blueloveTH 2 سال پیش
والد
کامیت
e1b2bda6aa
2فایلهای تغییر یافته به همراه5 افزوده شده و 9 حذف شده
  1. 2 2
      docs/C-API/stack.md
  2. 3 7
      src/pocketpy_c.cpp

+ 2 - 2
docs/C-API/stack.md

@@ -88,7 +88,7 @@ PK_EXPORT bool pkpy_is_none(pkpy_vm*, int i);
 
 + `bool pkpy_getattr(pkpy_vm*, pkpy_CName name)`
 
-    Push `b.<name>` onto the stack.
+    Push `b.<name>` onto the stack. Return false if the attribute is not found.
 
     ```
     [b] -> [b.<name>]
@@ -105,7 +105,7 @@ PK_EXPORT bool pkpy_is_none(pkpy_vm*, int i);
 
 + `bool pkpy_getglobal(pkpy_vm*, pkpy_CName name)`
 
-    Push a global variable onto the stack.
+    Push a global/builtin variable onto the stack. Return false if the variable is not found.
 
     ```
     [] -> [value]

+ 3 - 7
src/pocketpy_c.cpp

@@ -384,9 +384,8 @@ bool pkpy_getattr(pkpy_vm* vm_handle, pkpy_CName name) {
     PK_ASSERT_NO_ERROR()
     PK_ASSERT_N_EXTRA_ELEMENTS(1)
     PyObject* o = vm->s_data.top();
-    PK_PROTECTED(
-        o = vm->getattr(o, StrName(name));
-    )
+    o = vm->getattr(o, StrName(name), false);
+    if(o == nullptr) return false;
     vm->s_data.top() = o;
     return true;
 }
@@ -411,10 +410,7 @@ bool pkpy_getglobal(pkpy_vm* vm_handle, pkpy_CName name) {
     PyObject* o = vm->_main->attr().try_get(StrName(name));
     if (o == nullptr) {
         o = vm->builtins->attr().try_get(StrName(name));
-        if (o == nullptr){
-            pkpy_error(vm_handle, "NameError", pkpy_name_to_string(name));
-            return false;
-        }
+        if (o == nullptr) return false;
     }
     vm->s_data.push(o);
     return true;