Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: src/bootstrapper.cc

Issue 1143993003: Use shared container to manage imports/exports. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fixed test for no-snap Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/arraybuffer.js ('k') | src/collection.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/bootstrapper.h" 5 #include "src/bootstrapper.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/base/utils/random-number-generator.h" 9 #include "src/base/utils/random-number-generator.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 Handle<Map> CreateStrictFunctionMap(FunctionMode function_mode, 300 Handle<Map> CreateStrictFunctionMap(FunctionMode function_mode,
301 Handle<JSFunction> empty_function); 301 Handle<JSFunction> empty_function);
302 Handle<Map> CreateStrongFunctionMap(Handle<JSFunction> empty_function, 302 Handle<Map> CreateStrongFunctionMap(Handle<JSFunction> empty_function,
303 bool is_constructor); 303 bool is_constructor);
304 304
305 305
306 void SetStrictFunctionInstanceDescriptor(Handle<Map> map, 306 void SetStrictFunctionInstanceDescriptor(Handle<Map> map,
307 FunctionMode function_mode); 307 FunctionMode function_mode);
308 void SetStrongFunctionInstanceDescriptor(Handle<Map> map); 308 void SetStrongFunctionInstanceDescriptor(Handle<Map> map);
309 309
310 static bool CompileBuiltin(Isolate* isolate, int index, 310 static bool CompileBuiltin(Isolate* isolate, int index);
311 Handle<JSObject> shared);
312 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); 311 static bool CompileExperimentalBuiltin(Isolate* isolate, int index);
313 static bool CompileExtraBuiltin(Isolate* isolate, int index); 312 static bool CompileExtraBuiltin(Isolate* isolate, int index);
314 static bool CompileNative(Isolate* isolate, Vector<const char> name, 313 static bool CompileNative(Isolate* isolate, Vector<const char> name,
315 Handle<String> source, int argc, 314 Handle<String> source, int argc,
316 Handle<Object> argv[]); 315 Handle<Object> argv[]);
317 316
317 static bool CallUtilsFunction(Isolate* isolate, const char* name);
318
318 static bool CompileExtension(Isolate* isolate, v8::Extension* extension); 319 static bool CompileExtension(Isolate* isolate, v8::Extension* extension);
319 320
320 Isolate* isolate_; 321 Isolate* isolate_;
321 Handle<Context> result_; 322 Handle<Context> result_;
322 Handle<Context> native_context_; 323 Handle<Context> native_context_;
323 324
324 // Function maps. Function maps are created initially with a read only 325 // Function maps. Function maps are created initially with a read only
325 // prototype for the processing of JS builtins. Later the function maps are 326 // prototype for the processing of JS builtins. Later the function maps are
326 // replaced in order to make prototype writable. These are the final, writable 327 // replaced in order to make prototype writable. These are the final, writable
327 // prototype, maps. 328 // prototype, maps.
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 void Genesis::InitializeExperimentalGlobal() { 1436 void Genesis::InitializeExperimentalGlobal() {
1436 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id(); 1437 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id();
1437 1438
1438 HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL) 1439 HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL)
1439 HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL) 1440 HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL)
1440 HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL) 1441 HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
1441 #undef FEATURE_INITIALIZE_GLOBAL 1442 #undef FEATURE_INITIALIZE_GLOBAL
1442 } 1443 }
1443 1444
1444 1445
1445 bool Genesis::CompileBuiltin(Isolate* isolate, int index, 1446 bool Genesis::CompileBuiltin(Isolate* isolate, int index) {
1446 Handle<JSObject> shared) {
1447 Vector<const char> name = Natives::GetScriptName(index); 1447 Vector<const char> name = Natives::GetScriptName(index);
1448 Handle<String> source_code = 1448 Handle<String> source_code =
1449 isolate->bootstrapper()->SourceLookup<Natives>(index); 1449 isolate->bootstrapper()->SourceLookup<Natives>(index);
1450 Handle<Object> global = isolate->global_object(); 1450 Handle<Object> global = isolate->global_object();
1451 Handle<Object> exports = isolate->builtin_exports_object(); 1451 Handle<Object> utils = isolate->natives_utils_object();
1452 Handle<Object> args[] = {global, shared, exports}; 1452 Handle<Object> args[] = {global, utils};
1453 return CompileNative(isolate, name, source_code, arraysize(args), args); 1453 return CompileNative(isolate, name, source_code, arraysize(args), args);
1454 } 1454 }
1455 1455
1456 1456
1457 bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) { 1457 bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) {
1458 HandleScope scope(isolate); 1458 HandleScope scope(isolate);
1459 Vector<const char> name = ExperimentalNatives::GetScriptName(index); 1459 Vector<const char> name = ExperimentalNatives::GetScriptName(index);
1460 Handle<String> source_code = 1460 Handle<String> source_code =
1461 isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index); 1461 isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index);
1462 Handle<Object> global = isolate->global_object(); 1462 Handle<Object> global = isolate->global_object();
1463 Handle<Object> exports = isolate->builtin_exports_object(); 1463 Handle<Object> utils = isolate->natives_utils_object();
1464 Handle<Object> args[] = {global, exports}; 1464 Handle<Object> args[] = {global, utils};
1465 return CompileNative(isolate, name, source_code, arraysize(args), args); 1465 return CompileNative(isolate, name, source_code, arraysize(args), args);
1466 } 1466 }
1467 1467
1468 1468
1469 bool Genesis::CompileExtraBuiltin(Isolate* isolate, int index) { 1469 bool Genesis::CompileExtraBuiltin(Isolate* isolate, int index) {
1470 HandleScope scope(isolate); 1470 HandleScope scope(isolate);
1471 Vector<const char> name = ExtraNatives::GetScriptName(index); 1471 Vector<const char> name = ExtraNatives::GetScriptName(index);
1472 Handle<String> source_code = 1472 Handle<String> source_code =
1473 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index); 1473 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index);
1474 Handle<Object> global = isolate->global_object(); 1474 Handle<Object> global = isolate->global_object();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 Handle<Object> wrapper; 1510 Handle<Object> wrapper;
1511 if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) { 1511 if (!Execution::Call(isolate, fun, receiver, 0, NULL).ToHandle(&wrapper)) {
1512 return false; 1512 return false;
1513 } 1513 }
1514 // Then run the function wrapper. 1514 // Then run the function wrapper.
1515 return !Execution::Call(isolate, Handle<JSFunction>::cast(wrapper), receiver, 1515 return !Execution::Call(isolate, Handle<JSFunction>::cast(wrapper), receiver,
1516 argc, argv).is_null(); 1516 argc, argv).is_null();
1517 } 1517 }
1518 1518
1519 1519
1520 bool Genesis::CallUtilsFunction(Isolate* isolate, const char* name) {
1521 Handle<JSObject> utils =
1522 Handle<JSObject>::cast(isolate->natives_utils_object());
1523 Handle<String> name_string =
1524 isolate->factory()->NewStringFromAsciiChecked(name);
1525 Handle<Object> fun = JSObject::GetDataProperty(utils, name_string);
1526 Handle<Object> receiver = isolate->factory()->undefined_value();
1527 return !Execution::Call(isolate, fun, receiver, 0, NULL).is_null();
1528 }
1529
1530
1520 bool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) { 1531 bool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) {
1521 Factory* factory = isolate->factory(); 1532 Factory* factory = isolate->factory();
1522 HandleScope scope(isolate); 1533 HandleScope scope(isolate);
1523 Handle<SharedFunctionInfo> function_info; 1534 Handle<SharedFunctionInfo> function_info;
1524 1535
1525 Handle<String> source = 1536 Handle<String> source =
1526 isolate->factory() 1537 isolate->factory()
1527 ->NewExternalStringFromOneByte(extension->source()) 1538 ->NewExternalStringFromOneByte(extension->source())
1528 .ToHandleChecked(); 1539 .ToHandleChecked();
1529 DCHECK(source->IsOneByteRepresentation()); 1540 DCHECK(source->IsOneByteRepresentation());
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
1911 Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string()); 1922 Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string());
1912 DCHECK(bridge->context() == *isolate()->native_context()); 1923 DCHECK(bridge->context() == *isolate()->native_context());
1913 1924
1914 // Allocate the builtins context. 1925 // Allocate the builtins context.
1915 Handle<Context> context = 1926 Handle<Context> context =
1916 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); 1927 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge);
1917 context->set_global_object(*builtins); // override builtins global object 1928 context->set_global_object(*builtins); // override builtins global object
1918 1929
1919 native_context()->set_runtime_context(*context); 1930 native_context()->set_runtime_context(*context);
1920 1931
1921 // Set up shared object to set up cross references between native scripts. 1932 // Set up the utils object as shared container between native scripts.
1922 // "shared" is used for cross references between native scripts that are part 1933 Handle<JSObject> utils = factory()->NewJSObject(isolate()->object_function());
1923 // of the snapshot. "builtin_exports" is used for experimental natives. 1934 JSObject::NormalizeProperties(utils, CLEAR_INOBJECT_PROPERTIES, 16,
1924 Handle<JSObject> shared = 1935 "utils container for native scripts");
1925 factory()->NewJSObject(isolate()->object_function()); 1936 native_context()->set_natives_utils_object(*utils);
1926 JSObject::NormalizeProperties(shared, CLEAR_INOBJECT_PROPERTIES, 16,
1927 "container to share between native scripts");
1928
1929 Handle<JSObject> builtin_exports =
1930 factory()->NewJSObject(isolate()->object_function());
1931 JSObject::NormalizeProperties(builtin_exports, CLEAR_INOBJECT_PROPERTIES, 16,
1932 "container to export to experimental natives");
1933 native_context()->set_builtin_exports_object(*builtin_exports);
1934 1937
1935 Handle<JSObject> extras_exports = 1938 Handle<JSObject> extras_exports =
1936 factory()->NewJSObject(isolate()->object_function()); 1939 factory()->NewJSObject(isolate()->object_function());
1937 JSObject::NormalizeProperties(extras_exports, CLEAR_INOBJECT_PROPERTIES, 2, 1940 JSObject::NormalizeProperties(extras_exports, CLEAR_INOBJECT_PROPERTIES, 2,
1938 "container to export to extra natives"); 1941 "container to export to extra natives");
1939 native_context()->set_extras_exports_object(*extras_exports); 1942 native_context()->set_extras_exports_object(*extras_exports);
1940 1943
1941 if (FLAG_expose_natives_as != NULL) { 1944 if (FLAG_expose_natives_as != NULL) {
1942 Handle<String> shared_key = factory()->NewStringFromAsciiChecked("shared"); 1945 Handle<String> utils_key = factory()->NewStringFromAsciiChecked("utils");
1943 JSObject::AddProperty(builtins, shared_key, shared, NONE); 1946 JSObject::AddProperty(builtins, utils_key, utils, NONE);
1944 } 1947 }
1945 1948
1946 { // -- S c r i p t 1949 { // -- S c r i p t
1947 // Builtin functions for Script. 1950 // Builtin functions for Script.
1948 Handle<JSFunction> script_fun = InstallFunction( 1951 Handle<JSFunction> script_fun = InstallFunction(
1949 builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, 1952 builtins, "Script", JS_VALUE_TYPE, JSValue::kSize,
1950 isolate()->initial_object_prototype(), Builtins::kIllegal); 1953 isolate()->initial_object_prototype(), Builtins::kIllegal);
1951 Handle<JSObject> prototype = 1954 Handle<JSObject> prototype =
1952 factory()->NewJSObject(isolate()->object_function(), TENURED); 1955 factory()->NewJSObject(isolate()->object_function(), TENURED);
1953 Accessors::FunctionSetPrototype(script_fun, prototype).Assert(); 1956 Accessors::FunctionSetPrototype(script_fun, prototype).Assert();
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
2109 native_context()->set_opaque_reference_function(*opaque_reference_fun); 2112 native_context()->set_opaque_reference_function(*opaque_reference_fun);
2110 } 2113 }
2111 2114
2112 // InternalArrays should not use Smi-Only array optimizations. There are too 2115 // InternalArrays should not use Smi-Only array optimizations. There are too
2113 // many places in the C++ runtime code (e.g. RegEx) that assume that 2116 // many places in the C++ runtime code (e.g. RegEx) that assume that
2114 // elements in InternalArrays can be set to non-Smi values without going 2117 // elements in InternalArrays can be set to non-Smi values without going
2115 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT 2118 // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
2116 // transition easy to trap. Moreover, they rarely are smi-only. 2119 // transition easy to trap. Moreover, they rarely are smi-only.
2117 { 2120 {
2118 HandleScope scope(isolate()); 2121 HandleScope scope(isolate());
2119 Handle<JSObject> builtin_exports = 2122 Handle<JSObject> utils =
2120 Handle<JSObject>::cast(isolate()->builtin_exports_object()); 2123 Handle<JSObject>::cast(isolate()->natives_utils_object());
2121 Handle<JSFunction> array_function = InstallInternalArray( 2124 Handle<JSFunction> array_function =
2122 builtin_exports, "InternalArray", FAST_HOLEY_ELEMENTS); 2125 InstallInternalArray(utils, "InternalArray", FAST_HOLEY_ELEMENTS);
2123 native_context()->set_internal_array_function(*array_function); 2126 native_context()->set_internal_array_function(*array_function);
2124 InstallInternalArray(builtin_exports, "InternalPackedArray", FAST_ELEMENTS); 2127 InstallInternalArray(utils, "InternalPackedArray", FAST_ELEMENTS);
2125 } 2128 }
2126 2129
2127 { // -- S e t I t e r a t o r 2130 { // -- S e t I t e r a t o r
2128 Handle<JSFunction> set_iterator_function = InstallFunction( 2131 Handle<JSFunction> set_iterator_function = InstallFunction(
2129 builtins, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize, 2132 builtins, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize,
2130 isolate()->initial_object_prototype(), Builtins::kIllegal); 2133 isolate()->initial_object_prototype(), Builtins::kIllegal);
2131 native_context()->set_set_iterator_map( 2134 native_context()->set_set_iterator_map(
2132 set_iterator_function->initial_map()); 2135 set_iterator_function->initial_map());
2133 } 2136 }
2134 2137
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2214 { 2217 {
2215 static const PropertyAttributes attributes = 2218 static const PropertyAttributes attributes =
2216 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); 2219 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE);
2217 #define INSTALL_PUBLIC_SYMBOL(name, varname, description) \ 2220 #define INSTALL_PUBLIC_SYMBOL(name, varname, description) \
2218 Handle<String> varname = factory()->NewStringFromStaticChars(#varname); \ 2221 Handle<String> varname = factory()->NewStringFromStaticChars(#varname); \
2219 JSObject::AddProperty(builtins, varname, factory()->name(), attributes); 2222 JSObject::AddProperty(builtins, varname, factory()->name(), attributes);
2220 PUBLIC_SYMBOL_LIST(INSTALL_PUBLIC_SYMBOL) 2223 PUBLIC_SYMBOL_LIST(INSTALL_PUBLIC_SYMBOL)
2221 #undef INSTALL_PUBLIC_SYMBOL 2224 #undef INSTALL_PUBLIC_SYMBOL
2222 } 2225 }
2223 2226
2224 // Install natives. Everything exported to experimental natives is also
2225 // shared to regular natives.
2226 TransferNamedProperties(builtin_exports, shared);
2227 int i = Natives::GetDebuggerCount(); 2227 int i = Natives::GetDebuggerCount();
2228 if (!CompileBuiltin(isolate(), i, shared)) return false; 2228 if (!CompileBuiltin(isolate(), i)) return false;
2229 if (!InstallJSBuiltins(builtins)) return false; 2229 if (!InstallJSBuiltins(builtins)) return false;
2230 2230
2231 for (++i; i < Natives::GetBuiltinsCount(); ++i) { 2231 for (++i; i < Natives::GetBuiltinsCount(); ++i) {
2232 if (!CompileBuiltin(isolate(), i, shared)) return false; 2232 if (!CompileBuiltin(isolate(), i)) return false;
2233 } 2233 }
2234 2234
2235 if (!CallUtilsFunction(isolate(), "PostNatives")) return false;
2236
2235 InstallNativeFunctions(); 2237 InstallNativeFunctions();
2236 2238
2237 auto function_cache = 2239 auto function_cache =
2238 ObjectHashTable::New(isolate(), ApiNatives::kInitialFunctionCacheSize); 2240 ObjectHashTable::New(isolate(), ApiNatives::kInitialFunctionCacheSize);
2239 native_context()->set_function_cache(*function_cache); 2241 native_context()->set_function_cache(*function_cache);
2240 2242
2241 // Store the map for the string prototype after the natives has been compiled 2243 // Store the map for the string prototype after the natives has been compiled
2242 // and the String function has been set up. 2244 // and the String function has been set up.
2243 Handle<JSFunction> string_function(native_context()->string_function()); 2245 Handle<JSFunction> string_function(native_context()->string_function());
2244 DCHECK(JSObject::cast( 2246 DCHECK(JSObject::cast(
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
2537 Handle<JSGlobalObject> global(JSGlobalObject::cast( 2539 Handle<JSGlobalObject> global(JSGlobalObject::cast(
2538 native_context->global_object())); 2540 native_context->global_object()));
2539 2541
2540 Handle<JSObject> Error = Handle<JSObject>::cast( 2542 Handle<JSObject> Error = Handle<JSObject>::cast(
2541 Object::GetProperty(isolate, global, "Error").ToHandleChecked()); 2543 Object::GetProperty(isolate, global, "Error").ToHandleChecked());
2542 Handle<String> name = 2544 Handle<String> name =
2543 factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("stackTraceLimit")); 2545 factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("stackTraceLimit"));
2544 Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate); 2546 Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate);
2545 JSObject::AddProperty(Error, name, stack_trace_limit, NONE); 2547 JSObject::AddProperty(Error, name, stack_trace_limit, NONE);
2546 2548
2547 Handle<Object> builtin_exports(native_context->builtin_exports_object(), 2549 // By now the utils object is useless and can be removed.
2548 isolate); 2550 native_context->set_natives_utils_object(*factory->undefined_value());
2549 native_context->set_builtin_exports_object(Smi::FromInt(0));
2550 2551
2551 // Expose the natives in global if a name for it is specified. 2552 // Expose the natives in global if a name for it is specified.
2552 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { 2553 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) {
2553 Handle<String> natives_key = 2554 Handle<String> natives_key =
2554 factory->InternalizeUtf8String(FLAG_expose_natives_as); 2555 factory->InternalizeUtf8String(FLAG_expose_natives_as);
2555 uint32_t dummy_index; 2556 uint32_t dummy_index;
2556 if (natives_key->AsArrayIndex(&dummy_index)) return true; 2557 if (natives_key->AsArrayIndex(&dummy_index)) return true;
2557 Handle<JSBuiltinsObject> natives(global->builtins()); 2558 Handle<JSBuiltinsObject> natives(global->builtins());
2558 JSObject::AddProperty(global, natives_key, natives, DONT_ENUM); 2559 JSObject::AddProperty(global, natives_key, natives, DONT_ENUM);
2559 Handle<String> builtin_exports_key =
2560 factory->NewStringFromAsciiChecked("builtin_exports");
2561 JSObject::AddProperty(natives, builtin_exports_key, builtin_exports, NONE);
2562 } 2560 }
2563 2561
2564 // Expose the stack trace symbol to native JS. 2562 // Expose the stack trace symbol to native JS.
2565 RETURN_ON_EXCEPTION_VALUE(isolate, 2563 RETURN_ON_EXCEPTION_VALUE(isolate,
2566 JSObject::SetOwnPropertyIgnoreAttributes( 2564 JSObject::SetOwnPropertyIgnoreAttributes(
2567 handle(native_context->builtins(), isolate), 2565 handle(native_context->builtins(), isolate),
2568 factory->InternalizeOneByteString( 2566 factory->InternalizeOneByteString(
2569 STATIC_CHAR_VECTOR("$stackTraceSymbol")), 2567 STATIC_CHAR_VECTOR("$stackTraceSymbol")),
2570 factory->stack_trace_symbol(), NONE), 2568 factory->stack_trace_symbol(), NONE),
2571 false); 2569 false);
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
3044 return from + sizeof(NestingCounterType); 3042 return from + sizeof(NestingCounterType);
3045 } 3043 }
3046 3044
3047 3045
3048 // Called when the top-level V8 mutex is destroyed. 3046 // Called when the top-level V8 mutex is destroyed.
3049 void Bootstrapper::FreeThreadResources() { 3047 void Bootstrapper::FreeThreadResources() {
3050 DCHECK(!IsActive()); 3048 DCHECK(!IsActive());
3051 } 3049 }
3052 3050
3053 } } // namespace v8::internal 3051 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arraybuffer.js ('k') | src/collection.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698