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]);
}
Example #2
0
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];
}
Example #5
0
unsigned avm_totalactuals(void){
	return avm_get_envvalue(topsp + AVM_NUMACTUALS_OFFSET);
}