Commit 8fa923ca authored by Gabriel Ivăncescu's avatar Gabriel Ivăncescu Committed by Alexandre Julliard

jscript: Pass null jsval to builtin functions instead of the global host.

parent 5c5dfb3d
......@@ -599,7 +599,7 @@ static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, ID
if(this_disp)
vthis = jsval_disp(this_disp);
else
vthis = jsval_disp(lookup_global_host(ctx));
vthis = jsval_null();
return function->proc(ctx, vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r);
}
......
......@@ -16,6 +16,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
var JS_E_NUMBER_EXPECTED = 0x800a1389;
var JS_E_FUNCTION_EXPECTED = 0x800a138a;
var JS_E_DATE_EXPECTED = 0x800a138e;
var JS_E_OBJECT_EXPECTED = 0x800a138f;
var JS_E_BOOLEAN_EXPECTED = 0x800a1392;
var JS_E_VBARRAY_EXPECTED = 0x800a1395;
var JS_E_ENUMERATOR_EXPECTED = 0x800a1397;
var JS_E_REGEXP_EXPECTED = 0x800a1398;
var tmp, i;
var bigInt = Math.pow(2,40);
......@@ -3061,6 +3070,42 @@ ok(unescape.length == 1, "unescape.length = " + unescape.length);
String.length = 3;
ok(String.length == 1, "String.length = " + String.length);
(function() {
var tests = [
[ "Array.sort", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.sort.call(ctx); } ],
[ "Boolean.valueOf", JS_E_BOOLEAN_EXPECTED, function(ctx) { Boolean.prototype.valueOf.call(ctx); } ],
[ "Date.getYear", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.getYear.call(ctx); } ],
[ "Enumerator.atEnd", JS_E_ENUMERATOR_EXPECTED, function(ctx) { Enumerator.prototype.atEnd.call(ctx); } ],
[ "Function.apply", JS_E_FUNCTION_EXPECTED, function(ctx) { Function.prototype.apply.call(ctx, [ function() {} ]); } ],
[ "Number.toExponential", JS_E_NUMBER_EXPECTED, function(ctx) { Number.prototype.toExponential.call(ctx); } ],
[ "Object.hasOwnProperty", JS_E_OBJECT_EXPECTED, function(ctx) { Object.prototype.hasOwnProperty.call(ctx, "toString"); } ],
[ "RegExp.test", JS_E_REGEXP_EXPECTED, function(ctx) { RegExp.prototype.test.call(ctx, "foobar"); } ],
[ "VBArray.lbound", JS_E_VBARRAY_EXPECTED, function(ctx) { VBArray.prototype.lbound.call(ctx); } ]
];
for(var i = 0; i < tests.length; i++) {
try {
tests[i][2](null);
ok(false, "expected exception calling " + tests[i][0] + " with null context");
}catch(ex) {
var n = ex.number >>> 0; /* make it unsigned like HRESULT */
ok(n === tests[i][1], tests[i][0] + " with null context exception code = " + n);
}
try {
tests[i][2](undefined);
ok(false, "expected exception calling " + tests[i][0] + " with undefined context");
}catch(ex) {
var n = ex.number >>> 0;
ok(n === tests[i][1], tests[i][0] + " with undefined context exception code = " + n);
}
}
var r = Error.prototype.toString.call(undefined);
ok(r === "[object Error]", "Error.toString with undefined context returned " + r);
r = String.prototype.slice.call(null, 1, 3);
ok(r === "ul", "String.slice with null context returned " + r);
})();
var tmp = createArray();
ok(getVT(tmp) == "VT_ARRAY|VT_VARIANT", "getVT(createArray()) = " + getVT(tmp));
ok(getVT(VBArray(tmp)) == "VT_ARRAY|VT_VARIANT", "getVT(VBArray(tmp)) = " + getVT(VBArray(tmp)));
......
......@@ -17,6 +17,14 @@
*/
var JS_E_PROP_DESC_MISMATCH = 0x800a01bd;
var JS_E_NUMBER_EXPECTED = 0x800a1389;
var JS_E_FUNCTION_EXPECTED = 0x800a138a;
var JS_E_DATE_EXPECTED = 0x800a138e;
var JS_E_OBJECT_EXPECTED = 0x800a138f;
var JS_E_BOOLEAN_EXPECTED = 0x800a1392;
var JS_E_VBARRAY_EXPECTED = 0x800a1395;
var JS_E_ENUMERATOR_EXPECTED = 0x800a1397;
var JS_E_REGEXP_EXPECTED = 0x800a1398;
var JS_E_INVALID_WRITABLE_PROP_DESC = 0x800a13ac;
var JS_E_NONCONFIGURABLE_REDEFINED = 0x800a13d6;
var JS_E_NONWRITABLE_MODIFIED = 0x800a13d7;
......@@ -1222,6 +1230,51 @@ sync_test("isFrozen", function() {
ok(Object.isExtensible(o) === false, "o is extensible");
});
sync_test("builtin_context", function() {
var tests = [
[ "Array.map", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.map.call(ctx, function(a, b) {}); } ],
[ "Array.sort", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.sort.call(ctx); } ],
[ "Boolean.toString", JS_E_BOOLEAN_EXPECTED, function(ctx) { Boolean.prototype.toString.call(ctx); } ],
[ "Date.getTime", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.getTime.call(ctx); } ],
[ "Date.toGMTString", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.toGMTString.call(ctx); } ],
[ "Enumerator.item", JS_E_ENUMERATOR_EXPECTED, function(ctx) { Enumerator.prototype.item.call(ctx); } ],
[ "Error.toString", JS_E_OBJECT_EXPECTED, function(ctx) { Error.prototype.toString.call(ctx); } ],
[ "Function.call", JS_E_FUNCTION_EXPECTED, function(ctx) { Function.prototype.call.call(ctx, function() {}); } ],
[ "Map.clear", JS_E_OBJECT_EXPECTED, function(ctx) { Map.prototype.clear.call(ctx); } ],
[ "Number.toFixed", JS_E_NUMBER_EXPECTED, function(ctx) { Number.prototype.toFixed.call(ctx); } ],
[ "Object.isPrototypeOf", JS_E_OBJECT_EXPECTED, function(ctx) { Object.prototype.isPrototypeOf.call(ctx, Object); } ],
[ "RegExp.exec", JS_E_REGEXP_EXPECTED, function(ctx) { RegExp.prototype.exec.call(ctx, "foobar"); } ],
[ "String.search", JS_E_OBJECT_EXPECTED, function(ctx) { String.prototype.search.call(ctx, /foobar/g); } ],
[ "String.trim", JS_E_OBJECT_EXPECTED, function(ctx) { String.prototype.trim.call(ctx); } ],
[ "VBArray.dimensions", JS_E_VBARRAY_EXPECTED, function(ctx) { VBArray.prototype.dimensions.call(ctx); } ]
];
/* make global object suitable for some calls */
window[0] = "foo";
window[1] = "bar";
window.length = 2;
for(var i = 0; i < tests.length; i++) {
try {
tests[i][2](null);
ok(false, "expected exception calling " + tests[i][0] + " with null context");
}catch(ex) {
var n = ex.number >>> 0; /* make it unsigned like HRESULT */
ok(n === tests[i][1], tests[i][0] + " with null context exception code = " + n);
}
try {
tests[i][2](undefined);
ok(false, "expected exception calling " + tests[i][0] + " with undefined context");
}catch(ex) {
var n = ex.number >>> 0;
ok(n === tests[i][1], tests[i][0] + " with undefined context exception code = " + n);
}
}
var obj = (function() { return this; }).call(null);
ok(obj === window, "obj = " + obj);
});
sync_test("head_setter", function() {
document.head = "";
ok(typeof(document.head) === "object", "typeof(document.head) = " + typeof(document.head));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment