Procházet zdrojové kódy

replace `UserData` to `any`

blueloveTH před 1 rokem
rodič
revize
6778d29ffa
5 změnil soubory, kde provedl 11 přidání a 13 odebrání
  1. 1 1
      docs/bindings.md
  2. 0 2
      include/pocketpy/any.h
  3. 3 3
      include/pocketpy/codeobject.h
  4. 4 4
      include/pocketpy/vm.h
  5. 3 3
      src/vm.cpp

+ 1 - 1
docs/bindings.md

@@ -80,7 +80,7 @@ int main(){
 }
 ```
 
-The 2nd way is to use `vm->bind`'s last parameter `userdata`, you can store a POD type smaller than 8 bytes.
+The 2nd way is to use `vm->bind`'s last parameter `userdata`, you can store an `pkpy::any` object.
 And use `lambda_get_userdata<T>(args.begin())` to get it inside the lambda body.
 
 ```cpp

+ 0 - 2
include/pocketpy/any.h

@@ -66,6 +66,4 @@ bool any_cast(const any& a, T** out){
     return true;
 }
 
-using UserData = any;
-
 } // namespace pkpy

+ 3 - 3
include/pocketpy/codeobject.h

@@ -130,9 +130,9 @@ struct NativeFunc {
     // new style decl-based call
     FuncDecl_ decl;
 
-    UserData _userdata;
+    any _userdata;
 
-    void set_userdata(UserData&& data) {
+    void set_userdata(any&& data) {
         if(_userdata){
             throw std::runtime_error("NativeFunc userdata already set");
         }
@@ -186,7 +186,7 @@ struct Py_<NativeFunc> final: PyObject {
 template<typename T>
 T& lambda_get_userdata(PyObject** p){
     static_assert(std::is_same_v<T, std::decay_t<T>>);
-    UserData* ud;
+    any* ud;
     if(p[-1] != PY_NULL) ud = &PK_OBJ_GET(NativeFunc, p[-1])._userdata;
     else ud = &PK_OBJ_GET(NativeFunc, p[-2])._userdata;
     T* out;

+ 4 - 4
include/pocketpy/vm.h

@@ -306,21 +306,21 @@ public:
 #endif
 
 #if PK_REGION("General Bindings")
-    PyObject* bind_func(PyObject* obj, StrName name, int argc, NativeFuncC fn, UserData userdata={}, BindType bt=BindType::DEFAULT);
-    PyObject* bind_func(Type type, StrName name, int argc, NativeFuncC fn, UserData userdata={}, BindType bt=BindType::DEFAULT){
+    PyObject* bind_func(PyObject* obj, StrName name, int argc, NativeFuncC fn, any userdata={}, BindType bt=BindType::DEFAULT);
+    PyObject* bind_func(Type type, StrName name, int argc, NativeFuncC fn, any userdata={}, BindType bt=BindType::DEFAULT){
         return bind_func(_t(type), name, argc, fn, std::move(userdata), bt);
     }
     PyObject* bind_property(PyObject*, const char*, NativeFuncC fget, NativeFuncC fset=nullptr);
     template<typename T, typename F, bool ReadOnly=false>
     PyObject* bind_field(PyObject*, const char*, F T::*);
 
-    PyObject* bind(PyObject*, const char*, NativeFuncC, UserData userdata={}, BindType bt=BindType::DEFAULT);
+    PyObject* bind(PyObject*, const char*, NativeFuncC, any userdata={}, BindType bt=BindType::DEFAULT);
     template<typename Ret, typename... Params>
     PyObject* bind(PyObject*, const char*, Ret(*)(Params...), BindType bt=BindType::DEFAULT);
     template<typename Ret, typename T, typename... Params>
     PyObject* bind(PyObject*, const char*, Ret(T::*)(Params...), BindType bt=BindType::DEFAULT);
 
-    PyObject* bind(PyObject*, const char*, const char*, NativeFuncC, UserData userdata={}, BindType bt=BindType::DEFAULT);
+    PyObject* bind(PyObject*, const char*, const char*, NativeFuncC, any userdata={}, BindType bt=BindType::DEFAULT);
     template<typename Ret, typename... Params>
     PyObject* bind(PyObject*, const char*, const char*, Ret(*)(Params...), BindType bt=BindType::DEFAULT);
     template<typename Ret, typename T, typename... Params>

+ 3 - 3
src/vm.cpp

@@ -1227,7 +1227,7 @@ void VM::setattr(PyObject* obj, StrName name, PyObject* value){
     obj->attr().set(name, value);
 }
 
-PyObject* VM::bind_func(PyObject* obj, StrName name, int argc, NativeFuncC fn, UserData userdata, BindType bt) {
+PyObject* VM::bind_func(PyObject* obj, StrName name, int argc, NativeFuncC fn, any userdata, BindType bt) {
     PyObject* nf = VAR(NativeFunc(fn, argc));
     PK_OBJ_GET(NativeFunc, nf).set_userdata(std::move(userdata));
     switch(bt){
@@ -1239,11 +1239,11 @@ PyObject* VM::bind_func(PyObject* obj, StrName name, int argc, NativeFuncC fn, U
     return nf;
 }
 
-PyObject* VM::bind(PyObject* obj, const char* sig, NativeFuncC fn, UserData userdata, BindType bt){
+PyObject* VM::bind(PyObject* obj, const char* sig, NativeFuncC fn, any userdata, BindType bt){
     return bind(obj, sig, nullptr, fn, std::move(userdata), bt);
 }
 
-PyObject* VM::bind(PyObject* obj, const char* sig, const char* docstring, NativeFuncC fn, UserData userdata, BindType bt){
+PyObject* VM::bind(PyObject* obj, const char* sig, const char* docstring, NativeFuncC fn, any userdata, BindType bt){
     CodeObject_ co;
     try{
         // fn(a, b, *c, d=1) -> None