Rework Object's [[OwnPropertyKeys]] (#4001)

I've removed the ecma_op_object_get_property_names method, and implemented the following ones:
- ecma_op_object_own_property_keys: this is now the internal [[OwnPropertyKeys]] method
- ecma_op_object_enumerate: this is used for the for-in iterator
- ecma_object_sort_property_names: this is used for sorting the property names of an object
- ecma_object_list_lazy_property_names: this is for getting the lazy instantiated properties
- ecma_object_prop_name_is_duplicated: this is for checking if a given property is duplicated in an object

Also the for-in operation with Proxy object works with this patch, #3992 should be closed

JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
This commit is contained in:
Szilagyi Adam
2020-07-27 11:37:04 +02:00
committed by GitHub
parent 3f0f9589c4
commit ff47c84bc4
34 changed files with 853 additions and 1101 deletions
+19 -17
View File
@@ -31,14 +31,6 @@ var handler = { ownKeys (target) {
var proxy = new Proxy(target, handler);
try {
// Array.prototype.sort
Array.prototype.sort.call(proxy);
assert(false);
} catch (e) {
assert(e === 42);
}
try {
// 19.1.2.14.4
Object.keys(proxy);
@@ -63,6 +55,14 @@ try {
assert(e === 42);
}
var handler = { ownKeys (target) {
return ["a"];
}};
var proxy = new Proxy(target, handler);
var sort_result = Array.prototype.sort.call(proxy);
assert(Object.keys(sort_result).length === 0);
// test basic functionality
var symA = Symbol("smA");
var symB = Symbol("smB");
@@ -149,16 +149,18 @@ try {
}
// test with duplicated keys
var target = { prop1: "prop1", prop2: "prop2"};
var handler = {
var p = new Proxy({}, {
ownKeys: function(target) {
return ["a", "a", "a"];
}
};
return ["foo", "foo"];
}
});
var proxy = new Proxy(target, handler);
assert(JSON.stringify(Object.getOwnPropertyNames(proxy)) === '["a","a","a"]');
try {
Object.keys(p);
assert(false);
} catch (e) {
assert(e instanceof TypeError);
}
// test with lots of keys
var keyslist = [];
@@ -240,4 +242,4 @@ var handler = {
var proxy = new Proxy(object, handler);
assert(Object.keys(proxy).length === 1);
assert(Object.keys(proxy)[0] === "b");
assert(Object.keys(proxy)[0] === "b");