[#42344] [ruby-trunk - Feature #5964][Open] Make Symbols an Alternate Syntax for Strings — Tom Wardrop <tom@...>

23 messages 2012/02/03

[#42443] [ruby-trunk - Bug #5985][Open] miniruby skews "make benchmark" results — Eric Wong <normalperson@...>

21 messages 2012/02/08

[#42444] [ruby-trunk - Bug #5986][Open] Segmentation Fault — Luis Matta <levmatta@...>

16 messages 2012/02/08

[#42471] [ruby-trunk - Feature #5995][Open] calling io_advise_internal() in read_all() — Masaki Matsushita <glass.saga@...>

20 messages 2012/02/10

[#42560] [ruby-trunk - Bug #6011][Open] ruby-1.9.3-p0/lib/webrick/utils.rb:184: [BUG] Segmentation fault — Vit Ondruch <v.ondruch@...>

12 messages 2012/02/13

[#42579] [ruby-trunk - Bug #6012][Open] Proc#source_location also return the column — Roger Pack <rogerpack2005@...>

14 messages 2012/02/14

[#42685] [ruby-trunk - Bug #6036][Open] Test failures in Fedora Rawhide/17 — Bohuslav Kabrda <bkabrda@...>

14 messages 2012/02/16

[#42697] [ruby-trunk - Bug #6040][Open] Transcoding test failure: Big5 to UTF8 not defined (MinGW) — Luis Lavena <luislavena@...>

10 messages 2012/02/16

[#42813] [ruby-trunk - Feature #6065][Open] Allow Bignum marshalling/unmarshalling from C API — Martin Bosslet <Martin.Bosslet@...>

22 messages 2012/02/23

[#42815] [ruby-trunk - Bug #6066][Open] Fix "control may reach end of non-void function" warnings for clang — Eric Hodel <drbrain@...7.net>

15 messages 2012/02/23

[#42857] [ruby-trunk - Feature #6074][Open] Allow alias arguments to have a comma — Thomas Sawyer <transfire@...>

20 messages 2012/02/24

[#42891] [ruby-trunk - Feature #6083][Open] Hide a Bignum definition — Koichi Sasada <redmine@...>

23 messages 2012/02/25

[#42906] [ruby-trunk - Bug #6085][Open] Treatment of Wrong Number of Arguments — Marc-Andre Lafortune <ruby-core@...>

14 messages 2012/02/25

[#42949] [ruby-trunk - Bug #6089][Open] Test suite fails with OpenSSL 1.0.1 — Vit Ondruch <v.ondruch@...>

13 messages 2012/02/26

[ruby-core:42553] [ruby-trunk - Feature #1493] [patch] lex_state as bit field / IS_lex_state() macro

From: Yusuke Endoh <mame@...>
Date: 2012-02-13 15:26:17 UTC
List: ruby-core #42553
Issue #1493 has been updated by Yusuke Endoh.

Assignee changed from Yukihiro Matsumoto to Nobuyoshi Nakada

Nobu, aren't you interested in this?  Could you please review and
import the patch if it looks good to you?

This seems to be just a patch for refactoring.  Though, the purpose
is not so clear to me.  (Who is planning to break the dependence on
bison?)  But, the patch seems benign (I read only the ticket, not
the patch itself).

-- 
Yusuke Endoh <mame@tsg.ne.jp>
----------------------------------------
Feature #1493: [patch] lex_state as bit field / IS_lex_state() macro
https://bugs.ruby-lang.org/issues/1493

Author: Dave B
Status: Assigned
Priority: Low
Assignee: Nobuyoshi Nakada
Category: core
Target version: 2.0.0


=begin
 #  ? Changelog:
 #  Represent lex_state by bit field instead of serial integer enum
 #   so that single or multiple values can be checked together using
 #   unifying macro IS_lex_state().  States remain mutually exclusive.
 
 Example:
 
 Each use of current macro IS_BEG() ..
 #define IS_BEG() (lex_state == EXPR_BEG   || lex_state == EXPR_MID || \
                   lex_state == EXPR_VALUE || lex_state == EXPR_CLASS)
 
 .. results in up to 4 tests which can be reduced to 1.
 
 An extreme use case ..
 
         if (IS_BEG() ||
             lex_state == EXPR_DOT ||
             IS_ARG()) {
 
 .. requires up to 7 tests on lex_state.
 
 To my knowledge, compilers can't optimize this.
 As a bit field, there's no need to:
 
         if (IS_lex_state( EXPR_BEG_ANY | EXPR_ARG_ANY | EXPR_DOT ))
 
 .. reduces to:    if (lex_state & (test_bits))  // TRUE/FALSE
 
 All changes in this patch were scripted to eliminate the possibility
 of typos.  Where some replaced sections looked similar or the same,
 they were verified with MD5sum before applying!
 Multiple state tests were merged using simple, strict logic and any
 "surprise" code would have been left unchanged.
 
 Therefore, it should not be necessary to check every line of the patch;
 I hope that a check of a random sample will give confidence in the rest.
 
 There were several repeated switches which could have been replaced with:
 
   lex_state = (IS_lex_state( EXPR_FNAME | EXPR_DOT )) ? EXPR_ARG : EXPR_BEG
 
  but I assumed you would prefer if-else for flexibility and legibility:
 
  	if (IS_lex_state( EXPR_FNAME | EXPR_DOT )) {
 	    lex_state = EXPR_ARG;
 	}
 	else {
 	    lex_state = EXPR_BEG;
 	}
 
 Say what you don't like about anything - it might be easy to change. :)
 
 Wouldn't it be nice to use some spare bits to combine other state?
 
         if ((lex_state == EXPR_BEG && !cmd_state) || ...
         if (IS_ARG() && space_seen && ...
 
  - I haven't explored those, yet.
 
 
 My motivation was not to reduce processor heat. ;)
 In the future, if we need to break the dependence on Yacc/Bison, these
 state transitions might need to become token information and the change
 makes them far easier to store.
 ( e.g. Any of 'THESE states' => 'THIS state' )
 
 
 daz
=end



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next