mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
support vm switch
This commit is contained in:
parent
e04d4e790c
commit
397123e3c9
@ -47,10 +47,15 @@ extern py_GlobalRef py_None;
|
||||
extern py_GlobalRef py_NIL;
|
||||
|
||||
/************* Global Setup *************/
|
||||
/// Initialize the VM.
|
||||
/// Initialize pocketpy and the default VM.
|
||||
void py_initialize();
|
||||
/// Finalize the VM.
|
||||
/// Finalize pocketpy.
|
||||
void py_finalize();
|
||||
/// Get the current VM index.
|
||||
int py_currentvm();
|
||||
/// Switch to a VM.
|
||||
/// @param index index of the VM ranging from 0 to 16 (exclusive). `0` is the default VM.
|
||||
void py_switchvm(int index);
|
||||
|
||||
/// Run a source string.
|
||||
/// @param source source string.
|
||||
|
@ -17,11 +17,13 @@ py_GlobalRef py_None;
|
||||
py_GlobalRef py_NIL;
|
||||
|
||||
static pk_VM pk_default_vm;
|
||||
static pk_VM* pk_all_vm[16];
|
||||
|
||||
void py_initialize() {
|
||||
pk_MemoryPools__initialize();
|
||||
py_Name__initialize();
|
||||
pk_current_vm = &pk_default_vm;
|
||||
|
||||
pk_current_vm = pk_all_vm[0] = &pk_default_vm;
|
||||
|
||||
// initialize some convenient references
|
||||
static py_TValue _True, _False, _None, _NIL;
|
||||
@ -37,12 +39,35 @@ void py_initialize() {
|
||||
}
|
||||
|
||||
void py_finalize() {
|
||||
for(int i = 1; i < 16; i++) {
|
||||
pk_VM* vm = pk_all_vm[i];
|
||||
if(vm) {
|
||||
pk_VM__dtor(vm);
|
||||
free(vm);
|
||||
}
|
||||
}
|
||||
pk_VM__dtor(&pk_default_vm);
|
||||
pk_current_vm = NULL;
|
||||
py_Name__finalize();
|
||||
pk_MemoryPools__finalize();
|
||||
}
|
||||
|
||||
void py_switchvm(int index){
|
||||
if(index < 0 || index >= 16) c11__abort("invalid vm index");
|
||||
if(!pk_all_vm[index]){
|
||||
pk_all_vm[index] = malloc(sizeof(pk_VM));
|
||||
pk_VM__ctor(pk_all_vm[index]);
|
||||
}
|
||||
pk_current_vm = pk_all_vm[index];
|
||||
}
|
||||
|
||||
int py_currentvm() {
|
||||
for(int i = 0; i < 16; i++) {
|
||||
if(pk_all_vm[i] == pk_current_vm) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char* pk_opname(Opcode op) {
|
||||
const static char* OP_NAMES[] = {
|
||||
#define OPCODE(name) #name,
|
||||
|
Loading…
x
Reference in New Issue
Block a user