diff options
| -rw-r--r-- | Rakefile | 2 | ||||
| -rw-r--r-- | lib/mruby/build/load_gems.rb | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-array-ext/test/array.rb | 6 | ||||
| -rw-r--r-- | mrbgems/mruby-class-ext/src/class.c | 6 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 165 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/src/fiber.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-hash-ext/mrbgem.rake | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-hash-ext/test/hash.rb | 10 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/file.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 14 | ||||
| -rw-r--r-- | mrbgems/mruby-kernel-ext/src/kernel.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-metaprog/src/metaprog.c | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-proc-ext/src/proc.c | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-sprintf/src/kernel.c | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-struct/mrblib/struct.rb | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-symbol-ext/mrblib/symbol.rb | 8 | ||||
| -rw-r--r-- | src/array.c | 2 | ||||
| -rw-r--r-- | src/class.c | 25 | ||||
| -rw-r--r-- | src/error.c | 2 | ||||
| -rw-r--r-- | src/hash.c | 4 | ||||
| -rw-r--r-- | src/kernel.c | 6 | ||||
| -rw-r--r-- | src/numeric.c | 8 | ||||
| -rw-r--r-- | src/string.c | 108 | ||||
| -rw-r--r-- | src/symbol.c | 10 | ||||
| -rw-r--r-- | src/variable.c | 2 | ||||
| -rw-r--r-- | test/t/numeric.rb | 2 |
27 files changed, 184 insertions, 223 deletions
@@ -62,7 +62,7 @@ MRuby.each_target do |target| relative_from_root = gem.dir.relative_path_from(MRUBY_ROOT) current_build_dir = File.expand_path "#{build_dir}/#{relative_from_root}" - if current_build_dir !~ /^#{build_dir}/ + if current_build_dir !~ /^#{Regexp.escape(build_dir)}/ current_build_dir = "#{build_dir}/mrbgems/#{gem.name}" end diff --git a/lib/mruby/build/load_gems.rb b/lib/mruby/build/load_gems.rb index 9f09167ba..f6deb5168 100644 --- a/lib/mruby/build/load_gems.rb +++ b/lib/mruby/build/load_gems.rb @@ -13,13 +13,12 @@ module MRuby end def gem(gemdir, &block) - caller_dir = File.expand_path(File.dirname(/^(.*?):\d/.match(caller.first).to_a[1])) - if gemdir.is_a?(Hash) gemdir = load_special_path_gem(gemdir) elsif GemBox.path && gemdir.is_a?(String) gemdir = File.expand_path(gemdir, File.dirname(GemBox.path)) else + caller_dir = File.expand_path(File.dirname(caller(1,1)[0][/^(.*?):\d/,1])) gemdir = File.expand_path(gemdir, caller_dir) end diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb index cb76559c7..51172f9a8 100644 --- a/mrbgems/mruby-array-ext/test/array.rb +++ b/mrbgems/mruby-array-ext/test/array.rb @@ -195,12 +195,6 @@ assert("Array#reverse_each") do b << i end assert_equal [ "d", "c", "b", "a" ], b - - if Object.const_defined?(:Enumerator) - assert_equal [ "d", "c", "b", "a" ], a.reverse_each.to_a - else - true - end end assert("Array#rotate") do diff --git a/mrbgems/mruby-class-ext/src/class.c b/mrbgems/mruby-class-ext/src/class.c index 0d27c30ed..02ebf80cc 100644 --- a/mrbgems/mruby-class-ext/src/class.c +++ b/mrbgems/mruby-class-ext/src/class.c @@ -5,7 +5,11 @@ static mrb_value mrb_mod_name(mrb_state *mrb, mrb_value self) { - return mrb_class_path(mrb, mrb_class_ptr(self)); + mrb_value name = mrb_class_path(mrb, mrb_class_ptr(self)); + if (mrb_string_p(name)) { + MRB_SET_FROZEN_FLAG(mrb_basic_ptr(name)); + } + return name; } static mrb_value diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 6afc3f8fe..5a405b8cb 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -103,12 +103,7 @@ intern_gen(parser_state *p, const char *s, size_t len) } #define intern(s,len) intern_gen(p,(s),(len)) -static inline mrb_sym -intern_gen_c(parser_state *p, const char c) -{ - return mrb_intern(p->mrb, &c, 1); -} -#define intern_c(c) intern_gen_c(p,(c)) +#define intern_lit(s) mrb_intern_lit(p->mrb, s) static void cons_free_gen(parser_state *p, node *cons) @@ -793,15 +788,15 @@ new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk) local_add_blk(p, blk); - // allocate register for keywords arguments - // order is for Proc#parameters + /* allocate register for keywords arguments */ + /* order is for Proc#parameters */ for (k = kws; k; k = k->cdr) { - if (!k->car->cdr->cdr->car) { // allocate required keywords + if (!k->car->cdr->cdr->car) { /* allocate required keywords */ local_add_f(p, sym(k->car->cdr->car)); } } for (k = kws; k; k = k->cdr) { - if (k->car->cdr->cdr->car) { // allocate keywords with default + if (k->car->cdr->cdr->car) { /* allocate keywords with default */ local_add_lv(p, k->car->cdr->cdr->car->cdr); k->car->cdr->cdr->car = k->car->cdr->cdr->car->car; local_add_f(p, sym(k->car->cdr->car)); @@ -875,7 +870,7 @@ new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b) static node* new_imaginary(parser_state *p, node *imaginary) { - return new_call(p, new_const(p, intern_cstr("Kernel")), intern_cstr("Complex"), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); + return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Complex"), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); } #endif @@ -883,7 +878,7 @@ new_imaginary(parser_state *p, node *imaginary) static node* new_rational(parser_state *p, node *rational) { - return new_call(p, new_const(p, intern_cstr("Kernel")), intern_cstr("Rational"), list1(list1(rational)), 1); + return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Rational"), list1(list1(rational)), 1); } #endif @@ -1620,9 +1615,9 @@ command_asgn : lhs '=' command_rhs { $$ = new_op_asgn(p, $1, $2, $3); } - | primary_value '[' opt_call_args rbracket tOP_ASGN command_rhs + | primary_value '[' opt_call_args ']' tOP_ASGN command_rhs { - $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3, '.'), $5, $6); + $$ = new_op_asgn(p, new_call(p, $1, intern_lit("[]"), $3, '.'), $5, $6); } | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs { @@ -1849,9 +1844,9 @@ mlhs_node : variable { assignable(p, $1); } - | primary_value '[' opt_call_args rbracket + | primary_value '[' opt_call_args ']' { - $$ = new_call(p, $1, intern("[]",2), $3, '.'); + $$ = new_call(p, $1, intern_lit("[]"), $3, '.'); } | primary_value call_op tIDENTIFIER { @@ -1888,9 +1883,9 @@ lhs : variable { assignable(p, $1); } - | primary_value '[' opt_call_args rbracket + | primary_value '[' opt_call_args ']' { - $$ = new_call(p, $1, intern("[]",2), $3, '.'); + $$ = new_call(p, $1, intern_lit("[]"), $3, '.'); } | primary_value call_op tIDENTIFIER { @@ -1974,36 +1969,36 @@ undef_list : fsym } ; -op : '|' { $$ = intern_c('|'); } - | '^' { $$ = intern_c('^'); } - | '&' { $$ = intern_c('&'); } - | tCMP { $$ = intern("<=>",3); } - | tEQ { $$ = intern("==",2); } - | tEQQ { $$ = intern("===",3); } - | tMATCH { $$ = intern("=~",2); } - | tNMATCH { $$ = intern("!~",2); } - | '>' { $$ = intern_c('>'); } - | tGEQ { $$ = intern(">=",2); } - | '<' { $$ = intern_c('<'); } - | tLEQ { $$ = intern("<=",2); } - | tNEQ { $$ = intern("!=",2); } - | tLSHFT { $$ = intern("<<",2); } - | tRSHFT { $$ = intern(">>",2); } - | '+' { $$ = intern_c('+'); } - | '-' { $$ = intern_c('-'); } - | '*' { $$ = intern_c('*'); } - | tSTAR { $$ = intern_c('*'); } - | '/' { $$ = intern_c('/'); } - | '%' { $$ = intern_c('%'); } - | tPOW { $$ = intern("**",2); } - | tDSTAR { $$ = intern("**",2); } - | '!' { $$ = intern_c('!'); } - | '~' { $$ = intern_c('~'); } - | tUPLUS { $$ = intern("+@",2); } - | tUMINUS { $$ = intern("-@",2); } - | tAREF { $$ = intern("[]",2); } - | tASET { $$ = intern("[]=",3); } - | '`' { $$ = intern_c('`'); } +op : '|' { $$ = intern_lit("|"); } + | '^' { $$ = intern_lit("^"); } + | '&' { $$ = intern_lit("&"); } + | tCMP { $$ = intern_lit("<=>"); } + | tEQ { $$ = intern_lit("=="); } + | tEQQ { $$ = intern_lit("==="); } + | tMATCH { $$ = intern_lit("=~"); } + | tNMATCH { $$ = intern_lit("!~"); } + | '>' { $$ = intern_lit(">"); } + | tGEQ { $$ = intern_lit(">="); } + | '<' { $$ = intern_lit("<"); } + | tLEQ { $$ = intern_lit("<="); } + | tNEQ { $$ = intern_lit("!="); } + | tLSHFT { $$ = intern_lit("<<"); } + | tRSHFT { $$ = intern_lit(">>"); } + | '+' { $$ = intern_lit("+"); } + | '-' { $$ = intern_lit("-"); } + | '*' { $$ = intern_lit("*"); } + | tSTAR { $$ = intern_lit("*"); } + | '/' { $$ = intern_lit("/"); } + | '%' { $$ = intern_lit("%"); } + | tPOW { $$ = intern_lit("**"); } + | tDSTAR { $$ = intern_lit("**"); } + | '!' { $$ = intern_lit("!"); } + | '~' { $$ = intern_lit("~"); } + | tUPLUS { $$ = intern_lit("+@"); } + | tUMINUS { $$ = intern_lit("-@"); } + | tAREF { $$ = intern_lit("[]"); } + | tASET { $$ = intern_lit("[]="); } + | '`' { $$ = intern_lit("`"); } ; reswords : keyword__LINE__ | keyword__FILE__ | keyword__ENCODING__ @@ -2028,9 +2023,9 @@ arg : lhs '=' arg_rhs { $$ = new_op_asgn(p, $1, $2, $3); } - | primary_value '[' opt_call_args rbracket tOP_ASGN arg_rhs + | primary_value '[' opt_call_args ']' tOP_ASGN arg_rhs { - $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3, '.'), $5, $6); + $$ = new_op_asgn(p, new_call(p, $1, intern_lit("[]"), $3, '.'), $5, $6); } | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs { @@ -2226,7 +2221,7 @@ arg_rhs : arg %prec tOP_ASGN } ; -paren_args : '(' opt_call_args rparen +paren_args : '(' opt_call_args ')' { $$ = $2; } @@ -2237,18 +2232,18 @@ opt_paren_args : none ; opt_call_args : none - | call_args - | args ',' + | call_args opt_terms + | args comma { $$ = cons($1,0); NODE_LINENO($$, $1); } - | args comma assocs ',' + | args comma assocs comma { $$ = cons(push($1, new_kw_hash(p, $3)), 0); NODE_LINENO($$, $1); } - | assocs ',' + | assocs comma { $$ = cons(list1(new_kw_hash(p, $1)), 0); NODE_LINENO($$, $1); @@ -2915,11 +2910,11 @@ method_call : operation paren_args } | primary_value call_op paren_args { - $$ = new_call(p, $1, intern("call",4), $3, $2); + $$ = new_call(p, $1, intern_lit("call"), $3, $2); } | primary_value tCOLON2 paren_args { - $$ = new_call(p, $1, intern("call",4), $3, tCOLON2); + $$ = new_call(p, $1, intern_lit("call"), $3, tCOLON2); } | keyword_super paren_args { @@ -2929,9 +2924,9 @@ method_call : operation paren_args { $$ = new_zsuper(p); } - | primary_value '[' opt_call_args rbracket + | primary_value '[' opt_call_args ']' { - $$ = new_call(p, $1, intern("[]",2), $3, '.'); + $$ = new_call(p, $1, intern_lit("[]"), $3, '.'); } ; @@ -3329,11 +3324,13 @@ f_kw : f_label arg f_block_kw : f_label primary_value { - $$ = new_kw_arg(p, $1, $2); + $$ = new_kw_arg(p, $1, cons($2, locals_node(p))); + local_unnest(p); } | f_label { $$ = new_kw_arg(p, $1, 0); + local_unnest(p); } ; @@ -3722,14 +3719,11 @@ opt_nl : /* none */ | nl ; -rparen : opt_nl ')' - ; - -rbracket : opt_nl ']' +rparen : opt_terms ')' ; trailer : /* none */ - | nl + | terms | comma ; @@ -4387,12 +4381,7 @@ parse_string(parser_state *p) } } if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) { - if (c < 0) { - p->parsing_heredoc = NULL; - } - else { - return tHEREDOC_END; - } + return tHEREDOC_END; } } if (c < 0) { @@ -4819,7 +4808,7 @@ parser_yylex(parser_state *p) case '*': if ((c = nextc(p)) == '*') { if ((c = nextc(p)) == '=') { - pylval.id = intern("**",2); + pylval.id = intern_lit("**"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4837,7 +4826,7 @@ parser_yylex(parser_state *p) } else { if (c == '=') { - pylval.id = intern_c('*'); + pylval.id = intern_lit("*"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4953,7 +4942,7 @@ parser_yylex(parser_state *p) } if (c == '<') { if ((c = nextc(p)) == '=') { - pylval.id = intern("<<",2); + pylval.id = intern_lit("<<"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4975,7 +4964,7 @@ parser_yylex(parser_state *p) } if (c == '>') { if ((c = nextc(p)) == '=') { - pylval.id = intern(">>",2); + pylval.id = intern_lit(">>"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5083,7 +5072,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '&') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - pylval.id = intern("&&",2); + pylval.id = intern_lit("&&"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5095,7 +5084,7 @@ parser_yylex(parser_state *p) return tANDDOT; } else if (c == '=') { - pylval.id = intern_c('&'); + pylval.id = intern_lit("&"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5122,7 +5111,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '|') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - pylval.id = intern("||",2); + pylval.id = intern_lit("||"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5130,7 +5119,7 @@ parser_yylex(parser_state *p) return tOROP; } if (c == '=') { - pylval.id = intern_c('|'); + pylval.id = intern_lit("|"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5154,7 +5143,7 @@ parser_yylex(parser_state *p) return '+'; } if (c == '=') { - pylval.id = intern_c('+'); + pylval.id = intern_lit("+"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5182,7 +5171,7 @@ parser_yylex(parser_state *p) return '-'; } if (c == '=') { - pylval.id = intern_c('-'); + pylval.id = intern_lit("-"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5516,7 +5505,7 @@ parser_yylex(parser_state *p) return tREGEXP_BEG; } if ((c = nextc(p)) == '=') { - pylval.id = intern_c('/'); + pylval.id = intern_lit("/"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5535,7 +5524,7 @@ parser_yylex(parser_state *p) case '^': if ((c = nextc(p)) == '=') { - pylval.id = intern_c('^'); + pylval.id = intern_lit("^"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5712,7 +5701,7 @@ parser_yylex(parser_state *p) } } if ((c = nextc(p)) == '=') { - pylval.id = intern_c('%'); + pylval.id = intern_lit("%"); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5766,7 +5755,7 @@ parser_yylex(parser_state *p) tokadd(p, '$'); tokadd(p, c); tokfix(p); - pylval.id = intern_cstr(tok(p)); + pylval.id = intern(tok(p), toklen(p)); return tGVAR; case '-': @@ -5776,7 +5765,7 @@ parser_yylex(parser_state *p) pushback(p, c); gvar: tokfix(p); - pylval.id = intern_cstr(tok(p)); + pylval.id = intern(tok(p), toklen(p)); return tGVAR; case '&': /* $&: last match */ @@ -5942,7 +5931,7 @@ parser_yylex(parser_state *p) if (IS_LABEL_SUFFIX(0)) { p->lstate = EXPR_END; tokfix(p); - pylval.id = intern_cstr(tok(p)); + pylval.id = intern(tok(p), toklen(p)); return tIDENTIFIER; } } @@ -6001,7 +5990,7 @@ parser_yylex(parser_state *p) } } { - mrb_sym ident = intern_cstr(tok(p)); + mrb_sym ident = intern(tok(p), toklen(p)); pylval.id = ident; if (last_state != EXPR_DOT && ISLOWER(tok(p)[0]) && local_var_p(p, ident)) { diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index e2388f026..c1ddb553a 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -390,7 +390,7 @@ void mrb_mruby_eval_gem_init(mrb_state* mrb) { mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3)); - mrb_define_method(mrb, mrb_class_get(mrb, "BasicObject"), "instance_eval", f_instance_eval, MRB_ARGS_ARG(1, 2)); + mrb_define_method(mrb, mrb_class_get(mrb, "BasicObject"), "instance_eval", f_instance_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK()); } void diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index e22985bd3..3c17b59dd 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -409,7 +409,7 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb) c = mrb_define_class(mrb, "Fiber", mrb->object_class); MRB_SET_INSTANCE_TT(c, MRB_TT_FIBER); - mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE()); + mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY()); mrb_define_method(mrb, c, "transfer", fiber_transfer, MRB_ARGS_ANY()); mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE()); diff --git a/mrbgems/mruby-hash-ext/mrbgem.rake b/mrbgems/mruby-hash-ext/mrbgem.rake index 103410ab9..e0681c1cb 100644 --- a/mrbgems/mruby-hash-ext/mrbgem.rake +++ b/mrbgems/mruby-hash-ext/mrbgem.rake @@ -2,7 +2,5 @@ MRuby::Gem::Specification.new('mruby-hash-ext') do |spec| spec.license = 'MIT' spec.author = 'mruby developers' spec.summary = 'Hash class extension' - spec.add_dependency 'mruby-enum-ext', core: 'mruby-enum-ext' spec.add_dependency 'mruby-array-ext', core: 'mruby-array-ext' - spec.add_test_dependency 'mruby-enumerator', core: 'mruby-enumerator' end diff --git a/mrbgems/mruby-hash-ext/test/hash.rb b/mrbgems/mruby-hash-ext/test/hash.rb index b5d0aaaf8..fdf4c57a8 100644 --- a/mrbgems/mruby-hash-ext/test/hash.rb +++ b/mrbgems/mruby-hash-ext/test/hash.rb @@ -269,10 +269,8 @@ assert("Hash#transform_keys") do h.transform_keys{|k| k+"!"}) assert_equal({1 => 100, 2 => 200}, h.transform_keys{|k|k.to_i}) - assert_equal({"1.0" => 100, "2.1" => 200}, - h.transform_keys.with_index{|k, i| "#{k}.#{i}"}) - assert_equal(h, h.transform_keys!{|k|k.to_i}) - assert_equal(h, {1 => 100, 2 => 200}) + assert_same(h, h.transform_keys!{|k|k.to_i}) + assert_equal({1 => 100, 2 => 200}, h) end assert("Hash#transform_values") do @@ -281,9 +279,7 @@ assert("Hash#transform_values") do h.transform_values{|v| v * v + 1}) assert_equal({a: "1", b: "2", c: "3"}, h.transform_values{|v|v.to_s}) - assert_equal({a: "1.0", b: "2.1", c: "3.2"}, - h.transform_values.with_index{|v, i| "#{v}.#{i}"}) - assert_equal(h, h.transform_values!{|v|v.to_s}) + assert_same(h, h.transform_values!{|v|v.to_s}) assert_equal({a: "1", b: "2", c: "3"}, h) end diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index f9633535c..f9ccb6148 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -474,7 +474,7 @@ mrb_init_file(mrb_state *mrb) io = mrb_class_get(mrb, "IO"); file = mrb_define_class(mrb, "File", io); MRB_SET_INSTANCE_TT(file, MRB_TT_DATA); - mrb_define_class_method(mrb, file, "umask", mrb_file_s_umask, MRB_ARGS_REQ(1)); + mrb_define_class_method(mrb, file, "umask", mrb_file_s_umask, MRB_ARGS_OPT(1)); mrb_define_class_method(mrb, file, "delete", mrb_file_s_unlink, MRB_ARGS_ANY()); mrb_define_class_method(mrb, file, "unlink", mrb_file_s_unlink, MRB_ARGS_ANY()); mrb_define_class_method(mrb, file, "rename", mrb_file_s_rename, MRB_ARGS_REQ(2)); diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 3a6932b3a..5bc88e047 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -1321,23 +1321,23 @@ mrb_init_io(mrb_state *mrb) MRB_SET_INSTANCE_TT(io, MRB_TT_DATA); mrb_include_module(mrb, io, mrb_module_get(mrb, "Enumerable")); /* 15.2.20.3 */ - mrb_define_class_method(mrb, io, "_popen", mrb_io_s_popen, MRB_ARGS_ANY()); + mrb_define_class_method(mrb, io, "_popen", mrb_io_s_popen, MRB_ARGS_ARG(1,2)); mrb_define_class_method(mrb, io, "_sysclose", mrb_io_s_sysclose, MRB_ARGS_REQ(1)); - mrb_define_class_method(mrb, io, "for_fd", mrb_io_s_for_fd, MRB_ARGS_ANY()); - mrb_define_class_method(mrb, io, "select", mrb_io_s_select, MRB_ARGS_ANY()); - mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ANY()); + mrb_define_class_method(mrb, io, "for_fd", mrb_io_s_for_fd, MRB_ARGS_ARG(1,2)); + mrb_define_class_method(mrb, io, "select", mrb_io_s_select, MRB_ARGS_ARG(1,3)); + mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ARG(1,2)); #if !defined(_WIN32) && !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) mrb_define_class_method(mrb, io, "_pipe", mrb_io_s_pipe, MRB_ARGS_NONE()); #endif - mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ANY()); /* 15.2.20.5.21 (x)*/ + mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ARG(1,2)); /* 15.2.20.5.21 (x)*/ mrb_define_method(mrb, io, "initialize_copy", mrb_io_initialize_copy, MRB_ARGS_REQ(1)); mrb_define_method(mrb, io, "_check_readable", mrb_io_check_readable, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "isatty", mrb_io_isatty, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "sync", mrb_io_sync, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "sync=", mrb_io_set_sync, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, io, "sysread", mrb_io_sysread, MRB_ARGS_ANY()); - mrb_define_method(mrb, io, "sysseek", mrb_io_sysseek, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, io, "sysread", mrb_io_sysread, MRB_ARGS_ARG(1,1)); + mrb_define_method(mrb, io, "sysseek", mrb_io_sysseek, MRB_ARGS_ARG(1,1)); mrb_define_method(mrb, io, "syswrite", mrb_io_syswrite, MRB_ARGS_REQ(1)); mrb_define_method(mrb, io, "close", mrb_io_close, MRB_ARGS_NONE()); /* 15.2.20.5.1 */ mrb_define_method(mrb, io, "close_write", mrb_io_close_write, MRB_ARGS_NONE()); diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c index a2af6b46f..427740c1c 100644 --- a/mrbgems/mruby-kernel-ext/src/kernel.c +++ b/mrbgems/mruby-kernel-ext/src/kernel.c @@ -213,7 +213,7 @@ mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2)); mrb_define_module_function(mrb, krn, "caller", mrb_f_caller, MRB_ARGS_OPT(2)); mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); - mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ANY()); + mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ARG(1,1)); #ifndef MRB_WITHOUT_FLOAT mrb_define_module_function(mrb, krn, "Float", mrb_f_float, MRB_ARGS_REQ(1)); #endif diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index 3f22596eb..bca8ab34c 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -694,8 +694,8 @@ mrb_mruby_metaprog_gem_init(mrb_state* mrb) mrb_define_method(mrb, krn, "protected_methods", mrb_obj_protected_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.37 */ mrb_define_method(mrb, krn, "public_methods", mrb_obj_public_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.38 */ mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.45 */ - mrb_define_method(mrb, krn, "define_singleton_method", mod_define_singleton_method, MRB_ARGS_ANY()); - mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.44 */ + mrb_define_method(mrb, krn, "define_singleton_method", mod_define_singleton_method, MRB_ARGS_REQ(1)|MRB_ARGS_BLOCK()); + mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_REQ(1)|MRB_ARGS_REST()|MRB_ARGS_BLOCK()); /* 15.3.1.3.44 */ mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_OPT(1)); /* 15.2.2.4.19 */ mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */ diff --git a/mrbgems/mruby-proc-ext/src/proc.c b/mrbgems/mruby-proc-ext/src/proc.c index a7faeebea..424906c00 100644 --- a/mrbgems/mruby-proc-ext/src/proc.c +++ b/mrbgems/mruby-proc-ext/src/proc.c @@ -175,8 +175,8 @@ mrb_mruby_proc_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, p, "inspect", mrb_proc_inspect, MRB_ARGS_NONE()); mrb_define_method(mrb, p, "parameters", mrb_proc_parameters, MRB_ARGS_NONE()); - mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()); - mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()); + mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); + mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); } void diff --git a/mrbgems/mruby-sprintf/src/kernel.c b/mrbgems/mruby-sprintf/src/kernel.c index 946b43a8a..a0f0a78ba 100644 --- a/mrbgems/mruby-sprintf/src/kernel.c +++ b/mrbgems/mruby-sprintf/src/kernel.c @@ -18,8 +18,8 @@ mrb_mruby_sprintf_gem_init(mrb_state* mrb) } krn = mrb->kernel_module; - mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, MRB_ARGS_ANY()); - mrb_define_method(mrb, krn, "format", mrb_f_sprintf, MRB_ARGS_ANY()); + mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, MRB_ARGS_REQ(1)|MRB_ARGS_REST()); + mrb_define_method(mrb, krn, "format", mrb_f_sprintf, MRB_ARGS_REQ(1)|MRB_ARGS_REST()); } void diff --git a/mrbgems/mruby-struct/mrblib/struct.rb b/mrbgems/mruby-struct/mrblib/struct.rb index 7682ac033..21cbb47ed 100644 --- a/mrbgems/mruby-struct/mrblib/struct.rb +++ b/mrbgems/mruby-struct/mrblib/struct.rb @@ -57,7 +57,7 @@ if Object.const_defined?(:Struct) end buf = [] self.each_pair do |k,v| - buf.push [k.to_s + "=" + v._inspect(recur_list)] + buf.push k.to_s + "=" + v._inspect(recur_list) end str + buf.join(", ") + ">" end diff --git a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb index 4b4cf83fe..99fa275d5 100644 --- a/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +++ b/mrbgems/mruby-symbol-ext/mrblib/symbol.rb @@ -10,7 +10,7 @@ class Symbol # Same as <code>sym.to_s.capitalize.intern</code>. def capitalize - self.to_s.capitalize.to_sym + (self.to_s.capitalize! || self).to_sym end ## @@ -20,7 +20,7 @@ class Symbol # Same as <code>sym.to_s.downcase.intern</code>. def downcase - self.to_s.downcase.to_sym + (self.to_s.downcase! || self).to_sym end ## @@ -30,7 +30,7 @@ class Symbol # Same as <code>sym.to_s.upcase.intern</code>. def upcase - self.to_s.upcase.to_sym + (self.to_s.upcase! || self).to_sym end ## @@ -41,7 +41,7 @@ class Symbol def casecmp(other) return nil unless other.kind_of?(Symbol) - lhs = self.to_s.upcase + lhs = self.to_s; lhs.upcase! rhs = other.to_s.upcase lhs <=> rhs end diff --git a/src/array.c b/src/array.c index 85481fe9e..8190c2416 100644 --- a/src/array.c +++ b/src/array.c @@ -631,11 +631,13 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) ptr = a->as.heap.ptr; } else { + mrb_bool same = vals == ARY_PTR(a); ary_modify(mrb, a); if (ARY_CAPA(a) < len + alen) ary_expand_capa(mrb, a, len + alen); ptr = ARY_PTR(a); value_move(ptr + alen, ptr, len); + if (same) vals = ptr; } array_copy(ptr, vals, alen); ARY_SET_LEN(a, len+alen); diff --git a/src/class.c b/src/class.c index 2656806d2..e731fde59 100644 --- a/src/class.c +++ b/src/class.c @@ -65,23 +65,21 @@ mrb_class_name_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb name = mrb_symbol_value(id); } else { - const char *n; - mrb_int len; - mrb_value outer_name = mrb_class_path(mrb, outer); - - if (mrb_nil_p(outer_name)) { /* unnamed outer class */ + name = mrb_class_path(mrb, outer); + if (mrb_nil_p(name)) { /* unnamed outer class */ if (outer != mrb->object_class && outer != c) { mrb_obj_iv_set_force(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"), mrb_obj_value(outer)); } return; } - n = mrb_sym_name_len(mrb, id, &len); - name = mrb_str_new_capa(mrb, RSTRING_LEN(outer_name) + 2 + len); - mrb_str_cat_str(mrb, name, outer_name); - mrb_str_cat_lit(mrb, name, "::"); - mrb_str_cat(mrb, name, n, len); - MRB_SET_FROZEN_FLAG(mrb_obj_ptr(name)); + else { + mrb_int len; + const char *n = mrb_sym_name_len(mrb, id, &len); + + mrb_str_cat_lit(mrb, name, "::"); + mrb_str_cat(mrb, name, n, len); + } } mrb_obj_iv_set_force(mrb, (struct RObject*)c, nsym, name); } @@ -1718,7 +1716,7 @@ mrb_class_path(mrb_state *mrb, struct RClass *c) /* toplevel class/module */ return mrb_sym_str(mrb, mrb_symbol(path)); } - return path; + return mrb_str_dup(mrb, path); } MRB_API struct RClass* @@ -1885,8 +1883,7 @@ mrb_mod_to_s(mrb_state *mrb, mrb_value klass) return mrb_str_cat_lit(mrb, str, ">"); } else { - mrb_value str = class_name_str(mrb, mrb_class_ptr(klass)); - return mrb_frozen_p(mrb_basic_ptr(str)) ? mrb_str_dup(mrb, str) : str; + return class_name_str(mrb, mrb_class_ptr(klass)); } } diff --git a/src/error.c b/src/error.c index 97a156687..43b09ec66 100644 --- a/src/error.c +++ b/src/error.c @@ -594,7 +594,7 @@ mrb_init_exception(mrb_state *mrb) mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ MRB_SET_INSTANCE_TT(exception, MRB_TT_EXCEPTION); mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_OPT(1)); - mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ANY()); + mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_OPT(1)); mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_OPT(1)); mrb_define_method(mrb, exception, "to_s", exc_to_s, MRB_ARGS_NONE()); mrb_define_method(mrb, exception, "message", exc_message, MRB_ARGS_NONE()); diff --git a/src/hash.c b/src/hash.c index 21e34a5ea..d94fc23b0 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1414,7 +1414,7 @@ mrb_init_hash(mrb_state *mrb) mrb_define_method(mrb, h, "[]", mrb_hash_aget, MRB_ARGS_REQ(1)); /* 15.2.13.4.2 */ mrb_define_method(mrb, h, "[]=", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.3 */ mrb_define_method(mrb, h, "clear", mrb_hash_clear, MRB_ARGS_NONE()); /* 15.2.13.4.4 */ - mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_ANY()); /* 15.2.13.4.5 */ + mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_OPT(1)); /* 15.2.13.4.5 */ mrb_define_method(mrb, h, "default=", mrb_hash_set_default, MRB_ARGS_REQ(1)); /* 15.2.13.4.6 */ mrb_define_method(mrb, h, "default_proc", mrb_hash_default_proc,MRB_ARGS_NONE()); /* 15.2.13.4.7 */ mrb_define_method(mrb, h, "default_proc=", mrb_hash_set_default_proc,MRB_ARGS_REQ(1)); /* 15.2.13.4.7 */ @@ -1423,7 +1423,7 @@ mrb_init_hash(mrb_state *mrb) mrb_define_method(mrb, h, "has_key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.13 */ mrb_define_method(mrb, h, "has_value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.14 */ mrb_define_method(mrb, h, "include?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.15 */ - mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1)); /* 15.2.13.4.16 */ + mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); /* 15.2.13.4.16 */ mrb_define_method(mrb, h, "key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.18 */ mrb_define_method(mrb, h, "keys", mrb_hash_keys, MRB_ARGS_NONE()); /* 15.2.13.4.19 */ mrb_define_method(mrb, h, "length", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.20 */ diff --git a/src/kernel.c b/src/kernel.c index c88a457f0..69a7311e0 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -685,7 +685,6 @@ mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args) * r.xxiii #=> 23 * r.mm #=> 2000 */ -#ifdef MRB_DEFAULT_METHOD_MISSING static mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod) { @@ -698,7 +697,6 @@ mrb_obj_missing(mrb_state *mrb, mrb_value mod) /* not reached */ return mrb_nil_value(); } -#endif static inline mrb_bool basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) @@ -791,14 +789,12 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.24 */ mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */ -#ifdef MRB_DEFAULT_METHOD_MISSING mrb_define_method(mrb, krn, "method_missing", mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ -#endif mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */ mrb_define_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 15.3.1.3.40 */ mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,MRB_ARGS_REQ(1)); /* 15.3.1.3.41 */ - mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ANY()); /* 15.3.1.3.43 */ + mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ARG(1,1)); /* 15.3.1.3.43 */ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */ mrb_define_method(mrb, krn, "__case_eqq", mrb_obj_ceqq, MRB_ARGS_REQ(1)); /* internal */ mrb_define_method(mrb, krn, "__to_int", mrb_to_int, MRB_ARGS_NONE()); /* internal */ diff --git a/src/numeric.c b/src/numeric.c index 60925841f..6cfd64280 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1637,10 +1637,10 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */ mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE()); #ifndef MRB_WITHOUT_FLOAT - mrb_define_method(mrb, integer, "ceil", int_to_i, MRB_ARGS_REQ(1)); /* 15.2.8.3.8 (x) */ - mrb_define_method(mrb, integer, "floor", int_to_i, MRB_ARGS_REQ(1)); /* 15.2.8.3.10 (x) */ - mrb_define_method(mrb, integer, "round", int_to_i, MRB_ARGS_REQ(1)); /* 15.2.8.3.12 (x) */ - mrb_define_method(mrb, integer, "truncate", int_to_i, MRB_ARGS_REQ(1)); /* 15.2.8.3.15 (x) */ + mrb_define_method(mrb, integer, "ceil", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.8 (x) */ + mrb_define_method(mrb, integer, "floor", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.10 (x) */ + mrb_define_method(mrb, integer, "round", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.12 (x) */ + mrb_define_method(mrb, integer, "truncate", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.15 (x) */ #endif /* Fixnum Class */ diff --git a/src/string.c b/src/string.c index 6ab9a1ff7..724aad745 100644 --- a/src/string.c +++ b/src/string.c @@ -246,6 +246,28 @@ str_decref(mrb_state *mrb, mrb_shared_string *shared) } static void +str_modify_keep_ascii(mrb_state *mrb, struct RString *s) +{ + if (RSTR_SHARED_P(s)) { + mrb_shared_string *shared = s->as.heap.aux.shared; + + if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) { + s->as.heap.aux.capa = shared->capa; + s->as.heap.ptr[s->as.heap.len] = '\0'; + RSTR_UNSET_SHARED_FLAG(s); + mrb_free(mrb, shared); + } + else { + str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len); + str_decref(mrb, shared); + } + } + else if (RSTR_NOFREE_P(s) || RSTR_FSHARED_P(s)) { + str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len); + } +} + +static void check_null_byte(mrb_state *mrb, mrb_value str) { mrb_to_str(mrb, str); @@ -330,16 +352,21 @@ utf8_strlen(mrb_value str) static mrb_int chars2bytes(mrb_value s, mrb_int off, mrb_int idx) { - mrb_int i, b, n; - const char *p = RSTRING_PTR(s) + off; - const char *e = RSTRING_END(s); + if (RSTR_ASCII_P(mrb_str_ptr(s))) { + return idx; + } + else { + mrb_int i, b, n; + const char *p = RSTRING_PTR(s) + off; + const char *e = RSTRING_END(s); - for (b=i=0; p<e && i<idx; i++) { - n = utf8len(p, e); - b += n; - p += n; + for (b=i=0; p<e && i<idx; i++) { + n = utf8len(p, e); + b += n; + p += n; + } + return b; } - return b; } /* map byte offset to character index */ @@ -809,22 +836,7 @@ MRB_API void mrb_str_modify_keep_ascii(mrb_state *mrb, struct RString *s) { mrb_check_frozen(mrb, s); - if (RSTR_SHARED_P(s)) { - mrb_shared_string *shared = s->as.heap.aux.shared; - - if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) { - s->as.heap.aux.capa = shared->capa; - s->as.heap.ptr[s->as.heap.len] = '\0'; - mrb_free(mrb, shared); - } - else { - str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len); - str_decref(mrb, shared); - } - } - else if (RSTR_NOFREE_P(s) || RSTR_FSHARED_P(s)) { - str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len); - } + str_modify_keep_ascii(mrb, s); } MRB_API void @@ -1223,8 +1235,6 @@ mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen) * str[fixnum] => fixnum or nil * str[fixnum, fixnum] => new_str or nil * str[range] => new_str or nil - * str[regexp] => new_str or nil - * str[regexp, fixnum] => new_str or nil * str[other_str] => new_str or nil * str.slice(fixnum) => fixnum or nil * str.slice(fixnum, fixnum) => new_str or nil @@ -1432,8 +1442,6 @@ mrb_str_aset(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_ * str[fixnum] = replace * str[fixnum, fixnum] = replace * str[range] = replace - * str[regexp] = replace - * str[regexp, fixnum] = replace * str[other_str] = replace * * Modify +self+ by replacing the content of +self+. @@ -1941,15 +1949,10 @@ mrb_str_intern(mrb_state *mrb, mrb_value self) MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj) { - mrb_value str; - if (mrb_string_p(obj)) { return obj; } - str = mrb_funcall(mrb, obj, "to_s", 0); - if (!mrb_string_p(str)) - return mrb_any_to_s(mrb, obj); - return str; + return mrb_str_to_str(mrb, obj); } MRB_API mrb_value @@ -2103,23 +2106,18 @@ mrb_str_rindex(mrb_state *mrb, mrb_value str) /* * call-seq: - * str.split(pattern="\n", [limit]) => anArray + * str.split(separator=nil, [limit]) => anArray * * Divides <i>str</i> into substrings based on a delimiter, returning an array * of these substrings. * - * If <i>pattern</i> is a <code>String</code>, then its contents are used as - * the delimiter when splitting <i>str</i>. If <i>pattern</i> is a single + * If <i>separator</i> is a <code>String</code>, then its contents are used as + * the delimiter when splitting <i>str</i>. If <i>separator</i> is a single * space, <i>str</i> is split on whitespace, with leading whitespace and runs * of contiguous whitespace characters ignored. * - * If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the - * pattern matches. Whenever the pattern matches a zero-length string, - * <i>str</i> is split into individual characters. - * - * If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If - * <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is - * split on whitespace as if ' ' were specified. + * If <i>separator</i> is omitted or <code>nil</code> (which is the default), + * <i>str</i> is split on whitespace as if ' ' were specified. * * If the <i>limit</i> parameter is omitted, trailing null fields are * suppressed. If <i>limit</i> is a positive number, at most that number of @@ -2130,9 +2128,6 @@ mrb_str_rindex(mrb_state *mrb, mrb_value str) * * " now's the time".split #=> ["now's", "the", "time"] * " now's the time".split(' ') #=> ["now's", "the", "time"] - * " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"] - * "hello".split(//) #=> ["h", "e", "l", "l", "o"] - * "hello".split(//, 3) #=> ["h", "e", "llo"] * * "mellow yellow".split("ello") #=> ["m", "w y", "w"] * "1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"] @@ -2145,7 +2140,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) { mrb_int argc; mrb_value spat = mrb_nil_value(); - enum {awk, string, regexp} split_type = string; + enum {awk, string} split_type = string; mrb_int i = 0; mrb_int beg; mrb_int end; @@ -2434,15 +2429,12 @@ mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr) if (p[len] == '\0') { return p; } - if (mrb_frozen_p(ps) || RSTR_CAPA(ps) == len) { - ps = str_new(mrb, NULL, len+1); - memcpy(RSTR_PTR(ps), p, len); - RSTR_SET_LEN(ps, len); - *ptr = mrb_obj_value(ps); - } - else { - mrb_str_modify(mrb, ps); - } + + /* + * Even after str_modify_keep_ascii(), NULL termination is not ensured if + * RSTR_SET_LEN() is used explicitly (e.g. String#delete_suffix!). + */ + str_modify_keep_ascii(mrb, ps); RSTR_PTR(ps)[len] = '\0'; return RSTR_PTR(ps); } @@ -2506,8 +2498,6 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck) char buf[DBL_DIG * 4 + 10]; double d; - enum {max_width = 20}; - if (!p) return 0.0; while (ISSPACE(*p)) p++; diff --git a/src/symbol.c b/src/symbol.c index 2696b5210..a4c453d32 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -517,18 +517,14 @@ mrb_sym_str(mrb_state *mrb, mrb_sym sym) { mrb_int len; const char *name = mrb_sym_name_len(mrb, sym, &len); - mrb_value str; if (!name) return mrb_undef_value(); /* can't happen */ if (SYMBOL_INLINE_P(sym)) { - str = mrb_str_new(mrb, name, len); + mrb_value str = mrb_str_new(mrb, name, len); RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } - else { - str = mrb_str_new_static(mrb, name, len); - } - MRB_SET_FROZEN_FLAG(mrb_str_ptr(str)); - return str; + return mrb_str_new_static(mrb, name, len); } static const char* diff --git a/src/variable.c b/src/variable.c index 8fc01fe2d..030aa7b00 100644 --- a/src/variable.c +++ b/src/variable.c @@ -1123,7 +1123,7 @@ mrb_class_find_path(mrb_state *mrb, struct RClass *c) iv_del(mrb, c->iv, mrb_intern_lit(mrb, "__outer__"), NULL); iv_put(mrb, c->iv, mrb_intern_lit(mrb, "__classname__"), path); mrb_field_write_barrier_value(mrb, (struct RBasic*)c, path); - MRB_SET_FROZEN_FLAG(mrb_obj_ptr(path)); + path = mrb_str_dup(mrb, path); } return path; } diff --git a/test/t/numeric.rb b/test/t/numeric.rb index 5b1e79153..af44a2e1a 100644 --- a/test/t/numeric.rb +++ b/test/t/numeric.rb @@ -1,7 +1,7 @@ ## # Numeric ISO Test -def assert_step(exp, receiver, args, inf: false) +def assert_step(exp, receiver, args, inf: false) act = [] ret = receiver.step(*args) do |i| act << i |
