Jacek Caban : jscript: Pass container object and property name to stringify.

Alexandre Julliard julliard at winehq.org
Tue Apr 20 16:27:47 CDT 2021


Module: wine
Branch: master
Commit: 6a58d990e788247db63edec89b8f270c4678e844
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6a58d990e788247db63edec89b8f270c4678e844

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Apr 20 19:12:14 2021 +0200

jscript: Pass container object and property name to stringify.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/json.c | 82 ++++++++++++++++++++++++++---------------------------
 1 file changed, 41 insertions(+), 41 deletions(-)

diff --git a/dlls/jscript/json.c b/dlls/jscript/json.c
index 8f16ba22885..f3b523d63d8 100644
--- a/dlls/jscript/json.c
+++ b/dlls/jscript/json.c
@@ -490,13 +490,13 @@ static inline BOOL is_callable(jsdisp_t *obj)
     return is_class(obj, JSCLASS_FUNCTION);
 }
 
-static HRESULT stringify(stringify_ctx_t *ctx, jsval_t val);
+static HRESULT stringify(stringify_ctx_t *ctx, jsdisp_t *object, const WCHAR *name);
 
 /* ECMA-262 5.1 Edition    15.12.3 (abstract operation JA) */
 static HRESULT stringify_array(stringify_ctx_t *ctx, jsdisp_t *obj)
 {
     unsigned length, i, j;
-    jsval_t val;
+    WCHAR name[16];
     HRESULT hres;
 
     if(is_on_stack(ctx, obj)) {
@@ -526,19 +526,12 @@ static HRESULT stringify_array(stringify_ctx_t *ctx, jsdisp_t *obj)
             }
         }
 
-        hres = jsdisp_get_idx(obj, i, &val);
-        if(SUCCEEDED(hres)) {
-            hres = stringify(ctx, val);
-            if(FAILED(hres))
-                return hres;
-            if(hres == S_FALSE && !append_string(ctx, L"null"))
-                return E_OUTOFMEMORY;
-        }else if(hres == DISP_E_UNKNOWNNAME) {
-            if(!append_string(ctx, L"null"))
-                return E_OUTOFMEMORY;
-        }else {
+        _itow(i, name, ARRAY_SIZE(name));
+        hres = stringify(ctx, obj, name);
+        if(FAILED(hres))
             return hres;
-        }
+        if(hres == S_FALSE && !append_string(ctx, L"null"))
+            return E_OUTOFMEMORY;
     }
 
     if((length && *ctx->gap && !append_char(ctx, '\n')) || !append_char(ctx, ']'))
@@ -552,7 +545,6 @@ static HRESULT stringify_array(stringify_ctx_t *ctx, jsdisp_t *obj)
 static HRESULT stringify_object(stringify_ctx_t *ctx, jsdisp_t *obj)
 {
     DISPID dispid = DISPID_STARTENUM;
-    jsval_t val = jsval_undefined();
     unsigned prop_cnt = 0, i;
     size_t stepback;
     BSTR prop_name;
@@ -570,14 +562,6 @@ static HRESULT stringify_object(stringify_ctx_t *ctx, jsdisp_t *obj)
         return E_OUTOFMEMORY;
 
     while((hres = IDispatchEx_GetNextDispID(&obj->IDispatchEx_iface, fdexEnumDefault, dispid, &dispid)) == S_OK) {
-        jsval_release(val);
-        hres = jsdisp_propget(obj, dispid, &val);
-        if(FAILED(hres))
-            return hres;
-
-        if(is_undefined(val))
-            continue;
-
         stepback = ctx->buf_len;
 
         if(prop_cnt && !append_char(ctx, ',')) {
@@ -601,21 +585,23 @@ static HRESULT stringify_object(stringify_ctx_t *ctx, jsdisp_t *obj)
 
         hres = IDispatchEx_GetMemberName(&obj->IDispatchEx_iface, dispid, &prop_name);
         if(FAILED(hres))
-            break;
+            return hres;
 
         hres = json_quote(ctx, prop_name, SysStringLen(prop_name));
-        SysFreeString(prop_name);
-        if(FAILED(hres))
-            break;
+        if(FAILED(hres)) {
+            SysFreeString(prop_name);
+            return hres;
+        }
 
         if(!append_char(ctx, ':') || (*ctx->gap && !append_char(ctx, ' '))) {
-            hres = E_OUTOFMEMORY;
-            break;
+            SysFreeString(prop_name);
+            return E_OUTOFMEMORY;
         }
 
-        hres = stringify(ctx, val);
+        hres = stringify(ctx, obj, prop_name);
+        SysFreeString(prop_name);
         if(FAILED(hres))
-            break;
+            return hres;
 
         if(hres == S_FALSE) {
             ctx->buf_len = stepback;
@@ -624,9 +610,6 @@ static HRESULT stringify_object(stringify_ctx_t *ctx, jsdisp_t *obj)
 
         prop_cnt++;
     }
-    jsval_release(val);
-    if(FAILED(hres))
-        return hres;
 
     if(prop_cnt && *ctx->gap) {
         if(!append_char(ctx, '\n'))
@@ -648,18 +631,24 @@ static HRESULT stringify_object(stringify_ctx_t *ctx, jsdisp_t *obj)
 }
 
 /* ECMA-262 5.1 Edition    15.12.3 (abstract operation Str) */
-static HRESULT stringify(stringify_ctx_t *ctx, jsval_t val)
+static HRESULT stringify(stringify_ctx_t *ctx, jsdisp_t *object, const WCHAR *name)
 {
-    jsval_t value;
+    jsval_t value, v;
     HRESULT hres;
 
-    if(is_object_instance(val) && get_object(val)) {
+    hres = jsdisp_propget_name(object, name, &value);
+    if(FAILED(hres))
+        return hres == DISP_E_UNKNOWNNAME ? S_FALSE : hres;
+
+    if(is_object_instance(value) && get_object(value)) {
         jsdisp_t *obj;
         DISPID id;
 
-        obj = iface_to_jsdisp(get_object(val));
-        if(!obj)
+        obj = iface_to_jsdisp(get_object(value));
+        if(!obj) {
+            jsval_release(value);
             return S_FALSE;
+        }
 
         hres = jsdisp_get_id(obj, L"toJSON", 0, &id);
         jsdisp_release(obj);
@@ -669,7 +658,9 @@ static HRESULT stringify(stringify_ctx_t *ctx, jsval_t val)
 
     /* FIXME: Support replacer replacer. */
 
-    hres = maybe_to_primitive(ctx->ctx, val, &value);
+    v = value;
+    hres = maybe_to_primitive(ctx->ctx, v, &value);
+    jsval_release(v);
     if(FAILED(hres))
         return hres;
 
@@ -746,6 +737,7 @@ static HRESULT stringify(stringify_ctx_t *ctx, jsval_t val)
 static HRESULT JSON_stringify(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 {
     stringify_ctx_t stringify_ctx = {ctx, NULL,0,0, NULL,0,0, {0}};
+    jsdisp_t *obj;
     HRESULT hres;
 
     TRACE("\n");
@@ -790,7 +782,12 @@ static HRESULT JSON_stringify(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
         jsval_release(space_val);
     }
 
-    hres = stringify(&stringify_ctx, argv[0]);
+    if(FAILED(hres = create_object(ctx, NULL, &obj)))
+        goto fail;
+    if(FAILED(hres = jsdisp_propput_name(obj, L"", argv[0])))
+        goto fail;
+
+    hres = stringify(&stringify_ctx, obj, L"");
     if(SUCCEEDED(hres) && r) {
         assert(!stringify_ctx.stack_top);
 
@@ -805,6 +802,9 @@ static HRESULT JSON_stringify(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
         }
     }
 
+fail:
+    if(obj)
+        jsdisp_release(obj);
     heap_free(stringify_ctx.buf);
     heap_free(stringify_ctx.stack);
     return hres;




More information about the wine-cvs mailing list