55
66struct FFLuaData luaData ;
77
8- static yyjson_mut_val * lua2yyjson (lua_State * L , int idx , yyjson_mut_doc * doc ) {
8+ static yyjson_mut_val * lua2yyjson (lua_State * L , int idx , yyjson_mut_doc * doc , int depth ) {
9+ if (__builtin_expect (depth > 15 , false)) {
10+ yyjson_mut_doc_free (doc );
11+ lua_pushlstring (
12+ L , "yyjson: recursion depth exceeded; possible circular reference" ,
13+ strlen ("yyjson: recursion depth exceeded; possible circular reference" )
14+ );
15+ lua_error (L ); // noreturn
16+ __builtin_unreachable ();
17+ }
18+
919 if (idx < 0 ) {
1020 idx = lua_gettop (L ) + idx + 1 ;
1121 }
@@ -66,7 +76,7 @@ static yyjson_mut_val* lua2yyjson(lua_State* L, int idx, yyjson_mut_doc* doc) {
6676 yyjson_mut_val * arr = yyjson_mut_arr (doc );
6777 for (lua_Unsigned i = 1 ; i <= len ; i ++ ) {
6878 lua_rawgeti (L , idx , (lua_Integer ) i );
69- yyjson_mut_val * val = lua2yyjson (L , -1 , doc );
79+ yyjson_mut_val * val = lua2yyjson (L , -1 , doc , depth + 1 );
7080 yyjson_mut_arr_append (arr , val );
7181 lua_pop (L , 1 );
7282 }
@@ -80,7 +90,7 @@ static yyjson_mut_val* lua2yyjson(lua_State* L, int idx, yyjson_mut_doc* doc) {
8090 yyjson_mut_val * key = yyjson_mut_strncpy (doc , key_str , klen );
8191 lua_pop (L , 1 );
8292
83- yyjson_mut_val * val = lua2yyjson (L , -1 , doc );
93+ yyjson_mut_val * val = lua2yyjson (L , -1 , doc , depth + 1 );
8494 yyjson_mut_obj_add (obj , key , val );
8595 lua_pop (L , 1 );
8696 }
@@ -102,24 +112,31 @@ static int yyjsonEncode(lua_State* L) {
102112 }
103113
104114 yyjson_mut_doc * doc = yyjson_mut_doc_new (NULL );
105- if (!doc ) {
106- return luaL_error (L , "failed to create yyjson document" );
115+ if (__builtin_expect (!doc , false)) {
116+ lua_pushlstring (L , "yyjson: yyjson_mut_doc_new() failed" , strlen ("yyjson: yyjson_mut_doc_new() failed" ));
117+ return lua_error (L );
107118 }
108119
109- yyjson_mut_val * root = lua2yyjson (L , 1 , doc );
120+ yyjson_mut_val * root = lua2yyjson (L , 1 , doc , 0 );
110121 yyjson_mut_doc_set_root (doc , root );
111122
112123 size_t jsonLen ;
113124 yyjson_write_err err = {};
114125 FF_AUTO_FREE const char * jsonStr = yyjson_mut_write_opts (doc , YYJSON_WRITE_ALLOW_INF_AND_NAN | (pretty ? YYJSON_WRITE_PRETTY_TWO_SPACES : 0 ), NULL , & jsonLen , & err );
115126
116- if (jsonStr ) {
127+ if (__builtin_expect ( jsonStr != NULL , true) ) {
117128 lua_pushlstring (L , jsonStr , jsonLen );
118129 yyjson_mut_doc_free (doc );
119130 return 1 ;
120131 } else {
121132 yyjson_mut_doc_free (doc );
122- return luaL_error (L , "failed to encode JSON: %s" , err .msg );
133+ {
134+ FF_STRBUF_AUTO_DESTROY errBuf = ffStrbufCreateStatic ("yyjson: yyjson_mut_write_opts() failed: " );
135+ ffStrbufAppendS (& errBuf , err .msg );
136+ lua_pushlstring (L , errBuf .chars , errBuf .length );
137+ }
138+
139+ return lua_error (L ); // longjmp
123140 }
124141}
125142
@@ -163,33 +180,32 @@ const char* ffLuaLoadState() {
163180 FF_LIBRARY_LOAD_SYMBOL_MESSAGE (liblua , luaopen_string )
164181 FF_LIBRARY_LOAD_SYMBOL_MESSAGE (liblua , luaopen_table )
165182 #endif
166- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_settop )
183+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , luaL_checkany )
167184 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , luaL_loadbufferx )
168- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_tolstring )
169- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_createtable )
170- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushinteger )
171- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushnumber )
172- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushboolean )
173- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushstring )
174- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushlstring )
175- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushvalue )
176- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_seti )
177- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushnil )
178- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_setfield )
179- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pcallk )
180- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_gettop )
181185 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , luaL_tolstring )
182- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , luaL_error )
183- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushcclosure )
184- FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , luaL_checkany )
185186 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_callk )
187+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_createtable )
188+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_error )
189+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_gettop )
186190 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_isinteger )
187191 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_next )
192+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pcallk )
193+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushboolean )
194+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushcclosure )
195+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushinteger )
196+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushlstring )
197+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushnil )
198+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushnumber )
199+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_pushvalue )
188200 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_rawgeti )
189201 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_rawlen )
202+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_setfield )
190203 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_setglobal )
204+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_seti )
205+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_settop )
191206 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_toboolean )
192207 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_tointegerx )
208+ FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_tolstring )
193209 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_tonumberx )
194210 FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE (liblua , luaData , lua_type )
195211
0 commit comments