fix a bug

This commit is contained in:
blueloveTH 2022-12-05 19:28:29 +08:00
parent 040ef62d51
commit b35e46265b
4 changed files with 58 additions and 2 deletions

View File

@ -683,6 +683,7 @@ __LISTCOMP:
Token tkmodule = compileImportPath();
consume(TK("import"));
do {
emitCode(OP_DUP_TOP);
consume(TK("@id"));
Token tkname = parser->previous;
int index = getCode()->addName(tkname.str(), NAME_GLOBAL);
@ -694,6 +695,7 @@ __LISTCOMP:
index = getCode()->addName(tkname.str(), NAME_GLOBAL);
emitCode(OP_STORE_NAME_PTR, index);
} while (match(TK(",")));
emitCode(OP_POP_TOP);
consumeEndStatement();
}

View File

@ -3,8 +3,8 @@
#include "pocketpy.h"
#define PK_DEBUG_TIME
//#define PK_DEBUG_THREADED
//#define PK_DEBUG_TIME
#define PK_DEBUG_THREADED
struct Timer{
const char* title;

View File

@ -648,6 +648,49 @@ void __addModuleJson(VM* vm){
});
}
void __addModuleMath(VM* vm){
PyVar mod = vm->newModule("math");
vm->setAttr(mod, "pi", vm->PyFloat(M_PI));
vm->setAttr(mod, "e", vm->PyFloat(M_E));
vm->bindFunc(mod, "log", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(log(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "log10", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(log10(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "log2", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(log2(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "sin", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(sin(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "cos", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(cos(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "tan", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(tan(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "isclose", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 2);
_Float a = vm->numToFloat(args[0]);
_Float b = vm->numToFloat(args[1]);
return vm->PyBool(fabs(a - b) < 1e-6);
});
}
class _PkExported{
public:
virtual ~_PkExported() = default;
@ -764,6 +807,7 @@ extern "C" {
__addModuleSys(vm);
__addModuleTime(vm);
__addModuleJson(vm);
__addModuleMath(vm);
_Code code = compile(vm, __BUILTINS_CODE, "<builtins>");
if(code == nullptr) exit(1);

10
tests/math.py Normal file
View File

@ -0,0 +1,10 @@
from math import log, log10, log2, sin, cos, tan, e, pi, isclose
assert isclose(e, 2.718281828459045)
assert isclose(pi, 3.141592653589793)
assert isclose(log(10), 2.302585092994046)
assert isclose(log10(10), 1.0)
assert isclose(log2(10), 3.321928094887362)
assert isclose(sin(0), 0.0)
assert isclose(cos(0), 1.0)
assert isclose(tan(0), 0.0)