Exemple #1
0
        public override HeronValue InvokeBinaryOperator(VM vm, OpCode opcode, HeronValue val)
        {
            float x = GetValue();
            float y = val.ToFloat();

            switch (opcode)
            {
            case OpCode.opAdd: return(vm.MakeTemporary(x + y));

            case OpCode.opSub: return(vm.MakeTemporary(x - y));

            case OpCode.opMul: return(vm.MakeTemporary(x * y));

            case OpCode.opDiv: return(vm.MakeTemporary(x / y));

            case OpCode.opMod: return(vm.MakeTemporary(x % y));

            case OpCode.opGtEq: return(vm.MakeTemporary(x >= y));

            case OpCode.opLtEq: return(vm.MakeTemporary(x <= y));

            case OpCode.opGt: return(vm.MakeTemporary(x > y));

            case OpCode.opLt: return(vm.MakeTemporary(x < y));

            default: return(base.InvokeBinaryOperator(vm, opcode, val));
            }
        }
Exemple #2
0
        public override HeronValue InvokeUnaryOperator(VM vm, string s)
        {
            switch (s)
            {
            case "-": return(vm.MakeTemporary(-GetValue()));

            case "~": return(vm.MakeTemporary(~GetValue()));

            default:
                throw new Exception("Unary operation: '" + s + "' not supported by integers");
            }
        }
Exemple #3
0
        public override HeronValue InvokeBinaryOperator(VM vm, OpCode opcode, HeronValue val)
        {
            bool x = GetValue();
            bool y = val.ToBool();

            switch (opcode)
            {
            case OpCode.opAnd: return(vm.MakeTemporary(x && y));

            case OpCode.opOr: return(vm.MakeTemporary(x || y));

            case OpCode.opXOr: return(vm.MakeTemporary(x ^ y));

            default: return(base.InvokeBinaryOperator(vm, opcode, val));
            }
        }
Exemple #4
0
 public override HeronValue InvokeBinaryOperator(VM vm, OpCode opcode, HeronValue val)
 {
     if (opcode == OpCode.opAdd)
     {
         return(vm.MakeTemporary(GetValue() + val.ToString()));
     }
     else
     {
         return(base.InvokeBinaryOperator(vm, opcode, val));
     }
 }
Exemple #5
0
        public override HeronValue InvokeBinaryOperator(VM vm, OpCode opcode, HeronValue val)
        {
            int x = GetValue();
            int y = val.ToInt();

            switch (opcode)
            {
            case OpCode.opAdd: return(vm.MakeTemporary(x + y));

            case OpCode.opSub: return(vm.MakeTemporary(x - y));

            case OpCode.opMul: return(vm.MakeTemporary(x * y));

            case OpCode.opDiv: return(vm.MakeTemporary(x / y));

            case OpCode.opMod: return(vm.MakeTemporary(x % y));

            case OpCode.opShr: return(vm.MakeTemporary(x >> y));

            case OpCode.opShl: return(vm.MakeTemporary(x << y));

            case OpCode.opGtEq: return(vm.MakeTemporary(x >= y));

            case OpCode.opLtEq: return(vm.MakeTemporary(x <= y));

            case OpCode.opGt: return(vm.MakeTemporary(x > y));

            case OpCode.opLt: return(vm.MakeTemporary(x < y));

            case OpCode.opRange: return(new RangeEnumerator(this as IntValue, val as IntValue));

            default: return(base.InvokeBinaryOperator(vm, opcode, val));
            }
        }