From 4422df2a470e0d19fcd56b98a015f85cadb82cd8 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 24 Nov 2022 15:40:43 -0800 Subject: [PATCH] Variant small string optimization; --- src/api/l_event.c | 22 +++++++++++++++------- src/modules/event/event.h | 5 +++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/api/l_event.c b/src/api/l_event.c index 58175e2d..2df5ac4d 100644 --- a/src/api/l_event.c +++ b/src/api/l_event.c @@ -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; } diff --git a/src/modules/event/event.h b/src/modules/event/event.h index 0191a55b..fee4d997 100644 --- a/src/modules/event/event.h +++ b/src/modules/event/event.h @@ -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;