OLD | NEW |
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/factory.h" | 5 #include "src/factory.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1351 bool is_strict) { | 1351 bool is_strict) { |
1352 // Allocate the function | 1352 // Allocate the function |
1353 Handle<JSFunction> function = NewFunction(name, code, prototype, is_strict); | 1353 Handle<JSFunction> function = NewFunction(name, code, prototype, is_strict); |
1354 | 1354 |
1355 ElementsKind elements_kind = | 1355 ElementsKind elements_kind = |
1356 type == JS_ARRAY_TYPE ? FAST_SMI_ELEMENTS : FAST_HOLEY_SMI_ELEMENTS; | 1356 type == JS_ARRAY_TYPE ? FAST_SMI_ELEMENTS : FAST_HOLEY_SMI_ELEMENTS; |
1357 Handle<Map> initial_map = NewMap(type, instance_size, elements_kind); | 1357 Handle<Map> initial_map = NewMap(type, instance_size, elements_kind); |
1358 // TODO(littledan): Why do we have this is_generator test when | 1358 // TODO(littledan): Why do we have this is_generator test when |
1359 // NewFunctionPrototype already handles finding an appropriately | 1359 // NewFunctionPrototype already handles finding an appropriately |
1360 // shared prototype? | 1360 // shared prototype? |
1361 if (!function->shared()->is_resumable()) { | 1361 if (!IsResumableFunction(function->shared()->kind())) { |
1362 if (prototype->IsTheHole(isolate())) { | 1362 if (prototype->IsTheHole(isolate())) { |
1363 prototype = NewFunctionPrototype(function); | 1363 prototype = NewFunctionPrototype(function); |
1364 } | 1364 } |
1365 } | 1365 } |
1366 | 1366 |
1367 JSFunction::SetInitialMap(function, initial_map, | 1367 JSFunction::SetInitialMap(function, initial_map, |
1368 Handle<JSReceiver>::cast(prototype)); | 1368 Handle<JSReceiver>::cast(prototype)); |
1369 | 1369 |
1370 return function; | 1370 return function; |
1371 } | 1371 } |
1372 | 1372 |
1373 | 1373 |
1374 Handle<JSFunction> Factory::NewFunction(Handle<String> name, | 1374 Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
1375 Handle<Code> code, | 1375 Handle<Code> code, |
1376 InstanceType type, | 1376 InstanceType type, |
1377 int instance_size) { | 1377 int instance_size) { |
1378 return NewFunction(name, code, the_hole_value(), type, instance_size); | 1378 return NewFunction(name, code, the_hole_value(), type, instance_size); |
1379 } | 1379 } |
1380 | 1380 |
1381 | 1381 |
1382 Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) { | 1382 Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) { |
1383 // Make sure to use globals from the function's context, since the function | 1383 // Make sure to use globals from the function's context, since the function |
1384 // can be from a different context. | 1384 // can be from a different context. |
1385 Handle<Context> native_context(function->context()->native_context()); | 1385 Handle<Context> native_context(function->context()->native_context()); |
1386 Handle<Map> new_map; | 1386 Handle<Map> new_map; |
1387 if (function->shared()->is_resumable()) { | 1387 if (IsResumableFunction(function->shared()->kind())) { |
1388 // Generator and async function prototypes can share maps since they | 1388 // Generator and async function prototypes can share maps since they |
1389 // don't have "constructor" properties. | 1389 // don't have "constructor" properties. |
1390 new_map = handle(native_context->generator_object_prototype_map()); | 1390 new_map = handle(native_context->generator_object_prototype_map()); |
1391 } else { | 1391 } else { |
1392 CHECK(!function->shared()->is_async()); | |
1393 // Each function prototype gets a fresh map to avoid unwanted sharing of | 1392 // Each function prototype gets a fresh map to avoid unwanted sharing of |
1394 // maps between prototypes of different constructors. | 1393 // maps between prototypes of different constructors. |
1395 Handle<JSFunction> object_function(native_context->object_function()); | 1394 Handle<JSFunction> object_function(native_context->object_function()); |
1396 DCHECK(object_function->has_initial_map()); | 1395 DCHECK(object_function->has_initial_map()); |
1397 new_map = handle(object_function->initial_map()); | 1396 new_map = handle(object_function->initial_map()); |
1398 } | 1397 } |
1399 | 1398 |
1400 DCHECK(!new_map->is_prototype_map()); | 1399 DCHECK(!new_map->is_prototype_map()); |
1401 Handle<JSObject> prototype = NewJSObjectFromMap(new_map); | 1400 Handle<JSObject> prototype = NewJSObjectFromMap(new_map); |
1402 | 1401 |
1403 if (!function->shared()->is_resumable()) { | 1402 if (!IsResumableFunction(function->shared()->kind())) { |
1404 JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM); | 1403 JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM); |
1405 } | 1404 } |
1406 | 1405 |
1407 return prototype; | 1406 return prototype; |
1408 } | 1407 } |
1409 | 1408 |
1410 | 1409 |
1411 Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( | 1410 Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
1412 Handle<SharedFunctionInfo> info, | 1411 Handle<SharedFunctionInfo> info, |
1413 Handle<Context> context, | 1412 Handle<Context> context, |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1732 } | 1731 } |
1733 } | 1732 } |
1734 | 1733 |
1735 array->set_elements(*elms); | 1734 array->set_elements(*elms); |
1736 array->set_length(Smi::FromInt(length)); | 1735 array->set_length(Smi::FromInt(length)); |
1737 } | 1736 } |
1738 | 1737 |
1739 | 1738 |
1740 Handle<JSGeneratorObject> Factory::NewJSGeneratorObject( | 1739 Handle<JSGeneratorObject> Factory::NewJSGeneratorObject( |
1741 Handle<JSFunction> function) { | 1740 Handle<JSFunction> function) { |
1742 DCHECK(function->shared()->is_resumable()); | 1741 DCHECK(IsResumableFunction(function->shared()->kind())); |
1743 JSFunction::EnsureHasInitialMap(function); | 1742 JSFunction::EnsureHasInitialMap(function); |
1744 Handle<Map> map(function->initial_map()); | 1743 Handle<Map> map(function->initial_map()); |
1745 DCHECK_EQ(JS_GENERATOR_OBJECT_TYPE, map->instance_type()); | 1744 DCHECK_EQ(JS_GENERATOR_OBJECT_TYPE, map->instance_type()); |
1746 CALL_HEAP_FUNCTION( | 1745 CALL_HEAP_FUNCTION( |
1747 isolate(), | 1746 isolate(), |
1748 isolate()->heap()->AllocateJSObjectFromMap(*map), | 1747 isolate()->heap()->AllocateJSObjectFromMap(*map), |
1749 JSGeneratorObject); | 1748 JSGeneratorObject); |
1750 } | 1749 } |
1751 | 1750 |
1752 Handle<Module> Factory::NewModule(Handle<SharedFunctionInfo> code) { | 1751 Handle<Module> Factory::NewModule(Handle<SharedFunctionInfo> code) { |
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2604 Handle<AccessorInfo> prototype = | 2603 Handle<AccessorInfo> prototype = |
2605 Accessors::FunctionPrototypeInfo(isolate(), attribs); | 2604 Accessors::FunctionPrototypeInfo(isolate(), attribs); |
2606 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), | 2605 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), |
2607 prototype, attribs); | 2606 prototype, attribs); |
2608 map->AppendDescriptor(&d); | 2607 map->AppendDescriptor(&d); |
2609 } | 2608 } |
2610 } | 2609 } |
2611 | 2610 |
2612 } // namespace internal | 2611 } // namespace internal |
2613 } // namespace v8 | 2612 } // namespace v8 |
OLD | NEW |