Example #1
0
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);
		}
	}
}
Example #2
0
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);
			}
		}
}
Example #3
0
void avm_assign(avm_memcell* lv, avm_memcell* rv){
	if(lv == rv)
		{
		return;
		}
	if((lv->type == table_m)&&(rv->type == table_m)&&(lv->data.tableVal == rv->data.tableVal))
		{
		return;
		}
	if(rv->type == undef_m)
		{
		avm_warning("Assigning from 'undef' content!\n");
		}

	avm_memcellclear(lv);
	memcpy(lv, rv, sizeof(avm_memcell));

	if(lv->type == string_m)
		{
		lv->data.strVal = strdup(rv->data.strVal);
		}
	else if(lv->type = table_m)
		{
		avm_tableincrefcounter(lv->data.tableVal);
		}
}