MCPcopy Create free account
hub / github.com/defold/defold / DoPushTable

Function DoPushTable

engine/script/src/script_table.cpp:928–1150  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

926 }
927
928 int DoPushTable(lua_State*L, PushTableLogger& logger, const TableHeader& header, const char* original_buffer, const char* buffer, uint32_t buffer_size, uint32_t depth)
929 {
930 int top = lua_gettop(L);
931 (void)top;
932
933 const char* buffer_start = buffer;
934 const char* buffer_end = buffer + buffer_size;
935 CHECK_PUSHTABLE_OOB("table header", logger, buffer+2, buffer_end, 0, depth);
936
937 uint32_t count = 0;
938 if (header.m_Version <= 3)
939 {
940 memcpy(&count, buffer, sizeof(uint16_t));
941 buffer += 2;
942 }
943 else
944 {
945 memcpy(&count, buffer, sizeof(uint32_t));
946 buffer += 4;
947 }
948
949 PushTableLogFormat(logger, "{%d|", (uint32_t)count);
950
951 if (buffer > buffer_end) {
952 char log_str[PUSH_TABLE_LOGGER_STR_SIZE];
953 PushTableLogPrint(logger, log_str);
954 char str[512]; \
955 dmSnPrintf(str, sizeof(str), "Reading outside of buffer at before element [BufStart: %p, Cursor: %p, End: %p, BufSize: %lu, Bytes OOB: %d].\n'%s'", logger.m_BufferStart, buffer, buffer_end, logger.m_BufferSize, (int)(buffer_end - buffer), log_str); \
956 return luaL_error(L, "%s", str);
957 }
958
959 lua_newtable(L);
960
961 for (uint32_t i = 0; i < count; ++i)
962 {
963 CHECK_PUSHTABLE_OOB("key-value tags", logger, buffer+2, buffer_end, count, depth);
964
965 char key_type = (*buffer++);
966 char value_type = (*buffer++);
967
968 if (key_type == LUA_TSTRING)
969 {
970 PushTableLogString(logger, "KS");
971
972 if (header.m_Version <= 1)
973 buffer += LoadOldTSTRING(L, buffer, buffer_end, count, logger);
974 else
975 buffer += LoadTSTRING(L, buffer, buffer_end, count, logger);
976
977 CHECK_PUSHTABLE_OOB("key string", logger, buffer, buffer_end, count, depth);
978 }
979 else if (key_type == LUA_TNUMBER || key_type == LUA_TNEGATIVENUMBER)
980 {
981 PushTableLogString(logger, "KN");
982
983 buffer = ReadEncodedIndex(L, key_type, header, buffer);
984 CHECK_PUSHTABLE_OOB("key number", logger, buffer, buffer_end, count, depth);
985 }

Callers 1

PushTableFunction · 0.85

Calls 15

lua_gettopFunction · 0.85
PushTableLogFormatFunction · 0.85
PushTableLogPrintFunction · 0.85
dmSnPrintfFunction · 0.85
luaL_errorFunction · 0.85
PushTableLogStringFunction · 0.85
LoadOldTSTRINGFunction · 0.85
LoadTSTRINGFunction · 0.85
ReadEncodedIndexFunction · 0.85
PushHashFunction · 0.85
lua_pushbooleanFunction · 0.85
lua_pushnumberFunction · 0.85

Tested by

no test coverage detected