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)); } }
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"); } }
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)); } }
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)); } }
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)); } }