blueloveTH 1 год назад
Родитель
Сommit
397123e3c9
2 измененных файлов с 33 добавлено и 3 удалено
  1. 7 2
      include/pocketpy/pocketpy.h
  2. 26 1
      src/public/internal.c

+ 7 - 2
include/pocketpy/pocketpy.h

@@ -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.

+ 26 - 1
src/public/internal.c

@@ -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,