refactor(api): handle option dicts properly

Do not copy a lot of lua strings (dict keys) to just strequal() them
Just compare them directly to a dedicated hash function.

feat(generators): HASHY McHASHFACE
This commit is contained in:
Björn Linse
2021-08-21 13:55:12 +02:00
parent 9337fff8aa
commit 32565922ef
22 changed files with 729 additions and 536 deletions

View File

@@ -1299,3 +1299,25 @@ void nlua_init_types(lua_State *const lstate)
lua_rawset(lstate, -3);
}
void nlua_pop_keydict(lua_State *L, void *retval, field_hash hashy, Error *err)
{
lua_pushnil(L); // [dict, nil]
while (lua_next(L, -2)) {
// [dict, key, value]
size_t len;
const char *s = lua_tolstring(L, -2, &len);
Object *field = hashy(retval, s, len);
if (!field) {
api_set_error(err, kErrorTypeValidation, "invalid key: %.*s", (int)len, s);
lua_pop(L, 3); // []
return;
}
*field = nlua_pop_Object(L, true, err);
}
// [dict]
lua_pop(L, 1);
// []
}