예제 #1
0
FAKE_API void fkpspushbool(fake * fk, bool ret)
{
	bool err = false;
	variant * v = 0;
	PS_PUSH_AND_GET(fk->ps, v);
	V_SET_REAL(v, ret);
	CHECK_ERR(err);
}
예제 #2
0
void interpreter::set_running_vaiant(int frame, const char * name, int line, const char * value)
{
	if (!m_fb)
	{
		return;
	}
	
	int deps = 0;

	int ip = m_ip;
	int bp = m_bp;
	const func_binary * fb = m_fb;

	while (!BP_END(bp))
	{
		if (deps >= frame)
		{
			for (int i = 0; i < fb->m_debug_stack_variant_info_num; i++)
			{
				const stack_variant_info & info = fb->m_debug_stack_variant_info[i];
				if ((line != -1 && !strcmp(info.name, name) && info.line == line) ||
					(line == -1 && !strcmp(info.name, name)))
				{
					fake * fk = m_fk;
					
					variant * v = 0;
					GET_STACK(bp, v, info.pos);

					std::string valuestr = value;
					if (valuestr.empty())
					{
						return;
					}

					if (valuestr[0] == '\"')
					{
						valuestr[valuestr.size() - 1] = 0;
						V_SET_STRING(v, &valuestr[1]);
					}
					else
					{	
						V_SET_REAL(v, atoi(value));
					}
					
					return;
				}
			}
			break;
		}
		
		BP_GET_FB(bp, fb);
		BP_GET_IP(bp, ip);
		int callbp = 0;
		BP_GET_BP(bp, callbp);
		bp = callbp;
		if (BP_END(bp))
		{
			break;
		}
		
		deps++;
	}
	
}
예제 #3
0
bool compiler::compile_cmp_stmt(codegen & cg, cmp_stmt * cs)
{
	FKLOG("[compiler] compile_cmp_stmt %p", cs);

	int deps = m_cmp_deps;
	m_cmp_deps++;

	command oper = 0;
	command left = 0;
	command right = 0;
	command dest = 0;   

	if (cs->cmp != "not")
	{
		// oper
		if (cs->cmp == "&&")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_AND_JNE) : MAKE_OPCODE(OPCODE_AND);
		}
		else if (cs->cmp == "||")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_OR_JNE) : MAKE_OPCODE(OPCODE_OR);
		}
		else if (cs->cmp == "<")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_LESS_JNE) : MAKE_OPCODE(OPCODE_LESS);
		}
		else if (cs->cmp == ">")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_MORE_JNE) : MAKE_OPCODE(OPCODE_MORE);
		}
		else if (cs->cmp == "==")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_EQUAL_JNE) : MAKE_OPCODE(OPCODE_EQUAL);
		}
		else if (cs->cmp == ">=")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_MOREEQUAL_JNE) : MAKE_OPCODE(OPCODE_MOREEQUAL);
		}
		else if (cs->cmp == "<=")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_LESSEQUAL_JNE) : MAKE_OPCODE(OPCODE_LESSEQUAL);
		}
		else if (cs->cmp == "!=")
		{
			oper = !deps ? MAKE_OPCODE(OPCODE_NOTEQUAL_JNE) : MAKE_OPCODE(OPCODE_NOTEQUAL);
		}
		else if (cs->cmp == "true")
		{
			variant v;
			V_SET_REAL((&v), 1);
			int pos = cg.getconst(v);
			m_cur_addr = MAKE_ADDR(ADDR_CONST, pos);
			
			m_cmp_deps--;
			m_cmp_jne = false;
			
			return true;
		}
		else if (cs->cmp == "false")
		{
			variant v;
			V_SET_REAL((&v), 0);
			int pos = cg.getconst(v);
			m_cur_addr = MAKE_ADDR(ADDR_CONST, pos);
			
			m_cmp_deps--;
			m_cmp_jne = false;
			
			return true;
		}
		else if (cs->cmp == "is")
		{
			// left
			if (!compile_node(cg, cs->left))
			{
				FKERR("[compiler] compile_cmp_stmt left fail");
				return false;
			}
			
			m_cmp_deps--;
			m_cmp_jne = false;
			
			return true;
		}
		else
		{
			FKERR("[compiler] compile_cmp_stmt cmp error %s", cs->cmp.c_str());
			compile_seterror(cs, m_fk, efk_compile_cmp_error, "cmp error %s", cs->cmp.c_str());
			return false;
		}
		
		// left
		if (!compile_node(cg, cs->left))
		{
			FKERR("[compiler] compile_cmp_stmt left fail");
			return false;
		}
		left = m_cur_addr;

		// right
		if (!compile_node(cg, cs->right))
		{
			FKERR("[compiler] compile_cmp_stmt right fail");
			return false;
		}
		right = m_cur_addr;

		// result
		int despos = cg.alloc_stack_identifier();
		dest = MAKE_ADDR(ADDR_STACK, despos);
		m_cur_addr = dest;
		
		cg.push(oper, cs->lineno());
		cg.push(left, cs->lineno());
		cg.push(right, cs->lineno());
		cg.push(dest, cs->lineno());
	}
	/* "not" */
	else
	{
		oper = !deps ? MAKE_OPCODE(OPCODE_NOT_JNE) : MAKE_OPCODE(OPCODE_NOT);
		
		// left
		if (!compile_node(cg, cs->left))
		{
			FKERR("[compiler] compile_cmp_stmt left fail");
			return false;
		}
		left = m_cur_addr;
	
		int despos = cg.alloc_stack_identifier();
		dest = MAKE_ADDR(ADDR_STACK, despos);
		m_cur_addr = dest;
	
		cg.push(oper, cs->lineno());
		cg.push(left, cs->lineno());
		cg.push(dest, cs->lineno());
	}
	
	m_cmp_deps--;
	if (!deps)
	{
		m_cmp_jne = true;
	}
	
	FKLOG("[compiler] compile_cmp_stmt %p OK", cs);
	
	return true;
}
예제 #4
0
bool compiler::compile_explicit_value_node_to_variant(explicit_value_node* ev, variant & v)
{
	fake * fk = m_fk;
	
	switch (ev->getvaluetype())
	{
	case explicit_value_node::EVT_TRUE:
		V_SET_REAL((&v), 1);
		break;
	case explicit_value_node::EVT_FALSE:
		V_SET_REAL((&v), 0);
		break;
	case explicit_value_node::EVT_NUM:
		V_SET_REAL((&v), (fkatol(&ev->str)));
		break;
	case explicit_value_node::EVT_STR:
		v = fk->sh.allocsysstr(ev->str.c_str());
		break;
	case explicit_value_node::EVT_FLOAT:
		V_SET_REAL((&v), (fkatof(&ev->str)));
		break;
	case explicit_value_node::EVT_UUID:
		V_SET_UUID((&v), (fkatol(&ev->str)));
		break;
	case explicit_value_node::EVT_MAP:
		{
			const_map_list_value_node * cml = dynamic_cast<const_map_list_value_node *>(ev->v);
			assert(cml);
			variant_map * vm = fk->con.newconstmap();
			for (int i = 0; i < (int)cml->lists.size(); i++)
			{
				const_map_value_node * cmv = dynamic_cast<const_map_value_node *>(cml->lists[i]);
				assert(cmv);
				explicit_value_node * kn = dynamic_cast<explicit_value_node *>(cmv->k);
				explicit_value_node * vn = dynamic_cast<explicit_value_node *>(cmv->v);
				assert(kn);
				assert(vn);
				variant kv;
				variant vv;
				if (!compile_explicit_value_node_to_variant(kn, kv))
				{
					return false;
				}
				if (!compile_explicit_value_node_to_variant(vn, vv))
				{
					return false;
				}
				
				variant * des = con_map_get(fk, vm, &kv);
				*des = vv;
			}
			V_SET_MAP(&v, vm);
		}
		break;
	case explicit_value_node::EVT_ARRAY:
		{
			const_array_list_value_node * cal = dynamic_cast<const_array_list_value_node *>(ev->v);
			assert(cal);
			variant_array * va = fk->con.newconstarray();
			for (int i = 0; i < (int)cal->lists.size(); i++)
			{
				explicit_value_node * vn = dynamic_cast<explicit_value_node *>(cal->lists[i]);
				assert(vn);
				variant kv;
				V_SET_REAL((&kv), i);
				variant vv;
				if (!compile_explicit_value_node_to_variant(vn, vv))
				{
					return false;
				}
				
				variant * des = con_array_get(fk, va, &kv);
				*des = vv;
			}
			V_SET_ARRAY(&v, va);
		}
		break;
	default:
		FKERR("[compiler] compile_explicit_value type error %d %s", ev->getvaluetype(), ev->gettypename());
		compile_seterror(ev, m_fk, efk_compile_explicit_type_error, "compile explicit value type error %d", ev->getvaluetype());
		return false;
	}

	return true;
}