mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
Functions are having issues with being copied around, especially between buckets, leading to the scopes getting looped. The program gets stuck in 'incrementRefCount()'. It's past my time limit, so I'll keep working on it tomorrow with a fresh mind. All function stuff is still untested. See #163
59 lines
1.5 KiB
C
59 lines
1.5 KiB
C
#pragma once
|
|
|
|
#include "toy_common.h"
|
|
|
|
#include "toy_bucket.h"
|
|
#include "toy_scope.h"
|
|
#include "toy_module.h"
|
|
|
|
#include "toy_value.h"
|
|
#include "toy_string.h"
|
|
#include "toy_stack.h"
|
|
#include "toy_array.h"
|
|
#include "toy_table.h"
|
|
#include "toy_function.h"
|
|
|
|
typedef struct Toy_VM {
|
|
//raw instructions to be executed
|
|
unsigned char* code;
|
|
|
|
//metadata
|
|
unsigned int jumpsCount;
|
|
unsigned int paramCount;
|
|
unsigned int dataCount;
|
|
unsigned int subsCount;
|
|
|
|
unsigned int codeAddr;
|
|
unsigned int jumpsAddr;
|
|
unsigned int paramAddr;
|
|
unsigned int dataAddr;
|
|
unsigned int subsAddr;
|
|
|
|
//execution utils
|
|
unsigned int programCounter;
|
|
|
|
//scope - block-level key/value pairs
|
|
Toy_Scope* scope;
|
|
|
|
//stack - immediate-level values only
|
|
Toy_Stack* stack;
|
|
|
|
//easy access to memory
|
|
Toy_Bucket* literalBucket; //stores the value literals (strings, functions, etc.)
|
|
Toy_Bucket* scopeBucket; //stores the scope instances
|
|
Toy_Bucket** scopeBucketHandle; //for reusing the scope bucket to save on alloc/free
|
|
} Toy_VM;
|
|
|
|
TOY_API void Toy_resetVM(Toy_VM* vm, bool preserveScope);
|
|
|
|
TOY_API void Toy_initVM(Toy_VM* vm); //creates memory
|
|
TOY_API void Toy_inheritVM(Toy_VM* vm, Toy_VM* parent); //inherits scope bucket
|
|
|
|
TOY_API void Toy_bindVM(Toy_VM* vm, Toy_Module* module, bool preserveScope);
|
|
TOY_API unsigned int Toy_runVM(Toy_VM* vm);
|
|
TOY_API void Toy_freeVM(Toy_VM* vm);
|
|
|
|
TOY_API Toy_Array* Toy_extractResultsFromVM(Toy_Bucket** bucketHandle, Toy_VM* subVM, unsigned int resultCount);
|
|
|
|
//TODO: inject extra data (hook system for external libraries)
|