blueloveTH пре 2 година
родитељ
комит
e982a4e60b
4 измењених фајлова са 16 додато и 2 уклоњено
  1. 7 0
      c_bindings/pocketpy_c.cpp
  2. 2 0
      c_bindings/pocketpy_c.h
  3. 5 0
      src/cffi.h
  4. 2 2
      src/pocketpy.h

+ 7 - 0
c_bindings/pocketpy_c.cpp

@@ -614,4 +614,11 @@ bool pkpy_eval(pkpy_vm* vm_handle, const char* code) {
     vm->c_data->push(ret);
     ERRHANDLER_CLOSE
     return true;
+}
+
+void* pkpy_get_id(pkpy_vm* vm_handle, int index) {
+    CVM* vm = (CVM*) vm_handle;
+    index = lua_to_cstack_index(index, vm->c_data->size());
+    PyObject* o = vm->c_data->begin()[index];
+    return (void*) o;
 }

+ 2 - 0
c_bindings/pocketpy_c.h

@@ -114,6 +114,8 @@ PK_EXPORT bool pkpy_getattr(pkpy_vm*, const char* name);
 PK_EXPORT bool pkpy_setattr(pkpy_vm*, const char* name);
 PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source);
 
+PK_EXPORT void* pkpy_get_id(pkpy_vm*, int index);
+
 #ifdef __cplusplus
 }
 #endif

+ 5 - 0
src/cffi.h

@@ -75,6 +75,11 @@ struct VoidP{
             return _CAST(VoidP&, lhs).ptr <= CAST(VoidP&, rhs).ptr;
         });
 
+        vm->bind__hash__(OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
+            VoidP& self = _CAST(VoidP&, obj);
+            return reinterpret_cast<i64>(self.ptr);
+        });
+
         vm->bind_method<1>(type, "set_base_offset", [](VM* vm, ArgsView args){
             VoidP& self = _CAST(VoidP&, args[0]);
             if(is_non_tagged_type(args[1], vm->tp_str)){

+ 2 - 2
src/pocketpy.h

@@ -100,8 +100,8 @@ inline void init_builtins(VM* _vm) {
 
     _vm->bind_builtin_func<1>("id", [](VM* vm, ArgsView args) {
         PyObject* obj = args[0];
-        if(is_tagged(obj)) return VAR((i64)0);
-        return VAR(BITS(obj));
+        if(is_tagged(obj)) return vm->None;
+        return VAR_T(VoidP, obj);
     });
 
     _vm->bind_builtin_func<2>("divmod", [](VM* vm, ArgsView args) {