blueloveTH 1 rok pred
rodič
commit
34d620c82f
3 zmenil súbory, kde vykonal 10 pridanie a 1 odobranie
  1. 2 0
      include/pocketpy/pocketpy.h
  2. 5 1
      src/public/modules.c
  3. 3 0
      tests/66_eval.py

+ 2 - 0
include/pocketpy/pocketpy.h

@@ -75,6 +75,8 @@ bool py_exec(const char* source,
              enum py_CompileMode mode,
              py_Ref module) PY_RAISE;
 
+/// Compile a source string into a code object.
+/// Use python's `exec()` or `eval()` to execute it.
 bool py_compile(const char* source,
                 const char* filename,
                 enum py_CompileMode mode,

+ 5 - 1
src/public/modules.c

@@ -463,7 +463,11 @@ static bool _builtins_execdyn(const char* title, int argc, py_Ref argv, enum py_
 
     // [globals, locals, code]
     CodeObject* co = py_touserdata(code);
-    if(!co->src->is_dynamic) py_shrink(3);
+    if(!co->src->is_dynamic) {
+        if(argc != 1)
+            return ValueError("code object is not dynamic, so globals and locals must be None");
+        py_shrink(3);
+    }
     Frame* frame = pk_current_vm->top_frame;
     return pk_exec(co, frame ? frame->module : NULL);
 }

+ 3 - 0
tests/66_eval.py

@@ -59,6 +59,9 @@ globals = {'a': 2}
 locals = {'b': 3}
 assert eval('a*b', globals, locals) == 6
 
+code = compile('a*b', '<string>', 'eval')
+assert eval(code, globals, locals) == 6
+
 try:
     exec('a*b*c', globals, locals)
     exit(1)