parser json FEATURE support for nested ext instances with data

... such as schema-mount.
diff --git a/src/json.c b/src/json.c
index 85368cb..cbe38e9 100644
--- a/src/json.c
+++ b/src/json.c
@@ -24,12 +24,6 @@
 #include "json.h"
 #include "tree_schema_internal.h"
 
-#define JSON_PUSH_STATUS_RET(CTX, STATUS) \
-    LY_CHECK_RET(ly_set_add(&CTX->status, (void *)(uintptr_t)(STATUS), 1, NULL))
-
-#define JSON_POP_STATUS_RET(CTX) \
-    assert(CTX->status.count); CTX->status.count--;
-
 const char *
 lyjson_token2str(enum LYJSON_PARSER_STATUS status)
 {
@@ -78,7 +72,7 @@
         ly_in_skip(jsonctx->in, 1);
     }
     if (*jsonctx->in->current == '\0') {
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_END);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_END);
     }
 
     return LY_SUCCESS;
@@ -318,7 +312,7 @@
 {
     LY_CHECK_RET(lyjson_string_(jsonctx));
 
-    JSON_PUSH_STATUS_RET(jsonctx, LYJSON_STRING);
+    LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_STRING);
     LY_CHECK_RET(lyjson_check_next(jsonctx));
 
     return LY_SUCCESS;
@@ -718,7 +712,7 @@
     }
     ly_in_skip(jsonctx->in, offset);
 
-    JSON_PUSH_STATUS_RET(jsonctx, LYJSON_NUMBER);
+    LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_NUMBER);
     LY_CHECK_RET(lyjson_check_next(jsonctx));
 
     return LY_SUCCESS;
@@ -758,23 +752,21 @@
         /* empty object */
         ly_in_skip(jsonctx->in, 1);
         lyjson_ctx_set_value(jsonctx, NULL, 0, 0);
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_OBJECT_EMPTY);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_OBJECT_EMPTY);
         return LY_SUCCESS;
     }
 
     LY_CHECK_RET(lyjson_object_name(jsonctx));
 
     /* output data are set by lyjson_string_() */
-    JSON_PUSH_STATUS_RET(jsonctx, LYJSON_OBJECT);
+    LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_OBJECT);
 
     return LY_SUCCESS;
 }
 
-/*
+/**
  * @brief Process JSON array envelope
  *
- *
- *
  * @param[in] jsonctx JSON parser context
  * @return LY_SUCCESS or LY_EMEM
  */
@@ -786,9 +778,9 @@
     if (*jsonctx->in->current == ']') {
         /* empty array */
         ly_in_skip(jsonctx->in, 1);
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_ARRAY_EMPTY);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_ARRAY_EMPTY);
     } else {
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_ARRAY);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_ARRAY);
     }
 
     /* erase previous values, array has no value on its own */
@@ -808,21 +800,21 @@
         /* false */
         lyjson_ctx_set_value(jsonctx, jsonctx->in->current, ly_strlen_const("false"), 0);
         ly_in_skip(jsonctx->in, ly_strlen_const("false"));
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_FALSE);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_FALSE);
         LY_CHECK_RET(lyjson_check_next(jsonctx));
 
     } else if ((*jsonctx->in->current == 't') && !strncmp(jsonctx->in->current, "true", ly_strlen_const("true"))) {
         /* true */
         lyjson_ctx_set_value(jsonctx, jsonctx->in->current, ly_strlen_const("true"), 0);
         ly_in_skip(jsonctx->in, ly_strlen_const("true"));
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_TRUE);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_TRUE);
         LY_CHECK_RET(lyjson_check_next(jsonctx));
 
     } else if ((*jsonctx->in->current == 'n') && !strncmp(jsonctx->in->current, "null", ly_strlen_const("null"))) {
         /* none */
         lyjson_ctx_set_value(jsonctx, "", 0, 0);
         ly_in_skip(jsonctx->in, ly_strlen_const("null"));
-        JSON_PUSH_STATUS_RET(jsonctx, LYJSON_NULL);
+        LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_NULL);
         LY_CHECK_RET(lyjson_check_next(jsonctx));
 
     } else if (*jsonctx->in->current == '"') {
@@ -861,7 +853,7 @@
 }
 
 LY_ERR
-lyjson_ctx_new(const struct ly_ctx *ctx, struct ly_in *in, struct lyjson_ctx **jsonctx_p)
+lyjson_ctx_new(const struct ly_ctx *ctx, struct ly_in *in, ly_bool subtree, struct lyjson_ctx **jsonctx_p)
 {
     LY_ERR ret = LY_SUCCESS;
     struct lyjson_ctx *jsonctx;
@@ -885,8 +877,12 @@
         goto cleanup;
     }
 
-    ret = lyjson_value(jsonctx);
-
+    if (subtree) {
+        ret = lyjson_object(jsonctx);
+        jsonctx->depth++;
+    } else {
+        ret = lyjson_value(jsonctx);
+    }
     if ((jsonctx->status.count > 1) && (lyjson_ctx_status(jsonctx, 0) == LYJSON_END)) {
         LOGVAL(jsonctx->ctx, LY_VCODE_EOF);
         ret = LY_EVALID;
@@ -950,7 +946,7 @@
         goto result;
     } else {
         /* the previous token is closed and should be completely processed */
-        JSON_POP_STATUS_RET(jsonctx);
+        LYJSON_STATUS_POP_RET(jsonctx);
         prev = lyjson_ctx_status(jsonctx, 0);
     }
 
@@ -985,14 +981,15 @@
             /* ... array - get another complete value */
             ret = lyjson_value(jsonctx);
         }
-    } else if (((prev == LYJSON_OBJECT) && (*jsonctx->in->current == '}')) || ((prev == LYJSON_ARRAY) && (*jsonctx->in->current == ']'))) {
+    } else if (((prev == LYJSON_OBJECT) && (*jsonctx->in->current == '}')) ||
+            ((prev == LYJSON_ARRAY) && (*jsonctx->in->current == ']'))) {
         if (*jsonctx->in->current == '}') {
             assert(jsonctx->depth);
             jsonctx->depth--;
         }
         ly_in_skip(jsonctx->in, 1);
-        JSON_POP_STATUS_RET(jsonctx);
-        JSON_PUSH_STATUS_RET(jsonctx, prev + 1);
+        LYJSON_STATUS_POP_RET(jsonctx);
+        LYJSON_STATUS_PUSH_RET(jsonctx, prev + 1);
     } else {
         /* unexpected value */
         LOGVAL(jsonctx->ctx, LY_VCODE_INSTREXP, LY_VCODE_INSTREXP_len(jsonctx->in->current), jsonctx->in->current,