Пример #1
0
FAKE_API void fkpspushuint64(fake * fk, uint64_t ret)
{
	bool err = false;
	variant * v = 0;
	PS_PUSH_AND_GET(fk->ps, v);
	V_SET_UUID(v, ret);
	CHECK_ERR(err);
}
Пример #2
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;
}