|
@@ -34,7 +34,7 @@ vm->exec("print('Hello!')");
|
|
|
Evaluate a source string
|
|
Evaluate a source string
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = vm->eval("123");
|
|
|
|
|
|
|
+PyVar obj = vm->eval("123");
|
|
|
std::cout << py_cast<int>(vm, obj); // 123
|
|
std::cout << py_cast<int>(vm, obj); // 123
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -59,7 +59,7 @@ try{
|
|
|
Create primitive objects
|
|
Create primitive objects
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj;
|
|
|
|
|
|
|
+PyVar obj;
|
|
|
obj = py_var(vm, 1); // create a int
|
|
obj = py_var(vm, 1); // create a int
|
|
|
obj = py_var(vm, 1.0); // create a float
|
|
obj = py_var(vm, 1.0); // create a float
|
|
|
obj = py_var(vm, "123"); // create a string
|
|
obj = py_var(vm, "123"); // create a string
|
|
@@ -74,7 +74,7 @@ Tuple t(3);
|
|
|
t[0] = py_var(vm, 1);
|
|
t[0] = py_var(vm, 1);
|
|
|
t[1] = py_var(vm, 1.0);
|
|
t[1] = py_var(vm, 1.0);
|
|
|
t[2] = py_var(vm, "123");
|
|
t[2] = py_var(vm, "123");
|
|
|
-PyObject* obj = py_var(vm, std::move(t));
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, std::move(t));
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Create a list object
|
|
Create a list object
|
|
@@ -85,7 +85,7 @@ List t;
|
|
|
t.push_back(py_var(vm, 1));
|
|
t.push_back(py_var(vm, 1));
|
|
|
t.push_back(py_var(vm, 1.0));
|
|
t.push_back(py_var(vm, 1.0));
|
|
|
t.push_back(py_var(vm, "123"));
|
|
t.push_back(py_var(vm, "123"));
|
|
|
-PyObject* obj = py_var(vm, std::move(t));
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, std::move(t));
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Create a dict object
|
|
Create a dict object
|
|
@@ -95,13 +95,13 @@ Create a dict object
|
|
|
Dict d(vm);
|
|
Dict d(vm);
|
|
|
d.set(py_var(vm, "x"), py_var(vm, 1));
|
|
d.set(py_var(vm, "x"), py_var(vm, 1));
|
|
|
d.set(py_var(vm, "y"), py_var(vm, "123"));
|
|
d.set(py_var(vm, "y"), py_var(vm, "123"));
|
|
|
-PyObject* obj = py_var(vm, std::move(d));
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, std::move(d));
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get native types from python objects
|
|
Get native types from python objects
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj;
|
|
|
|
|
|
|
+PyVar obj;
|
|
|
i64 a = py_cast<i64>(vm, obj);
|
|
i64 a = py_cast<i64>(vm, obj);
|
|
|
f64 b = py_cast<f64>(vm, obj);
|
|
f64 b = py_cast<f64>(vm, obj);
|
|
|
Str& c = py_cast<Str&>(vm, obj); // reference cast
|
|
Str& c = py_cast<Str&>(vm, obj); // reference cast
|
|
@@ -130,11 +130,11 @@ Tuple& c_ = PK_OBJ_GET(Tuple, obj);
|
|
|
Access built-in python types
|
|
Access built-in python types
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* int_t = vm->_t(VM::tp_int);
|
|
|
|
|
-PyObject* float_t = vm->_t(VM::tp_float);
|
|
|
|
|
-PyObject* object_t = vm->_t(VM::tp_object);
|
|
|
|
|
-PyObject* tuple_t = vm->_t(VM::tp_tuple);
|
|
|
|
|
-PyObject* list_t = vm->_t(VM::tp_list);
|
|
|
|
|
|
|
+PyVar int_t = vm->_t(VM::tp_int);
|
|
|
|
|
+PyVar float_t = vm->_t(VM::tp_float);
|
|
|
|
|
+PyVar object_t = vm->_t(VM::tp_object);
|
|
|
|
|
+PyVar tuple_t = vm->_t(VM::tp_tuple);
|
|
|
|
|
+PyVar list_t = vm->_t(VM::tp_list);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Access user registered types
|
|
Access user registered types
|
|
@@ -146,22 +146,22 @@ Type voidp_t = vm->_tp_user<VoidP>();
|
|
|
Check if an object is a python type
|
|
Check if an object is a python type
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj;
|
|
|
|
|
|
|
+PyVar obj;
|
|
|
bool ok = is_type(obj, VM::tp_int); // check if obj is an int
|
|
bool ok = is_type(obj, VM::tp_int); // check if obj is an int
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get the type of a python object
|
|
Get the type of a python object
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = py_var(vm, 1);
|
|
|
|
|
-PyObject* t = vm->_t(obj); // <class 'int'>
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, 1);
|
|
|
|
|
+PyVar t = vm->_t(obj); // <class 'int'>
|
|
|
Type type = vm->_tp(obj); // VM::tp_int
|
|
Type type = vm->_tp(obj); // VM::tp_int
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Convert a type object into a type index
|
|
Convert a type object into a type index
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* int_t = vm->_t(VM::tp_int);
|
|
|
|
|
|
|
+PyVar int_t = vm->_t(VM::tp_int);
|
|
|
Type t = PK_OBJ_GET(Type, int_t);
|
|
Type t = PK_OBJ_GET(Type, int_t);
|
|
|
// t == VM::tp_int
|
|
// t == VM::tp_int
|
|
|
```
|
|
```
|
|
@@ -171,7 +171,7 @@ Type t = PK_OBJ_GET(Type, int_t);
|
|
|
Check an object supports attribute access
|
|
Check an object supports attribute access
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj;
|
|
|
|
|
|
|
+PyVar obj;
|
|
|
bool ok = !is_tagged(obj) && obj->is_attr_valid();
|
|
bool ok = !is_tagged(obj) && obj->is_attr_valid();
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -188,8 +188,8 @@ class MyClass:
|
|
|
Get and set attributes
|
|
Get and set attributes
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = vm->exec("MyClass(1, 2)");
|
|
|
|
|
-PyObject* x = vm->getattr(obj, "x"); // obj.x
|
|
|
|
|
|
|
+PyVar obj = vm->exec("MyClass(1, 2)");
|
|
|
|
|
+PyVar x = vm->getattr(obj, "x"); // obj.x
|
|
|
vm->setattr(obj, "x", py_var(vm, 3)); // obj.x = 3
|
|
vm->setattr(obj, "x", py_var(vm, 3)); // obj.x = 3
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -203,16 +203,16 @@ def add(a, b):
|
|
|
Call a function
|
|
Call a function
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* f_add = vm->eval("add");
|
|
|
|
|
-PyObject* ret = vm->call(f_add, py_var(vm, 1), py_var(vm, 2));
|
|
|
|
|
|
|
+PyVar f_add = vm->eval("add");
|
|
|
|
|
+PyVar ret = vm->call(f_add, py_var(vm, 1), py_var(vm, 2));
|
|
|
std::cout << py_cast<int>(vm, ret); // 3
|
|
std::cout << py_cast<int>(vm, ret); // 3
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Call a method
|
|
Call a method
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = vm->exec("MyClass(1, 2)");
|
|
|
|
|
-PyObject* ret = vm->call_method(obj, "sum");
|
|
|
|
|
|
|
+PyVar obj = vm->exec("MyClass(1, 2)");
|
|
|
|
|
+PyVar ret = vm->call_method(obj, "sum");
|
|
|
std::cout << CAST(i64, ret); // 3
|
|
std::cout << CAST(i64, ret); // 3
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -221,7 +221,7 @@ Cache the name of a function or method to avoid string-based lookup
|
|
|
```cpp
|
|
```cpp
|
|
|
// cache the name "add" to avoid string-based lookup
|
|
// cache the name "add" to avoid string-based lookup
|
|
|
const static StrName m_sum("sum");
|
|
const static StrName m_sum("sum");
|
|
|
-PyObject* ret = vm->call_method(obj, m_sum);
|
|
|
|
|
|
|
+PyVar ret = vm->call_method(obj, m_sum);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## Special operations
|
|
## Special operations
|
|
@@ -229,50 +229,50 @@ PyObject* ret = vm->call_method(obj, m_sum);
|
|
|
Compare two python objects
|
|
Compare two python objects
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj1 = py_var(vm, 1);
|
|
|
|
|
-PyObject* obj2 = py_var(vm, 2);
|
|
|
|
|
|
|
+PyVar obj1 = py_var(vm, 1);
|
|
|
|
|
+PyVar obj2 = py_var(vm, 2);
|
|
|
bool ok = vm->py_eq(obj1, obj2);
|
|
bool ok = vm->py_eq(obj1, obj2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Convert a python object to string
|
|
Convert a python object to string
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = py_var(vm, 123);
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, 123);
|
|
|
std::cout << vm->py_str(obj); // 123
|
|
std::cout << vm->py_str(obj); // 123
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get the string representation of a python object
|
|
Get the string representation of a python object
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = py_var(vm, "123");
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, "123");
|
|
|
std::cout << vm->py_repr(obj); // "'123'"
|
|
std::cout << vm->py_repr(obj); // "'123'"
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get the JSON representation of a python object
|
|
Get the JSON representation of a python object
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = py_var(vm, 123);
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, 123);
|
|
|
std::cout << vm->py_json(obj); // "123"
|
|
std::cout << vm->py_json(obj); // "123"
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get the hash value of a python object
|
|
Get the hash value of a python object
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = py_var(vm, 1);
|
|
|
|
|
|
|
+PyVar obj = py_var(vm, 1);
|
|
|
i64 h = vm->py_hash(obj); // 1
|
|
i64 h = vm->py_hash(obj); // 1
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get the iterator of a python object
|
|
Get the iterator of a python object
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = vm->eval("range(3)");
|
|
|
|
|
-PyObject* iter = vm->py_iter(obj);
|
|
|
|
|
|
|
+PyVar obj = vm->eval("range(3)");
|
|
|
|
|
+PyVar iter = vm->py_iter(obj);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Get the next item of an iterator
|
|
Get the next item of an iterator
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = vm->py_next(iter);
|
|
|
|
|
|
|
+PyVar obj = vm->py_next(iter);
|
|
|
if(obj == vm->StopIteration){
|
|
if(obj == vm->StopIteration){
|
|
|
// end of iteration
|
|
// end of iteration
|
|
|
}else{
|
|
}else{
|
|
@@ -283,7 +283,7 @@ if(obj == vm->StopIteration){
|
|
|
Convert a python iterable to a list
|
|
Convert a python iterable to a list
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* obj = vm->eval("range(3)");
|
|
|
|
|
|
|
+PyVar obj = vm->eval("range(3)");
|
|
|
List list = vm->py_list(obj);
|
|
List list = vm->py_list(obj);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -328,6 +328,6 @@ vm->_lazy_modules["test"] = "pi = 3.14";
|
|
|
Create a native module
|
|
Create a native module
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-PyObject* mod = vm->new_module("test");
|
|
|
|
|
|
|
+PyVar mod = vm->new_module("test");
|
|
|
vm->setattr(mod, "pi", py_var(vm, 3.14));
|
|
vm->setattr(mod, "pi", py_var(vm, 3.14));
|
|
|
```
|
|
```
|