|
@@ -37,15 +37,15 @@ namespace pkpy{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- void C99Struct::_register(VM* vm, PyObject* mod, PyObject* type){
|
|
|
|
|
|
|
+ void Struct::_register(VM* vm, PyObject* mod, PyObject* type){
|
|
|
vm->bind_constructor<2>(type, [](VM* vm, ArgsView args){
|
|
vm->bind_constructor<2>(type, [](VM* vm, ArgsView args){
|
|
|
Type cls = PK_OBJ_GET(Type, args[0]);
|
|
Type cls = PK_OBJ_GET(Type, args[0]);
|
|
|
int size = CAST(int, args[1]);
|
|
int size = CAST(int, args[1]);
|
|
|
- return vm->heap.gcnew<C99Struct>(cls, size);
|
|
|
|
|
|
|
+ return vm->heap.gcnew<Struct>(cls, size);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
vm->bind_method<0>(type, "hex", [](VM* vm, ArgsView args){
|
|
vm->bind_method<0>(type, "hex", [](VM* vm, ArgsView args){
|
|
|
- const C99Struct& self = _CAST(C99Struct&, args[0]);
|
|
|
|
|
|
|
+ const Struct& self = _CAST(Struct&, args[0]);
|
|
|
SStream ss;
|
|
SStream ss;
|
|
|
for(int i=0; i<self.size; i++) ss.write_hex((unsigned char)self.p[i]);
|
|
for(int i=0; i<self.size; i++) ss.write_hex((unsigned char)self.p[i]);
|
|
|
return VAR(ss.str());
|
|
return VAR(ss.str());
|
|
@@ -55,7 +55,7 @@ namespace pkpy{
|
|
|
vm->bind_func<1>(type, "fromhex", [](VM* vm, ArgsView args){
|
|
vm->bind_func<1>(type, "fromhex", [](VM* vm, ArgsView args){
|
|
|
const Str& s = CAST(Str&, args[0]);
|
|
const Str& s = CAST(Str&, args[0]);
|
|
|
if(s.size<2 || s.size%2!=0) vm->ValueError("invalid hex string");
|
|
if(s.size<2 || s.size%2!=0) vm->ValueError("invalid hex string");
|
|
|
- C99Struct buffer(s.size/2, false);
|
|
|
|
|
|
|
+ Struct buffer(s.size/2, false);
|
|
|
for(int i=0; i<s.size; i+=2){
|
|
for(int i=0; i<s.size; i+=2){
|
|
|
char c = 0;
|
|
char c = 0;
|
|
|
if(s[i]>='0' && s[i]<='9') c += s[i]-'0';
|
|
if(s[i]>='0' && s[i]<='9') c += s[i]-'0';
|
|
@@ -69,48 +69,48 @@ namespace pkpy{
|
|
|
else vm->ValueError(_S("invalid hex char: '", s[i+1], "'"));
|
|
else vm->ValueError(_S("invalid hex char: '", s[i+1], "'"));
|
|
|
buffer.p[i/2] = c;
|
|
buffer.p[i/2] = c;
|
|
|
}
|
|
}
|
|
|
- return vm->new_user_object<C99Struct>(std::move(buffer));
|
|
|
|
|
|
|
+ return vm->new_user_object<Struct>(std::move(buffer));
|
|
|
}, {}, BindType::STATICMETHOD);
|
|
}, {}, BindType::STATICMETHOD);
|
|
|
|
|
|
|
|
vm->bind__repr__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
|
vm->bind__repr__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
|
|
- C99Struct& self = _CAST(C99Struct&, obj);
|
|
|
|
|
|
|
+ Struct& self = _CAST(Struct&, obj);
|
|
|
SStream ss;
|
|
SStream ss;
|
|
|
ss << "<struct object of " << self.size << " bytes>";
|
|
ss << "<struct object of " << self.size << " bytes>";
|
|
|
return VAR(ss.str());
|
|
return VAR(ss.str());
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
vm->bind_method<0>(type, "addr", [](VM* vm, ArgsView args){
|
|
vm->bind_method<0>(type, "addr", [](VM* vm, ArgsView args){
|
|
|
- C99Struct& self = _CAST(C99Struct&, args[0]);
|
|
|
|
|
|
|
+ Struct& self = _CAST(Struct&, args[0]);
|
|
|
return vm->new_user_object<VoidP>(self.p);
|
|
return vm->new_user_object<VoidP>(self.p);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
vm->bind_method<0>(type, "sizeof", [](VM* vm, ArgsView args){
|
|
vm->bind_method<0>(type, "sizeof", [](VM* vm, ArgsView args){
|
|
|
- C99Struct& self = _CAST(C99Struct&, args[0]);
|
|
|
|
|
|
|
+ Struct& self = _CAST(Struct&, args[0]);
|
|
|
return VAR(self.size);
|
|
return VAR(self.size);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
vm->bind_method<0>(type, "copy", [](VM* vm, ArgsView args){
|
|
vm->bind_method<0>(type, "copy", [](VM* vm, ArgsView args){
|
|
|
- const C99Struct& self = _CAST(C99Struct&, args[0]);
|
|
|
|
|
- return vm->heap.gcnew<C99Struct>(vm->_tp(args[0]), self);
|
|
|
|
|
|
|
+ const Struct& self = _CAST(Struct&, args[0]);
|
|
|
|
|
+ return vm->heap.gcnew<Struct>(vm->_tp(args[0]), self);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
vm->bind__eq__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* lhs, PyObject* rhs){
|
|
vm->bind__eq__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* lhs, PyObject* rhs){
|
|
|
- C99Struct& self = _CAST(C99Struct&, lhs);
|
|
|
|
|
- if(!vm->is_user_type<C99Struct>(rhs)) return vm->NotImplemented;
|
|
|
|
|
- C99Struct& other = _CAST(C99Struct&, rhs);
|
|
|
|
|
|
|
+ Struct& self = _CAST(Struct&, lhs);
|
|
|
|
|
+ if(!vm->is_user_type<Struct>(rhs)) return vm->NotImplemented;
|
|
|
|
|
+ Struct& other = _CAST(Struct&, rhs);
|
|
|
bool ok = self.size == other.size && memcmp(self.p, other.p, self.size) == 0;
|
|
bool ok = self.size == other.size && memcmp(self.p, other.p, self.size) == 0;
|
|
|
return VAR(ok);
|
|
return VAR(ok);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
#define BIND_SETGET(T, name) \
|
|
#define BIND_SETGET(T, name) \
|
|
|
vm->bind(type, "read_" name "(self, offset=0)", [](VM* vm, ArgsView args){ \
|
|
vm->bind(type, "read_" name "(self, offset=0)", [](VM* vm, ArgsView args){ \
|
|
|
- C99Struct& self = _CAST(C99Struct&, args[0]); \
|
|
|
|
|
|
|
+ Struct& self = _CAST(Struct&, args[0]); \
|
|
|
i64 offset = CAST(i64, args[1]); \
|
|
i64 offset = CAST(i64, args[1]); \
|
|
|
void* ptr = self.p + offset; \
|
|
void* ptr = self.p + offset; \
|
|
|
return VAR(*(T*)ptr); \
|
|
return VAR(*(T*)ptr); \
|
|
|
}); \
|
|
}); \
|
|
|
vm->bind(type, "write_" name "(self, value, offset=0)", [](VM* vm, ArgsView args){ \
|
|
vm->bind(type, "write_" name "(self, value, offset=0)", [](VM* vm, ArgsView args){ \
|
|
|
- C99Struct& self = _CAST(C99Struct&, args[0]); \
|
|
|
|
|
|
|
+ Struct& self = _CAST(Struct&, args[0]); \
|
|
|
i64 offset = CAST(i64, args[2]); \
|
|
i64 offset = CAST(i64, args[2]); \
|
|
|
void* ptr = self.p + offset; \
|
|
void* ptr = self.p + offset; \
|
|
|
*(T*)ptr = CAST(T, args[1]); \
|
|
*(T*)ptr = CAST(T, args[1]); \
|
|
@@ -162,7 +162,7 @@ void add_module_c(VM* vm){
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
vm->register_user_class<VoidP>(mod, "void_p", true);
|
|
vm->register_user_class<VoidP>(mod, "void_p", true);
|
|
|
- vm->register_user_class<C99Struct>(mod, "struct", true);
|
|
|
|
|
|
|
+ vm->register_user_class<Struct>(mod, "struct", true);
|
|
|
|
|
|
|
|
mod->attr().set("NULL", vm->new_user_object<VoidP>(nullptr));
|
|
mod->attr().set("NULL", vm->new_user_object<VoidP>(nullptr));
|
|
|
|
|
|
|
@@ -193,7 +193,7 @@ void add_module_c(VM* vm){
|
|
|
#define BIND_PRIMITIVE(T, CNAME) \
|
|
#define BIND_PRIMITIVE(T, CNAME) \
|
|
|
vm->bind_func<1>(mod, CNAME "_", [](VM* vm, ArgsView args){ \
|
|
vm->bind_func<1>(mod, CNAME "_", [](VM* vm, ArgsView args){ \
|
|
|
T val = CAST(T, args[0]); \
|
|
T val = CAST(T, args[0]); \
|
|
|
- return vm->new_user_object<C99Struct>(&val, sizeof(T)); \
|
|
|
|
|
|
|
+ return vm->new_user_object<Struct>(&val, sizeof(T)); \
|
|
|
}); \
|
|
}); \
|
|
|
type = vm->new_type_object(mod, CNAME "_p", vm->_tp_user<VoidP>()); \
|
|
type = vm->new_type_object(mod, CNAME "_p", vm->_tp_user<VoidP>()); \
|
|
|
mod->attr().set(CNAME "_p", type); \
|
|
mod->attr().set(CNAME "_p", type); \
|