diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2019-07-14 20:14:28 -0400 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2019-07-18 22:38:47 -0400 |
commit | 3048ff4346bf2021059bdecec6343c73bb26833a (patch) | |
tree | 0562ee7c2989e3415d2772fb8fb2f1ebc85000bf /js/src/builtin | |
parent | 091d00f1bd22f821d3926c46dd1d6cf7fbc746f4 (diff) | |
download | UXP-3048ff4346bf2021059bdecec6343c73bb26833a.tar UXP-3048ff4346bf2021059bdecec6343c73bb26833a.tar.gz UXP-3048ff4346bf2021059bdecec6343c73bb26833a.tar.lz UXP-3048ff4346bf2021059bdecec6343c73bb26833a.tar.xz UXP-3048ff4346bf2021059bdecec6343c73bb26833a.zip |
1339395 - Part 3: Add BytecodeEmitter support for object rest and spread properties.
Diffstat (limited to 'js/src/builtin')
-rw-r--r-- | js/src/builtin/Utilities.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/js/src/builtin/Utilities.js b/js/src/builtin/Utilities.js index c73bc5e7f..ec5c88336 100644 --- a/js/src/builtin/Utilities.js +++ b/js/src/builtin/Utilities.js @@ -229,6 +229,69 @@ function GetInternalError(msg) { // To be used when a function is required but calling it shouldn't do anything. function NullFunction() {} +// Object Rest/Spread Properties proposal +// Abstract operation: CopyDataProperties (target, source, excluded) +function CopyDataProperties(target, source, excluded) { + // Step 1. + assert(IsObject(target), "target is an object"); + + // Step 2. + assert(IsObject(excluded), "excluded is an object"); + + // Steps 3, 6. + if (source === undefined || source === null) + return; + + // Step 4.a. + source = ToObject(source); + + // Step 4.b. + var keys = OwnPropertyKeys(source, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS); + + // Step 5. + for (var index = 0; index < keys.length; index++) { + var key = keys[index]; + + // We abbreviate this by calling propertyIsEnumerable which is faster + // and returns false for not defined properties. + if (!callFunction(std_Object_hasOwnProperty, key, excluded) && callFunction(std_Object_propertyIsEnumerable, source, key)) + _DefineDataProperty(target, key, source[key]); + } + + // Step 6 (Return). +} + +// Object Rest/Spread Properties proposal +// Abstract operation: CopyDataProperties (target, source, excluded) +function CopyDataPropertiesUnfiltered(target, source) { + // Step 1. + assert(IsObject(target), "target is an object"); + + // Step 2 (Not applicable). + + // Steps 3, 6. + if (source === undefined || source === null) + return; + + // Step 4.a. + source = ToObject(source); + + // Step 4.b. + var keys = OwnPropertyKeys(source, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS); + + // Step 5. + for (var index = 0; index < keys.length; index++) { + var key = keys[index]; + + // We abbreviate this by calling propertyIsEnumerable which is faster + // and returns false for not defined properties. + if (callFunction(std_Object_propertyIsEnumerable, source, key)) + _DefineDataProperty(target, key, source[key]); + } + + // Step 6 (Return). +} + /*************************************** Testing functions ***************************************/ function outer() { return function inner() { |