public static object SendMessage(Machine machine, object obj, string msgname, object[] args) { if (obj == null) return SendNativeMessage(machine, obj, msgname, args); NativeBehavior behavior = machine.GetNativeBehavior(obj.GetType()); if (behavior != null) { IMethod mth = behavior.GetInstanceMethod(msgname); if (mth != null) return mth.ExecuteNative(machine, obj, args); } string mthname = msgname; int p = msgname.IndexOf(":"); if (p > 0) mthname = msgname.Substring(0, p); else mthname = msgname; if (obj is Type) { if (msgname == "new" || msgname.StartsWith("new:")) return NewObject((Type)obj, args); } if (obj is IList) { behavior = machine.GetNativeBehavior(typeof(IList)); IMethod mth = behavior.GetInstanceMethod(msgname); if (mth != null) return mth.ExecuteNative(machine, obj, args); } if (obj is IEnumerable) { behavior = machine.GetNativeBehavior(typeof(IEnumerable)); IMethod mth = behavior.GetInstanceMethod(msgname); if (mth != null) return mth.ExecuteNative(machine, obj, args); } // TODO how to use doesNotUnderstand in native behavior // mth = behavior.GetInstanceMethod("doesNotUnderstand:with:"); // if (mth != null) // return mth.ExecuteNative(obj, new object[] { msgname, args }); return SendNativeMessage(machine, obj, mthname, args); }
public void SerializeDeserializeMachinePreservingBuiltinMethods() { Machine machine = new Machine(); machine.SetGlobalObject("Block", machine.GetNativeBehavior(typeof(Block))); var result = this.Process(machine, machine); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(Machine)); var newmachine = (Machine)result; var blockbehavior = newmachine.GetNativeBehavior(typeof(Block)); Assert.IsNotNull(blockbehavior); }