1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* vim: set ts=8 sts=2 et sw=2 tw=80:
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "js/PropertyAndElement.h" // JS_ForwardSetPropertyTo
#include "jsapi-tests/tests.h"
using namespace JS;
BEGIN_TEST(testForwardSetProperty) {
RootedValue v1(cx);
EVAL(
"var foundValue; \n"
"var obj1 = { set prop(val) { foundValue = this; } }; \n"
"obj1;",
&v1);
RootedValue v2(cx);
EVAL(
"var obj2 = Object.create(obj1); \n"
"obj2;",
&v2);
RootedValue v3(cx);
EVAL(
"var obj3 = {}; \n"
"obj3;",
&v3);
RootedObject obj1(cx, &v1.toObject());
RootedObject obj2(cx, &v2.toObject());
RootedObject obj3(cx, &v3.toObject());
RootedValue setval(cx, Int32Value(42));
RootedValue propkey(cx);
EVAL("'prop';", &propkey);
RootedId prop(cx);
CHECK(JS_ValueToId(cx, propkey, &prop));
EXEC(
"function assertEq(a, b, msg) \n"
"{ \n"
" if (!Object.is(a, b)) \n"
" throw new Error('Assertion failure: ' + msg); \n"
"}");
// Non-strict setter
JS::ObjectOpResult result;
CHECK(JS_ForwardSetPropertyTo(cx, obj2, prop, setval, v3, result));
CHECK(result);
EXEC("assertEq(foundValue, obj3, 'wrong receiver passed to setter');");
CHECK(JS_ForwardSetPropertyTo(cx, obj2, prop, setval, setval, result));
CHECK(result);
EXEC(
"assertEq(typeof foundValue === 'object', true, \n"
" 'passing 42 as receiver to non-strict setter ' + \n"
" 'must box');");
EXEC(
"assertEq(foundValue instanceof Number, true, \n"
" 'passing 42 as receiver to non-strict setter ' + \n"
" 'must box to a Number');");
EXEC(
"assertEq(foundValue.valueOf(), 42, \n"
" 'passing 42 as receiver to non-strict setter ' + \n"
" 'must box to new Number(42)');");
// Strict setter
RootedValue v4(cx);
EVAL("({ set prop(val) { 'use strict'; foundValue = this; } })", &v4);
RootedObject obj4(cx, &v4.toObject());
CHECK(JS_ForwardSetPropertyTo(cx, obj4, prop, setval, v3, result));
CHECK(result);
EXEC("assertEq(foundValue, obj3, 'wrong receiver passed to strict setter');");
CHECK(JS_ForwardSetPropertyTo(cx, obj4, prop, setval, setval, result));
CHECK(result);
EXEC(
"assertEq(foundValue, 42, \n"
" '42 passed as receiver to strict setter was mangled');");
return true;
}
END_TEST(testForwardSetProperty)
|