VALUE rb_f_eval(VALUE self, SEL sel, int argc, VALUE *argv) { VALUE src, scope, vfile, vline; const char *file = "(eval)"; int line = 1; rb_scan_args(argc, argv, "13", &src, &scope, &vfile, &vline); if (rb_safe_level() >= 4) { StringValue(src); if (!NIL_P(scope) && !OBJ_TAINTED(scope)) { rb_raise(rb_eSecurityError, "Insecure: can't modify trusted binding"); } } else { SafeStringValue(src); } if (argc >= 3) { StringValue(vfile); } if (argc >= 4) { line = NUM2INT(vline); } if (!NIL_P(vfile)) { file = RSTRING_PTR(vfile); } VALUE klass; switch (TYPE(self)) { case T_CLASS: case T_MODULE: klass = self; break; default: klass = 0; break; } #if 0 if (!NIL_P(scope)) { rb_vm_binding_t *t = rb_vm_current_binding(); assert(t != NULL); rb_vm_binding_t *tmp = rb_vm_create_binding(t->self, t->block, GetBindingPtr(scope), 0, NULL, false); GC_WB(&tmp->locals, t->locals); scope = rb_binding_new_from_binding(tmp); } #endif return eval_string(self, klass, src, scope, file, line); }
void Init_Binding(void) { rb_cBinding = rb_define_class("Binding", rb_cObject); rb_undef_alloc_func(rb_cBinding); rb_undef_method(CLASS_OF(rb_cBinding), "new"); rb_objc_define_method(rb_cBinding, "clone", binding_clone, 0); rb_objc_define_method(rb_cBinding, "dup", binding_dup, 0); rb_objc_define_method(rb_cBinding, "eval", bind_eval, -1); rb_objc_define_module_function(rb_mKernel, "binding", rb_f_binding, 0); rb_vm_binding_t *binding = (rb_vm_binding_t *)xmalloc( sizeof(rb_vm_binding_t)); GC_WB(&binding->self, rb_vm_top_self()); binding->outer_stack = NULL; rb_define_global_const("TOPLEVEL_BINDING", rb_binding_new_from_binding(binding)); }