@@ -77,6 +77,7 @@ static bool heading_nav(lua_State *L, int keys_len, bool array_type) {
7777 if (keys_len <= 0 ) return set_tmlerr (new_tmlerr (L , DECODE_DEFINED_IDX ), false, 28 , "no keys provided to navigate" );
7878 int keys_start = absindex (lua_gettop (L ), - keys_len );
7979 lua_pushvalue (L , DECODE_RESULT_IDX );
80+ bool is_new = false;
8081 for (int key_idx = keys_start ; key_idx < keys_start + keys_len ; key_idx ++ ) {
8182 int parent_idx = lua_gettop (L );
8283 lua_pushvalue (L , key_idx );
@@ -88,6 +89,7 @@ static bool heading_nav(lua_State *L, int keys_len, bool array_type) {
8889 lua_pushvalue (L , key_idx );
8990 lua_pushvalue (L , -2 );
9091 lua_rawset (L , parent_idx ); // t[key] = new table
92+ is_new = true;
9193 } else if (vtype != LUA_TTABLE ) {
9294 TMLErr * err = new_tmlerr (L , DECODE_DEFINED_IDX );
9395 set_tmlerr (err , false, 44 , "cannot navigate through non-table! Key was: " );
@@ -101,7 +103,7 @@ static bool heading_nav(lua_State *L, int keys_len, bool array_type) {
101103 lua_Integer len = lua_tointeger (L , -1 );
102104 lua_pop (L , 1 );
103105 if (key_idx == keys_start + keys_len - 1 ) {
104- if (len >= 0 && array_type ) {
106+ if (( len > 0 || is_new ) && array_type ) {
105107 len ++ ;
106108 parent_idx = lua_gettop (L );
107109 lua_pushvalue (L , parent_idx );
@@ -111,7 +113,7 @@ static bool heading_nav(lua_State *L, int keys_len, bool array_type) {
111113 lua_pushvalue (L , -1 );
112114 lua_rawseti (L , parent_idx , len );
113115 lua_remove (L , parent_idx ); // remove parent table, keep child on top
114- } else if (len != 0 ) {
116+ } else if (! is_new ) {
115117 TMLErr * err = new_tmlerr (L , DECODE_DEFINED_IDX );
116118 set_tmlerr (err , false, 32 , "table already defined! Key was: " );
117119 return err_push_keys (L , err , keys_start , keys_start + keys_len - 1 );
0 commit comments