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

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


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

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

jscript: Inherit some RegExp functions from Object.

---

 dlls/jscript/global.c     |    2 +-
 dlls/jscript/jscript.h    |    2 +-
 dlls/jscript/regexp.c     |   51 ++++++--------------------------------------
 dlls/jscript/tests/api.js |    5 ++-
 4 files changed, 12 insertions(+), 48 deletions(-)

diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 9991f08..42dad41 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -774,7 +774,7 @@ static HRESULT init_constructors(script_ctx_t *ctx, DispatchEx *object_prototype
     if(FAILED(hres))
         return hres;
 
-    hres = create_regexp_constr(ctx, &ctx->regexp_constr);
+    hres = create_regexp_constr(ctx, object_prototype, &ctx->regexp_constr);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 63654f7..4db58fc 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -231,7 +231,7 @@ HRESULT create_date_constr(script_ctx_t*,DispatchEx**);
 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_regexp_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
 HRESULT create_string_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
 
 typedef struct {
diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c
index a4d640e..5fe99ab 100644
--- a/dlls/jscript/regexp.c
+++ b/dlls/jscript/regexp.c
@@ -90,11 +90,6 @@ static const WCHAR ignoreCaseW[] = {'i','g','n','o','r','e','C','a','s','e',0};
 static const WCHAR multilineW[] = {'m','u','l','t','i','l','i','n','e',0};
 static const WCHAR lastIndexW[] = {'l','a','s','t','I','n','d','e','x',0};
 static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
-static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',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 execW[] = {'e','x','e','c',0};
 static const WCHAR testW[] = {'t','e','s','t',0};
 
@@ -3471,34 +3466,6 @@ static HRESULT RegExp_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
     return E_NOTIMPL;
 }
 
-static HRESULT RegExp_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT RegExp_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT RegExp_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
-static HRESULT RegExp_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
-        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
 static HRESULT RegExp_exec(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
@@ -3542,15 +3509,11 @@ static void RegExp_destructor(DispatchEx *dispex)
 static const builtin_prop_t RegExp_props[] = {
     {execW,                  RegExp_exec,                  PROPF_METHOD},
     {globalW,                RegExp_global,                0},
-    {hasOwnPropertyW,        RegExp_hasOwnProperty,        PROPF_METHOD},
     {ignoreCaseW,            RegExp_ignoreCase,            0},
-    {isPrototypeOfW,         RegExp_isPrototypeOf,         PROPF_METHOD},
     {lastIndexW,             RegExp_lastIndex,             0},
     {multilineW,             RegExp_multiline,             0},
-    {propertyIsEnumerableW,  RegExp_propertyIsEnumerable,  PROPF_METHOD},
     {sourceW,                RegExp_source,                0},
     {testW,                  RegExp_test,                  PROPF_METHOD},
-    {toLocaleStringW,        RegExp_toLocaleString,        PROPF_METHOD},
     {toStringW,              RegExp_toString,              PROPF_METHOD}
 };
 
@@ -3563,7 +3526,7 @@ static const builtin_info_t RegExp_info = {
     NULL
 };
 
-static HRESULT alloc_regexp(script_ctx_t *ctx, BOOL use_constr, RegExpInstance **ret)
+static HRESULT alloc_regexp(script_ctx_t *ctx, DispatchEx *object_prototype, RegExpInstance **ret)
 {
     RegExpInstance *regexp;
     HRESULT hres;
@@ -3572,10 +3535,10 @@ static HRESULT alloc_regexp(script_ctx_t *ctx, BOOL use_constr, RegExpInstance *
     if(!regexp)
         return E_OUTOFMEMORY;
 
-    if(use_constr)
-        hres = init_dispex_from_constr(&regexp->dispex, ctx, &RegExp_info, ctx->regexp_constr);
+    if(object_prototype)
+        hres = init_dispex(&regexp->dispex, ctx, &RegExp_info, object_prototype);
     else
-        hres = init_dispex(&regexp->dispex, ctx, &RegExp_info, NULL);
+        hres = init_dispex_from_constr(&regexp->dispex, ctx, &RegExp_info, ctx->regexp_constr);
 
     if(FAILED(hres)) {
         heap_free(regexp);
@@ -3593,7 +3556,7 @@ static HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD
 
     TRACE("%s %x\n", debugstr_w(exp), flags);
 
-    hres = alloc_regexp(ctx, TRUE, &regexp);
+    hres = alloc_regexp(ctx, NULL, &regexp);
     if(FAILED(hres))
         return hres;
 
@@ -3694,12 +3657,12 @@ static HRESULT RegExpConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
     return S_OK;
 }
 
-HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
 {
     RegExpInstance *regexp;
     HRESULT hres;
 
-    hres = alloc_regexp(ctx, FALSE, &regexp);
+    hres = alloc_regexp(ctx, object_prototype, &regexp);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 7cb1f56..8db2bc9 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -1374,10 +1374,11 @@ function testObjectInherit(obj, ts, tls, vo) {
         ok(obj.valueOf != Object.prototype.valueOf,
            "obj.valueOf == Object.prototype.valueOf");
 
-    ok(obj.test === "test", "obj.test = " + obj.test);
+    ok(obj._test === "test", "obj.test = " + obj._test);
 }
 
-Object.prototype.test = "test";
+Object.prototype._test = "test";
 testObjectInherit(new String("test"), false, true, false);
+testObjectInherit(/test/g, false, true, true);
 
 reportSuccess();




More information about the wine-cvs mailing list