From 940eb786e4bfcd747480b2d3bffe541b537fb3fd Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 15:48:33 +0800 Subject: add Module#module_eval --- src/class.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/class.c b/src/class.c index 69aa31249..8338287ba 100644 --- a/src/class.c +++ b/src/class.c @@ -848,6 +848,21 @@ mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod) return class_instance_method_list(mrb, argc, argv, c, 0); } +mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); + +mrb_value +mrb_mod_module_eval(mrb_state *mrb, mrb_value mod) +{ + mrb_value a, b; + struct RClass *c; + + if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { + mrb_raise(mrb, E_NOTIMP_ERROR, "module_eval/class_eval with string not implemented"); + } + c = mrb_class_ptr(mod); + return mrb_yield_internal(mrb, b, 0, 0, mod, c); +} + mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value v) { @@ -1507,6 +1522,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */ + mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.35 */ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE()); mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, ARGS_NONE()); -- cgit v1.2.3 From 861bcad53a4f4c47942ba5ab0155c1594829ebd1 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 16:02:45 +0800 Subject: add Module#module_eval test --- test/t/module.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/t/module.rb b/test/t/module.rb index e666a1763..c2008cc67 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -151,6 +151,14 @@ assert('Module#instance_methods', '15.2.2.4.33') do r.class == Array and r.include?(:method3) and r.include?(:method2) end +assert('Module#module_eval', '15.2.2.4.35') do + module Test4ModuleEval + @a = 11 + @b = 12 + end + Test4ModuleEval.module_eval{ @a } == 11 and + Test4ModuleEval.module_eval{ @b } == 12 +end # Not ISO specified -- cgit v1.2.3 From 3fbeb298a6943c59567b0b3a8b8d50104858d8c1 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 16:12:11 +0800 Subject: add comments for Module#module_eval --- src/class.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/class.c b/src/class.c index 8338287ba..981bf270e 100644 --- a/src/class.c +++ b/src/class.c @@ -850,6 +850,17 @@ mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod) mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); +/* 15.2.2.4.35 */ +/* + * call-seq: + * mod.class_eval {| | block } -> obj + * mod.module_eval {| | block } -> obj + * + * Evaluates block in the context of _mod_. This can + * be used to add methods to a class. module_eval returns + * the result of evaluating its argument. + */ + mrb_value mrb_mod_module_eval(mrb_state *mrb, mrb_value mod) { -- cgit v1.2.3 From 1311c828c687e5d192ed6a14d50bd1864faf8df9 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 16:17:07 +0800 Subject: add Module#class_eval --- src/class.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class.c b/src/class.c index 981bf270e..a5b028105 100644 --- a/src/class.c +++ b/src/class.c @@ -1530,7 +1530,8 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */ mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, ARGS_REQ(1)); /* 15.2.2.4.28 */ mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */ - mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ + mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.15 */ + mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.35 */ -- cgit v1.2.3 From 053c104f2ba6aa0e94bd2c9e9fd17123746a8f43 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 16:27:32 +0800 Subject: add Module#class_eval test --- test/t/module.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/t/module.rb b/test/t/module.rb index c2008cc67..5e825c6b5 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -31,6 +31,22 @@ assert('Module#append_features', '15.2.2.4.10') do Test4AppendFeatures2.const_get(:Const4AppendFeatures2) == Test4AppendFeatures2 end +assert('Module#class_eval', '15.2.2.4.15') do + class Test4ClassEval + @a = 11 + @b = 12 + end + Test4ClassEval.class_eval do + def method1 + end + end + r = Test4ClassEval.instance_methods + Test4ClassEval.class_eval{ @a } == 11 and + Test4ClassEval.class_eval{ @b } == 12 and + r.class == Array and r.include?(:method1) +end + + assert('Module#class_variables', '15.2.2.4.19') do class Test4ClassVariables1 @@var1 = 1 -- cgit v1.2.3 From 83ecb2f078234bca084b934bb086e9f13cb967f6 Mon Sep 17 00:00:00 2001 From: shtirlic Date: Thu, 29 Nov 2012 19:03:00 +0400 Subject: Fix compile warnings in mirb Change last_char type to int Warnings mirb.c:174:7: warning: comparison is always false due to limited range of data type [-Wtype-limits] warning: comparison is always false due to limited range of data type [-Wtype-limits] --- tools/mirb/mirb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index 502400c72..d3903ef57 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -5,7 +5,7 @@ ** an interactive way and executes it ** immediately. It's a REPL... */ - + #include #include @@ -143,7 +143,7 @@ print_cmdline(int code_block_open) int main(void) { - char last_char; + int last_char; char ruby_code[1024] = { 0 }; char last_code_line[1024] = { 0 }; int char_index; @@ -156,7 +156,7 @@ main(void) print_hint(); - /* new interpreter instance */ + /* new interpreter instance */ mrb = mrb_open(); if (mrb == NULL) { fprintf(stderr, "Invalid mrb interpreter, exiting mirb"); @@ -207,7 +207,7 @@ main(void) parser->send = ruby_code + strlen(ruby_code); parser->lineno = 1; mrb_parser_parse(parser, cxt); - code_block_open = is_code_block_open(parser); + code_block_open = is_code_block_open(parser); if (code_block_open) { /* no evaluation of code */ -- cgit v1.2.3 From ee0563823d54b507c0dfdce4fbdb20c80fe3aadc Mon Sep 17 00:00:00 2001 From: Ryunosuke SATO Date: Fri, 30 Nov 2012 22:42:25 +0900 Subject: Stop warning: extra ';' outside of a function --- include/mruby/proc.h | 2 +- src/class.c | 2 +- src/hash.c | 4 ++-- src/variable.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 50e55f231..96f7ddbd7 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -52,7 +52,7 @@ struct RProc *mrb_closure_new(mrb_state*, mrb_irep*); void mrb_proc_copy(struct RProc *a, struct RProc *b); #include "mruby/khash.h" -KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1); +KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1) #if defined(__cplusplus) } /* extern "C" { */ diff --git a/src/class.c b/src/class.c index 69aa31249..1759914c3 100644 --- a/src/class.c +++ b/src/class.c @@ -15,7 +15,7 @@ #include "mruby/array.h" #include "error.h" -KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal); +KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) typedef struct fc_result { mrb_sym name; diff --git a/src/hash.c b/src/hash.c index c74ac837b..c7a419250 100644 --- a/src/hash.c +++ b/src/hash.c @@ -29,8 +29,8 @@ mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) return mrb_eql(mrb, a, b); } -KHASH_DECLARE(ht, mrb_value, mrb_value, 1); -KHASH_DEFINE (ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal); +KHASH_DECLARE(ht, mrb_value, mrb_value, 1) +KHASH_DEFINE (ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal) static void mrb_hash_modify(mrb_state *mrb, mrb_value hash); diff --git a/src/variable.c b/src/variable.c index 7d583da40..6907a8e2a 100644 --- a/src/variable.c +++ b/src/variable.c @@ -256,7 +256,7 @@ iv_free(mrb_state *mrb, iv_tbl *t) #endif KHASH_DECLARE(iv, mrb_sym, mrb_value, 1) -KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal); +KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) typedef struct iv_tbl { khash_t(iv) h; -- cgit v1.2.3 From 9704ceefcee91b4dbb71e559b507936c002489cf Mon Sep 17 00:00:00 2001 From: skandhas Date: Fri, 30 Nov 2012 22:11:41 +0800 Subject: remove incorrect pop() in codegen --- src/codegen.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/codegen.c b/src/codegen.c index fd41e3cb8..1e468867c 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1412,7 +1412,6 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, tree->cdr->cdr->car, VAL); pop(); gen_assignment(s, tree->car, cursp(), val); - if (val) pop(); dispatch(s, pos); break; } -- cgit v1.2.3 From a100352595794ec1f1a1aaa5ae1654bc29d21192 Mon Sep 17 00:00:00 2001 From: skandhas Date: Fri, 30 Nov 2012 22:31:35 +0800 Subject: add test for 'Abbreviated variable assignment as returns' --- test/t/syntax.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/t/syntax.rb b/test/t/syntax.rb index 47221d425..0501608e5 100644 --- a/test/t/syntax.rb +++ b/test/t/syntax.rb @@ -58,3 +58,14 @@ assert('Nested const reference') do Syntax4Const::CONST1 == "hello world" and Syntax4Const::Const2.new.const1 == "hello world" end + +assert('Abbreviated variable assignment as returns') do + module Syntax4AbbrVarAsgnAsReturns + class A + def b + @c ||= 1 + end + end + end + Syntax4AbbrVarAsgnAsReturns::A.new.b == 1 +end -- cgit v1.2.3 From 1d3f4b3ff7cbd3393a669698a252601b232bf553 Mon Sep 17 00:00:00 2001 From: Yukihiro Matz Matsumoto Date: Sat, 1 Dec 2012 12:10:29 +0900 Subject: Fix typos: invalide -> invalid; patch from @darashi; close #577 --- src/class.c | 2 +- src/string.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class.c b/src/class.c index 69aa31249..fbb7fb501 100644 --- a/src/class.c +++ b/src/class.c @@ -630,7 +630,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) } break; default: - mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalide argument specifier %c", c); + mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %c", c); break; } } diff --git a/src/string.c b/src/string.c index 425b79ca7..7ab6e5806 100644 --- a/src/string.c +++ b/src/string.c @@ -2511,7 +2511,7 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) return mrb_fixnum_value(result); } bad: - mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalide string for number(%s)", str); + mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%s)", str); /* not reached */ return mrb_fixnum_value(0); } @@ -2621,7 +2621,7 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, int badcheck) if (p == end) { if (badcheck) { bad: - mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalide string for float(%s)", p); + mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%s)", p); /* not reached */ } return d; -- cgit v1.2.3