From 1b132cb25462e378b7d133b762d0f587b19e753f Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 27 Oct 2014 06:50:49 +0000 Subject: [PATCH] eventids2.c: reduce size * ext/ripper/eventids2.c (token_to_eventid): reduce relocations and element size. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48156 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/ripper/eventids2.c | 521 +++++++++++++++++++++-------------------- 1 file changed, 264 insertions(+), 257 deletions(-) diff --git a/ext/ripper/eventids2.c b/ext/ripper/eventids2.c index ced29e93c4..bfb4e094d0 100644 --- a/ext/ripper/eventids2.c +++ b/ext/ripper/eventids2.c @@ -8,287 +8,294 @@ #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; +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; -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; + 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"); +#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); - 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"); + 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);