Index: /trunk/src/VBox/Runtime/common/misc/json.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/misc/json.cpp	(revision 73615)
+++ /trunk/src/VBox/Runtime/common/misc/json.cpp	(revision 73616)
@@ -1289,27 +1289,52 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, RTJSONVALTYPE_INVALID);
+
     if (pThis == NIL_RTJSONVAL)
         return RTJSONVALTYPE_INVALID;
-    AssertPtrReturn(pThis, RTJSONVALTYPE_INVALID);
 
     return pThis->enmType;
 }
 
+
+#define AssertJsonTypeReturn(pJson, enmExpectedType, ret) do {          \
+        AssertPtrReturn((pJson), (ret));                                \
+        AssertReturn((pJson) != NIL_RTJSONVAL, (ret));                  \
+        AssertReturn((pJson)->enmType == (enmExpectedType), (ret));     \
+    } while (0)
+
+#define RTJSON_TYPECHECK(pJson, enmExpectedType) do {   \
+        if (RT_UNLIKELY((pJson) == NIL_RTJSONVAL))      \
+            return VERR_INVALID_HANDLE;                 \
+        if ((pJson)->enmType != (enmExpectedType))      \
+            return VERR_JSON_VALUE_INVALID_TYPE;        \
+    } while (0)
+
+
+#define RTJSON_TYPECHECK_CONTAINER(pJson) do {                  \
+        if (RT_UNLIKELY((pJson) == NIL_RTJSONVAL))              \
+            return VERR_INVALID_HANDLE;                         \
+        if (   (pJson)->enmType != RTJSONVALTYPE_ARRAY          \
+            && (pJson)->enmType != RTJSONVALTYPE_OBJECT)        \
+            return VERR_JSON_VALUE_INVALID_TYPE;                \
+    } while (0)
+
+
 RTDECL(const char *) RTJsonValueGetString(RTJSONVAL hJsonVal)
 {
     PRTJSONVALINT pThis = hJsonVal;
-    AssertReturn(pThis != NIL_RTJSONVAL, NULL);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_STRING, NULL);
+    AssertJsonTypeReturn(pThis, RTJSONVALTYPE_STRING, NULL);
 
     return pThis->Type.String.pszStr;
 }
 
+
 RTDECL(int) RTJsonValueQueryString(RTJSONVAL hJsonVal, const char **ppszStr)
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     AssertPtrReturn(ppszStr, VERR_INVALID_POINTER);
-    AssertReturn(pThis != NIL_RTJSONVAL, VERR_INVALID_HANDLE);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_STRING, VERR_JSON_VALUE_INVALID_TYPE);
-
+
+    RTJSON_TYPECHECK(pThis, RTJSONVALTYPE_STRING);
     *ppszStr = pThis->Type.String.pszStr;
     return VINF_SUCCESS;
@@ -1319,8 +1344,8 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     AssertPtrReturn(pi64Num, VERR_INVALID_POINTER);
-    AssertReturn(pThis != NIL_RTJSONVAL, VERR_INVALID_HANDLE);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_NUMBER, VERR_JSON_VALUE_INVALID_TYPE);
-
+
+    RTJSON_TYPECHECK(pThis, RTJSONVALTYPE_NUMBER);
     *pi64Num = pThis->Type.Number.i64Num;
     return VINF_SUCCESS;
@@ -1330,8 +1355,9 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     AssertPtrReturn(pszName, VERR_INVALID_POINTER);
     AssertPtrReturn(phJsonVal, VERR_INVALID_POINTER);
-    AssertReturn(pThis != NIL_RTJSONVAL, VERR_INVALID_HANDLE);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_OBJECT, VERR_JSON_VALUE_INVALID_TYPE);
+
+    RTJSON_TYPECHECK(pThis, RTJSONVALTYPE_OBJECT);
 
     int rc = VERR_NOT_FOUND;
@@ -1407,6 +1433,5 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
-    AssertReturn(pThis != NIL_RTJSONVAL, 0);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_ARRAY, 0);
+    AssertJsonTypeReturn(pThis, RTJSONVALTYPE_ARRAY, 0);
 
     return pThis->Type.Array.cItems;
@@ -1416,8 +1441,8 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     AssertPtrReturn(pcItems, VERR_INVALID_POINTER);
-    AssertReturn(pThis != NIL_RTJSONVAL, VERR_INVALID_HANDLE);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_ARRAY, VERR_JSON_VALUE_INVALID_TYPE);
-
+
+    RTJSON_TYPECHECK(pThis, RTJSONVALTYPE_ARRAY);
     *pcItems = pThis->Type.Array.cItems;
     return VINF_SUCCESS;
@@ -1427,8 +1452,10 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     AssertPtrReturn(phJsonVal, VERR_INVALID_POINTER);
-    AssertReturn(pThis != NIL_RTJSONVAL, VERR_INVALID_HANDLE);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_ARRAY, VERR_JSON_VALUE_INVALID_TYPE);
-    AssertReturn(idx < pThis->Type.Array.cItems, VERR_OUT_OF_RANGE);
+
+    RTJSON_TYPECHECK(pThis, RTJSONVALTYPE_ARRAY);
+    if (RT_UNLIKELY(idx >= pThis->Type.Array.cItems))
+        return VERR_OUT_OF_RANGE;
 
     RTJsonValueRetain(pThis->Type.Array.papItems[idx]);
@@ -1440,8 +1467,8 @@
 {
     PRTJSONVALINT pThis = hJsonVal;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     AssertPtrReturn(phJsonIt, VERR_INVALID_POINTER);
-    AssertReturn(pThis != NIL_RTJSONVAL, VERR_INVALID_HANDLE);
-    AssertReturn(pThis->enmType == RTJSONVALTYPE_ARRAY || pThis->enmType == RTJSONVALTYPE_OBJECT,
-                 VERR_JSON_VALUE_INVALID_TYPE);
+
+    RTJSON_TYPECHECK_CONTAINER(pThis);
 
     PRTJSONITINT pIt = (PRTJSONITINT)RTMemTmpAllocZ(sizeof(RTJSONITINT));
@@ -1460,4 +1487,5 @@
 {
     PRTJSONITINT pIt = hJsonIt;
+    AssertPtrReturn(pIt, VERR_INVALID_HANDLE);
     AssertReturn(pIt != NIL_RTJSONIT, VERR_INVALID_HANDLE);
     AssertPtrReturn(phJsonVal, VERR_INVALID_POINTER);
@@ -1500,4 +1528,5 @@
 {
     PRTJSONITINT pIt = hJsonIt;
+    AssertPtrReturn(pIt, VERR_INVALID_HANDLE);
     AssertReturn(pIt != NIL_RTJSONIT, VERR_INVALID_HANDLE);
 
@@ -1529,10 +1558,10 @@
 {
     PRTJSONITINT pThis = hJsonIt;
+    AssertPtrReturnVoid(pThis);
+
     if (pThis == NIL_RTJSONIT)
         return;
-    AssertPtrReturnVoid(pThis);
 
     RTJsonValueRelease(pThis->pJsonVal);
     RTMemTmpFree(pThis);
 }
-
