/*
* call-seq:
* Method.load(String) => Method
*
* Load a Method from a String.
*/
static VALUE method_load(VALUE klass, VALUE str)
{
struct METHOD * method;
VALUE rarr = marshal_load(str);
VALUE * arr;
NODE * n;
VALUE retval;
if( ruby_safe_level >= 4
|| (ruby_safe_level >= 1 && OBJ_TAINTED(str)))
{
/* no playing with knives in the sandbox */
rb_raise(rb_eSecurityError, "Insecure: can't load method");
}
Check_Type(rarr, T_ARRAY);
if(RARRAY_LEN(rarr) != 6)
{
rb_raise(rb_eArgError, "corrupt data");
}
/* Create a METHOD object -- doesn't matter which method we use */
retval = rb_funcall(
rb_cObject, rb_intern("method"), 1, ID2SYM(rb_intern("__id__")));
Data_Get_Struct(retval, struct METHOD, method);
arr = RARRAY_PTR(rarr);
METHOD_OCLASS(method) =
rb_funcall(lookup_module_proc, rb_intern("call"), 1, arr[0]);
METHOD_RCLASS(method) =
rb_funcall(lookup_module_proc, rb_intern("call"), 1, arr[1]);
method->recv = arr[2];
method->id = SYM2ID(arr[3]);
method->oid = SYM2ID(arr[4]);
Data_Get_Struct(arr[5], NODE, n);
method->body = n;
if(klass == rb_cUnboundMethod)
{
retval = rb_funcall(retval, rb_intern("unbind"), 0);
}
return retval;
}