Module: wine Branch: master Commit: 9fd4f4a44a5704a839103bfed7e03b1206d31086 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9fd4f4a44a5704a839103bfed7...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Feb 5 23:17:35 2010 +0100
jscript: Added support for constructor property.
---
dlls/jscript/dispex.c | 17 +++++++++++++++++ dlls/jscript/tests/lang.js | 5 +++++ dlls/jscript/tests/regexp.js | 1 + 3 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index c420f54..6894eae 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -803,6 +803,7 @@ HRESULT init_dispex_from_constr(DispatchEx *dispex, script_ctx_t *ctx, const bui dispex_prop_t *prop; HRESULT hres;
+ static const WCHAR constructorW[] = {'c','o','n','s','t','r','u','c','t','o','r'}; static const WCHAR prototypeW[] = {'p','r','o','t','o','t','y','p','e',0};
hres = find_prop_name_prot(constr, prototypeW, &prop); @@ -827,6 +828,22 @@ HRESULT init_dispex_from_constr(DispatchEx *dispex, script_ctx_t *ctx, const bui
if(prot) jsdisp_release(prot); + if(FAILED(hres)) + return hres; + + hres = ensure_prop_name(dispex, constructorW, FALSE, 0, &prop); + if(SUCCEEDED(hres)) { + jsexcept_t jsexcept; + VARIANT var; + + V_VT(&var) = VT_DISPATCH; + V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(constr); + memset(&jsexcept, 0, sizeof(jsexcept)); + hres = prop_put(dispex, prop, &var, &jsexcept, NULL/*FIXME*/); + } + if(FAILED(hres)) + jsdisp_release(dispex); + return hres; }
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index d91b1f2..495762e 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -116,6 +116,7 @@ ok(tmp === 1, "tmp = " + tmp);
var obj1 = new Object(); ok(typeof(obj1) === "object", "typeof(obj1) is not object"); +ok(obj1.constructor === Object, "unexpected obj1.constructor"); obj1.test = true; obj1.func = function () { ok(this === obj1, "this is not obj1"); @@ -144,6 +145,7 @@ testConstr1.prototype.pvar = 1;
var obj2 = new testConstr1(true); ok(typeof(obj2) === "object", "typeof(obj2) is not object"); +ok(obj2.constructor === testConstr1, "unexpected obj2.constructor"); ok(obj2.pvar === 1, "obj2.pvar is not 1");
testConstr1.prototype.pvar = 2; @@ -209,6 +211,7 @@ if(false) { var obj3 = { prop1: 1, prop2: typeof(false) }; ok(obj3.prop1 === 1, "obj3.prop1 is not 1"); ok(obj3.prop2 === "boolean", "obj3.prop2 is not "boolean""); +ok(obj3.constructor === Object, "unexpected obj3.constructor");
{ var blockVar = 1; @@ -422,8 +425,10 @@ ok(+"3e3" === 3000, "+'3e3' !== 3000");
tmp = new Number(1); ok(+tmp === 1, "+(new Number(1)) = " + (+tmp)); +ok(tmp.constructor === Number, "unexpected tmp.constructor"); tmp = new String("1"); ok(+tmp === 1, "+(new String('1')) = " + (+tmp)); +ok(tmp.constructor === String, "unexpected tmp.constructor");
ok("" + 0 === "0", """ + 0 !== "0""); ok("" + 123 === "123", """ + 123 !== "123""); diff --git a/dlls/jscript/tests/regexp.js b/dlls/jscript/tests/regexp.js index d09d787..fac1112 100644 --- a/dlls/jscript/tests/regexp.js +++ b/dlls/jscript/tests/regexp.js @@ -100,6 +100,7 @@ m = "abcabc".match(re = /ca/); ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 1, "m.length is not 1"); ok(m["0"] === "ca", "m[0] is not "ca""); +ok(m.constructor === Array, "unexpected m.constructor"); ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex);
m = "abcabc".match(/ab/);