mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-04-09 16:40:38 +00:00
Fix RETURN (NULL) handling in PROG()
This commit is contained in:
parent
320bfbef81
commit
485aba5542
@ -98,10 +98,7 @@ def natv_prog(symptr, expr)
|
||||
prog_car = prog_expr=>car
|
||||
prog_expr = prog_expr=>cdr // Assume continuation
|
||||
if prog_car->type == CONS_TYPE
|
||||
//
|
||||
// List - check for (COND (...))
|
||||
//
|
||||
if prog_car=>car == sym_cond // Inline cond() evaluation
|
||||
if prog_car=>car == sym_cond // Inline COND(...) evaluation
|
||||
cond_expr = prog_car=>cdr
|
||||
while cond_expr
|
||||
if eval_expr(cond_expr=>car=>car)
|
||||
@ -110,7 +107,7 @@ def natv_prog(symptr, expr)
|
||||
fin
|
||||
cond_expr = cond_expr=>cdr
|
||||
loop
|
||||
elsif prog_car=>car == sym_if // Inline if() evaluation
|
||||
elsif prog_car=>car == sym_if // Inline IF(...) evaluation
|
||||
cond_expr = prog_car=>cdr
|
||||
if eval_expr(cond_expr=>car)
|
||||
eval_expr(cond_expr=>cdr=>car) // Drop result
|
||||
@ -120,20 +117,20 @@ def natv_prog(symptr, expr)
|
||||
else
|
||||
eval_expr(prog_car) // Drop result
|
||||
fin
|
||||
//else
|
||||
//
|
||||
// Atom - skip, i.e. (GO ) destination
|
||||
//
|
||||
//else Atom - skip, i.e. GO() destination
|
||||
fin
|
||||
if prog_return // Check for RETURN()
|
||||
expr = prog_return ^ NULL_HACK
|
||||
prog_return = NULL
|
||||
prog_expr = NULL
|
||||
fin
|
||||
loop
|
||||
prog = prog_enter
|
||||
expr = prog_return
|
||||
prog_return = FALSE
|
||||
prog = prog_enter
|
||||
return expr
|
||||
end
|
||||
|
||||
def natv_return(symptr, expr)
|
||||
prog_return = eval_expr(expr=>car)
|
||||
prog_return = eval_expr(expr=>car) ^ NULL_HACK
|
||||
return NULL // This value will be dropped in natv_prog
|
||||
end
|
||||
|
||||
@ -147,7 +144,7 @@ def natv_go(symptr, expr)
|
||||
fin
|
||||
symptr = symptr=>cdr
|
||||
loop
|
||||
puts("(GO ...) destination not found:"); print_expr(expr); putln
|
||||
puts("GO destination not found:"); print_expr(expr); putln
|
||||
return NULL
|
||||
end
|
||||
|
||||
|
@ -69,6 +69,7 @@ var float_free = NULL
|
||||
//
|
||||
// Symbol hash table
|
||||
//
|
||||
|
||||
const HASH_SIZE = 64 // Must be power of two!
|
||||
const HASH_MASK = HASH_SIZE-1
|
||||
word hashtbl[HASH_SIZE]
|
||||
@ -180,7 +181,6 @@ def collect_list(listhead, freehead)#2
|
||||
while elemptr
|
||||
if elemptr->type & MARK_BIT
|
||||
elemptr->type = elemptr->type & MARK_MASK
|
||||
//puts("Free: "); print_expr(elemptr); putln
|
||||
if prevptr
|
||||
prevptr=>link = elemptr=>link
|
||||
elemptr=>link = freehead
|
||||
@ -653,7 +653,7 @@ export def new_assoc(symptr, valptr)#0
|
||||
var pair, pairlist
|
||||
|
||||
if symptr and (symptr->type & TYPE_MASK <> SYM_TYPE)
|
||||
puts("Not a SYM in new_assoc\n")
|
||||
puts("NEW ASSOC: Not a SYM\n")
|
||||
return
|
||||
fin
|
||||
pair = new_cons
|
||||
@ -1284,6 +1284,10 @@ def natv_for(symptr, expr)
|
||||
return pop_sweep_stack
|
||||
end
|
||||
|
||||
def natv_copy(symptr, expr)
|
||||
return copy_expr(expr=>car)
|
||||
end
|
||||
|
||||
//
|
||||
// Install default functions
|
||||
//
|
||||
@ -1326,5 +1330,6 @@ new_sym("PRINT")=>natv = @natv_print
|
||||
new_sym("EVAL")=>natv = @natv_eval
|
||||
new_sym("TRACE")=>natv = @natv_trace
|
||||
new_sym("FOR")=>natv = @natv_for
|
||||
new_sym("COPY")=>natv = @natv_copy
|
||||
return modkeep | modinitkeep
|
||||
done
|
||||
|
Loading…
x
Reference in New Issue
Block a user