// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. (function(global, utils) { "use strict"; %CheckIsBootstrapping(); // ---------------------------------------------------------------------------- // Imports // var GlobalProxy = global.Proxy; var MakeTypeError; utils.Import(function(from) { MakeTypeError = from.MakeTypeError; }); //---------------------------------------------------------------------------- function ProxyCreateRevocable(target, handler) { var p = new GlobalProxy(target, handler); return {proxy: p, revoke: () => %JSProxyRevoke(p)}; } // ------------------------------------------------------------------- // Proxy Builtins // Implements part of ES6 9.5.11 Proxy.[[Enumerate]]: // Call the trap, which should return an iterator, exhaust the iterator, // and return an array containing the values. function ProxyEnumerate(trap, handler, target) { // 7. Let trapResult be ? Call(trap, handler, «target»). var trap_result = %_Call(trap, handler, target); // 8. If Type(trapResult) is not Object, throw a TypeError exception. if (!IS_RECEIVER(trap_result)) { throw MakeTypeError(kProxyEnumerateNonObject); } // 9. Return trapResult. var result = []; for (var it = trap_result.next(); !it.done; it = trap_result.next()) { var key = it.value; // Not yet spec'ed as of 2015-11-25, but will be spec'ed soon: // If the iterator returns a non-string value, throw a TypeError. if (!IS_STRING(key)) { throw MakeTypeError(kProxyEnumerateNonString); } result.push(key); } return result; } //------------------------------------------------------------------- //Set up non-enumerable properties of the Proxy object. utils.InstallFunctions(GlobalProxy, DONT_ENUM, [ "revocable", ProxyCreateRevocable ]); // ------------------------------------------------------------------- // Exports %InstallToContext([ "proxy_enumerate", ProxyEnumerate, ]); })