void execute_funcexit(instruction *unused){ unsigned oldTop=top; top=avm_get_envvalue(topsp+AVM_SAVEDTOP_OFFSET); pc=avm_get_envvalue(topsp+AVM_SAVEDPC_OFFSET); topsp=avm_get_envvalue(topsp+AVM_SAVEDTOPSP_OFFSET); while (oldTop++<=top) avm_memcellclear(&stack[oldTop]); }
void libfunc_totalarguments(void){ unsigned p_topsp = avm_get_envvalue(topsp + AVM_SAVEDTOPSP_OFFSET); avm_memcellclear(&retval); if(!p_topsp){ avm_error("'totalarguments' called outside a function!"); retval.type = nil_m; } else{ retval.type = number_m; retval.data.numVal = avm_get_envvalue(p_topsp + AVM_NUMACTUALS_OFFSET); } }
void libfunc_totalarguments(void){ unsigned p_topsp=avm_get_envvalue(topsp+AVM_SAVEDTOPSP_OFFSET); avm_memcellclear(&retval); unsigned i; if(p_topsp>=AVM_STACKSIZE-1-programVarOffset){ avm_error("'totalarguments' called outside of a function"); retval.type=nil_m; } else { retval.type=number_m; retval.data.numVal=avm_get_envvalue(p_topsp+AVM_NUMACTUALS_OFFSET); } }
void libfunc_argument(void){ unsigned p_topsp=avm_get_envvalue(topsp+AVM_SAVEDTOPSP_OFFSET); avm_memcellclear(&retval); unsigned i; if(p_topsp>=AVM_STACKSIZE-1-programVarOffset){ avm_error("'argument' called outside of a function"); retval.type=nil_m; } unsigned n=avm_totalactuals(); if(n!=1){ avm_error("one argument expected at 'argument'"); return ; } avm_memcell* m=avm_getactual(0); if(m->type!=number_m){ avm_error("argument of 'argument' must be a number"); return; } int doubletoint=m->data.numVal; retval=stack[p_topsp+AVM_STACKENV_SIZE +1 +doubletoint]; }
unsigned avm_totalactuals(void){ return avm_get_envvalue(topsp + AVM_NUMACTUALS_OFFSET); }