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;
|
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.
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user