mirror of https://github.com/bjornbytes/lovr.git
Variant small string optimization;
This commit is contained in:
parent
0c281bca50
commit
4422df2a47
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue