mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 20:40:18 +00:00
...
This commit is contained in:
parent
f240d0e9f4
commit
1e1063edfe
@ -911,43 +911,18 @@ inline void VM::post_init(){
|
|||||||
} // namespace pkpy
|
} // namespace pkpy
|
||||||
|
|
||||||
/*************************GLOBAL NAMESPACE*************************/
|
/*************************GLOBAL NAMESPACE*************************/
|
||||||
|
static std::map<void*, void(*)(void*)> _pk_deleter_map;
|
||||||
class PkExportedBase{
|
|
||||||
public:
|
|
||||||
virtual ~PkExportedBase() = default;
|
|
||||||
virtual void* get() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::vector<PkExportedBase*> _pk_lookup_table;
|
|
||||||
template<typename T>
|
|
||||||
class PkExported : public PkExportedBase{
|
|
||||||
T* _ptr;
|
|
||||||
public:
|
|
||||||
template<typename... Args>
|
|
||||||
PkExported(Args&&... args) {
|
|
||||||
_ptr = new T(std::forward<Args>(args)...);
|
|
||||||
_pk_lookup_table.push_back(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
~PkExported() override { delete _ptr; }
|
|
||||||
void* get() override { return _ptr; }
|
|
||||||
operator T*() { return _ptr; }
|
|
||||||
};
|
|
||||||
|
|
||||||
#define PKPY_ALLOCATE(T, ...) *(new PkExported<T>(__VA_ARGS__))
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
__EXPORT
|
__EXPORT
|
||||||
void pkpy_delete(void* p){
|
void pkpy_delete(void* p){
|
||||||
for(int i = 0; i < _pk_lookup_table.size(); i++){
|
auto it = _pk_deleter_map.find(p);
|
||||||
if(_pk_lookup_table[i]->get() == p){
|
if(it != _pk_deleter_map.end()){
|
||||||
delete _pk_lookup_table[i];
|
it->second(p);
|
||||||
_pk_lookup_table.erase(_pk_lookup_table.begin() + i);
|
}else{
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
__EXPORT
|
__EXPORT
|
||||||
void pkpy_vm_exec(pkpy::VM* vm, const char* source){
|
void pkpy_vm_exec(pkpy::VM* vm, const char* source){
|
||||||
@ -980,7 +955,9 @@ extern "C" {
|
|||||||
|
|
||||||
__EXPORT
|
__EXPORT
|
||||||
pkpy::REPL* pkpy_new_repl(pkpy::VM* vm){
|
pkpy::REPL* pkpy_new_repl(pkpy::VM* vm){
|
||||||
return PKPY_ALLOCATE(pkpy::REPL, vm);
|
pkpy::REPL* p = new pkpy::REPL(vm);
|
||||||
|
_pk_deleter_map[p] = [](void* p){ delete (pkpy::REPL*)p; };
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
__EXPORT
|
__EXPORT
|
||||||
@ -995,7 +972,9 @@ extern "C" {
|
|||||||
|
|
||||||
__EXPORT
|
__EXPORT
|
||||||
pkpy::VM* pkpy_new_vm(bool use_stdio=true, bool enable_os=true){
|
pkpy::VM* pkpy_new_vm(bool use_stdio=true, bool enable_os=true){
|
||||||
return PKPY_ALLOCATE(pkpy::VM, use_stdio, enable_os);
|
pkpy::VM* p = new pkpy::VM(use_stdio, enable_os);
|
||||||
|
_pk_deleter_map[p] = [](void* p){ delete (pkpy::VM*)p; };
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
__EXPORT
|
__EXPORT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user