void push_string(lua_State* L, jass::jstring_t value) { if (value < 0x10000) { value = get_jass_vm()->string_table->get(value); } lua_pushstring(L, jass::from_trigstring(jass::from_string(value))); }
void handle_set_ref(jass::jhandle_t h, bool dec) { jass_vm_t* vm = get_jass_vm(); if (vm && vm->set_handle_reference) { fast_call<void>(vm->set_handle_reference, h, dec ? 1 : 0, vm->handle_table); } }
const char* from_stringid(uint32_t strid) { return get_jass_vm()->symbol_table->string_table->at(strid)->str_; }
int jass_call_native_function(lua_State* L, const jass::func_value* nf, uintptr_t func_address) { LUA_PERFTRACE(kJassCall); if (!lua_isyieldable(L) && nf->has_sleep()) { printf("Wanring: %s is disable.\n", lua_tostring(L, lua_upvalueindex(1))); lua_pushnil(L); return 1; } size_t param_size = nf->get_param().size(); if ((int)param_size > lua_gettop(L)) { lua_pushnil(L); return 1; } jass::call_param param(param_size); for (size_t i = 0; i < param_size; ++i) { jass::variable_type vt = nf->get_param()[i]; switch (vt) { case jass::TYPE_BOOLEAN: param.push(i, jassbind::read_boolean(L, i + 1)); break; case jass::TYPE_CODE: param.push(i, jassbind::read_code(L, i + 1)); break; case jass::TYPE_HANDLE: param.push(i, jassbind::read_handle(L, i + 1)); break; case jass::TYPE_INTEGER: param.push(i, jassbind::read_integer(L, i + 1)); break; case jass::TYPE_REAL: param.push_real(i, jassbind::read_real(L, i + 1)); break; case jass::TYPE_STRING: param.push(i, lua_tostring(L, i + 1)); break; default: param.push(i, 0); break; } } if (func_address == 0) func_address = nf->get_address(); uintptr_t retval = 0; if (runtime::catch_crash) { retval = safe_jass_call(L, func_address, param.data(), param_size); } else { retval = jass::call(func_address, param.data(), param_size); } if (nf->get_return() == jass::TYPE_STRING) { retval = get_jass_vm()->string_table->get(retval); } return jass_push(L, nf->get_return(), retval) ? 1 : 0; }