From b5ffbea4c2f914409465aa87d906f12b5a57972e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 18:32:42 +0900 Subject: remove Ruby version of Kernel#instance_eval --- mrblib/kernel.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'mrblib/kernel.rb') diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index e769741b7..f5099c561 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -33,10 +33,10 @@ module Kernel #end # 15.3.1.3.18 - def instance_eval(string=nil, &block) - ### *** TODO *** ### - raise "Not implemented yet" - end + #def instance_eval(string=nil, &block) + # ### *** TODO *** ### + # raise "Not implemented yet" + #end ## # Alias for +Kernel.lambda+. -- cgit v1.2.3 From a74ab0c2daf1855b968ef8498b9161eadb04a386 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 23:39:54 +0900 Subject: Kernel.eval to raise NotImplementedError --- mrblib/error.rb | 7 +++++++ mrblib/kernel.rb | 14 +++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'mrblib/kernel.rb') diff --git a/mrblib/error.rb b/mrblib/error.rb index 5660d8235..3fa7f21e3 100644 --- a/mrblib/error.rb +++ b/mrblib/error.rb @@ -12,3 +12,10 @@ class Exception self.new(*args, &block) end end + +# ISO 15.2.37 +class ScriptError < Exception +end + +class NotImplementedError < ScriptError +end diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index f5099c561..c263ec403 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -24,6 +24,11 @@ module Kernel end end + # 15.3.1.2.3 + def self.eval(s) + raise NotImplementedError.new("eval not implemented") + end + ## # Alias for +send+. # @@ -32,11 +37,10 @@ module Kernel ### *** TODO *** ### #end - # 15.3.1.3.18 - #def instance_eval(string=nil, &block) - # ### *** TODO *** ### - # raise "Not implemented yet" - #end + # 15.3.1.3.12 + def eval(s) + Kernel.eval(s) + end ## # Alias for +Kernel.lambda+. -- cgit v1.2.3 From b11d4647e91bdcd6dfaecfaccdc4c350b1bc413f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 15:41:22 +0900 Subject: ISO conforming lambda --- mrblib/kernel.rb | 20 -------------------- src/kernel.c | 18 ------------------ src/proc.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 38 deletions(-) (limited to 'mrblib/kernel.rb') diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index c263ec403..f29a80973 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -3,17 +3,6 @@ # # ISO 15.3.1 module Kernel - - ## - # Takes the given block, create a lambda - # out of it and +call+ it. - # - # ISO 15.3.1.2.6 - def self.lambda(&block) - ### *** TODO *** ### - block # dummy - end - ## # Calls the given block repetitively. # @@ -42,15 +31,6 @@ module Kernel Kernel.eval(s) end - ## - # Alias for +Kernel.lambda+. - # - # ISO 15.3.1.3.27 - def lambda(&block) - ### *** TODO *** ### - block # dummy - end - ## # Alias for +Kernel.loop+. # diff --git a/src/kernel.c b/src/kernel.c index b5bde628a..45eda6d2f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -794,22 +794,6 @@ mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self) } } -/* 15.3.1.2.6 */ -/* 15.3.1.3.27 */ -/* - * call-seq: - * lambda { |...| block } -> a_proc - * - * Equivalent to Proc.new, except the resulting Proc objects - * check the number of parameters passed when called. - */ -mrb_value -proc_lambda(mrb_state *mrb, mrb_value self) -{ - //return mrb_block_lambda(); - return mrb_nil_value(); /* dummy */ -} - static void method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) { @@ -1205,7 +1189,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.2 */ mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, ARGS_NONE()); /* 15.3.1.2.4 */ mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.5 */ - mrb_define_class_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ ; /* 15.3.1.2.11 */ mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, ARGS_ANY()); /* 15.3.1.2.12 */ @@ -1236,7 +1219,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, ARGS_REQ(1)); /* 15.3.1.3.24 */ mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.3.25 */ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, ARGS_REQ(1)); /* 15.3.1.3.26 */ - mrb_define_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.3.27 */ mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, ARGS_ANY()); /* 15.3.1.3.31 */ mrb_define_method(mrb, krn, "nil?", mrb_false, ARGS_NONE()); /* 15.3.1.3.32 */ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, ARGS_NONE()); /* 15.3.1.3.33 */ diff --git a/src/proc.c b/src/proc.c index c64bb88ac..98f753ac6 100644 --- a/src/proc.c +++ b/src/proc.c @@ -59,6 +59,7 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) static inline void proc_copy(struct RProc *a, struct RProc *b) { + a->flags = b->flags; a->body = b->body; a->target_class = b->target_class; a->env = b->env; @@ -111,6 +112,35 @@ mrb_proc_iseq(mrb_state *mrb, struct RProc *p) return p->body.irep->iseq; } +/* 15.3.1.2.6 */ +/* 15.3.1.3.27 */ +/* + * call-seq: + * lambda { |...| block } -> a_proc + * + * Equivalent to Proc.new, except the resulting Proc objects + * check the number of parameters passed when called. + */ +static mrb_value +proc_lambda(mrb_state *mrb, mrb_value self) +{ + mrb_value blk; + struct RProc *p; + + mrb_get_args(mrb, "&", &blk); + if (mrb_nil_p(blk)) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); + } + p = mrb_proc_ptr(blk); + if (!MRB_PROC_STRICT_P(p)) { + struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c); + proc_copy(p2, p); + p2->flags |= MRB_PROC_STRICT; + return mrb_obj_value(p2); + } + return self; +} + void mrb_init_proc(mrb_state *mrb) { @@ -136,4 +166,7 @@ mrb_init_proc(mrb_state *mrb) m = mrb_proc_new(mrb, call_irep); mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "call"), m); mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "[]"), m); + + mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ + mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.3.27 */ } -- cgit v1.2.3 From 6f22a61135fd077c1dcff2dec92ab215e3a83d79 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 15:42:51 +0900 Subject: __send__ added --- mrblib/kernel.rb | 8 -------- src/kernel.c | 1 + 2 files changed, 1 insertion(+), 8 deletions(-) (limited to 'mrblib/kernel.rb') diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index f29a80973..ad3bc72f7 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -18,14 +18,6 @@ module Kernel raise NotImplementedError.new("eval not implemented") end - ## - # Alias for +send+. - # - # ISO 15.3.1.3.4 - #def __send__(symbol, *args, &block) - ### *** TODO *** ### - #end - # 15.3.1.3.12 def eval(s) Kernel.eval(s) diff --git a/src/kernel.c b/src/kernel.c index 45eda6d2f..5b65714b6 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1229,6 +1229,7 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,ARGS_REQ(1)); /* 15.3.1.3.41 */ mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, ARGS_ANY()); /* 15.3.1.3.43 */ mrb_define_method(mrb, krn, "send", mrb_f_send, ARGS_ANY()); /* 15.3.1.3.44 */ + mrb_define_method(mrb, krn, "__send__", mrb_f_send, ARGS_ANY()); /* 15.3.1.3.4 */ mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, ARGS_ANY()); /* 15.3.1.3.45 */ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, ARGS_NONE()); /* 15.3.1.3.46 */ -- cgit v1.2.3