| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
| |
Layers 0-89 are used in self-hosting SubX.
Layers 90-99 are not needed for self-hosting SubX, and therefore could
use transitional levels of syntax sugar.
Layers 100 and up use all SubX syntax sugar.
|
|
|
|
| |
Finalize design for type trees.
|
|
|
|
|
|
|
|
|
|
| |
When I created it I was conflating two things:
a) needing to refer to just the start, rather than the whole, and
b) counting indirections.
Both are kinda ill-posed. Now Mu will have just `addr` and `handle` types.
Normal types will translate implicitly to `addr` types, while `handle`
will always require explicit handling.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Follow stupid GNU convention, because why not:
https://www.gnu.org/prep/standards/html_node/Releases.html
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
I can now run this program:
fn main -> result/ebx: int {
result <- do-add 3 4
}
fn do-add a: int, b: int -> result/ebx: int {
result <- copy a
result <- add b
}
We still can't define local variables, but can write any programs involving
ints by passing in enough arguments for temporaries.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Let's start putting r32 first in compare instructions that need it. Ordering
there is quite subtle and of great import.
|
|
|
|
| |
Bugfix.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
We haven't implemented it yet, but there's now a design for how we check
whether a function has written its output correctly. Functions must write
to each output at the top level at least once, and never overwrite an output
register in the top-level once it's been defined.
This is conservative (it can be perfectly reasonable for functions to write
the output, reuse the register for a temporary, and then write the output
again) but easy to check.
|
| |
|
|
|
|
|
| |
Bugfix: statements defining a new register variable require an initializer
instruction.
|
| |
|
|
|
|
|
| |
Copy (mov) instructions are unlike instructions we've encoded so far, in
that their destination is not read.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
See test-convert-function-with-arg-and-body.
|
|
|
|
|
|
|
|
|
|
|
| |
One test failing. It took enough debugging just to get to the expected
failure that it seems worth saving this snapshot.
Saw some signs that I have to remember to zero-out allocated memory. We
need a scalable solution for this.
I think parse-var-with-type needs to be rewritten. Just added a test and
a hacky fix for now.
|
| |
|
|
|
|
|
| |
Try to make the comments consistent with the type system we'll eventually
have.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
Rather surprisingly, all the treeshake tooling is done in just about 2
hours of work. From now on it'll be easier to update stats.txt. Observations:
a) Binaries are tiny compared to conventional stacks. Tens of KB.
b) ~80% of binaries are tests and unused libraries in all my apps.
c) ~75% of LoC in SubX sources are tests or comments.
|
|
|
|
|
| |
Fix a bug in one test: it checks eax when the component under test returns
nothing. It's been just accidentally passing all these months.
|
|
|
|
|
|
| |
Standardize conventions for labels within objects in the data segment.
We're going to use this in a new tool.
|
|
|
|
|
| |
All tests passing again. We have big gaping holes for type- and var-management.
We're going to work on the latter first.
|
|
|
|
|
| |
Lots of debugging to add two curly braces. I need tests for populate-mu-function-body,
or even parse-mu-block.
|
| |
|
|
|
|
|
| |
parse-mu-stmt now working, though we'll need to go back and stop creating
a new var for every instance of a variable in a scope.
|
| |
|
|
|
|
|
| |
Snapshot with new skeleton for parsing function body.
New test still failing, but only in the one expected place.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Function headers seem to be parsing right.
|