shell: allow 'def' to overwrite

This commit is contained in:
Kartik K. Agaram 2021-04-29 23:53:28 -07:00
parent d46c4b06b2
commit 3385febc11
2 changed files with 7 additions and 14 deletions

View File

@ -199,7 +199,7 @@ fn evaluate _in: (addr handle cell), out: (addr handle cell), env-h: (handle cel
stream-to-array first-arg-data, tmp-ah
var first-arg-data-string/eax: (addr array byte) <- lookup *tmp-ah
var out2/edi: (addr handle cell) <- copy out
append-global globals, first-arg-data-string, *out2, trace
assign-or-create-global globals, first-arg-data-string, *out2, trace
trace-higher trace
return
}

View File

@ -282,23 +282,16 @@ fn append-primitive _self: (addr global-table), name: (addr array byte) {
new-primitive-function curr-value-ah, curr-index
}
fn append-global _self: (addr global-table), name: (addr array byte), value: (handle cell), trace: (addr trace) {
fn assign-or-create-global _self: (addr global-table), name: (addr array byte), value: (handle cell), trace: (addr trace) {
var self/esi: (addr global-table) <- copy _self
var curr-index/ecx: int <- find-symbol-name-in-globals self, name
{
var curr-index/ecx: int <- find-symbol-name-in-globals self, name
compare curr-index, -1/not-found
break-if-=
# otherwise error "global already exists: ", sym
var stream-storage: (stream byte 0x40)
var stream/ecx: (addr stream byte) <- address stream-storage
write stream, "global already exists: "
write stream, name
trace trace, "error", stream
return
break-if-!=
var final-index-addr/eax: (addr int) <- get self, final-index
increment *final-index-addr
curr-index <- copy *final-index-addr
}
var final-index-addr/ecx: (addr int) <- get self, final-index
increment *final-index-addr
var curr-index/ecx: int <- copy *final-index-addr
var data-ah/eax: (addr handle array global) <- get self, data
var data/eax: (addr array global) <- lookup *data-ah
var curr-offset/esi: (offset global) <- compute-offset data, curr-index