From 46f992ddd08c27e5d9898f83534bee67165a7bd3 Mon Sep 17 00:00:00 2001 From: yangguo Date: Tue, 12 May 2015 07:00:47 -0700 Subject: [PATCH] Reland "Use function wrapper argument to expose internal arrays to native scripts." Review URL: https://codereview.chromium.org/1138173002 Cr-Commit-Position: refs/heads/master@{#28367} --- src/array.js | 5 + src/bootstrapper.cc | 213 ++++++++++++++------------ src/contexts.h | 4 +- src/date.js | 6 + src/harmony-array-includes.js | 2 +- src/harmony-array.js | 2 +- src/harmony-object.js | 2 +- src/harmony-reflect.js | 2 +- src/harmony-regexp.js | 2 +- src/harmony-spread.js | 8 +- src/harmony-tostring.js | 2 +- src/harmony-typedarray.js | 2 +- src/json.js | 4 + src/math.js | 4 + src/messages.js | 9 +- src/object-observe.js | 4 + src/objects.h | 4 - src/promise.js | 5 + src/regexp.js | 6 + src/string.js | 5 + src/templates.js | 14 +- src/uri.js | 4 + src/v8natives.js | 4 + test/cctest/test-heap.cc | 53 +++++++ test/mjsunit/debug-stepout-scope-part1.js | 2 +- test/mjsunit/debug-stepout-scope-part2.js | 2 +- test/mjsunit/debug-stepout-scope-part3.js | 2 +- test/mjsunit/debug-stepout-scope-part4.js | 2 +- test/mjsunit/debug-stepout-scope-part5.js | 2 +- test/mjsunit/debug-stepout-scope-part6.js | 2 +- test/mjsunit/debug-stepout-scope-part7.js | 2 +- test/mjsunit/debug-stepout-scope-part8.js | 2 +- test/mjsunit/global-deleted-property-keyed.js | 6 +- test/mjsunit/regress/regress-1878.js | 6 +- test/mjsunit/samevalue.js | 2 +- 35 files changed, 263 insertions(+), 133 deletions(-) diff --git a/src/array.js b/src/array.js index 3f9bd68..93378cf 100644 --- a/src/array.js +++ b/src/array.js @@ -19,7 +19,12 @@ var $innerArrayEvery; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalArray = global.Array; +var InternalArray = exports.InternalArray; +var InternalPackedArray = exports.InternalPackedArray; // ------------------------------------------------------------------- diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index f3dd682..f0278ca 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -217,7 +217,7 @@ class Genesis BASE_EMBEDDED { HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION) #undef DECLARE_FEATURE_INITIALIZATION - Handle InstallInternalArray(Handle builtins, + Handle InstallInternalArray(Handle target, const char* name, ElementsKind elements_kind); bool InstallNatives(); @@ -307,19 +307,15 @@ class Genesis BASE_EMBEDDED { FunctionMode function_mode); void SetStrongFunctionInstanceDescriptor(Handle map); - static bool CompileBuiltin(Isolate* isolate, int index); + static bool CompileBuiltin(Isolate* isolate, int index, + Handle shared); static bool CompileExperimentalBuiltin(Isolate* isolate, int index); static bool CompileExtraBuiltin(Isolate* isolate, int index); - static bool CompileNative(Isolate* isolate, - Vector name, - Handle source); - static bool CompileScriptCached(Isolate* isolate, - Vector name, - Handle source, - SourceCodeCache* cache, - v8::Extension* extension, - Handle top_context, - bool use_runtime_context); + static bool CompileNative(Isolate* isolate, Vector name, + Handle source, int argc, + Handle argv[]); + + static bool CompileExtension(Isolate* isolate, v8::Extension* extension); Isolate* isolate_; Handle result_; @@ -1441,34 +1437,45 @@ void Genesis::InitializeExperimentalGlobal() { } -bool Genesis::CompileBuiltin(Isolate* isolate, int index) { +bool Genesis::CompileBuiltin(Isolate* isolate, int index, + Handle shared) { Vector name = Natives::GetScriptName(index); Handle source_code = isolate->bootstrapper()->SourceLookup(index); - return CompileNative(isolate, name, source_code); + Handle global = isolate->global_object(); + Handle exports = isolate->builtin_exports_object(); + Handle args[] = {global, shared, exports}; + return CompileNative(isolate, name, source_code, arraysize(args), args); } bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) { + HandleScope scope(isolate); Vector name = ExperimentalNatives::GetScriptName(index); Handle source_code = isolate->bootstrapper()->SourceLookup(index); - return CompileNative(isolate, name, source_code); + Handle global = isolate->global_object(); + Handle exports = isolate->builtin_exports_object(); + Handle args[] = {global, exports}; + return CompileNative(isolate, name, source_code, arraysize(args), args); } bool Genesis::CompileExtraBuiltin(Isolate* isolate, int index) { + HandleScope scope(isolate); Vector name = ExtraNatives::GetScriptName(index); Handle source_code = isolate->bootstrapper()->SourceLookup(index); - return CompileNative(isolate, name, source_code); + Handle global = isolate->global_object(); + Handle exports = isolate->builtin_exports_object(); + Handle args[] = {global, exports}; + return CompileNative(isolate, name, source_code, arraysize(args), args); } -bool Genesis::CompileNative(Isolate* isolate, - Vector name, - Handle source) { - HandleScope scope(isolate); +bool Genesis::CompileNative(Isolate* isolate, Vector name, + Handle source, int argc, + Handle argv[]) { SuppressDebug compiling_natives(isolate->debug()); // During genesis, the boilerplate for stack overflow won't work until the // environment has been at least partially initialized. Add a stack check @@ -1476,78 +1483,72 @@ bool Genesis::CompileNative(Isolate* isolate, StackLimitCheck check(isolate); if (check.HasOverflowed()) return false; - bool result = CompileScriptCached(isolate, - name, - source, - NULL, - NULL, - Handle(isolate->context()), - true); - DCHECK(isolate->has_pending_exception() != result); - if (!result) isolate->clear_pending_exception(); - return result; + Handle context(isolate->context()); + + Handle script_name = + isolate->factory()->NewStringFromUtf8(name).ToHandleChecked(); + Handle function_info = Compiler::CompileScript( + source, script_name, 0, 0, false, false, Handle(), context, NULL, + NULL, ScriptCompiler::kNoCompileOptions, NATIVES_CODE, false); + + DCHECK(context->IsNativeContext()); + + Handle runtime_context(context->runtime_context()); + Handle receiver(context->builtins()); + Handle fun = + isolate->factory()->NewFunctionFromSharedFunctionInfo(function_info, + runtime_context); + + // For non-extension scripts, run script to get the function wrapper. + Handle wrapper; + if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) { + return false; + } + // Then run the function wrapper. + return !Execution::Call(isolate, Handle::cast(wrapper), receiver, + argc, argv).is_null(); } -bool Genesis::CompileScriptCached(Isolate* isolate, - Vector name, - Handle source, - SourceCodeCache* cache, - v8::Extension* extension, - Handle top_context, - bool use_runtime_context) { +bool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) { Factory* factory = isolate->factory(); HandleScope scope(isolate); Handle function_info; + Handle source = + isolate->factory() + ->NewExternalStringFromOneByte(extension->source()) + .ToHandleChecked(); + DCHECK(source->IsOneByteRepresentation()); + // If we can't find the function in the cache, we compile a new // function and insert it into the cache. - if (cache == NULL || !cache->Lookup(name, &function_info)) { - DCHECK(source->IsOneByteRepresentation()); + Vector name = CStrVector(extension->name()); + SourceCodeCache* cache = isolate->bootstrapper()->extensions_cache(); + Handle context(isolate->context()); + DCHECK(context->IsNativeContext()); + + if (!cache->Lookup(name, &function_info)) { Handle script_name = factory->NewStringFromUtf8(name).ToHandleChecked(); function_info = Compiler::CompileScript( - source, script_name, 0, 0, false, false, Handle(), top_context, - extension, NULL, ScriptCompiler::kNoCompileOptions, - use_runtime_context ? NATIVES_CODE : NOT_NATIVES_CODE, false); + source, script_name, 0, 0, false, false, Handle(), context, + extension, NULL, ScriptCompiler::kNoCompileOptions, NOT_NATIVES_CODE, + false); if (function_info.is_null()) return false; - if (cache != NULL) cache->Add(name, function_info); + cache->Add(name, function_info); } // Set up the function context. Conceptually, we should clone the // function before overwriting the context but since we're in a // single-threaded environment it is not strictly necessary. - DCHECK(top_context->IsNativeContext()); - Handle context = - Handle(use_runtime_context - ? Handle(top_context->runtime_context()) - : top_context); Handle fun = factory->NewFunctionFromSharedFunctionInfo(function_info, context); // Call function using either the runtime object or the global // object as the receiver. Provide no parameters. - Handle receiver = - Handle(use_runtime_context - ? top_context->builtins() - : top_context->global_object(), - isolate); - MaybeHandle result; - if (extension == NULL) { - // For non-extension scripts, run script to get the function wrapper. - Handle wrapper; - if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) { - return false; - } - // Then run the function wrapper. - Handle global_obj(top_context->global_object(), isolate); - Handle args[] = {global_obj}; - result = Execution::Call(isolate, Handle::cast(wrapper), - receiver, arraysize(args), args); - } else { - result = Execution::Call(isolate, fun, receiver, 0, NULL); - } - return !result.is_null(); + Handle receiver = isolate->global_object(); + return !Execution::Call(isolate, fun, receiver, 0, NULL).is_null(); } @@ -1818,10 +1819,9 @@ void Genesis::InitializeGlobal_harmony_tostring() { } -Handle Genesis::InstallInternalArray( - Handle builtins, - const char* name, - ElementsKind elements_kind) { +Handle Genesis::InstallInternalArray(Handle target, + const char* name, + ElementsKind elements_kind) { // --- I n t e r n a l A r r a y --- // An array constructor on the builtins object that works like // the public Array constructor, except that its prototype @@ -1830,9 +1830,9 @@ Handle Genesis::InstallInternalArray( // must not be leaked to user code. Handle prototype = factory()->NewJSObject(isolate()->object_function(), TENURED); - Handle array_function = InstallFunction( - builtins, name, JS_ARRAY_TYPE, JSArray::kSize, - prototype, Builtins::kInternalArrayCode); + Handle array_function = + InstallFunction(target, name, JS_ARRAY_TYPE, JSArray::kSize, prototype, + Builtins::kInternalArrayCode); InternalArrayConstructorStub internal_array_constructor_stub(isolate()); Handle code = internal_array_constructor_stub.GetCode(); @@ -1910,6 +1910,19 @@ bool Genesis::InstallNatives() { native_context()->set_runtime_context(*context); + // Set up shared object to set up cross references between native scripts. + // "shared" is used for cross references between native scripts that are part + // of the snapshot. "builtin_exports" is used for experimental natives. + Handle shared = + factory()->NewJSObject(isolate()->object_function()); + JSObject::NormalizeProperties(shared, CLEAR_INOBJECT_PROPERTIES, 16, + "container to share between native scripts"); + Handle builtin_exports = + factory()->NewJSObject(isolate()->object_function()); + JSObject::NormalizeProperties(builtin_exports, CLEAR_INOBJECT_PROPERTIES, 16, + "container to export to experimental natives"); + native_context()->set_builtin_exports_object(*builtin_exports); + { // -- S c r i p t // Builtin functions for Script. Handle script_fun = InstallFunction( @@ -2082,13 +2095,13 @@ bool Genesis::InstallNatives() { // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT // transition easy to trap. Moreover, they rarely are smi-only. { - Handle array_function = - InstallInternalArray(builtins, "InternalArray", FAST_HOLEY_ELEMENTS); + HandleScope scope(isolate()); + Handle builtin_exports = + Handle::cast(isolate()->builtin_exports_object()); + Handle array_function = InstallInternalArray( + builtin_exports, "InternalArray", FAST_HOLEY_ELEMENTS); native_context()->set_internal_array_function(*array_function); - } - - { - InstallInternalArray(builtins, "InternalPackedArray", FAST_ELEMENTS); + InstallInternalArray(builtin_exports, "InternalPackedArray", FAST_ELEMENTS); } { // -- S e t I t e r a t o r @@ -2181,13 +2194,15 @@ bool Genesis::InstallNatives() { #undef INSTALL_PUBLIC_SYMBOL } - // Install natives. + // Install natives. Everything exported to experimental natives is also + // shared to regular natives. + TransferNamedProperties(builtin_exports, shared); int i = Natives::GetDebuggerCount(); - if (!CompileBuiltin(isolate(), i)) return false; + if (!CompileBuiltin(isolate(), i, shared)) return false; if (!InstallJSBuiltins(builtins)) return false; for (++i; i < Natives::GetBuiltinsCount(); ++i) { - if (!CompileBuiltin(isolate(), i)) return false; + if (!CompileBuiltin(isolate(), i, shared)) return false; } InstallNativeFunctions(); @@ -2502,14 +2517,21 @@ bool Genesis::InstallSpecialObjects(Handle native_context) { Handle stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate); JSObject::AddProperty(Error, name, stack_trace_limit, NONE); + Handle builtin_exports(native_context->builtin_exports_object(), + isolate); + native_context->set_builtin_exports_object(Smi::FromInt(0)); + // Expose the natives in global if a name for it is specified. if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { - Handle natives = + Handle natives_key = factory->InternalizeUtf8String(FLAG_expose_natives_as); uint32_t dummy_index; - if (natives->AsArrayIndex(&dummy_index)) return true; - JSObject::AddProperty(global, natives, handle(global->builtins()), - DONT_ENUM); + if (natives_key->AsArrayIndex(&dummy_index)) return true; + Handle natives(global->builtins()); + JSObject::AddProperty(global, natives_key, natives, DONT_ENUM); + Handle builtin_exports_key = + factory->NewStringFromAsciiChecked("builtin_exports"); + JSObject::AddProperty(natives, builtin_exports_key, builtin_exports, NONE); } // Expose the stack trace symbol to native JS. @@ -2653,17 +2675,7 @@ bool Genesis::InstallExtension(Isolate* isolate, } } // We do not expect this to throw an exception. Change this if it does. - Handle source_code = - isolate->factory() - ->NewExternalStringFromOneByte(extension->source()) - .ToHandleChecked(); - bool result = CompileScriptCached(isolate, - CStrVector(extension->name()), - source_code, - isolate->bootstrapper()->extensions_cache(), - extension, - Handle(isolate->context()), - false); + bool result = CompileExtension(isolate, extension); DCHECK(isolate->has_pending_exception() != result); if (!result) { // We print out the name of the extension that fail to install. @@ -2914,6 +2926,7 @@ Genesis::Genesis(Isolate* isolate, // We can only de-serialize a context if the isolate was initialized from // a snapshot. Otherwise we have to build the context from scratch. + // Also create a context from scratch to expose natives, if required by flag. Handle outdated_contexts; if (!isolate->initialized_from_snapshot() || !Snapshot::NewContextFromSnapshot(isolate, global_proxy, diff --git a/src/contexts.h b/src/contexts.h index 2d04da2..066e8a1 100644 --- a/src/contexts.h +++ b/src/contexts.h @@ -185,7 +185,8 @@ enum BindingFlags { V(MAP_ITERATOR_MAP_INDEX, Map, map_iterator_map) \ V(SET_ITERATOR_MAP_INDEX, Map, set_iterator_map) \ V(ARRAY_VALUES_ITERATOR_INDEX, JSFunction, array_values_iterator) \ - V(SCRIPT_CONTEXT_TABLE_INDEX, ScriptContextTable, script_context_table) + V(SCRIPT_CONTEXT_TABLE_INDEX, ScriptContextTable, script_context_table) \ + V(BUILTIN_EXPORTS_OBJECT_INDEX, Object, builtin_exports_object) // A table of all script contexts. Every loaded top-level script with top-level @@ -422,6 +423,7 @@ class Context: public FixedArray { SCRIPT_CONTEXT_TABLE_INDEX, MAP_CACHE_INDEX, TO_LENGTH_FUN_INDEX, + BUILTIN_EXPORTS_OBJECT_INDEX, // Properties from here are treated as weak references by the full GC. // Scavenge treats them as strong references. diff --git a/src/date.js b/src/date.js index 0cd1825..7b6f539 100644 --- a/src/date.js +++ b/src/date.js @@ -16,7 +16,13 @@ var $createDate; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalDate = global.Date; +var InternalArray = shared.InternalArray; + +// ------------------------------------------------------------------- // This file contains date support implemented in JavaScript. diff --git a/src/harmony-array-includes.js b/src/harmony-array-includes.js index 109499e..e4ac07b 100644 --- a/src/harmony-array-includes.js +++ b/src/harmony-array-includes.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -(function(global, shared, exports) { +(function(global, exports) { 'use strict'; diff --git a/src/harmony-array.js b/src/harmony-array.js index f9283b9..8520f35 100644 --- a/src/harmony-array.js +++ b/src/harmony-array.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -(function(global, shared, exports) { +(function(global, exports) { 'use strict'; diff --git a/src/harmony-object.js b/src/harmony-object.js index acf74dd..bbb6437 100644 --- a/src/harmony-object.js +++ b/src/harmony-object.js @@ -3,7 +3,7 @@ // found in the LICENSE file. // -(function(global, shared, exports) { +(function(global, exports) { "use strict"; diff --git a/src/harmony-reflect.js b/src/harmony-reflect.js index eee6df40..4f78b2a 100644 --- a/src/harmony-reflect.js +++ b/src/harmony-reflect.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -(function(global, shared, exports) { +(function(global, exports) { 'use strict'; diff --git a/src/harmony-regexp.js b/src/harmony-regexp.js index 6a32f16..21c2c71 100644 --- a/src/harmony-regexp.js +++ b/src/harmony-regexp.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -(function(global, shared, exports) { +(function(global, exports) { 'use strict'; diff --git a/src/harmony-spread.js b/src/harmony-spread.js index a523d26..8eade4b 100644 --- a/src/harmony-spread.js +++ b/src/harmony-spread.js @@ -5,10 +5,16 @@ var $spreadArguments; var $spreadIterable; -(function(global, shared, exports) { +(function(global, exports) { 'use strict'; +// ------------------------------------------------------------------- +// Imports +var InternalArray = exports.InternalArray; + +// ------------------------------------------------------------------- + function SpreadArguments() { var count = %_ArgumentsLength(); var args = new InternalArray(); diff --git a/src/harmony-tostring.js b/src/harmony-tostring.js index b3783c4..d29d9c6 100644 --- a/src/harmony-tostring.js +++ b/src/harmony-tostring.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -(function(global, shared, exports) { +(function(global, exports) { "use strict"; diff --git a/src/harmony-typedarray.js b/src/harmony-typedarray.js index 18b4ca0..bbdb91f 100644 --- a/src/harmony-typedarray.js +++ b/src/harmony-typedarray.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -(function(global, shared, exports) { +(function(global, exports) { "use strict"; diff --git a/src/json.js b/src/json.js index f093e5c..2e6bbbb 100644 --- a/src/json.js +++ b/src/json.js @@ -10,7 +10,11 @@ var $jsonSerializeAdapter; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalJSON = global.JSON; +var InternalArray = shared.InternalArray; // ------------------------------------------------------------------- diff --git a/src/math.js b/src/math.js index af2d0ac..633a5d0 100644 --- a/src/math.js +++ b/src/math.js @@ -16,7 +16,11 @@ var $min; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalObject = global.Object; +var InternalArray = shared.InternalArray; //------------------------------------------------------------------- diff --git a/src/messages.js b/src/messages.js index 4b67c2e..eb6e07f 100644 --- a/src/messages.js +++ b/src/messages.js @@ -35,7 +35,14 @@ var MakeTypeErrorEmbedded; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalObject = global.Object; +var InternalArray = shared.InternalArray; + +// ------------------------------------------------------------------- + var GlobalError; var GlobalTypeError; var GlobalRangeError; @@ -44,8 +51,6 @@ var GlobalSyntaxError; var GlobalReferenceError; var GlobalEvalError; -// ------------------------------------------------------------------- - var kMessages = { // Error constructor_is_generator: ["Class constructor may not be a generator"], diff --git a/src/object-observe.js b/src/object-observe.js index 00bf85d..3dfc35e 100644 --- a/src/object-observe.js +++ b/src/object-observe.js @@ -16,8 +16,12 @@ var $observeNativeObjectNotifierPerformChange; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalArray = global.Array; var GlobalObject = global.Object; +var InternalArray = shared.InternalArray; // ------------------------------------------------------------------- diff --git a/src/objects.h b/src/objects.h index f27ce21..5437530 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1700,9 +1700,6 @@ class JSReceiver: public HeapObject { // Forward declaration for JSObject::GetOrCreateHiddenPropertiesHashTable. class ObjectHashTable; -// Forward declaration for JSObject::Copy. -class AllocationSite; - // The JSObject describes real heap allocated JavaScript objects with // properties. @@ -2163,7 +2160,6 @@ class JSObject: public JSReceiver { // Copy object. enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 }; - static Handle Copy(Handle object); MUST_USE_RESULT static MaybeHandle DeepCopy( Handle object, AllocationSiteUsageContext* site_context, diff --git a/src/promise.js b/src/promise.js index b0d1aa0..97a0b4c 100644 --- a/src/promise.js +++ b/src/promise.js @@ -19,6 +19,11 @@ var $promiseValue; %CheckIsBootstrapping(); // ------------------------------------------------------------------- +// Imports + +var InternalArray = shared.InternalArray; + +// ------------------------------------------------------------------- // Status values: 0 = pending, +1 = resolved, -1 = rejected var promiseStatus = GLOBAL_PRIVATE("Promise#status"); diff --git a/src/regexp.js b/src/regexp.js index 3ac5987..b6bf3f9 100644 --- a/src/regexp.js +++ b/src/regexp.js @@ -13,7 +13,13 @@ var harmony_unicode_regexps = false; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalRegExp = global.RegExp; +var InternalPackedArray = shared.InternalPackedArray; + +// ------------------------------------------------------------------- // Property of the builtins object for recording the result of the last // regexp match. The property $regexpLastMatchInfo includes the matchIndices diff --git a/src/string.js b/src/string.js index 03979fd..1fc7b02 100644 --- a/src/string.js +++ b/src/string.js @@ -10,8 +10,13 @@ var $stringSubstring; %CheckIsBootstrapping(); +// ------------------------------------------------------------------- +// Imports + var GlobalRegExp = global.RegExp; var GlobalString = global.String; +var InternalArray = shared.InternalArray; +var InternalPackedArray = shared.InternalPackedArray; //------------------------------------------------------------------- diff --git a/src/templates.js b/src/templates.js index ff94683..e49cb3e 100644 --- a/src/templates.js +++ b/src/templates.js @@ -12,9 +12,17 @@ var $getTemplateCallSite; %CheckIsBootstrapping(); -var callSiteCache = new global.Map; -var mapGetFn = global.Map.prototype.get; -var mapSetFn = global.Map.prototype.set; +// ------------------------------------------------------------------- +// Imports + +var GlobalMap = global.Map; +var InternalArray = shared.InternalArray; + +// ------------------------------------------------------------------- + +var callSiteCache = new GlobalMap; +var mapGetFn = GlobalMap.prototype.get; +var mapSetFn = GlobalMap.prototype.set; function SameCallSiteElements(rawStrings, other) { diff --git a/src/uri.js b/src/uri.js index 1f4b8b6..d3ecac9 100644 --- a/src/uri.js +++ b/src/uri.js @@ -11,8 +11,12 @@ %CheckIsBootstrapping(); +//- ------------------------------------------------------------------ +// Imports + var GlobalObject = global.Object; var GlobalArray = global.Array; +var InternalArray = shared.InternalArray; // ------------------------------------------------------------------- // Define internal helper functions. diff --git a/src/v8natives.js b/src/v8natives.js index ce54c75..94133bf 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -36,11 +36,15 @@ var $toNameArray; %CheckIsBootstrapping(); +// ---------------------------------------------------------------------------- +// Imports + var GlobalArray = global.Array; var GlobalBoolean = global.Boolean; var GlobalFunction = global.Function; var GlobalNumber = global.Number; var GlobalObject = global.Object; +var InternalArray = shared.InternalArray; // ---------------------------------------------------------------------------- diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc index d8c89ae..5730cde 100644 --- a/test/cctest/test-heap.cc +++ b/test/cctest/test-heap.cc @@ -5430,3 +5430,56 @@ TEST(PreprocessStackTrace) { CHECK(!element->IsCode()); } } + + +static bool shared_has_been_collected = false; +static bool builtin_exports_has_been_collected = false; + +static void SharedHasBeenCollected( + const v8::WeakCallbackInfo>& data) { + shared_has_been_collected = true; + data.GetParameter()->Reset(); +} + + +static void BuiltinExportsHasBeenCollected( + const v8::WeakCallbackInfo>& data) { + builtin_exports_has_been_collected = true; + data.GetParameter()->Reset(); +} + + +TEST(BootstrappingExports) { + FLAG_expose_natives_as = "natives"; + CcTest::InitializeVM(); + v8::Isolate* isolate = CcTest::isolate(); + + if (Snapshot::HaveASnapshotToStartFrom(CcTest::i_isolate())) return; + + shared_has_been_collected = false; + builtin_exports_has_been_collected = false; + + v8::Persistent shared; + v8::Persistent builtin_exports; + + { + v8::HandleScope scope(isolate); + v8::Handle natives = + CcTest::global()->Get(v8_str("natives"))->ToObject(isolate); + shared.Reset(isolate, natives->Get(v8_str("shared"))->ToObject(isolate)); + natives->Delete(v8_str("shared")); + builtin_exports.Reset( + isolate, natives->Get(v8_str("builtin_exports"))->ToObject(isolate)); + natives->Delete(v8_str("builtin_exports")); + } + + shared.SetWeak(&shared, SharedHasBeenCollected, + v8::WeakCallbackType::kParameter); + builtin_exports.SetWeak(&builtin_exports, BuiltinExportsHasBeenCollected, + v8::WeakCallbackType::kParameter); + + CcTest::heap()->CollectAllAvailableGarbage("fire weak callbacks"); + + CHECK(shared_has_been_collected); + CHECK(builtin_exports_has_been_collected); +} diff --git a/test/mjsunit/debug-stepout-scope-part1.js b/test/mjsunit/debug-stepout-scope-part1.js index f49b1a0..cce88b7 100644 --- a/test/mjsunit/debug-stepout-scope-part1.js +++ b/test/mjsunit/debug-stepout-scope-part1.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part2.js b/test/mjsunit/debug-stepout-scope-part2.js index 69cee99..ba05317 100644 --- a/test/mjsunit/debug-stepout-scope-part2.js +++ b/test/mjsunit/debug-stepout-scope-part2.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part3.js b/test/mjsunit/debug-stepout-scope-part3.js index 319f879..c120640 100644 --- a/test/mjsunit/debug-stepout-scope-part3.js +++ b/test/mjsunit/debug-stepout-scope-part3.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part4.js b/test/mjsunit/debug-stepout-scope-part4.js index eb9c82f..a5743fe 100644 --- a/test/mjsunit/debug-stepout-scope-part4.js +++ b/test/mjsunit/debug-stepout-scope-part4.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part5.js b/test/mjsunit/debug-stepout-scope-part5.js index 250bee4..cabacba 100644 --- a/test/mjsunit/debug-stepout-scope-part5.js +++ b/test/mjsunit/debug-stepout-scope-part5.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part6.js b/test/mjsunit/debug-stepout-scope-part6.js index 2d8357f..f222fbd 100644 --- a/test/mjsunit/debug-stepout-scope-part6.js +++ b/test/mjsunit/debug-stepout-scope-part6.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part7.js b/test/mjsunit/debug-stepout-scope-part7.js index 4f0c066..eba115d 100644 --- a/test/mjsunit/debug-stepout-scope-part7.js +++ b/test/mjsunit/debug-stepout-scope-part7.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/debug-stepout-scope-part8.js b/test/mjsunit/debug-stepout-scope-part8.js index f91fab5..c0a8a00 100644 --- a/test/mjsunit/debug-stepout-scope-part8.js +++ b/test/mjsunit/debug-stepout-scope-part8.js @@ -25,7 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-debug-as debug --expose-natives-as=builtins +// Flags: --expose-debug-as debug // Check that the ScopeIterator can properly recreate the scope at // every point when stepping through functions. diff --git a/test/mjsunit/global-deleted-property-keyed.js b/test/mjsunit/global-deleted-property-keyed.js index dba3a4d..a0e48ff 100644 --- a/test/mjsunit/global-deleted-property-keyed.js +++ b/test/mjsunit/global-deleted-property-keyed.js @@ -26,9 +26,9 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-natives_as natives -// Test keyed access to deleted property in a global object without access checks. -// Regression test that exposed the_hole value from Runtime_KeyedGetPoperty. +// Flags: --expose-natives-as natives +// Test keyed access to deleted property in a global object w/o access checks. +// Regression test that exposed the_hole value from Runtime_KeyedGetProperty. var name = "fisk"; natives[name] = name; diff --git a/test/mjsunit/regress/regress-1878.js b/test/mjsunit/regress/regress-1878.js index fbc47bd..b1d47b5 100644 --- a/test/mjsunit/regress/regress-1878.js +++ b/test/mjsunit/regress/regress-1878.js @@ -27,18 +27,18 @@ // See: http://code.google.com/p/v8/issues/detail?id=1878 -// Flags: --allow-natives-syntax --expose_natives_as=natives +// Flags: --allow-natives-syntax --expose-natives-as=natives var a = Array(); for (var i = 0; i < 1000; i++) { - var ai = natives.InternalArray(10000); + var ai = natives.builtin_exports.InternalArray(10000); assertFalse(%HaveSameMap(ai, a)); assertTrue(%HasFastObjectElements(ai)); } for (var i = 0; i < 1000; i++) { - var ai = new natives.InternalArray(10000); + var ai = new natives.builtin_exports.InternalArray(10000); assertFalse(%HaveSameMap(ai, a)); assertTrue(%HasFastObjectElements(ai)); } diff --git a/test/mjsunit/samevalue.js b/test/mjsunit/samevalue.js index 36a7dea..229db0d 100644 --- a/test/mjsunit/samevalue.js +++ b/test/mjsunit/samevalue.js @@ -26,7 +26,7 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --expose-natives_as natives +// Flags: --expose-natives-as natives // Test the SameValue internal method. var obj1 = {x: 10, y: 11, z: "test"}; -- 2.7.4