Piotr Caban : jscript: Inherit some String functions from Object.

Alexandre Julliard julliard at winehq.org
Wed Aug 12 11:09:53 CDT 2009


Module: wine
Branch: master
Commit: 79f45c5374e587019feda40d6d7273c023f4e536
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=79f45c5374e587019feda40d6d7273c023f4e536

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Wed Aug 12 12:47:53 2009 +0200

jscript: Inherit some String functions from Object.

---

 dlls/jscript/global.c     |    2 +-
 dlls/jscript/jscript.h    |    2 +-
 dlls/jscript/string.c     |   42 +++++++-----------------------------------
 dlls/jscript/tests/api.js |   35 +++++++++++++++++++++++++++++++++++
 4 files changed, 44 insertions(+), 37 deletions(-)

diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index ff3510f..9991f08 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -778,7 +778,7 @@ static HRESULT init_constructors(script_ctx_t *ctx, DispatchEx *object_prototype
     if(FAILED(hres))
         return hres;
 
-    hres = create_string_constr(ctx, &ctx->string_constr);
+    hres = create_string_constr(ctx, object_prototype, &ctx->string_constr);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 70c9fea..63654f7 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -232,7 +232,7 @@ HRESULT init_error_constr(script_ctx_t*);
 HRESULT create_number_constr(script_ctx_t*,DispatchEx**);
 HRESULT create_object_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
 HRESULT create_regexp_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_string_constr(script_ctx_t*,DispatchEx**);
+HRESULT create_string_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
 
 typedef struct {
     const WCHAR *str;
diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index 4cf3783..04d5017 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -62,10 +62,6 @@ static const WCHAR toUpperCaseW[] = {'t','o','U','p','p','e','r','C','a','s','e'
 static const WCHAR toLocaleLowerCaseW[] = {'t','o','L','o','c','a','l','e','L','o','w','e','r','C','a','s','e',0};
 static const WCHAR toLocaleUpperCaseW[] = {'t','o','L','o','c','a','l','e','U','p','p','e','r','C','a','s','e',0};
 static const WCHAR localeCompareW[] = {'l','o','c','a','l','e','C','o','m','p','a','r','e',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] =
-    {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
 static const WCHAR fromCharCodeW[] = {'f','r','o','m','C','h','a','r','C','o','d','e',0};
 
 static HRESULT String_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -1511,27 +1507,6 @@ static HRESULT String_localeCompare(DispatchEx *dispex, LCID lcid, WORD flags, D
     return E_NOTIMPL;
 }
 
-static HRESULT String_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT String_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT String_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
 static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
@@ -1578,16 +1553,13 @@ static const builtin_prop_t String_props[] = {
     {fixedW,                 String_fixed,                 PROPF_METHOD},
     {fontcolorW,             String_fontcolor,             PROPF_METHOD},
     {fontsizeW,              String_fontsize,              PROPF_METHOD},
-    {hasOwnPropertyW,        String_hasOwnProperty,        PROPF_METHOD},
     {indexOfW,               String_indexOf,               PROPF_METHOD},
-    {isPrototypeOfW,         String_isPrototypeOf,         PROPF_METHOD},
     {italicsW,               String_italics,               PROPF_METHOD},
     {lastIndexOfW,           String_lastIndexOf,           PROPF_METHOD},
     {lengthW,                String_length,                0},
     {linkW,                  String_link,                  PROPF_METHOD},
     {localeCompareW,         String_localeCompare,         PROPF_METHOD},
     {matchW,                 String_match,                 PROPF_METHOD},
-    {propertyIsEnumerableW,  String_propertyIsEnumerable,  PROPF_METHOD},
     {replaceW,               String_replace,               PROPF_METHOD},
     {searchW,                String_search,                PROPF_METHOD},
     {sliceW,                 String_slice,                 PROPF_METHOD},
@@ -1703,7 +1675,7 @@ static HRESULT StringConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
     return S_OK;
 }
 
-static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance **ret)
+static HRESULT string_alloc(script_ctx_t *ctx, DispatchEx *object_prototype, StringInstance **ret)
 {
     StringInstance *string;
     HRESULT hres;
@@ -1712,10 +1684,10 @@ static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance *
     if(!string)
         return E_OUTOFMEMORY;
 
-    if(use_constr)
-        hres = init_dispex_from_constr(&string->dispex, ctx, &String_info, ctx->string_constr);
+    if(object_prototype)
+        hres = init_dispex(&string->dispex, ctx, &String_info, object_prototype);
     else
-        hres = init_dispex(&string->dispex, ctx, &String_info, NULL);
+        hres = init_dispex_from_constr(&string->dispex, ctx, &String_info, ctx->string_constr);
     if(FAILED(hres)) {
         heap_free(string);
         return hres;
@@ -1738,12 +1710,12 @@ static const builtin_info_t StringConstr_info = {
     NULL
 };
 
-HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
 {
     StringInstance *string;
     HRESULT hres;
 
-    hres = string_alloc(ctx, FALSE, &string);
+    hres = string_alloc(ctx, object_prototype, &string);
     if(FAILED(hres))
         return hres;
 
@@ -1758,7 +1730,7 @@ HRESULT create_string(script_ctx_t *ctx, const WCHAR *str, DWORD len, DispatchEx
     StringInstance *string;
     HRESULT hres;
 
-    hres = string_alloc(ctx, TRUE, &string);
+    hres = string_alloc(ctx, NULL, &string);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 15b4b57..7cb1f56 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -1345,4 +1345,39 @@ exception_test(function() {eval("while(")}, "SyntaxError", -2146827286);
 exception_test(function() {eval("if(")}, "SyntaxError", -2146827286);
 exception_test(function() {eval("'unterminated")}, "SyntaxError", -2146827273);
 
+function testObjectInherit(obj, ts, tls, vo) {
+    ok(obj.hasOwnProperty === Object.prototype.hasOwnProperty,
+       "obj.hasOwnProperty !== Object.prototype.hasOwnProprty");
+    ok(obj.isPrototypeOf === Object.prototype.isPrototypeOf,
+       "obj.isPrototypeOf !== Object.prototype.isPrototypeOf");
+    ok(obj.propertyIsEnumerable === Object.prototype.propertyIsEnumerable,
+       "obj.propertyIsEnumerable !== Object.prototype.propertyIsEnumerable");
+
+    if(ts)
+        ok(obj.toString === Object.prototype.toString,
+           "obj.toString !== Object.prototype.toString");
+    else
+        ok(obj.toString != Object.prototype.toString,
+           "obj.toString == Object.prototype.toString");
+
+    if(tls)
+        ok(obj.toLocaleString === Object.prototype.toLocaleString,
+           "obj.toLocaleString !== Object.prototype.toLocaleString");
+    else
+        ok(obj.toLocaleString != Object.prototype.toLocaleString,
+           "obj.toLocaleString == Object.prototype.toLocaleString");
+
+    if(vo)
+        ok(obj.valueOf === Object.prototype.valueOf,
+           "obj.valueOf !== Object.prototype.valueOf");
+    else
+        ok(obj.valueOf != Object.prototype.valueOf,
+           "obj.valueOf == Object.prototype.valueOf");
+
+    ok(obj.test === "test", "obj.test = " + obj.test);
+}
+
+Object.prototype.test = "test";
+testObjectInherit(new String("test"), false, true, false);
+
 reportSuccess();




More information about the wine-cvs mailing list