support vm switch

This commit is contained in:
blueloveTH 2024-08-03 15:07:47 +08:00
parent e04d4e790c
commit 397123e3c9
2 changed files with 33 additions and 3 deletions

View File

@ -47,10 +47,15 @@ extern py_GlobalRef py_None;
extern py_GlobalRef py_NIL; extern py_GlobalRef py_NIL;
/************* Global Setup *************/ /************* Global Setup *************/
/// Initialize the VM. /// Initialize pocketpy and the default VM.
void py_initialize(); void py_initialize();
/// Finalize the VM. /// Finalize pocketpy.
void py_finalize(); 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. /// Run a source string.
/// @param source source string. /// @param source source string.

View File

@ -17,11 +17,13 @@ py_GlobalRef py_None;
py_GlobalRef py_NIL; py_GlobalRef py_NIL;
static pk_VM pk_default_vm; static pk_VM pk_default_vm;
static pk_VM* pk_all_vm[16];
void py_initialize() { void py_initialize() {
pk_MemoryPools__initialize(); pk_MemoryPools__initialize();
py_Name__initialize(); py_Name__initialize();
pk_current_vm = &pk_default_vm;
pk_current_vm = pk_all_vm[0] = &pk_default_vm;
// initialize some convenient references // initialize some convenient references
static py_TValue _True, _False, _None, _NIL; static py_TValue _True, _False, _None, _NIL;
@ -37,12 +39,35 @@ void py_initialize() {
} }
void py_finalize() { 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_VM__dtor(&pk_default_vm);
pk_current_vm = NULL; pk_current_vm = NULL;
py_Name__finalize(); py_Name__finalize();
pk_MemoryPools__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 char* pk_opname(Opcode op) {
const static char* OP_NAMES[] = { const static char* OP_NAMES[] = {
#define OPCODE(name) #name, #define OPCODE(name) #name,