void execute_tablegetelem (instruction* instr){ avm_memcell* lv = avm_translate_operand(&instr->result, (avm_memcell*) 0); avm_memcell* t = avm_translate_operand(&instr->arg1, (avm_memcell*) 0); avm_memcell* i = avm_translate_operand(&instr->result, &ax); // assert(lv && &stack[N-1] >= lv && lv > &stack[top] || lv == &retval); // assert(t && stack[N-1] >= t && t > &stack[top]); assert(i); avm_memcellclear(lv); lv->type = nil_m; if(t->type != table_m) { avm_error("illegal use of type %s as table!\n", typeStrings[t->type]); executionFinished = 1; } else { avm_memcell* content = avm_tablegetelem(t->data.tableVal, i); if(content) { avm_assign(lv, content); } else { char* ts = avm_tostring(t); char* is = avm_tostring(i); avm_warning("%s[%s] not found!\n", ts, is); free(ts); free(is); } } }
void execute_tablegetelem(instruction* instr){ //printf("exec_tableget\n"); avm_memcell* lv = avm_translate_operand(&instr->result,(avm_memcell*) 0); avm_memcell* t = avm_translate_operand(&instr->arg1,(avm_memcell*) 0); avm_memcell* i = avm_translate_operand(&instr->arg2,&ax); assert(lv && (&stack[AVM_STACKSIZE-1] >= lv && lv > &stack[top] || lv == &retval)); assert(t && &stack[AVM_STACKSIZE-1] >= t && t > &stack[top]); assert(i); avm_memcellclear(lv); lv->type = nil_m; if(t->type != table_m){ avm_error("illigal use of type as table!"); } else{ avm_memcell* content = avm_tablegetelem(t->data.tableVal,i); if(content) avm_assign(lv,content); else{ char* ts = avm_tostring(t); char* is = avm_tostring(i); avm_warning("not found!"); free(ts); free(is); } } }