aboutsummaryrefslogtreecommitdiff
path: root/snug-clean/src/Snug/Compile
diff options
context:
space:
mode:
authorCamil Staps2023-06-20 22:13:40 +0200
committerCamil Staps2023-06-20 22:13:40 +0200
commit3a068f37f49b56efcb3bb2d99973bf3c4b4c9905 (patch)
tree50a841d28ab6582adbb82462a091bca7b872d273 /snug-clean/src/Snug/Compile
parentAdd automated tests (diff)
Add tests for function application
Diffstat (limited to 'snug-clean/src/Snug/Compile')
-rw-r--r--snug-clean/src/Snug/Compile/Simulate.icl11
1 files changed, 9 insertions, 2 deletions
diff --git a/snug-clean/src/Snug/Compile/Simulate.icl b/snug-clean/src/Snug/Compile/Simulate.icl
index af72277..b443913 100644
--- a/snug-clean/src/Snug/Compile/Simulate.icl
+++ b/snug-clean/src/Snug/Compile/Simulate.icl
@@ -130,14 +130,21 @@ indirectAndEval =
, StoreWord TempImm 0 FrontEvalPtr
] >>|
storeStackValue sv 4 FrontEvalPtr >>|
+ getState >>= \{hp_offset} ->
add
// Evaluate
[ AddImmediate Signed FrontEvalPtr HeapPtr (Immediate offset)
, Jump NoLink (Direct (Address 0 "eval"))
- ] >>|
+ , AddImmediate Signed HeapPtr HeapPtr (Immediate hp_offset)
+ ]
+ SVIndirect 4 FrontEvalPtr ->
+ // We only need to overwrite the descriptor with an indirection
getState >>= \{hp_offset} ->
add
- [ AddImmediate Signed HeapPtr HeapPtr (Immediate hp_offset)
+ [ LoadAddress TempImm (Address 0 (functionLabel "" NodeEntry "indir"))
+ , StoreWord TempImm 0 FrontEvalPtr
+ , Jump NoLink (Direct (Address 0 "eval"))
+ , AddImmediate Signed HeapPtr HeapPtr (Immediate hp_offset)
]
_ ->
fail "unexpected top of stack in indirect\n"