mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 19:40:18 +00:00
up
This commit is contained in:
parent
300058b063
commit
234ec85fc6
30
src/cffi.h
30
src/cffi.h
@ -223,21 +223,6 @@ struct Pointer{
|
|||||||
self.set(vm, args[1]);
|
self.set(vm, args[1]);
|
||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<1>(type, "cast", [](VM* vm, Args& args) {
|
|
||||||
Pointer& self = CAST(Pointer&, args[0]);
|
|
||||||
const Str& name = CAST(Str&, args[1]);
|
|
||||||
int level = 0;
|
|
||||||
for(int i=name.size()-1; i>=0; i--){
|
|
||||||
if(name[i] == '*') level++;
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
if(level == 0) vm->TypeError("expect a pointer type, such as 'int*'");
|
|
||||||
Str type_s = name.substr(0, name.size()-level);
|
|
||||||
const TypeInfo* type = _type_db.get(type_s);
|
|
||||||
if(type == nullptr) vm->TypeError("unknown type: " + type_s.escape(true));
|
|
||||||
return VAR_T(Pointer, type, level, self.ptr);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -385,6 +370,21 @@ void add_module_c(VM* vm){
|
|||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
vm->bind_func<2>(mod, "cast", [](VM* vm, Args& args) {
|
||||||
|
Pointer& self = CAST(Pointer&, args[0]);
|
||||||
|
const Str& name = CAST(Str&, args[1]);
|
||||||
|
int level = 0;
|
||||||
|
for(int i=name.size()-1; i>=0; i--){
|
||||||
|
if(name[i] == '*') level++;
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
if(level == 0) vm->TypeError("expect a pointer type, such as 'int*'");
|
||||||
|
Str type_s = name.substr(0, name.size()-level);
|
||||||
|
const TypeInfo* type = _type_db.get(type_s);
|
||||||
|
if(type == nullptr) vm->TypeError("unknown type: " + type_s.escape(true));
|
||||||
|
return VAR_T(Pointer, type, level, self.ptr);
|
||||||
|
});
|
||||||
|
|
||||||
vm->bind_func<1>(mod, "sizeof", [](VM* vm, Args& args) {
|
vm->bind_func<1>(mod, "sizeof", [](VM* vm, Args& args) {
|
||||||
const Str& name = CAST(Str&, args[0]);
|
const Str& name = CAST(Str&, args[0]);
|
||||||
if(name.find('*') != Str::npos) return VAR(sizeof(void*));
|
if(name.find('*') != Str::npos) return VAR(sizeof(void*));
|
||||||
|
@ -14,7 +14,7 @@ int main(){
|
|||||||
|
|
||||||
pkpy_vm_exec(vm, R"(
|
pkpy_vm_exec(vm, R"(
|
||||||
from c import *
|
from c import *
|
||||||
p = malloc(4).cast("int*")
|
p = cast(malloc(4), "int*")
|
||||||
ret = f(p)
|
ret = f(p)
|
||||||
print(p.get()) # 100
|
print(p.get()) # 100
|
||||||
print(ret, ret.get()) # 3.5
|
print(ret, ret.get()) # 3.5
|
||||||
|
Loading…
x
Reference in New Issue
Block a user