Variant small string optimization;

This commit is contained in:
bjorn 2022-11-24 15:40:43 -08:00
parent 0c281bca50
commit 4422df2a47
2 changed files with 20 additions and 7 deletions

View File

@ -40,16 +40,23 @@ void luax_checkvariant(lua_State* L, int index, Variant* variant) {
variant->value.number = lua_tonumber(L, index);
break;
case LUA_TSTRING:
variant->type = TYPE_STRING;
case LUA_TSTRING: {
size_t length;
const char* string = lua_tolstring(L, index, &length);
variant->value.string.pointer = malloc(length + 1);
lovrAssert(variant->value.string.pointer, "Out of memory");
memcpy(variant->value.string.pointer, string, length);
variant->value.string.pointer[length] = '\0';
variant->value.string.length = length;
if (length <= sizeof(variant->value.ministring.data)) {
variant->type = TYPE_MINISTRING;
variant->value.ministring.length = length;
memcpy(variant->value.ministring.data, string, length);
} else {
variant->type = TYPE_STRING;
variant->value.string.pointer = malloc(length + 1);
lovrAssert(variant->value.string.pointer, "Out of memory");
memcpy(variant->value.string.pointer, string, length);
variant->value.string.pointer[length] = '\0';
variant->value.string.length = length;
}
break;
}
case LUA_TUSERDATA:
variant->type = TYPE_OBJECT;
@ -80,6 +87,7 @@ int luax_pushvariant(lua_State* L, Variant* variant) {
case TYPE_BOOLEAN: lua_pushboolean(L, variant->value.boolean); return 1;
case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); return 1;
case TYPE_STRING: lua_pushlstring(L, variant->value.string.pointer, variant->value.string.length); return 1;
case TYPE_MINISTRING: lua_pushlstring(L, variant->value.ministring.data, variant->value.ministring.length); return 1;
case TYPE_OBJECT: _luax_pushtype(L, variant->value.object.type, hash64(variant->value.object.type, strlen(variant->value.object.type)), variant->value.object.pointer); return 1;
default: return 0;
}

View File

@ -28,6 +28,7 @@ typedef enum {
TYPE_BOOLEAN,
TYPE_NUMBER,
TYPE_STRING,
TYPE_MINISTRING,
TYPE_OBJECT
} VariantType;
@ -38,6 +39,10 @@ typedef union {
char* pointer;
size_t length;
} string;
struct {
uint8_t length;
char data[23];
} ministring;
struct {
void* pointer;
const char* type;