about summary refs log tree commit diff stats
path: root/subx/apps/handle
Commit message (Collapse)AuthorAgeFilesLines
* new primitives: append-byte, append-byte-hexKartik Agaram2019-05-021-0/+0
| | | | | | | These are variants of write-byte-buffered and print-byte-buffered respectively that operate on in-memory `stream`s rather than `buffered-file`s. They don't operate on files, so we'll avoid using the prefix 'write-'.
* standardize function namesKartik Agaram2019-05-021-0/+0
| | | | | Operations on buffered-file now always include the word 'buffered'. More verbose, but hopefully this highlights holes in the library.
* 5118 - convert int to stringKartik Agaram2019-04-231-0/+0
|
* 5090Kartik Agaram2019-04-131-0/+0
| | | | | | | Start using the new newline escape in string literals everywhere. I could use it more aggressively, but it makes tests harder to read. So only one line of text per string for now.
* 5074Kartik Agaram2019-04-101-0/+0
| | | | | | | | | | | | | Fail early when writing to a fake file runs out of space. Makes debugging tests easier. Reads from files, on the other hand, are only buffering to a temporary stream, so it makes sense to silently stop when they run out of space. In the process I uncovered a testing bug in pack.subx: I was missing a trailing space in the expected result, but the test still passed because the space was getting truncated. Being principled about aborting on overflow by default will help avoid such issues.
* 5060Kartik Agaram2019-04-061-0/+0
|
* 5059Kartik Agaram2019-04-051-0/+0
|
* 5056Kartik Agaram2019-04-051-0/+0
|
* 5053Kartik Agaram2019-04-031-0/+0
| | | | | | write-stream-buffered isn't a clean abstraction. Ignoring the 'read' index of a stream is a hack. It's just saving us the trouble of a rewind-stream. So make it a helper of pack.subx rather than part of the standard library.
* 5027Kartik Agaram2019-03-271-0/+0
| | | | | | | | | Testing conversion of multiple lines in a data segment. Bugs fixed: 1. Stack issues in next-token helpers. 2. Needed to teach next-token to avoid newlines. 3. rewind-stream(line) before passing it to convert-code or convert-instruction.
* 4999Kartik Agaram2019-03-101-0/+0
| | | | | | | | Fix CI. pack.subx was passing in emulation but not natively. Commit 4954 on Feb 10 was a real dud. First I find I forgot to reclaim space for locals (commit 4996). Now I find I haven't been tracking registers properly either.
* 4996 - back on pack.subxKartik Agaram2019-03-081-0/+0
| | | | | | | | | Yet another redrawing of responsibilities between convert and its helpers. In the process I discovered a bug in `write-stream-buffered` which ended up taking me through a detour to extract `browse_trace` into its own tool. It turns out just having long buffers is enough to need browse_trace. Simple operations like clearing a stream swamp a flat view of the trace.
* 4988Kartik Agaram2019-02-251-0/+0
|
* 4981 - no, go back to 3 phasesKartik Agaram2019-02-181-0/+0
| | | | | | | | | | | | | Considering how much trouble a merge phase would be (commit 4978), it seems simpler to just add the extra syntax for controlling the entry point of the generated ELF binary. But I wouldn't have noticed this if I hadn't taken the time to write out the commit messages of 4976 and 4978. Even if we happened to already have linked list primitives built, this may still be a good idea considering that I'm saving quite a lot of code in duplicated entrypoints.
* 4968Kartik Agaram2019-02-141-0/+0
|
* 4965Kartik Agaram2019-02-141-0/+0
|
* 4961Kartik Agaram2019-02-141-0/+0
|
* 4955Kartik Agaram2019-02-101-0/+0
| | | | Starting to build up Phase 2 (apps/pack) out of recently designed primitives.
* 4954Kartik Agaram2019-02-101-0/+0
|
* 4952Kartik Agaram2019-02-051-0/+0
|
* 4951Kartik Agaram2019-02-031-0/+0
| | | | Cleaner way to compare streams in tests.
* 4949Kartik Agaram2019-02-021-0/+0
|
* 4945Kartik Agaram2019-02-011-0/+0
|
* 4938Kartik Agaram2019-01-201-0/+0
|
* 4937Kartik Agaram2019-01-201-0/+0
|
* 4930Kartik Agaram2019-01-151-0/+0
|
* 4929Kartik Agaram2019-01-151-0/+0
| | | | Clean up primitives for converting from/to hex chars.
* 4928Kartik Agaram2019-01-141-0/+0
|
* 4927Kartik Agaram2019-01-141-0/+0
|
* 4926Kartik Agaram2019-01-141-0/+0
|
* 4925Kartik Agaram2019-01-141-0/+0
|
* 4923Kartik Agaram2019-01-121-0/+0
| | | | | We want slice-equal? for length-prefixed strings, not null-terminated "kernel" strings.
* 4920Kartik Agaram2019-01-111-0/+0
|
* 4916Kartik Agaram2019-01-101-0/+0
| | | | | In the process of building slice primitives I found an out-of-bounds access in write-byte.
* 4913Kartik Agaram2019-01-071-0/+0
|
* 4911Kartik Agaram2019-01-061-0/+0
|
* 4908Kartik Agaram2019-01-051-0/+0
| | | | | | | | Fix CI. a) Update canonical binaries. b) Fix an out-of-bounds access in `clear-stream`. This also required supporting a new instruction in `subx run` to load an imm8 into rm8.
* 4905 - safe ptr lookup is now 6 instructionsKartik Agaram2019-01-041-0/+0
| | | | | | | | | | | | | The lines within '{}' can now be turned into a macro like `E_X = deref(E_X)`, parameterizing the register being modified. Assumes the input is in a register but also saved elsewhere, so it's safe to clobber and replace with the result. Compare commit 4894. Used to take 9 instructions, 8 of them making loads/stores. Now it's 6 instructions, 4 of them loads/stores (the one non-local load is unchanged, of course). Key is to not consume more registers so we don't have to push/pop them.
* 4900Kartik Agaram2018-12-301-0/+0
| | | | | | | | | | | Finally really fix the CI failure of commit 4894. This is a remainder to forget my knowledge of stack addresses in the SubX VM when writing SubX programs. Otherwise my programs will work in the VM but not natively. The only assumptions a SubX program should make about its segment addresses are what's encoded in the ELF binary. Thanks to https://en.wikipedia.org/wiki/Address_space_layout_randomization, it can't know anything else.
* 4896Kartik Agaram2018-12-301-0/+0
| | | | Fix CI.
* 4894Kartik Agaram2018-12-301-0/+0
| | | | | | | | | | | | Done with kinda-safe pointers. In a real compiler the fast path of 'lookup' would ideally get inlined. Excluding procedure-call overhead, the current implementation consumes 2 registers besides the input, and requires 9 instructions (2 push, 2 load, compare, jump, increment, 2 pop). That's large enough that inlining may become a trade-off. Even if we somehow magically had the registers already loaded and available, we'd still need 4 instructions (1 pointer dereference, compare, jump and increment). The price of safety.
* 4889 - playing with kinda-safe pointersKartik Agaram2018-12-291-0/+0