Commit Graph

160 Commits

Author SHA1 Message Date
Kayne Ruse
6f27d07829 Added a few opcodes to the inspector 2026-04-12 00:19:20 +10:00
Kayne Ruse
b32ea9f309 Started working on a decompiler, called 'bytecode inspector'
It only has a few instructions for now, but I can flesh it out over
time.
2026-04-11 13:37:26 +10:00
Kayne Ruse
49a825aaf9 Removed some old notes 2026-04-11 02:06:59 +10:00
Kayne Ruse
66155fa213 Tweak, but I need a decompiler now 2026-04-10 16:19:03 +10:00
Kayne Ruse
547229e150 Script tests re-added, all tests can run under gdb
Also fixed a minor bug with printing, and removed the ability to
configure the parser.

Added and updated QUICKSTART.md as a quick way to get people started.

There's some broken scripts under 'scripts/' that require functions to
work properly.
2026-04-10 15:28:56 +10:00
Kayne Ruse
842f041a50 VM test is passing 2026-04-07 21:34:05 +10:00
Kayne Ruse
09fc6d5279 Compiler test is passing 2026-04-07 20:36:58 +10:00
Kayne Ruse
48072f0dd1 AST test is passing 2026-04-07 20:06:44 +10:00
Kayne Ruse
522fc3e64b Value test is passing 2026-04-07 19:44:28 +10:00
Kayne Ruse
f4ce6ad9f1 String test is passing
Note: String fragmentation is no longer supported
2026-04-07 19:22:31 +10:00
Kayne Ruse
f06218b9cd 'print' now works as expected
String literals are now stored in the bucket mid-compilation, but this
is fine, as the buckets are freed one the bytecode is complete.
2026-04-06 23:08:17 +10:00
Kayne Ruse
1ae3fcbf73 WIP: Scopes weren't tracking their content sizes
'print' no longer segfaults from a long chain of indirect memory frees.

It still doesn't work though, which is odd.
2026-04-06 21:50:41 +10:00
Kayne Ruse
fbb7e1bc54 WIP: Retreived the unit tests (formerly test cases)
Some of these still work, others have just been dummied out for now.

Also added tests for console colors tool, and tweaked it to work
properly.
2026-04-05 18:42:56 +10:00
Kayne Ruse
57fe9bb00d WIP: Compiles but still very broken 2026-04-05 17:04:30 +10:00
Kayne Ruse
914ee6fcfa WIP: Fixed strings and scopes, still reworking impacted areas 2026-04-05 10:13:58 +10:00
Kayne Ruse
ba9418f365 Removed unneeded files and console colors are disabled 2026-04-04 20:35:12 +11:00
Kayne Ruse
4b21e61df0 Updated README 2025-02-28 11:30:01 +11:00
Kayne Ruse
d3b59eb0da WIP functions working, untested, memory issues, read more
I've ripped out the deep copying, and flattened the bucket usage, but
this results in no memory being freed or reused for the lifetime of the
program.

This is shown most clearly with this script:

```toy
fn makeCounter() {
	var counter: int = 0;

	fn increment() {
		return ++counter;
	}

	return increment;
}

var tally = makeCounter();

while (true) {
	var result = tally();

	if (result >= 10_000_000) {
		break;
	}
}
```

The number of calls vs amount of memory consumed is:

```
function calls -> memory used in megabytes
1_000 -> 0.138128
10_000 -> 2.235536
100_000 -> 21.7021
1_000_000 -> 216.1712
10_000_000 -> 1520.823
```

Obviously this needs to be fixed, as ballooning to gigabytes of memory
in only a moment isn't practical. That will be the next task - to find
some way to free memory that isn't needed anymore.

See #163, #160
2025-02-21 11:41:27 +11:00
Kayne Ruse
9fe6d6b218 WIP bad approach, read more
I build a self-referential system, then tried to copy only parts. I need
to step back and adjust my approach.

'Toy_private_deepCopyValue' and 'Toy_private_deepCopyScope' need to be
ripped out, and I need to simply accept there will be only one instance
of 'Toy_Bucket' that isn't freed until the top-level VM is.

I need an hour's break before I'll tackle this again.

See #163
2025-02-18 13:06:15 +11:00
Kayne Ruse
639250f028 WIP return keyword, read more
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
2025-02-17 19:10:24 +11:00
Kayne Ruse
02dfc996b4 Functions are successfully called, read more
Return keyword is not yet implemented.

Functions are untested.

See #163
2025-02-17 14:05:07 +11:00
Kayne Ruse
76d89fe0ad Reduced excessive calls to Toy_unwrapValue()
In practice, references only point to arrays or tables.

Fixed #176
2025-02-17 04:42:22 +11:00
Kayne Ruse
258968d7a4 WIP, Functions are declared, still not called 2025-02-11 11:55:35 +11:00
Kayne Ruse
7a8c415b3f Functions are written, but not yet executed, untested 2025-02-10 20:17:53 +11:00
Kayne Ruse
344c265918 Parameters are immutable
It took me a whole day to change one line.
2025-02-09 14:34:44 +11:00
NishiOwO
1006b6e216 Add bitness definitions, and platform definitions 2025-02-08 22:14:32 +09:00
NishiOwO
a1cfc095a7 Compile on NetBSD 2025-02-08 22:09:28 +09:00
Kayne Ruse
7c054db9e6 Compiler now reuses existing strings in the data, read more
If a string exists in the data, instead of being written, the function
'emitCStringToData()' will instead return the address of the match
within the data section.

Then, I can search the jump table for that address, and use the existing
jump entry or append a new one.

Fixes #168
2025-02-08 17:27:47 +11:00
Kayne Ruse
e2a284d9ce Ensured parser is reading functions correctly, read more
Parameter lists are read manually, rather than delegating to
parsePrecedence, because that was causing issues.

function bodies are read as block-level statements, just like the entire
files.
2025-02-08 12:00:55 +11:00
Kayne Ruse
c646904407 replaced void* with unsigned char* everywhere 2025-02-08 00:53:23 +11:00
Kayne Ruse
470836a390 Renamed Toy_ModuleBuilder to Toy_ModuleCompiler
I also noticed that Toy_ModuleBundle isn't being used right now.
2025-02-08 00:23:19 +11:00
Kayne Ruse
b93ea5006c Functions are WIP, read more
They're no-ops in compilation for now, and param types aren't parsed.

'return' keyword needs to be implemented.

Was distracted by bugfixes in v2 and v2-docs.
2025-02-02 17:26:47 +11:00
Kayne Ruse
336616a1bf Tweaked truthiness, fixed int to float coersion 2025-02-02 16:38:46 +11:00
Kayne Ruse
63cc530899 Fixed continue keyword, was pointing at break's target 2025-02-02 16:15:20 +11:00
Kayne Ruse
3c0a50c4cd Tweaked AST bitness test 2025-02-01 10:04:19 +11:00
Kayne Ruse
481d17f040 Tests are passing, added preserveScope to VM API 2025-01-31 13:51:53 +11:00
Kayne Ruse
bfed4e23f3 Repl works, also fixed a few small bugs 2025-01-31 10:16:06 +11:00
Kayne Ruse
002651f95d WIP, adjusting architecture, read more
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.
2025-01-29 10:21:33 +11:00
Kayne Ruse
f9715c2016 Too buggered to think today. 2025-01-15 14:05:31 +11:00
Kayne Ruse
05451af8d7 What is the most bullshit error you've ever seen?
'error: no newline at end of file'

This only occurs in the MacOS builds.
2025-01-15 08:40:22 +11:00
Kayne Ruse
730353342d Updated license date, tweaked an error message 2025-01-14 13:23:23 +11:00
Kayne Ruse
513d8f130c Fixed obscure EOF bug in lexer 2025-01-14 12:45:11 +11:00
Kayne Ruse
9141102f2e Fixed stack overflow caused by assignments, read more
Variable declaration was also causing this issue.

It was caused by a value being left on the stack after these statements.
It wasn't a quick fix, as chained assignments depended on it. Now, the
assignment opcode has a configuration option, indicating if the last
value should be left on the stack or not.

This also means the benchmark in 'scripts/benchpress.toy' will no longer
cause a stack overflow.

Fixed #171
2025-01-11 15:07:29 +11:00
Kayne Ruse
ce03a342c9 Fixed a missing ';' required at the end of var statements 2025-01-11 13:27:06 +11:00
Kayne Ruse
14696833fd Postfix '++' & '--' works (prefix & postfix are both tested) 2025-01-09 18:33:10 +11:00
Kayne Ruse
6f16c31f24 Prefix '++' working (postfix is next) 2025-01-09 16:45:48 +11:00
Kayne Ruse
3aee2ba664 Added quotemarks to internal string elements
This applies to strings within arrays and tables.
2025-01-09 12:11:23 +11:00
Kayne Ruse
b55192e513 Removed stubs for types as values
Also potentially fixed a bug in the previous commit, not certain
2025-01-09 11:46:29 +11:00
Kayne Ruse
90ffe9b40e Disallow empty bodies in control flow statements, added 'pass' keyword
Fixed #170
2025-01-09 11:03:03 +11:00
Kayne Ruse
23eb3e45df Keywords 'break' & 'continue' tested
There were a couple bugs - I'm glad I'm so thorough with these tests.

See #152
2024-12-30 16:56:57 +11:00