[前][次][番号順一覧][スレッド一覧]

ruby-changes:36075

From: nobu <ko1@a...>
Date: Mon, 27 Oct 2014 15:51:01 +0900 (JST)
Subject: [ruby-changes:36075] nobu:r48156 (trunk): eventids2.c: reduce size

nobu	2014-10-27 15:50:49 +0900 (Mon, 27 Oct 2014)

  New Revision: 48156

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=48156

  Log:
    eventids2.c: reduce size
    
    * ext/ripper/eventids2.c (token_to_eventid): reduce relocations
      and element size.

  Modified files:
    trunk/ext/ripper/eventids2.c
Index: ext/ripper/eventids2.c
===================================================================
--- ext/ripper/eventids2.c	(revision 48155)
+++ ext/ripper/eventids2.c	(revision 48156)
@@ -8,287 +8,294 @@ https://github.com/ruby/ruby/blob/trunk/ext/ripper/eventids2.c#L8
 #define tHEREDOC_END     (tLAST_TOKEN + 8)
 #define k__END__         (tLAST_TOKEN + 9)
 
-static ID ripper_id_backref;
-static ID ripper_id_backtick;
-static ID ripper_id_comma;
-static ID ripper_id_const;
-static ID ripper_id_cvar;
-static ID ripper_id_embexpr_beg;
-static ID ripper_id_embexpr_end;
-static ID ripper_id_embvar;
-static ID ripper_id_float;
-static ID ripper_id_gvar;
-static ID ripper_id_ident;
-static ID ripper_id_imaginary;
-static ID ripper_id_int;
-static ID ripper_id_ivar;
-static ID ripper_id_kw;
-static ID ripper_id_lbrace;
-static ID ripper_id_lbracket;
-static ID ripper_id_lparen;
-static ID ripper_id_nl;
-static ID ripper_id_op;
-static ID ripper_id_period;
-static ID ripper_id_rbrace;
-static ID ripper_id_rbracket;
-static ID ripper_id_rparen;
-static ID ripper_id_semicolon;
-static ID ripper_id_symbeg;
-static ID ripper_id_tstring_beg;
-static ID ripper_id_tstring_content;
-static ID ripper_id_tstring_end;
-static ID ripper_id_words_beg;
-static ID ripper_id_qwords_beg;
-static ID ripper_id_qsymbols_beg;
-static ID ripper_id_symbols_beg;
-static ID ripper_id_words_sep;
-static ID ripper_id_rational;
-static ID ripper_id_regexp_beg;
-static ID ripper_id_regexp_end;
-static ID ripper_id_label;
-static ID ripper_id_label_end;
-static ID ripper_id_tlambda;
-static ID ripper_id_tlambeg;
-
-static ID ripper_id_ignored_nl;
-static ID ripper_id_comment;
-static ID ripper_id_embdoc_beg;
-static ID ripper_id_embdoc;
-static ID ripper_id_embdoc_end;
-static ID ripper_id_sp;
-static ID ripper_id_heredoc_beg;
-static ID ripper_id_heredoc_end;
-static ID ripper_id___end__;
-static ID ripper_id_CHAR;
+typedef struct {
+    ID ripper_id_backref;
+    ID ripper_id_backtick;
+    ID ripper_id_comma;
+    ID ripper_id_const;
+    ID ripper_id_cvar;
+    ID ripper_id_embexpr_beg;
+    ID ripper_id_embexpr_end;
+    ID ripper_id_embvar;
+    ID ripper_id_float;
+    ID ripper_id_gvar;
+    ID ripper_id_ident;
+    ID ripper_id_imaginary;
+    ID ripper_id_int;
+    ID ripper_id_ivar;
+    ID ripper_id_kw;
+    ID ripper_id_lbrace;
+    ID ripper_id_lbracket;
+    ID ripper_id_lparen;
+    ID ripper_id_nl;
+    ID ripper_id_op;
+    ID ripper_id_period;
+    ID ripper_id_rbrace;
+    ID ripper_id_rbracket;
+    ID ripper_id_rparen;
+    ID ripper_id_semicolon;
+    ID ripper_id_symbeg;
+    ID ripper_id_tstring_beg;
+    ID ripper_id_tstring_content;
+    ID ripper_id_tstring_end;
+    ID ripper_id_words_beg;
+    ID ripper_id_qwords_beg;
+    ID ripper_id_qsymbols_beg;
+    ID ripper_id_symbols_beg;
+    ID ripper_id_words_sep;
+    ID ripper_id_rational;
+    ID ripper_id_regexp_beg;
+    ID ripper_id_regexp_end;
+    ID ripper_id_label;
+    ID ripper_id_label_end;
+    ID ripper_id_tlambda;
+    ID ripper_id_tlambeg;
+
+    ID ripper_id_ignored_nl;
+    ID ripper_id_comment;
+    ID ripper_id_embdoc_beg;
+    ID ripper_id_embdoc;
+    ID ripper_id_embdoc_end;
+    ID ripper_id_sp;
+    ID ripper_id_heredoc_beg;
+    ID ripper_id_heredoc_end;
+    ID ripper_id___end__;
+    ID ripper_id_CHAR;
+} ripper_scanner_ids_t;
+
+static ripper_scanner_ids_t ripper_scanner_ids;
 
 #include "eventids2table.c"
 
 static void
 ripper_init_eventids2(void)
 {
-    ripper_id_backref = rb_intern_const("on_backref");
-    ripper_id_backtick = rb_intern_const("on_backtick");
-    ripper_id_comma = rb_intern_const("on_comma");
-    ripper_id_const = rb_intern_const("on_const");
-    ripper_id_cvar = rb_intern_const("on_cvar");
-    ripper_id_embexpr_beg = rb_intern_const("on_embexpr_beg");
-    ripper_id_embexpr_end = rb_intern_const("on_embexpr_end");
-    ripper_id_embvar = rb_intern_const("on_embvar");
-    ripper_id_float = rb_intern_const("on_float");
-    ripper_id_gvar = rb_intern_const("on_gvar");
-    ripper_id_ident = rb_intern_const("on_ident");
-    ripper_id_imaginary = rb_intern_const("on_imaginary");
-    ripper_id_int = rb_intern_const("on_int");
-    ripper_id_ivar = rb_intern_const("on_ivar");
-    ripper_id_kw = rb_intern_const("on_kw");
-    ripper_id_lbrace = rb_intern_const("on_lbrace");
-    ripper_id_lbracket = rb_intern_const("on_lbracket");
-    ripper_id_lparen = rb_intern_const("on_lparen");
-    ripper_id_nl = rb_intern_const("on_nl");
-    ripper_id_op = rb_intern_const("on_op");
-    ripper_id_period = rb_intern_const("on_period");
-    ripper_id_rbrace = rb_intern_const("on_rbrace");
-    ripper_id_rbracket = rb_intern_const("on_rbracket");
-    ripper_id_rparen = rb_intern_const("on_rparen");
-    ripper_id_semicolon = rb_intern_const("on_semicolon");
-    ripper_id_symbeg = rb_intern_const("on_symbeg");
-    ripper_id_tstring_beg = rb_intern_const("on_tstring_beg");
-    ripper_id_tstring_content = rb_intern_const("on_tstring_content");
-    ripper_id_tstring_end = rb_intern_const("on_tstring_end");
-    ripper_id_words_beg = rb_intern_const("on_words_beg");
-    ripper_id_qwords_beg = rb_intern_const("on_qwords_beg");
-    ripper_id_qsymbols_beg = rb_intern_const("on_qsymbols_beg");
-    ripper_id_symbols_beg = rb_intern_const("on_symbols_beg");
-    ripper_id_words_sep = rb_intern_const("on_words_sep");
-    ripper_id_rational = rb_intern_const("on_rational");
-    ripper_id_regexp_beg = rb_intern_const("on_regexp_beg");
-    ripper_id_regexp_end = rb_intern_const("on_regexp_end");
-    ripper_id_label = rb_intern_const("on_label");
-    ripper_id_label_end = rb_intern_const("on_label_end");
-    ripper_id_tlambda = rb_intern_const("on_tlambda");
-    ripper_id_tlambeg = rb_intern_const("on_tlambeg");
-
-    ripper_id_ignored_nl = rb_intern_const("on_ignored_nl");
-    ripper_id_comment = rb_intern_const("on_comment");
-    ripper_id_embdoc_beg = rb_intern_const("on_embdoc_beg");
-    ripper_id_embdoc = rb_intern_const("on_embdoc");
-    ripper_id_embdoc_end = rb_intern_const("on_embdoc_end");
-    ripper_id_sp = rb_intern_const("on_sp");
-    ripper_id_heredoc_beg = rb_intern_const("on_heredoc_beg");
-    ripper_id_heredoc_end = rb_intern_const("on_heredoc_end");
-    ripper_id___end__ = rb_intern_const("on___end__");
-    ripper_id_CHAR = rb_intern_const("on_CHAR");
+#define set_id2(name) ripper_scanner_ids.ripper_id_##name = rb_intern_const("on_"#name)
+    set_id2(backref);
+    set_id2(backtick);
+    set_id2(comma);
+    set_id2(const);
+    set_id2(cvar);
+    set_id2(embexpr_beg);
+    set_id2(embexpr_end);
+    set_id2(embvar);
+    set_id2(float);
+    set_id2(gvar);
+    set_id2(ident);
+    set_id2(imaginary);
+    set_id2(int);
+    set_id2(ivar);
+    set_id2(kw);
+    set_id2(lbrace);
+    set_id2(lbracket);
+    set_id2(lparen);
+    set_id2(nl);
+    set_id2(op);
+    set_id2(period);
+    set_id2(rbrace);
+    set_id2(rbracket);
+    set_id2(rparen);
+    set_id2(semicolon);
+    set_id2(symbeg);
+    set_id2(tstring_beg);
+    set_id2(tstring_content);
+    set_id2(tstring_end);
+    set_id2(words_beg);
+    set_id2(qwords_beg);
+    set_id2(qsymbols_beg);
+    set_id2(symbols_beg);
+    set_id2(words_sep);
+    set_id2(rational);
+    set_id2(regexp_beg);
+    set_id2(regexp_end);
+    set_id2(label);
+    set_id2(label_end);
+    set_id2(tlambda);
+    set_id2(tlambeg);
+
+    set_id2(ignored_nl);
+    set_id2(comment);
+    set_id2(embdoc_beg);
+    set_id2(embdoc);
+    set_id2(embdoc_end);
+    set_id2(sp);
+    set_id2(heredoc_beg);
+    set_id2(heredoc_end);
+    set_id2(__end__);
+    set_id2(CHAR);
 }
 
+#define O(member) (int)offsetof(ripper_scanner_ids_t, ripper_id_##member)
+
 static const struct token_assoc {
     int token;
-    ID *id;
+    int id_offset;
 } token_to_eventid[] = {
-    {' ',		&ripper_id_words_sep},
-    {'!',		&ripper_id_op},
-    {'%',		&ripper_id_op},
-    {'&',		&ripper_id_op},
-    {'*',		&ripper_id_op},
-    {'+',		&ripper_id_op},
-    {'-',		&ripper_id_op},
-    {'/',		&ripper_id_op},
-    {'<',		&ripper_id_op},
-    {'=',		&ripper_id_op},
-    {'>',		&ripper_id_op},
-    {'?',		&ripper_id_op},
-    {'^',		&ripper_id_op},
-    {'|',		&ripper_id_op},
-    {'~',		&ripper_id_op},
-    {':',		&ripper_id_op},
-    {',',		&ripper_id_comma},
-    {'.',		&ripper_id_period},
-    {';',		&ripper_id_semicolon},
-    {'`',		&ripper_id_backtick},
-    {'\n',              &ripper_id_nl},
-    {keyword_alias,	&ripper_id_kw},
-    {keyword_and,	&ripper_id_kw},
-    {keyword_begin,	&ripper_id_kw},
-    {keyword_break,	&ripper_id_kw},
-    {keyword_case,	&ripper_id_kw},
-    {keyword_class,	&ripper_id_kw},
-    {keyword_def,	&ripper_id_kw},
-    {keyword_defined,	&ripper_id_kw},
-    {keyword_do,	&ripper_id_kw},
-    {keyword_do_block,	&ripper_id_kw},
-    {keyword_do_cond,	&ripper_id_kw},
-    {keyword_else,	&ripper_id_kw},
-    {keyword_elsif,	&ripper_id_kw},
-    {keyword_end,	&ripper_id_kw},
-    {keyword_ensure,	&ripper_id_kw},
-    {keyword_false,	&ripper_id_kw},
-    {keyword_for,	&ripper_id_kw},
-    {keyword_if,	&ripper_id_kw},
-    {modifier_if,	&ripper_id_kw},
-    {keyword_in,	&ripper_id_kw},
-    {keyword_module,	&ripper_id_kw},
-    {keyword_next,	&ripper_id_kw},
-    {keyword_nil,	&ripper_id_kw},
-    {keyword_not,	&ripper_id_kw},
-    {keyword_or,	&ripper_id_kw},
-    {keyword_redo,	&ripper_id_kw},
-    {keyword_rescue,	&ripper_id_kw},
-    {modifier_rescue,	&ripper_id_kw},
-    {keyword_retry,	&ripper_id_kw},
-    {keyword_return,	&ripper_id_kw},
-    {keyword_self,	&ripper_id_kw},
-    {keyword_super,	&ripper_id_kw},
-    {keyword_then,	&ripper_id_kw},
-    {keyword_true,	&ripper_id_kw},
-    {keyword_undef,	&ripper_id_kw},
-    {keyword_unless,	&ripper_id_kw},
-    {modifier_unless,	&ripper_id_kw},
-    {keyword_until,	&ripper_id_kw},
-    {modifier_until,	&ripper_id_kw},
-    {keyword_when,	&ripper_id_kw},
-    {keyword_while,	&ripper_id_kw},
-    {modifier_while,	&ripper_id_kw},
-    {keyword_yield,	&ripper_id_kw},
-    {keyword__FILE__,	&ripper_id_kw},
-    {keyword__LINE__,	&ripper_id_kw},
-    {keyword__ENCODING__, &ripper_id_kw},
-    {keyword_BEGIN,	&ripper_id_kw},
-    {keyword_END,	&ripper_id_kw},
-    {keyword_do_LAMBDA,	&ripper_id_kw},
-    {tAMPER,		&ripper_id_op},
-    {tANDOP,		&ripper_id_op},
-    {tAREF,		&ripper_id_op},
-    {tASET,		&ripper_id_op},
-    {tASSOC,		&ripper_id_op},
-    {tBACK_REF,		&ripper_id_backref},
-    {tCHAR,		&ripper_id_CHAR},
-    {tCMP,		&ripper_id_op},
-    {tCOLON2,		&ripper_id_op},
-    {tCOLON3,		&ripper_id_op},
-    {tCONSTANT,		&ripper_id_const},
-    {tCVAR,		&ripper_id_cvar},
-    {tDOT2,		&ripper_id_op},
-    {tDOT3,		&ripper_id_op},
-    {tEQ,		&ripper_id_op},
-    {tEQQ,		&ripper_id_op},
-    {tFID,		&ripper_id_ident},
-    {tFLOAT,		&ripper_id_float},
-    {tGEQ,		&ripper_id_op},
-    {tGVAR,		&ripper_id_gvar},
-    {tIDENTIFIER,	&ripper_id_ident},
-    {tIMAGINARY,	&ripper_id_imaginary},
-    {tINTEGER,		&ripper_id_int},
-    {tIVAR,		&ripper_id_ivar},
-    {tLBRACE,		&ripper_id_lbrace},
-    {tLBRACE_ARG,	&ripper_id_lbrace},
-    {'{',       	&ripper_id_lbrace},
-    {'}',       	&ripper_id_rbrace},
-    {tLBRACK,		&ripper_id_lbracket},
-    {'[',       	&ripper_id_lbracket},
-    {']',       	&ripper_id_rbracket},
-    {tLEQ,		&ripper_id_op},
-    {tLPAREN,		&ripper_id_lparen},
-    {tLPAREN_ARG,	&ripper_id_lparen},
-    {'(',		&ripper_id_lparen},
-    {')',		&ripper_id_rparen},
-    {tLSHFT,		&ripper_id_op},
-    {tMATCH,		&ripper_id_op},
-    {tNEQ,		&ripper_id_op},
-    {tNMATCH,		&ripper_id_op},
-    {tNTH_REF,		&ripper_id_backref},
-    {tOP_ASGN,		&ripper_id_op},
-    {tOROP,		&ripper_id_op},
-    {tPOW,		&ripper_id_op},
-    {tQWORDS_BEG,	&ripper_id_qwords_beg},
-    {tQSYMBOLS_BEG,	&ripper_id_qsymbols_beg},
-    {tSYMBOLS_BEG,	&ripper_id_symbols_beg},
-    {tRATIONAL,		&ripper_id_rational},
-    {tREGEXP_BEG,	&ripper_id_regexp_beg},
-    {tREGEXP_END,	&ripper_id_regexp_end},
-    {tRPAREN,		&ripper_id_rparen},
-    {tRSHFT,		&ripper_id_op},
-    {tSTAR,		&ripper_id_op},
-    {tDSTAR,		&ripper_id_op},
-    {tSTRING_BEG,	&ripper_id_tstring_beg},
-    {tSTRING_CONTENT,	&ripper_id_tstring_content},
-    {tSTRING_DBEG,	&ripper_id_embexpr_beg},
-    {tSTRING_DEND,	&ripper_id_embexpr_end},
-    {tSTRING_DVAR,	&ripper_id_embvar},
-    {tSTRING_END,	&ripper_id_tstring_end},
-    {tSYMBEG,		&ripper_id_symbeg},
-    {tUMINUS,		&ripper_id_op},
-    {tUMINUS_NUM,	&ripper_id_op},
-    {tUPLUS,		&ripper_id_op},
-    {tWORDS_BEG,	&ripper_id_words_beg},
-    {tXSTRING_BEG,	&ripper_id_backtick},
-    {tLABEL,		&ripper_id_label},
-    {tLABEL_END,	&ripper_id_label_end},
-    {tLAMBDA,		&ripper_id_tlambda},
-    {tLAMBEG,		&ripper_id_tlambeg},
+    {' ',			O(words_sep)},
+    {'!',			O(op)},
+    {'%',			O(op)},
+    {'&',			O(op)},
+    {'*',			O(op)},
+    {'+',			O(op)},
+    {'-',			O(op)},
+    {'/',			O(op)},
+    {'<',			O(op)},
+    {'=',			O(op)},
+    {'>',			O(op)},
+    {'?',			O(op)},
+    {'^',			O(op)},
+    {'|',			O(op)},
+    {'~',			O(op)},
+    {':',			O(op)},
+    {',',			O(comma)},
+    {'.',			O(period)},
+    {';',			O(semicolon)},
+    {'`',			O(backtick)},
+    {'\n',			O(nl)},
+    {keyword_alias,		O(kw)},
+    {keyword_and,		O(kw)},
+    {keyword_begin,		O(kw)},
+    {keyword_break,		O(kw)},
+    {keyword_case,		O(kw)},
+    {keyword_class,		O(kw)},
+    {keyword_def,		O(kw)},
+    {keyword_defined,		O(kw)},
+    {keyword_do,		O(kw)},
+    {keyword_do_block,		O(kw)},
+    {keyword_do_cond,		O(kw)},
+    {keyword_else,		O(kw)},
+    {keyword_elsif,		O(kw)},
+    {keyword_end,		O(kw)},
+    {keyword_ensure,		O(kw)},
+    {keyword_false,		O(kw)},
+    {keyword_for,		O(kw)},
+    {keyword_if,		O(kw)},
+    {modifier_if,		O(kw)},
+    {keyword_in,		O(kw)},
+    {keyword_module,		O(kw)},
+    {keyword_next,		O(kw)},
+    {keyword_nil,		O(kw)},
+    {keyword_not,		O(kw)},
+    {keyword_or,		O(kw)},
+    {keyword_redo,		O(kw)},
+    {keyword_rescue,		O(kw)},
+    {modifier_rescue,		O(kw)},
+    {keyword_retry,		O(kw)},
+    {keyword_return,		O(kw)},
+    {keyword_self,		O(kw)},
+    {keyword_super,		O(kw)},
+    {keyword_then,		O(kw)},
+    {keyword_true,		O(kw)},
+    {keyword_undef,		O(kw)},
+    {keyword_unless,		O(kw)},
+    {modifier_unless,		O(kw)},
+    {keyword_until,		O(kw)},
+    {modifier_until,		O(kw)},
+    {keyword_when,		O(kw)},
+    {keyword_while,		O(kw)},
+    {modifier_while,		O(kw)},
+    {keyword_yield,		O(kw)},
+    {keyword__FILE__,		O(kw)},
+    {keyword__LINE__,		O(kw)},
+    {keyword__ENCODING__,	O(kw)},
+    {keyword_BEGIN,		O(kw)},
+    {keyword_END,		O(kw)},
+    {keyword_do_LAMBDA,		O(kw)},
+    {tAMPER,			O(op)},
+    {tANDOP,			O(op)},
+    {tAREF,			O(op)},
+    {tASET,			O(op)},
+    {tASSOC,			O(op)},
+    {tBACK_REF,			O(backref)},
+    {tCHAR,			O(CHAR)},
+    {tCMP,			O(op)},
+    {tCOLON2,			O(op)},
+    {tCOLON3,			O(op)},
+    {tCONSTANT,			O(const)},
+    {tCVAR,			O(cvar)},
+    {tDOT2,			O(op)},
+    {tDOT3,			O(op)},
+    {tEQ,			O(op)},
+    {tEQQ,			O(op)},
+    {tFID,			O(ident)},
+    {tFLOAT,			O(float)},
+    {tGEQ,			O(op)},
+    {tGVAR,			O(gvar)},
+    {tIDENTIFIER,		O(ident)},
+    {tIMAGINARY,		O(imaginary)},
+    {tINTEGER,			O(int)},
+    {tIVAR,			O(ivar)},
+    {tLBRACE,			O(lbrace)},
+    {tLBRACE_ARG,		O(lbrace)},
+    {'{',			O(lbrace)},
+    {'}',			O(rbrace)},
+    {tLBRACK,			O(lbracket)},
+    {'[',			O(lbracket)},
+    {']',			O(rbracket)},
+    {tLEQ,			O(op)},
+    {tLPAREN,			O(lparen)},
+    {tLPAREN_ARG,		O(lparen)},
+    {'(',			O(lparen)},
+    {')',			O(rparen)},
+    {tLSHFT,			O(op)},
+    {tMATCH,			O(op)},
+    {tNEQ,			O(op)},
+    {tNMATCH,			O(op)},
+    {tNTH_REF,			O(backref)},
+    {tOP_ASGN,			O(op)},
+    {tOROP,			O(op)},
+    {tPOW,			O(op)},
+    {tQWORDS_BEG,		O(qwords_beg)},
+    {tQSYMBOLS_BEG,		O(qsymbols_beg)},
+    {tSYMBOLS_BEG,		O(symbols_beg)},
+    {tRATIONAL,			O(rational)},
+    {tREGEXP_BEG,		O(regexp_beg)},
+    {tREGEXP_END,		O(regexp_end)},
+    {tRPAREN,			O(rparen)},
+    {tRSHFT,			O(op)},
+    {tSTAR,			O(op)},
+    {tDSTAR,			O(op)},
+    {tSTRING_BEG,		O(tstring_beg)},
+    {tSTRING_CONTENT,		O(tstring_content)},
+    {tSTRING_DBEG,		O(embexpr_beg)},
+    {tSTRING_DEND,		O(embexpr_end)},
+    {tSTRING_DVAR,		O(embvar)},
+    {tSTRING_END,		O(tstring_end)},
+    {tSYMBEG,			O(symbeg)},
+    {tUMINUS,			O(op)},
+    {tUMINUS_NUM,		O(op)},
+    {tUPLUS,			O(op)},
+    {tWORDS_BEG,		O(words_beg)},
+    {tXSTRING_BEG,		O(backtick)},
+    {tLABEL,			O(label)},
+    {tLABEL_END,		O(label_end)},
+    {tLAMBDA,			O(tlambda)},
+    {tLAMBEG,			O(tlambeg)},
 
     /* ripper specific tokens */
-    {tIGNORED_NL,       &ripper_id_ignored_nl},
-    {tCOMMENT,          &ripper_id_comment},
-    {tEMBDOC_BEG,       &ripper_id_embdoc_beg},
-    {tEMBDOC,           &ripper_id_embdoc},
-    {tEMBDOC_END,       &ripper_id_embdoc_end},
-    {tSP,               &ripper_id_sp},
-    {tHEREDOC_BEG,      &ripper_id_heredoc_beg},
-    {tHEREDOC_END,      &ripper_id_heredoc_end},
-    {k__END__,          &ripper_id___end__},
-    {0, NULL}
+    {tIGNORED_NL,		O(ignored_nl)},
+    {tCOMMENT,			O(comment)},
+    {tEMBDOC_BEG,		O(embdoc_beg)},
+    {tEMBDOC,			O(embdoc)},
+    {tEMBDOC_END,		O(embdoc_end)},
+    {tSP,			O(sp)},
+    {tHEREDOC_BEG,		O(heredoc_beg)},
+    {tHEREDOC_END,		O(heredoc_end)},
+    {k__END__,			O(__end__)},
 };
 
 static ID
 ripper_token2eventid(int tok)
 {
-    const struct token_assoc *a;
+    int i;
 
-    for (a = token_to_eventid; a->id != NULL; a++) {
+    for (i = 0; i < numberof(token_to_eventid); i++) {
+	const struct token_assoc *const a = &token_to_eventid[i];
         if (a->token == tok)
-            return *a->id;
+            return *(const ID *)((const char *)&ripper_scanner_ids + a->id_offset);
     }
     if (tok < 256) {
-        return ripper_id_CHAR;
+        return ripper_scanner_ids.ripper_id_CHAR;
     }
     rb_raise(rb_eRuntimeError, "[Ripper FATAL] unknown token %d", tok);
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]