From 397123e3c97d75cd8fcf29ae453cdc7ba059d31f Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 3 Aug 2024 15:07:47 +0800 Subject: [PATCH] support vm switch --- include/pocketpy/pocketpy.h | 9 +++++++-- src/public/internal.c | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h index 03a9aa64..2b87083a 100644 --- a/include/pocketpy/pocketpy.h +++ b/include/pocketpy/pocketpy.h @@ -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. diff --git a/src/public/internal.c b/src/public/internal.c index c16ed9bc..03eb16a5 100644 --- a/src/public/internal.c +++ b/src/public/internal.c @@ -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,