From ad23d21297f9dd1942a77e24c6fdeb372dd511a3 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 10 Nov 2022 13:49:26 +0800 Subject: [PATCH] add zero div error --- src/pocketpy.h | 8 ++++++-- src/vm.h | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/pocketpy.h b/src/pocketpy.h index 054cca33..9749c607 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -124,7 +124,9 @@ void __initializeBuiltinFunctions(VM* _vm) { _vm->bindMethodMulti({"int", "float"}, "__truediv__", [](VM* vm, PyVarList args) { if(!vm->isIntOrFloat(args[0], args[1])) vm->typeError("unsupported operand type(s) for " "/" ); - return vm->PyFloat(vm->numToFloat(args[0]) / vm->numToFloat(args[1])); + _Float rhs = vm->numToFloat(args[1]); + if (rhs == 0) vm->zeroDivisionError(); + return vm->PyFloat(vm->numToFloat(args[0]) / rhs); }); _vm->bindMethodMulti({"int", "float"}, "__pow__", [](VM* vm, PyVarList args) { @@ -141,7 +143,9 @@ void __initializeBuiltinFunctions(VM* _vm) { _vm->bindMethod("int", "__floordiv__", [](VM* vm, PyVarList args) { if(!args[0]->isType(vm->_tp_int) || !args[1]->isType(vm->_tp_int)) vm->typeError("unsupported operand type(s) for " "//" ); - return vm->PyInt(vm->PyInt_AS_C(args[0]) / vm->PyInt_AS_C(args[1])); + _Int rhs = vm->PyInt_AS_C(args[1]); + if(rhs == 0) vm->zeroDivisionError(); + return vm->PyInt(vm->PyInt_AS_C(args[0]) / rhs); }); _vm->bindMethod("int", "__mod__", [](VM* vm, PyVarList args) { diff --git a/src/vm.h b/src/vm.h index 137e6f77..a30da508 100644 --- a/src/vm.h +++ b/src/vm.h @@ -655,11 +655,15 @@ private: public: void typeError(const _Str& msg){ - typeError(msg); + _error("TypeError", msg); } void systemError(const _Str& msg){ - systemError(msg); + _error("SystemError", msg); + } + + void zeroDivisionError(){ + _error("ZeroDivisionError", "division by zero"); } void indexError(const _Str& msg){