|
|
@@ -5,7 +5,7 @@
|
|
|
namespace pkpy {
|
|
|
|
|
|
struct CType{
|
|
|
- PY_CLASS(c, type_)
|
|
|
+ PY_CLASS(CType, c, type_)
|
|
|
|
|
|
const char* name; // must be a literal
|
|
|
const int size;
|
|
|
@@ -16,7 +16,7 @@ struct CType{
|
|
|
vm->bind_static_method<-1>(type, "__new__", CPP_NOT_IMPLEMENTED());
|
|
|
|
|
|
vm->bind_method<0>(type, "__repr__", [](VM* vm, Args& args) {
|
|
|
- CType& self = vm->_cast<CType>(args[0]);
|
|
|
+ CType& self = CAST(CType, args[0]);
|
|
|
StrStream ss;
|
|
|
ss << "<c._type '" << self.name << "' (" << self.size*8 << " bits)>";
|
|
|
return VAR(ss.str());
|
|
|
@@ -51,7 +51,7 @@ constexpr int C_TYPE(const char name[]){
|
|
|
#define C_TYPE_T(x) (kCTypes[C_TYPE(x)])
|
|
|
|
|
|
struct Pointer{
|
|
|
- PY_CLASS(c, ptr_)
|
|
|
+ PY_CLASS(Pointer, c, ptr_)
|
|
|
|
|
|
void* ptr;
|
|
|
CType ctype; // base type
|
|
|
@@ -70,61 +70,61 @@ struct Pointer{
|
|
|
vm->bind_static_method<-1>(type, "__new__", CPP_NOT_IMPLEMENTED());
|
|
|
|
|
|
vm->bind_method<0>(type, "__repr__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
StrStream ss;
|
|
|
ss << "<" << self.ctype.name << "* at " << (i64)self.ptr << ">";
|
|
|
return VAR(ss.str());
|
|
|
});
|
|
|
|
|
|
vm->bind_method<1>(type, "__add__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
- return vm->new_object<Pointer>(self + CAST(i64, args[1]));
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
+ return VAR_T(Pointer, self + CAST(i64, args[1]));
|
|
|
});
|
|
|
|
|
|
vm->bind_method<1>(type, "__sub__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
- return vm->new_object<Pointer>(self - CAST_V(i64, args[1]));
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
+ return VAR_T(Pointer, self - CAST_V(i64, args[1]));
|
|
|
});
|
|
|
|
|
|
vm->bind_method<1>(type, "__eq__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
- Pointer& other = vm->_cast<Pointer>(args[1]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
+ Pointer& other = CAST(Pointer, args[1]);
|
|
|
return VAR(self.ptr == other.ptr);
|
|
|
});
|
|
|
|
|
|
vm->bind_method<1>(type, "__ne__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
- Pointer& other = vm->_cast<Pointer>(args[1]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
+ Pointer& other = CAST(Pointer, args[1]);
|
|
|
return VAR(self.ptr != other.ptr);
|
|
|
});
|
|
|
|
|
|
// https://docs.python.org/zh-cn/3/library/ctypes.html
|
|
|
vm->bind_method<1>(type, "__getitem__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
i64 index = CAST_V(i64, args[1]);
|
|
|
return (self+index).get(vm);
|
|
|
});
|
|
|
|
|
|
vm->bind_method<2>(type, "__setitem__", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
i64 index = CAST_V(i64, args[1]);
|
|
|
(self+index).set(vm, args[2]);
|
|
|
return vm->None;
|
|
|
});
|
|
|
|
|
|
vm->bind_method<1>(type, "cast", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
- CType& ctype = vm->_cast<CType>(args[1]);
|
|
|
- return vm->new_object<Pointer>(self.ptr, ctype);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
+ CType& ctype = CAST(CType, args[1]);
|
|
|
+ return VAR_T(Pointer, self.ptr, ctype);
|
|
|
});
|
|
|
|
|
|
vm->bind_method<0>(type, "get", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
return self.get(vm);
|
|
|
});
|
|
|
|
|
|
vm->bind_method<1>(type, "set", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
self.set(vm, args[1]);
|
|
|
return vm->None;
|
|
|
});
|
|
|
@@ -155,7 +155,7 @@ struct Pointer{
|
|
|
case C_TYPE("uint16_"): return VAR(ref<uint16_t>());
|
|
|
case C_TYPE("uint32_"): return VAR(ref<uint32_t>());
|
|
|
case C_TYPE("uint64_"): return VAR(ref<uint64_t>());
|
|
|
- case C_TYPE("void_p_"): return vm->new_object<Pointer>(ref<void*>(), C_TYPE_T("void_"));
|
|
|
+ case C_TYPE("void_p_"): return VAR_T(Pointer, ref<void*>(), C_TYPE_T("void_"));
|
|
|
// use macro here to do extension
|
|
|
default: UNREACHABLE();
|
|
|
}
|
|
|
@@ -178,7 +178,7 @@ struct Pointer{
|
|
|
case C_TYPE("uint16_"): ref<uint16_t>() = CAST_V(i64, val); break;
|
|
|
case C_TYPE("uint32_"): ref<uint32_t>() = CAST_V(i64, val); break;
|
|
|
case C_TYPE("uint64_"): ref<uint64_t>() = CAST_V(i64, val); break;
|
|
|
- case C_TYPE("void_p_"): ref<void*>() = vm->_cast<Pointer>(val).ptr; break;
|
|
|
+ case C_TYPE("void_p_"): ref<void*>() = CAST(Pointer, val).ptr; break;
|
|
|
// use macro here to do extension
|
|
|
default: UNREACHABLE();
|
|
|
}
|
|
|
@@ -209,7 +209,7 @@ static const StructMetaInfo _Point2_info = {
|
|
|
};
|
|
|
|
|
|
struct Struct {
|
|
|
- PY_CLASS(c, struct_)
|
|
|
+ PY_CLASS(Struct, c, struct_)
|
|
|
|
|
|
const StructMetaInfo* info;
|
|
|
int8_t* _data; // store any `struct`
|
|
|
@@ -238,11 +238,11 @@ struct Struct {
|
|
|
|
|
|
static void _register(VM* vm, PyVar mod, PyVar type){
|
|
|
vm->bind_static_method<-1>(type, "__new__", [](VM* vm, Args& args) {
|
|
|
- return vm->new_object<Struct>();
|
|
|
+ return VAR_T(Struct);
|
|
|
});
|
|
|
|
|
|
vm->bind_method<0>(type, "__repr__", [](VM* vm, Args& args) {
|
|
|
- Struct& self = vm->_cast<Struct>(args[0]);
|
|
|
+ Struct& self = CAST(Struct, args[0]);
|
|
|
StrStream ss;
|
|
|
ss << self.info->name << "(" << ")";
|
|
|
return VAR(ss.str());
|
|
|
@@ -252,41 +252,41 @@ struct Struct {
|
|
|
|
|
|
void add_module_c(VM* vm){
|
|
|
PyVar mod = vm->new_module("c");
|
|
|
- PyVar ptr_t = vm->register_class<Pointer>(mod);
|
|
|
- vm->register_class<CType>(mod);
|
|
|
- vm->register_class<Struct>(mod);
|
|
|
+ PyVar ptr_t = Pointer::register_class(vm, mod);
|
|
|
+ CType::register_class(vm, mod);
|
|
|
+ Struct::register_class(vm, mod);
|
|
|
|
|
|
for(int i=0; i<kCTypeCount; i++){
|
|
|
- vm->setattr(mod, kCTypes[i].name, vm->new_object<CType>(kCTypes[i]));
|
|
|
+ vm->setattr(mod, kCTypes[i].name, VAR_T(CType, kCTypes[i]));
|
|
|
}
|
|
|
- vm->setattr(mod, "nullptr", vm->new_object<Pointer>(nullptr, C_TYPE_T("void_")));
|
|
|
+ vm->setattr(mod, "nullptr", VAR_T(Pointer, nullptr, C_TYPE_T("void_")));
|
|
|
|
|
|
vm->bind_func<1>(mod, "malloc", [](VM* vm, Args& args) {
|
|
|
i64 size = CAST_V(i64, args[0]);
|
|
|
- return vm->new_object<Pointer>(malloc(size), C_TYPE_T("void_"));
|
|
|
+ return VAR_T(Pointer, malloc(size), C_TYPE_T("void_"));
|
|
|
});
|
|
|
|
|
|
vm->bind_func<1>(mod, "free", [](VM* vm, Args& args) {
|
|
|
- Pointer& self = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& self = CAST(Pointer, args[0]);
|
|
|
free(self.ptr);
|
|
|
return vm->None;
|
|
|
});
|
|
|
|
|
|
vm->bind_func<1>(mod, "sizeof", [](VM* vm, Args& args) {
|
|
|
- CType& ctype = vm->_cast<CType>(args[0]);
|
|
|
+ CType& ctype = CAST(CType, args[0]);
|
|
|
return VAR(ctype.size);
|
|
|
});
|
|
|
|
|
|
vm->bind_func<3>(mod, "memcpy", [](VM* vm, Args& args) {
|
|
|
- Pointer& dst = vm->_cast<Pointer>(args[0]);
|
|
|
- Pointer& src = vm->_cast<Pointer>(args[1]);
|
|
|
+ Pointer& dst = CAST(Pointer, args[0]);
|
|
|
+ Pointer& src = CAST(Pointer, args[1]);
|
|
|
i64 size = CAST_V(i64, args[2]);
|
|
|
memcpy(dst.ptr, src.ptr, size);
|
|
|
return vm->None;
|
|
|
});
|
|
|
|
|
|
vm->bind_func<3>(mod, "memset", [](VM* vm, Args& args) {
|
|
|
- Pointer& dst = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& dst = CAST(Pointer, args[0]);
|
|
|
i64 val = CAST_V(i64, args[1]);
|
|
|
i64 size = CAST_V(i64, args[2]);
|
|
|
memset(dst.ptr, (int)val, size);
|
|
|
@@ -296,10 +296,10 @@ void add_module_c(VM* vm){
|
|
|
vm->bind_func<1>(mod, "strdup", [ptr_t](VM* vm, Args& args) {
|
|
|
if(is_type(args[0], vm->tp_str)){
|
|
|
const Str& s = CAST(Str, args[0]);
|
|
|
- return vm->new_object<Pointer>(strdup(s.c_str()), C_TYPE_T("char_"));
|
|
|
+ return VAR_T(Pointer, strdup(s.c_str()), C_TYPE_T("char_"));
|
|
|
}else if(is_type(args[0], OBJ_GET(Type, ptr_t))){
|
|
|
- Pointer& p = vm->_cast<Pointer>(args[0]);
|
|
|
- return vm->new_object<Pointer>(strdup(p.cast<char*>()), C_TYPE_T("char_"));
|
|
|
+ Pointer& p = CAST(Pointer, args[0]);
|
|
|
+ return VAR_T(Pointer, strdup(p.cast<char*>()), C_TYPE_T("char_"));
|
|
|
}else{
|
|
|
vm->TypeError("strdup() argument must be 'str' or 'char*'");
|
|
|
return vm->None;
|
|
|
@@ -307,13 +307,13 @@ void add_module_c(VM* vm){
|
|
|
});
|
|
|
|
|
|
vm->bind_func<2>(mod, "strcmp", [](VM* vm, Args& args) {
|
|
|
- Pointer& p1 = vm->_cast<Pointer>(args[0]);
|
|
|
- Pointer& p2 = vm->_cast<Pointer>(args[1]);
|
|
|
+ Pointer& p1 = CAST(Pointer, args[0]);
|
|
|
+ Pointer& p2 = CAST(Pointer, args[1]);
|
|
|
return VAR(strcmp(p1.cast<char*>(), p2.cast<char*>()));
|
|
|
});
|
|
|
|
|
|
vm->bind_func<1>(mod, "strlen", [](VM* vm, Args& args) {
|
|
|
- Pointer& p = vm->_cast<Pointer>(args[0]);
|
|
|
+ Pointer& p = CAST(Pointer, args[0]);
|
|
|
return VAR(strlen(p.cast<char*>()));
|
|
|
});
|
|
|
}
|