//needs retesting public override object Call1(Class last_class, object recv, Frame caller, Proc block, object arg) { if (arg is Array) { ArgList argv = new ArgList(block, new object[] { recv }); argv.AddRange((Array)arg); return rb_f_sprintf.singleton.Calln(last_class, null, caller, argv); } return rb_f_sprintf.singleton.Call2(last_class, null, caller, block, recv, arg); }
internal static object method_missing(object recv, Frame caller, string methodId, ArgList args) { ArgList newargs = new ArgList(args.block); newargs.Add(new Symbol(methodId)); newargs.AddRange(args); Class origin; RubyMethod method = FindPrivateMethod(recv, caller, "method_missing", out origin); if (method != null) return method.body.Calln(origin, recv, caller, newargs); else throw new NoMethodError("method_missing method missing").raise(caller); }
public override object Call(Class last_class, object recv, Frame caller, Proc block, Array rest) { Class klass0 = Class.CLASS_OF(recv).class_real(); object members = klass0.instance_variable_get("__members__"); if (!(members is Array)) throw new TypeError("members field of struct is not an Array").raise(caller); Array values = new Array(); if (((Array)members).Count > 0) { foreach (object m in (Array)members) { string id = Symbol.rb_to_id(caller, m); values.Add(((Object)recv).instance_variable_get(id)); } } ArgList args = new ArgList(); args.AddRange(rest.value); return rb_ary_values_at.singleton.Calln(last_class, values, caller, args); }