diff options
Diffstat (limited to 'src/kernel.c')
| -rw-r--r-- | src/kernel.c | 67 |
1 files changed, 18 insertions, 49 deletions
diff --git a/src/kernel.c b/src/kernel.c index bc8e0059b..30c1c8a67 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -269,12 +269,6 @@ mrb_f_send(mrb_state *mrb, mrb_value self) return mrb_funcall_with_block(mrb,self, mrb_string_value_ptr(mrb, name), argc, argv, block); } -static mrb_value -mrb_f_block_given_p(void) -{ - return mrb_false_value(); /* dummy */ -} - /* 15.3.1.2.2 */ /* 15.3.1.2.5 */ /* 15.3.1.3.6 */ @@ -302,7 +296,18 @@ mrb_f_block_given_p(void) static mrb_value mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self) { - return mrb_f_block_given_p(); + mrb_callinfo *ci = mrb->ci; + mrb_value *bp, *p; + + p = mrb->stbase + ci->stackidx; + bp = mrb->stbase + ci->stackidx + 1; + ci--; + if (ci <= mrb->cibase) return mrb_false_value(); + if (ci->argc > 0) { + bp += ci->argc; + } + if (mrb_nil_p(*bp)) return mrb_false_value(); + return mrb_true_value(); } /* 15.3.1.3.7 */ @@ -466,40 +471,6 @@ mrb_obj_dup(mrb_state *mrb, mrb_value obj) return dup; } -/* 15.3.1.2.3 */ -/* 15.3.1.3.12 */ -/* - * call-seq: - * eval(string [, binding [, filename [,lineno]]]) -> obj - * - * Evaluates the Ruby expression(s) in <em>string</em>. If - * <em>binding</em> is given, which must be a <code>Binding</code> - * object, the evaluation is performed in its context. If the - * optional <em>filename</em> and <em>lineno</em> parameters are - * present, they will be used when reporting syntax errors. - * - * def getBinding(str) - * return binding - * end - * str = "hello" - * eval "str + ' Fred'" #=> "hello Fred" - * eval "str + ' Fred'", getBinding("bye") #=> "bye Fred" - */ -mrb_value -mrb_f_eval(int argc, mrb_value *argv, mrb_value self) -{ - return mrb_false_value(); /* dummy */ -} -mrb_value -mrb_f_eval_m(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - return mrb_f_eval(argc, argv, self); -} - static mrb_value mrb_obj_extend(mrb_state *mrb, int argc, mrb_value *argv, mrb_value obj) { @@ -591,12 +562,10 @@ mrb_obj_init_copy(mrb_state *mrb, mrb_value self) /* 15.3.1.3.18 */ /* * call-seq: - * obj.instance_eval(string [, filename [, lineno]] ) -> obj * obj.instance_eval {| | block } -> obj * - * Evaluates a string containing Ruby source code, or the given block, - * within the context of the receiver (_obj_). In order to set the - * context, the variable +self+ is set to _obj_ while + * Evaluates the given block,within the context of the receiver (_obj_). + * In order to set the context, the variable +self+ is set to _obj_ while * the code is executing, giving the code access to _obj_'s * instance variables. In the version of <code>instance_eval</code> * that takes a +String+, the optional second and third @@ -614,9 +583,11 @@ mrb_obj_init_copy(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) { - mrb_value b; + mrb_value a, b; - mrb_get_args(mrb, "&", &b); + if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { + mrb_raise(mrb, mrb->eRuntimeError_class, "instance_eval with string not implemented"); + } return mrb_yield_with_self(mrb, b, 0, 0, self); } @@ -1370,7 +1341,6 @@ mrb_init_kernel(mrb_state *mrb) krn = mrb->kernel_module = mrb_define_module(mrb, "Kernel"); 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, "eval", mrb_f_eval_m, ARGS_ANY()); /* 15.3.1.2.3 */ 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 */ @@ -1393,7 +1363,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "dup", mrb_obj_dup, ARGS_NONE()); /* 15.3.1.3.9 */ mrb_define_method(mrb, krn, "eql?", mrb_obj_equal_m, ARGS_REQ(1)); /* 15.3.1.3.10 */ mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, ARGS_REQ(1)); /* 15.3.1.3.11 */ - mrb_define_method(mrb, krn, "eval", mrb_f_eval_m, ARGS_ANY()); /* 15.3.1.3.12 */ mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, ARGS_ANY()); /* 15.3.1.3.13 */ mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, ARGS_NONE()); /* 15.3.1.3.14 */ mrb_define_method(mrb, krn, "hash", mrb_obj_hash, ARGS_NONE()); /* 15.3.1.3.15 */ |
