예제 #1
0
        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);
        }
예제 #2
0
        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);
        }