diff options
Diffstat (limited to 'lua_cjson.c')
-rw-r--r-- | lua_cjson.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lua_cjson.c b/lua_cjson.c index 3a77644..1695979 100644 --- a/lua_cjson.c +++ b/lua_cjson.c | |||
@@ -1401,10 +1401,21 @@ static int lua_cjson_new(lua_State *l) | |||
1401 | /* Initialise number conversions */ | 1401 | /* Initialise number conversions */ |
1402 | fpconv_init(); | 1402 | fpconv_init(); |
1403 | 1403 | ||
1404 | /* Create empty array metatable */ | 1404 | /* Test if empty array metatable is in registry */ |
1405 | lua_pushlightuserdata(l, &json_empty_array); | 1405 | lua_pushlightuserdata(l, &json_empty_array); |
1406 | lua_newtable(l); | 1406 | lua_rawget(l, LUA_REGISTRYINDEX); |
1407 | lua_rawset(l, LUA_REGISTRYINDEX); | 1407 | if (lua_isnil(l, -1)) { |
1408 | /* Create empty array metatable. | ||
1409 | * | ||
1410 | * If multiple calls to lua_cjson_new() are made, | ||
1411 | * this prevents overriding the table at the given | ||
1412 | * registry's index with a new one. | ||
1413 | */ | ||
1414 | lua_pop(l, 1); | ||
1415 | lua_pushlightuserdata(l, &json_empty_array); | ||
1416 | lua_newtable(l); | ||
1417 | lua_rawset(l, LUA_REGISTRYINDEX); | ||
1418 | } | ||
1408 | 1419 | ||
1409 | /* cjson module table */ | 1420 | /* cjson module table */ |
1410 | lua_newtable(l); | 1421 | lua_newtable(l); |