Example #1
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var str = (string)instruction.Operand.GetObject();

            var prefix  = Helper.ReadPrefix(str);
            var mdtoken = int.Parse(str.Substring(1));

            switch (prefix)
            {
            // method
            case 0:
                vmContext.Stack.Push(typeof(Ldtoken).Module.ResolveMethod(mdtoken));
                break;

            // member ref
            case 1:
                vmContext.Stack.Push(((MethodBase)typeof(Ldtoken).Module.ResolveMember(mdtoken)).MethodHandle);
                break;

            // ifield
            case 2:
                vmContext.Stack.Push(typeof(Ldtoken).Module.ResolveType(mdtoken));
                break;

            // itypedeforref
            case 3:
                vmContext.Stack.Push(typeof(Ldtoken).Module.ResolveField(mdtoken).FieldHandle);
                break;
            }

            vmContext.Index++;
        }
Example #2
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var x = vmContext.Stack.Pop();
            var y = vmContext.Stack.Pop();

            if (x.IsInt16())
            {
                vmContext.Stack.Push((short)x.GetObject() << (short)y.GetObject());
            }
            else if (x.IsInt32())
            {
                vmContext.Stack.Push((int)x.GetObject() << (int)y.GetObject());
            }
            else if (x.IsUInt16())
            {
                vmContext.Stack.Push((ushort)x.GetObject() << (ushort)y.GetObject());
            }
            else if (x.IsByte())
            {
                vmContext.Stack.Push((byte)x.GetObject() << (byte)y.GetObject());
            }
            else if (x.IsSByte())
            {
                vmContext.Stack.Push((sbyte)x.GetObject() << (sbyte)y.GetObject());
            }

            vmContext.Index++;
        }
Example #3
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var arr = (Array)vmContext.Stack.Pop().GetObject();

            vmContext.Stack.Push(arr.Length);

            vmContext.Index++;
        }
Example #4
0
 public override void Execute(Context vmContext, HxInstruction instruction)
 {
     var y = vmContext.Stack.Pop().GetObject();
     var x = vmContext.Stack.Pop().GetObject();
     vmContext.Stack.Push(y.Equals(x));
         
     vmContext.Index++;
 }
Example #5
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var y = vmContext.Stack.Pop();
            var x = vmContext.Stack.Pop();

            if (!x.IsNumeric() || !y.IsNumeric())  ///|| !x.Same(y)
            {
                throw new Exception("Uhm, something went wrong while emulating Clt");
            }

            if (x.IsInt16())
            {
                vmContext.Stack.Push((short)x.GetObject() < (short)y.GetObject());
            }
            else if (x.IsInt32())
            {
                vmContext.Stack.Push((int)x.GetObject() < (int)y.GetObject());
            }
            else if (x.IsInt64())
            {
                vmContext.Stack.Push((long)x.GetObject() < (long)y.GetObject());
            }
            else if (x.IsUInt16())
            {
                vmContext.Stack.Push((ushort)x.GetObject() < (ushort)y.GetObject());
            }
            else if (x.IsUInt32())
            {
                vmContext.Stack.Push((uint)x.GetObject() < (uint)y.GetObject());
            }
            else if (x.IsUInt64())
            {
                vmContext.Stack.Push((ulong)x.GetObject() < (ulong)y.GetObject());
            }
            else if (x.IsDouble())
            {
                vmContext.Stack.Push((double)x.GetObject() < (double)y.GetObject());
            }
            else if (x.IsByte())
            {
                vmContext.Stack.Push((byte)x.GetObject() < (byte)y.GetObject());
            }
            else if (x.IsDecimal())
            {
                vmContext.Stack.Push((decimal)x.GetObject() < (decimal)y.GetObject());
            }
            else if (x.IsSByte())
            {
                vmContext.Stack.Push((sbyte)x.GetObject() < (sbyte)y.GetObject());
            }
            else if (x.IsFloat())
            {
                vmContext.Stack.Push((float)x.GetObject() < (float)y.GetObject());
            }

            vmContext.Index++;
        }
Example #6
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            // dynamics may work too, possibly even better

            var y = vmContext.Stack.Pop();
            var x = vmContext.Stack.Pop();

            if (x.IsInt16())
            {
                vmContext.Stack.Push((short)x.GetObject() + (short)y.GetObject());
            }
            else if (x.IsInt32())
            {
                vmContext.Stack.Push((int)x.GetObject() + (int)y.GetObject());
            }
            else if (x.IsInt64())
            {
                vmContext.Stack.Push((long)x.GetObject() + (long)y.GetObject());
            }
            else if (x.IsUInt16())
            {
                vmContext.Stack.Push((ushort)x.GetObject() + (ushort)y.GetObject());
            }
            else if (x.IsUInt32())
            {
                vmContext.Stack.Push((uint)x.GetObject() + (uint)y.GetObject());
            }
            else if (x.IsUInt64())
            {
                vmContext.Stack.Push((ulong)x.GetObject() + (ulong)y.GetObject());
            }
            else if (x.IsDouble())
            {
                vmContext.Stack.Push((double)x.GetObject() + (double)y.GetObject());
            }
            else if (x.IsByte())
            {
                vmContext.Stack.Push((byte)x.GetObject() + (byte)y.GetObject());
            }
            else if (x.IsDecimal())
            {
                vmContext.Stack.Push((decimal)x.GetObject() + (decimal)y.GetObject());
            }
            else if (x.IsSByte())
            {
                vmContext.Stack.Push((sbyte)x.GetObject() + (sbyte)y.GetObject());
            }
            else if (x.IsFloat())
            {
                vmContext.Stack.Push((float)x.GetObject() + (float)y.GetObject());
            }

            vmContext.Index++;
        }
Example #7
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var y = vmContext.Stack.Pop();
            var x = vmContext.Stack.Pop();

            if (x.IsInt16())
            {
                vmContext.Stack.Push((short)x.GetObject() % (short)y.GetObject());
            }
            else if (x.IsInt32())
            {
                vmContext.Stack.Push((int)x.GetObject() % (int)y.GetObject());
            }
            else if (x.IsInt64())
            {
                vmContext.Stack.Push((long)x.GetObject() % (long)y.GetObject());
            }
            else if (x.IsUInt16())
            {
                vmContext.Stack.Push((ushort)x.GetObject() % (ushort)y.GetObject());
            }
            else if (x.IsUInt32())
            {
                vmContext.Stack.Push((uint)x.GetObject() % (uint)y.GetObject());
            }
            else if (x.IsUInt64())
            {
                vmContext.Stack.Push((ulong)x.GetObject() % (ulong)y.GetObject());
            }
            else if (x.IsDouble())
            {
                vmContext.Stack.Push((double)x.GetObject() % (double)y.GetObject());
            }
            else if (x.IsByte())
            {
                vmContext.Stack.Push((byte)x.GetObject() % (byte)y.GetObject());
            }
            else if (x.IsDecimal())
            {
                vmContext.Stack.Push((decimal)x.GetObject() % (decimal)y.GetObject());
            }
            else if (x.IsSByte())
            {
                vmContext.Stack.Push((sbyte)x.GetObject() % (sbyte)y.GetObject());
            }
            else if (x.IsFloat())
            {
                vmContext.Stack.Push((float)x.GetObject() % (float)y.GetObject());
            }

            vmContext.Index++;
        }
Example #8
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var str = (string)instruction.Operand.GetObject();

            var id      = Helper.ReadPrefix(str);
            var mdtoken = int.Parse(str.Substring(1));

            var fi = ForceResolveField(mdtoken);
            var v  = fi.GetValue(id == 0 ? vmContext.Stack.Pop().GetObject() : null);

            vmContext.Stack.Push(v);
            vmContext.Index++;
        }
Example #9
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var m  = ForceResolveConstructor((int)instruction.Operand.GetObject());
            var pm = Helper.GetMethodParameters(vmContext, m.GetParameters());

            var inst = m.Invoke(pm);

            if (inst != null)
            {
                vmContext.Stack.Push(inst);
            }

            vmContext.Index++;
        }
Example #10
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var str    = (string)instruction.Operand.GetObject();
            var prefix = Helper.ReadPrefix(str);
            var idx    = int.Parse(str.Substring(1));

            if (prefix == 0)
            {
                vmContext.Stack.Push(vmContext.Locals.Get(idx));
            }
            else
            {
                var item = vmContext.Stack.Pop();
                vmContext.Locals.Update(idx, item);
            }

            vmContext.Index++;
        }
Example #11
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var x = vmContext.Stack.Pop();

            if (x.IsInt16())
            {
                vmContext.Stack.Push(~(short)x.GetObject());
            }
            else if (x.IsInt32())
            {
                vmContext.Stack.Push(~(int)x.GetObject());
            }
            else if (x.IsInt64())
            {
                vmContext.Stack.Push(~(long)x.GetObject());
            }
            else if (x.IsUInt16())
            {
                vmContext.Stack.Push(~(ushort)x.GetObject());
            }
            else if (x.IsUInt32())
            {
                vmContext.Stack.Push(~(uint)x.GetObject());
            }
            else if (x.IsUInt64())
            {
                vmContext.Stack.Push(~(ulong)x.GetObject());
            }
            else if (x.IsByte())
            {
                vmContext.Stack.Push(~(byte)x.GetObject());
            }
            else if (x.IsSByte())
            {
                vmContext.Stack.Push(~(sbyte)x.GetObject());
            }

            vmContext.Index++;
        }
Example #12
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var prefix = (int)instruction.Operand.GetObject();

            if (prefix == 0)
            {
                var idx = (int)vmContext.Stack.Pop().GetObject();
                var arr = (Array)vmContext.Stack.Pop().GetObject();

                vmContext.Stack.Push(arr.GetValue(idx));
            }
            else if (prefix == 1)
            {
                var obj = vmContext.Stack.Pop().GetObject();
                var idx = (int)vmContext.Stack.Pop().GetObject();
                var arr = (Array)vmContext.Stack.Pop().GetObject();

                arr.SetValue(obj, idx);
            }

            vmContext.Index++;
        }
Example #13
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var     id   = (int)instruction.Operand.GetObject();
            dynamic item = vmContext.Stack.Pop().GetObject();

            // should work
            switch (id)
            {
            case 0:     // convert to float   Conv_R4
                vmContext.Stack.Push(Convert.ToSingle(item));
                break;

            case 1:     // convert to double   Conv_R8
                vmContext.Stack.Push(Convert.ToDouble(item));
                break;

            default:
                break;
            }

            vmContext.Index++;
        }
Example #14
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var v = vmContext.Stack.Pop();
            int x;

            if (v.IsBool())
            {
                x = (bool)v.GetObject() ? 1 : 0;
            }
            else
            {
                x = (int)v.GetObject();
            }

            if (x == 1)
            {
                vmContext.Index = (int)instruction.Operand.GetObject();
            }
            else
            {
                vmContext.Index++;
            }
        }
Example #15
0
 public override void Execute(Context vmContext, HxInstruction instruction)
 {
     vmContext.Index = (int)instruction.Operand.GetObject();
 }
Example #16
0
 public override void Execute(Context vmContext, HxInstruction instruction)
 {
     vmContext.Stack.Push(instruction.Operand);
     vmContext.Index++;
 }
Example #17
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            // hmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

            vmContext.Index++;
        }
Example #18
0
 public override void Execute(Context vmContext, HxInstruction instruction)
 {
     vmContext.Stack.Push(vmContext.Stack.Count == 0 ? new Value(null) : vmContext.Stack.Pop().GetObject());
     vmContext.Index++;
 }
Example #19
0
        public override void Execute(Context vmContext, HxInstruction instruction)
        {
            var str = (string)instruction.Operand.GetObject();

            var type    = Helper.ReadPrefix(str);
            var prefix  = Helper.ReadPrefix(str, 1);
            var mdtoken = int.Parse(str.Substring(2));

            switch (prefix)
            {
            // constructor
            case 0:
            {
                var m    = ForceResolveConstructor(mdtoken);
                var pm   = Helper.GetMethodParameters(vmContext, m.GetParameters());
                var inst = m.Invoke(pm);

                if (inst != null)
                {
                    vmContext.Stack.Push(inst);
                }
                break;
            }

            //  method
            case 1:
            {
                var m  = ForceResolveMethod(mdtoken);
                var pm = Helper.GetMethodParameters(vmContext, m.GetParameters());

                object target = null;
                if (!m.IsStatic)
                {
                    target = vmContext.Stack.Pop().GetObject();
                }

                var ret = m.Invoke(target, pm);

                if (ret != null)
                {
                    vmContext.Stack.Push(ret);
                }

                break;
            }

            // member ref
            case 2:
            {
                var m  = ForceResolveMember(mdtoken);
                var pm = Helper.GetMethodParameters(vmContext, m.GetParameters());

                object target = null;
                if (!m.IsStatic)
                {
                    target = vmContext.Stack.Pop().GetObject();
                }

                var ret = m.Invoke(target, pm);

                if (ret != null)
                {
                    vmContext.Stack.Push(ret);
                }

                break;
            }
            }

            vmContext.Index++;
        }
Example #20
0
 public override void Execute(Context vmContext, HxInstruction instruction)
 {
     // do nothing really
     vmContext.Index++;
 }
Example #21
0
 public abstract void Execute(Context vmContext, HxInstruction instruction);
Example #22
0
 public override void Execute(Context vmContext, HxInstruction instruction)
 {
     vmContext.Stack.Pop();
     vmContext.Index++;
 }