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); variant->value.number = lua_tonumber(L, index);
break; break;
case LUA_TSTRING: case LUA_TSTRING: {
variant->type = TYPE_STRING;
size_t length; size_t length;
const char* string = lua_tolstring(L, index, &length); const char* string = lua_tolstring(L, index, &length);
variant->value.string.pointer = malloc(length + 1); if (length <= sizeof(variant->value.ministring.data)) {
lovrAssert(variant->value.string.pointer, "Out of memory"); variant->type = TYPE_MINISTRING;
memcpy(variant->value.string.pointer, string, length); variant->value.ministring.length = length;
variant->value.string.pointer[length] = '\0'; memcpy(variant->value.ministring.data, string, length);
variant->value.string.length = 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; break;
}
case LUA_TUSERDATA: case LUA_TUSERDATA:
variant->type = TYPE_OBJECT; 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_BOOLEAN: lua_pushboolean(L, variant->value.boolean); return 1;
case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); 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_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; 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; default: return 0;
} }

View File

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