Skip to content

Commit 6d7c7ca

Browse files
committed
Proxy ownkeys trap needs marshal
1 parent 039dfe1 commit 6d7c7ca

5 files changed

Lines changed: 48 additions & 30 deletions

File tree

lib/Runtime/Language/JavascriptOperators.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,7 @@ namespace Js
11161116
if (JavascriptProxy::Is(instance))
11171117
{
11181118
JavascriptProxy* proxy = JavascriptProxy::FromVar(instance);
1119-
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind);
1119+
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, scriptContext);
11201120
}
11211121

11221122
return JavascriptObject::CreateOwnStringPropertiesHelper(object, scriptContext);
@@ -1130,7 +1130,7 @@ namespace Js
11301130
if (JavascriptProxy::Is(instance))
11311131
{
11321132
JavascriptProxy* proxy = JavascriptProxy::FromVar(instance);
1133-
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertySymbolKind);
1133+
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertySymbolKind, scriptContext);
11341134
}
11351135

11361136
return JavascriptObject::CreateOwnSymbolPropertiesHelper(object, scriptContext);
@@ -1143,7 +1143,7 @@ namespace Js
11431143
if (JavascriptProxy::Is(instance))
11441144
{
11451145
JavascriptProxy* proxy = JavascriptProxy::FromVar(instance);
1146-
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind);
1146+
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind, scriptContext);
11471147
}
11481148

11491149
return JavascriptObject::CreateOwnStringSymbolPropertiesHelper(object, scriptContext);
@@ -1156,7 +1156,7 @@ namespace Js
11561156
if (JavascriptProxy::Is(instance))
11571157
{
11581158
JavascriptProxy* proxy = JavascriptProxy::FromVar(instance);
1159-
JavascriptArray* proxyResult = proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind);
1159+
JavascriptArray* proxyResult = proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, scriptContext);
11601160
JavascriptArray* proxyResultToReturn = scriptContext->GetLibrary()->CreateArray(0);
11611161

11621162
// filter enumerable keys
@@ -1192,7 +1192,7 @@ namespace Js
11921192
if (JavascriptProxy::Is(instance))
11931193
{
11941194
JavascriptProxy* proxy = JavascriptProxy::FromVar(instance);
1195-
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind);
1195+
return proxy->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::KeysKind, scriptContext);
11961196
}
11971197
return JavascriptObject::CreateOwnEnumerableStringSymbolPropertiesHelper(object, scriptContext);
11981198
}

lib/Runtime/Library/JSON.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ namespace JSON
603603
if (JavascriptProxy::Is(object))
604604
{
605605
JavascriptProxy* proxyObject = JavascriptProxy::FromVar(object);
606-
JavascriptArray* proxyResult = proxyObject->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind);
606+
JavascriptArray* proxyResult = proxyObject->PropertyKeysTrap(JavascriptProxy::KeysTrapKind::GetOwnPropertyNamesKind, this->scriptContext);
607607

608608
// filter enumerable keys
609609
uint32 resultLength = proxyResult->GetLength();

lib/Runtime/Library/JavascriptProxy.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,7 +2105,7 @@ namespace Js
21052105
return trapResult;
21062106
}
21072107

2108-
JavascriptArray* JavascriptProxy::PropertyKeysTrap(KeysTrapKind keysTrapKind)
2108+
JavascriptArray* JavascriptProxy::PropertyKeysTrap(KeysTrapKind keysTrapKind, ScriptContext* requestContext)
21092109
{
21102110
PROBE_STACK(GetScriptContext(), Js::Constants::MinStackDefault);
21112111

@@ -2134,7 +2134,7 @@ namespace Js
21342134
//6. ReturnIfAbrupt(trap).
21352135
//7. If trap is undefined, then
21362136
// a. Return target.[[OwnPropertyKeys]]().
2137-
JavascriptFunction* ownKeysMethod = GetMethodHelper(PropertyIds::ownKeys, scriptContext);
2137+
JavascriptFunction* ownKeysMethod = GetMethodHelper(PropertyIds::ownKeys, requestContext);
21382138
Assert(!GetScriptContext()->IsHeapEnumInProgress());
21392139

21402140
JavascriptArray *targetKeys;

lib/Runtime/Library/JavascriptProxy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ namespace Js
156156

157157
void PropertyIdFromInt(uint32 index, PropertyRecord const** propertyRecord);
158158

159-
JavascriptArray* PropertyKeysTrap(KeysTrapKind keysTrapKind);
159+
JavascriptArray* PropertyKeysTrap(KeysTrapKind keysTrapKind, ScriptContext* requestContext);
160160

161161
template <class Fn>
162162
void GetOwnPropertyKeysHelper(ScriptContext* scriptContext, RecyclableObject* trapResultArray, uint32 len, JavascriptArray* trapResult,

test/es6/proxybug.js

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,40 @@
33
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
44
//-------------------------------------------------------------------------------------------------------
55

6-
var passed;
6+
var passed = true;
77

8-
var func3 = function ()
9-
{
8+
function test1() {
109
var sc4 = WScript.LoadScript('function test(){ obj2.prop4 = {needMarshal:true}; }', 'samethread');
11-
var obj1=new Proxy({}, {set:function(target, property, value) { Reflect.set(value);}})
10+
var obj1 = new Proxy({}, { set: function (target, property, value) { Reflect.set(value); } })
1211
sc4.obj2 = obj1;
1312
sc4.test();
14-
obj1.prop4 = {needMarshal:false};
15-
obj1.prop5 = {needMarshal:false};
13+
obj1.prop4 = { needMarshal: false };
14+
obj1.prop5 = { needMarshal: false };
1615
};
17-
func3();
16+
test1();
1817

1918

20-
21-
var bug = new Proxy(new Array(1), {has: () => true});
22-
var a = bug.concat();
23-
if(a[0] !== undefined || a.length !== 1) {
24-
passed = "failed";
25-
} else {
26-
passed = "passed";
19+
function test2() {
20+
var bug = new Proxy(new Array(1), { has: () => true });
21+
var a = bug.concat();
22+
if (a[0] !== undefined || a.length !== 1) {
23+
passed = false;
24+
} else {
25+
passed &= true;
26+
}
2727
}
28+
test2();
2829

29-
function test0() {
30+
function test3() {
3031
var obj1 = {};
3132
var arrObj0 = {};
32-
var x=1
33+
var x = 1
3334
var proxyHandler = {};
34-
proxyHandler['get'] = function () {};
35-
proxyHandler['defineProperty'] = function (target, property, descriptor) {
35+
proxyHandler['get'] = function () { };
36+
proxyHandler['defineProperty'] = function (target, property, descriptor) {
3637
return Reflect.defineProperty(target, property, descriptor);
3738
};
38-
proxyHandler['isExtensible'] = function (target) {
39+
proxyHandler['isExtensible'] = function (target) {
3940
arrObj0.prop0;
4041
arrObj0 = new Proxy(arrObj0, proxyHandler);
4142
return Reflect.isExtensible(target);
@@ -49,7 +50,24 @@ function test0() {
4950
sc3.test();
5051
} while (x--);
5152
}
52-
test0();
53+
test3();
5354

55+
function test4() {
56+
var func3 = function () { };
57+
var ary = Array();
58+
var proxyHandler = {};
59+
var ownkeys = Reflect.ownKeys(ary);
60+
proxyHandler['ownKeys'] = function () {
61+
func3() == 0;
62+
return ownkeys;
63+
};
64+
65+
ary = new Proxy(ary, proxyHandler);
66+
var sc2 = WScript.LoadScript('function test(){for (var x in ary);}', 'samethread');
67+
sc2.ary = ary;
68+
sc2.func3 = func3;
69+
sc2.test();
70+
}
71+
test4();
5472

55-
print(passed);
73+
print(passed ? "passed" : "failed");

0 commit comments

Comments
 (0)