From 37263e50e5ad833d6d8faf4abf4c2616788446a1 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Mon, 18 Mar 2013 22:03:00 +0900 Subject: Remove mrb_checkstack() as unused. --- include/mruby.h | 1 - 1 file changed, 1 deletion(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 4e4751c38..84aeff0d7 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -209,7 +209,6 @@ mrb_state* mrb_open(void); mrb_state* mrb_open_allocf(mrb_allocf, void *ud); void mrb_irep_free(mrb_state*, struct mrb_irep*); void mrb_close(mrb_state*); -int mrb_checkstack(mrb_state*,int); mrb_value mrb_top_self(mrb_state *); mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value); -- cgit v1.2.3 From cdf8114e27288612139b544a6dea34e33217c88c Mon Sep 17 00:00:00 2001 From: FUKUZAWA-Tadashi Date: Thu, 14 Mar 2013 23:05:05 +0900 Subject: %I %i literal --- include/mruby/compile.h | 16 +++++++++------- src/codegen.c | 4 ++++ src/node.h | 1 + src/parse.y | 30 ++++++++++++++++++++++++++++-- test/t/literals.rb | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 89 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 4b12cb10c..8b0743fa3 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -68,13 +68,15 @@ struct mrb_parser_message { enum mrb_string_type { str_not_parsing = (0), - str_squote = (STR_FUNC_PARSING), - str_dquote = (STR_FUNC_PARSING|STR_FUNC_EXPAND), - str_regexp = (STR_FUNC_PARSING|STR_FUNC_REGEXP|STR_FUNC_EXPAND), - str_sword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY), - str_dword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY|STR_FUNC_EXPAND), - str_ssym = (STR_FUNC_PARSING|STR_FUNC_SYMBOL), - str_heredoc = (STR_FUNC_PARSING|STR_FUNC_HEREDOC), + str_squote = (STR_FUNC_PARSING), + str_dquote = (STR_FUNC_PARSING|STR_FUNC_EXPAND), + str_regexp = (STR_FUNC_PARSING|STR_FUNC_REGEXP|STR_FUNC_EXPAND), + str_sword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY), + str_dword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY|STR_FUNC_EXPAND), + str_ssym = (STR_FUNC_PARSING|STR_FUNC_SYMBOL), + str_ssymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY), + str_dsymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY|STR_FUNC_EXPAND), + str_heredoc = (STR_FUNC_PARSING|STR_FUNC_HEREDOC), }; /* heredoc structure */ diff --git a/src/codegen.c b/src/codegen.c index 992275052..7a91d597d 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2027,6 +2027,10 @@ codegen(codegen_scope *s, node *tree, int val) gen_literal_array(s, tree, FALSE, val); break; + case NODE_SYMBOLS: + gen_literal_array(s, tree, TRUE, val); + break; + case NODE_REGX: if (val) { char *p1 = (char*)tree->car; diff --git a/src/node.h b/src/node.h index bcf02e8ff..4f9db8265 100644 --- a/src/node.h +++ b/src/node.h @@ -108,6 +108,7 @@ enum node_type { NODE_HEREDOC, NODE_LITERAL_DELIM, NODE_WORDS, + NODE_SYMBOLS, NODE_LAST }; diff --git a/src/parse.y b/src/parse.y index 33688e45a..ee95cfb73 100644 --- a/src/parse.y +++ b/src/parse.y @@ -763,6 +763,13 @@ new_words(parser_state *p, node *a) return cons((node*)NODE_WORDS, a); } +// (:symbols . a) +static node* +new_symbols(parser_state *p, node *a) +{ + return cons((node*)NODE_SYMBOLS, a); +} + // xxx ----------------------------- // (:call a op) @@ -991,7 +998,7 @@ heredoc_end(parser_state *p) %type mlhs mlhs_list mlhs_post mlhs_basic mlhs_item mlhs_node mlhs_inner %type fsym sym basic_symbol operation operation2 operation3 %type cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg -%type heredoc words +%type heredoc words symbols %token tUPLUS /* unary+ */ %token tUMINUS /* unary- */ @@ -1020,7 +1027,7 @@ heredoc_end(parser_state *p) %token tSTAR /* * */ %token tAMPER /* & */ %token tLAMBDA /* -> */ -%token tSYMBEG tREGEXP_BEG tWORDS_BEG +%token tSYMBEG tREGEXP_BEG tWORDS_BEG tSYMBOLS_BEG %token tSTRING_BEG tSTRING_DVAR tLAMBEG %token tHEREDOC_BEG /* <<, <<- */ %token tHEREDOC_END tLITERAL_DELIM @@ -2535,6 +2542,7 @@ opt_ensure : keyword_ensure compstmt literal : numeric | symbol | words + | symbols ; string : tCHAR @@ -2653,6 +2661,16 @@ sym : fname } ; +symbols : tSYMBOLS_BEG tSTRING + { + $$ = new_symbols(p, list1($2)); + } + | tSYMBOLS_BEG string_rep tSTRING + { + $$ = new_symbols(p, push($2, $3)); + } + ; + numeric : tINTEGER | tFLOAT | tUMINUS_NUM tINTEGER %prec tLOWEST @@ -4625,6 +4643,14 @@ parser_yylex(parser_state *p) p->lex_strterm = new_strterm(p, str_ssym, term, paren); return tSYMBEG; + case 'I': + p->lex_strterm = new_strterm(p, str_dsymbols, term, paren); + return tSYMBOLS_BEG; + + case 'i': + p->lex_strterm = new_strterm(p, str_ssymbols, term, paren); + return tSYMBOLS_BEG; + default: yyerror(p, "unknown type of %string"); return 0; diff --git a/test/t/literals.rb b/test/t/literals.rb index 5a29cff0c..f40852ff9 100644 --- a/test/t/literals.rb +++ b/test/t/literals.rb @@ -186,8 +186,54 @@ d test1 and test2 end +assert('Literals Array of symbols') do + a = %I{abc#{1+2}def \}g} + b = %I(abc #{2+3} def \(g) + c = %I[#{3+4}] + d = %I< #{4+5} > + e = %I// + f = %I[[ab cd][ef]] + g = %I{ + ab + #{-1}1 + 2#{2} + } + + test1 = (a == [:'abc3def', :'}g'] and + b == [:'abc', :'5', :'def', :'(g'] and + c == [:'7'] and + d == [:'9'] and + e == [] and + f == [:'[ab', :'cd][ef]'] and + g == [:'ab', :'-11', :'22'] + ) + + a = %i{abc#{1+2}def \}g} + b = %i(abc #{2+3} def \(g) + c = %i[#{3+4}] + d = %i< #{4+5} > + e = %i// + f = %i[[ab cd][ef]] + g = %i{ + ab + #{-1}1 + 2#{2} + } + + test2 = (a == [:'abc#{1+2}def', :'}g'] and + b == [:'abc', :'#{2+3}', :'def', :'(g'] and + c == [:'#{3+4}'] and + d == [:'#{4+5}'] and + e == [] and + f == [:'[ab', :'cd][ef]'] and + g == [:'ab', :'#{-1}1', :'2#{2}'] + ) + + test1 and test2 +end + assert('Literals Symbol', '8.7.6.6') do - /* do not compile error */ + # do not compile error :$asd :@asd :@@asd -- cgit v1.2.3