diff --git a/src/pocketpy.h b/src/pocketpy.h index 8456e1ed..53800186 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -16,21 +16,23 @@ _Code VM::compile(_Str source, _Str filename, CompileMode mode) { } #define BIND_NUM_ARITH_OPT(name, op) \ - _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \ - if(args[0]->is_type(vm->_tp_int) && args[1]->is_type(vm->_tp_int)){ \ - return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \ + _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \ + if(args[0]->is_type(vm->_tp_int) && args[1]->is_type(vm->_tp_int)){ \ + return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \ }else{ \ - return vm->PyFloat(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ + return vm->PyFloat(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ } \ }); #define BIND_NUM_LOGICAL_OPT(name, op, is_eq) \ - _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \ - if(!vm->is_int_or_float(args[0], args[1])){ \ + _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \ + bool _0 = args[0]->is_type(vm->_tp_int) || args[0]->is_type(vm->_tp_float); \ + bool _1 = args[1]->is_type(vm->_tp_int) || args[1]->is_type(vm->_tp_float); \ + if(!_0 || !_1){ \ if constexpr(is_eq) return vm->PyBool(args[0] == args[1]); \ vm->typeError("unsupported operand type(s) for " #op ); \ } \ - return vm->PyBool(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ + return vm->PyBool(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ }); diff --git a/src/vm.h b/src/vm.h index 4d710bc3..4f1ccb4c 100644 --- a/src/vm.h +++ b/src/vm.h @@ -686,14 +686,6 @@ public: bindFunc(builtins, funcName, fn); } - inline bool is_int_or_float(const PyVar& obj) const{ - return obj->is_type(_tp_int) || obj->is_type(_tp_float); - } - - inline bool is_int_or_float(const PyVar& obj1, const PyVar& obj2) const{ - return is_int_or_float(obj1) && is_int_or_float(obj2); - } - inline f64 num_to_float(const PyVar& obj){ if (obj->is_type(_tp_int)){ return (f64)PyInt_AS_C(obj);