mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
The 'source' directory compiles, but the repl and tests are almost
untouched so far. There's no guarantee that the code in 'source' is
correct, so I'm branching this for a short time, until I'm confident the
whole project passes the CI again.
I'm adjusting the concepts of routines and bytecode to make them more
consistent, and tweaking the VM so it loads from an instance of
'Toy_Module'.
* 'Toy_ModuleBuilder' (formally 'Toy_Routine')
This is where the AST is compiled, producing a chunk of memory that can
be read by the VM. This will eventually operate on individual
user-defined functions as well.
* 'Toy_ModuleBundle' (formally 'Toy_Bytecode')
This collects one or more otherwise unrelated modules into one chunk of
memory, stored in sequence. It is also preprended with the version data for
Toy's reference implementation:
For each byte in the bytecode:
0th: TOY_VERSION_MAJOR
1st: TOY_VERSION_MINOR
2nd: TOY_VERSION_PATCH
3rd: (the number of modules in the bundle)
4th and onwards: TOY_VERSION_BUILD
TOY_VERSION_BUILD has always been a null terminated C-string, but from
here on, it begins at the word-alignment, and continues until the first
word-alignment after the null terminator.
As for the 3rd byte listed, since having more than 256 modules in one
bundle seems unlikely, I'm storing the count here, as it was otherwise
unused. This is a bit janky, but it works for now.
* 'Toy_Module'
This new structure represents a single complete unit of operation, such
as a single source file, or a user-defined function. It is divided into
three main sections, with various sub-sections.
HEADER (all members are unsigned ints):
total module size in bytes
jumps count
param count
data count
subs count
code addr
jumps addr (if jumps count > 0)
param addr (if param count > 0)
data addr (if data count > 0)
subs addr (if subs count > 0)
BODY:
<raw opcodes, etc.>
DATA:
jumps table
uint array, pointing to addresses in 'data' or 'subs'
param table
uint array, pointing to addresses in 'data'
data
heterogeneous data, including strings
subs
an array of modules, using recursive logic
The reference implementation as a whole uses a lot of recursion, so this
makes sense.
The goal of this rework is so 'Toy_Module' can be added as a member of
'Toy_Value', as a simple and logical way to handle functions. I'll
probably use the union pattern, similarly to Toy_String, so functions
can be written in C and Toy, and used without needing to worry which is
which.
69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
#pragma once
|
||
|
||
//for specified type sizes
|
||
#include <stdbool.h>
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
|
||
//TOY_API is platform-dependant, and marks publicly usable API functions
|
||
#if defined(__linux__)
|
||
#define TOY_API extern
|
||
#elif defined(_WIN32) || defined(_WIN64)
|
||
#if defined(TOY_EXPORT)
|
||
#define TOY_API __declspec(dllexport)
|
||
#elif defined(TOY_IMPORT)
|
||
#define TOY_API __declspec(dllimport)
|
||
#else
|
||
#define TOY_API extern
|
||
#endif
|
||
#elif defined(__APPLE__)
|
||
#define TOY_API extern
|
||
#else
|
||
//generic solution
|
||
#define TOY_API extern
|
||
#endif
|
||
|
||
//TOY_BITNESS is used to encourage memory-cache friendliness
|
||
#if defined(__linux__)
|
||
#if defined(__LP64__)
|
||
#define TOY_BITNESS 64
|
||
#else
|
||
#define TOY_BITNESS 32
|
||
#endif
|
||
#elif defined(_WIN32) || defined(_WIN64)
|
||
#if defined(_WIN64)
|
||
#define TOY_BITNESS 64
|
||
#else
|
||
#define TOY_BITNESS 32
|
||
#endif
|
||
#elif defined(__APPLE__)
|
||
#if defined(__LP64__)
|
||
#define TOY_BITNESS 64
|
||
#else
|
||
#define TOY_BITNESS 32
|
||
#endif
|
||
#else
|
||
//generic solution
|
||
#define TOY_BITNESS -1
|
||
#endif
|
||
|
||
//version specifiers, embedded as the header
|
||
#define TOY_VERSION_MAJOR 2
|
||
#define TOY_VERSION_MINOR 0
|
||
#define TOY_VERSION_PATCH 0
|
||
|
||
//defined as a function, for technical reasons
|
||
#define TOY_VERSION_BUILD Toy_private_version_build()
|
||
TOY_API const char* Toy_private_version_build(void);
|
||
|
||
/*
|
||
|
||
Version validation rules:
|
||
|
||
* Under no circumstance, should you ever run code whose major version is different from the interpreter’s major version
|
||
* Under no circumstance, should you ever run code whose minor version is above the interpreter’s minor version
|
||
* You may, at your own risk, attempt to run code whose patch version is different from the interpreter’s patch version
|
||
* You may, at your own risk, attempt to run code whose build version is different from the interpreter’s build version
|
||
|
||
*/
|