| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 2583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2594 typedef CodeStubAssembler::Variable Variable; | 2594 typedef CodeStubAssembler::Variable Variable; |
| 2595 | 2595 |
| 2596 Label if_number(assembler, Label::kDeferred), if_notsmi(assembler), | 2596 Label if_number(assembler, Label::kDeferred), if_notsmi(assembler), |
| 2597 if_jsreceiver(assembler), if_noconstructor(assembler, Label::kDeferred), | 2597 if_jsreceiver(assembler), if_noconstructor(assembler, Label::kDeferred), |
| 2598 if_wrapjsvalue(assembler); | 2598 if_wrapjsvalue(assembler); |
| 2599 | 2599 |
| 2600 Node* object = assembler->Parameter(Descriptor::kArgument); | 2600 Node* object = assembler->Parameter(Descriptor::kArgument); |
| 2601 Node* context = assembler->Parameter(Descriptor::kContext); | 2601 Node* context = assembler->Parameter(Descriptor::kContext); |
| 2602 | 2602 |
| 2603 Variable constructor_function_index_var(assembler, | 2603 Variable constructor_function_index_var(assembler, |
| 2604 MachineRepresentation::kWord32); | 2604 MachineType::PointerRepresentation()); |
| 2605 | 2605 |
| 2606 assembler->Branch(assembler->WordIsSmi(object), &if_number, &if_notsmi); | 2606 assembler->Branch(assembler->WordIsSmi(object), &if_number, &if_notsmi); |
| 2607 | 2607 |
| 2608 assembler->Bind(&if_notsmi); | 2608 assembler->Bind(&if_notsmi); |
| 2609 Node* map = assembler->LoadMap(object); | 2609 Node* map = assembler->LoadMap(object); |
| 2610 | 2610 |
| 2611 assembler->GotoIf( | 2611 assembler->GotoIf( |
| 2612 assembler->WordEqual(map, assembler->HeapNumberMapConstant()), | 2612 assembler->WordEqual(map, assembler->HeapNumberMapConstant()), |
| 2613 &if_number); | 2613 &if_number); |
| 2614 | 2614 |
| 2615 Node* instance_type = assembler->LoadMapInstanceType(map); | 2615 Node* instance_type = assembler->LoadMapInstanceType(map); |
| 2616 assembler->GotoIf( | 2616 assembler->GotoIf( |
| 2617 assembler->Int32GreaterThanOrEqual( | 2617 assembler->Int32GreaterThanOrEqual( |
| 2618 instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)), | 2618 instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)), |
| 2619 &if_jsreceiver); | 2619 &if_jsreceiver); |
| 2620 | 2620 |
| 2621 Node* constructor_function_index = assembler->LoadObjectField( | 2621 Node* constructor_function_index = |
| 2622 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 2622 assembler->LoadMapConstructorFunctionIndex(map); |
| 2623 MachineType::Uint8()); | 2623 assembler->GotoIf(assembler->WordEqual(constructor_function_index, |
| 2624 assembler->GotoIf( | 2624 assembler->IntPtrConstant( |
| 2625 assembler->Word32Equal( | 2625 Map::kNoConstructorFunctionIndex)), |
| 2626 constructor_function_index, | 2626 &if_noconstructor); |
| 2627 assembler->Int32Constant(Map::kNoConstructorFunctionIndex)), | |
| 2628 &if_noconstructor); | |
| 2629 constructor_function_index_var.Bind(constructor_function_index); | 2627 constructor_function_index_var.Bind(constructor_function_index); |
| 2630 assembler->Goto(&if_wrapjsvalue); | 2628 assembler->Goto(&if_wrapjsvalue); |
| 2631 | 2629 |
| 2632 assembler->Bind(&if_number); | 2630 assembler->Bind(&if_number); |
| 2633 constructor_function_index_var.Bind( | 2631 constructor_function_index_var.Bind( |
| 2634 assembler->Int32Constant(Context::NUMBER_FUNCTION_INDEX)); | 2632 assembler->IntPtrConstant(Context::NUMBER_FUNCTION_INDEX)); |
| 2635 assembler->Goto(&if_wrapjsvalue); | 2633 assembler->Goto(&if_wrapjsvalue); |
| 2636 | 2634 |
| 2637 assembler->Bind(&if_wrapjsvalue); | 2635 assembler->Bind(&if_wrapjsvalue); |
| 2638 Node* native_context = assembler->LoadNativeContext(context); | 2636 Node* native_context = assembler->LoadNativeContext(context); |
| 2639 Node* constructor = assembler->LoadFixedArrayElement( | 2637 Node* constructor = assembler->LoadFixedArrayElement( |
| 2640 native_context, constructor_function_index_var.value()); | 2638 native_context, constructor_function_index_var.value(), 0, |
| 2639 CodeStubAssembler::INTPTR_PARAMETERS); |
| 2641 Node* initial_map = assembler->LoadObjectField( | 2640 Node* initial_map = assembler->LoadObjectField( |
| 2642 constructor, JSFunction::kPrototypeOrInitialMapOffset); | 2641 constructor, JSFunction::kPrototypeOrInitialMapOffset); |
| 2643 Node* js_value = assembler->Allocate(JSValue::kSize); | 2642 Node* js_value = assembler->Allocate(JSValue::kSize); |
| 2644 assembler->StoreMapNoWriteBarrier(js_value, initial_map); | 2643 assembler->StoreMapNoWriteBarrier(js_value, initial_map); |
| 2645 assembler->StoreObjectFieldRoot(js_value, JSValue::kPropertiesOffset, | 2644 assembler->StoreObjectFieldRoot(js_value, JSValue::kPropertiesOffset, |
| 2646 Heap::kEmptyFixedArrayRootIndex); | 2645 Heap::kEmptyFixedArrayRootIndex); |
| 2647 assembler->StoreObjectFieldRoot(js_value, JSObject::kElementsOffset, | 2646 assembler->StoreObjectFieldRoot(js_value, JSObject::kElementsOffset, |
| 2648 Heap::kEmptyFixedArrayRootIndex); | 2647 Heap::kEmptyFixedArrayRootIndex); |
| 2649 assembler->StoreObjectField(js_value, JSValue::kValueOffset, object); | 2648 assembler->StoreObjectField(js_value, JSValue::kValueOffset, object); |
| 2650 assembler->Return(js_value); | 2649 assembler->Return(js_value); |
| (...skipping 1769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4420 | 4419 |
| 4421 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 4420 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 4422 typedef compiler::Node Node; | 4421 typedef compiler::Node Node; |
| 4423 Node* context = assembler->Parameter(Descriptor::kContext); | 4422 Node* context = assembler->Parameter(Descriptor::kContext); |
| 4424 Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 4423 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
| 4425 // For now we only support receiver_is_holder. | 4424 // For now we only support receiver_is_holder. |
| 4426 DCHECK(receiver_is_holder()); | 4425 DCHECK(receiver_is_holder()); |
| 4427 Node* holder = receiver; | 4426 Node* holder = receiver; |
| 4428 Node* map = assembler->LoadMap(receiver); | 4427 Node* map = assembler->LoadMap(receiver); |
| 4429 Node* descriptors = assembler->LoadMapDescriptors(map); | 4428 Node* descriptors = assembler->LoadMapDescriptors(map); |
| 4430 Node* offset = | 4429 Node* value_index = |
| 4431 assembler->Int32Constant(DescriptorArray::ToValueIndex(index())); | 4430 assembler->IntPtrConstant(DescriptorArray::ToValueIndex(index())); |
| 4432 Node* callback = assembler->LoadFixedArrayElement(descriptors, offset); | 4431 Node* callback = assembler->LoadFixedArrayElement( |
| 4432 descriptors, value_index, 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 4433 assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, | 4433 assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, |
| 4434 holder, callback); | 4434 holder, callback); |
| 4435 } | 4435 } |
| 4436 | 4436 |
| 4437 // static | 4437 // static |
| 4438 compiler::Node* LessThanStub::Generate(CodeStubAssembler* assembler, | 4438 compiler::Node* LessThanStub::Generate(CodeStubAssembler* assembler, |
| 4439 compiler::Node* lhs, compiler::Node* rhs, | 4439 compiler::Node* lhs, compiler::Node* rhs, |
| 4440 compiler::Node* context) { | 4440 compiler::Node* context) { |
| 4441 return GenerateAbstractRelationalComparison(assembler, kLessThan, lhs, rhs, | 4441 return GenerateAbstractRelationalComparison(assembler, kLessThan, lhs, rhs, |
| 4442 context); | 4442 context); |
| (...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5186 Node* compiler_hints = assembler->LoadObjectField( | 5186 Node* compiler_hints = assembler->LoadObjectField( |
| 5187 shared_info, SharedFunctionInfo::kCompilerHintsOffset, | 5187 shared_info, SharedFunctionInfo::kCompilerHintsOffset, |
| 5188 MachineType::Uint32()); | 5188 MachineType::Uint32()); |
| 5189 Node* is_strict = assembler->Word32And( | 5189 Node* is_strict = assembler->Word32And( |
| 5190 compiler_hints, | 5190 compiler_hints, |
| 5191 assembler->Int32Constant(1 << SharedFunctionInfo::kStrictModeBit)); | 5191 assembler->Int32Constant(1 << SharedFunctionInfo::kStrictModeBit)); |
| 5192 | 5192 |
| 5193 Label if_normal(assembler), if_generator(assembler), if_async(assembler), | 5193 Label if_normal(assembler), if_generator(assembler), if_async(assembler), |
| 5194 if_class_constructor(assembler), if_function_without_prototype(assembler), | 5194 if_class_constructor(assembler), if_function_without_prototype(assembler), |
| 5195 load_map(assembler); | 5195 load_map(assembler); |
| 5196 Variable map_index(assembler, MachineRepresentation::kTagged); | 5196 Variable map_index(assembler, MachineType::PointerRepresentation()); |
| 5197 | 5197 |
| 5198 Node* is_not_normal = assembler->Word32And( | 5198 Node* is_not_normal = assembler->Word32And( |
| 5199 compiler_hints, | 5199 compiler_hints, |
| 5200 assembler->Int32Constant(SharedFunctionInfo::kFunctionKindMaskBits)); | 5200 assembler->Int32Constant(SharedFunctionInfo::kFunctionKindMaskBits)); |
| 5201 assembler->GotoUnless(is_not_normal, &if_normal); | 5201 assembler->GotoUnless(is_not_normal, &if_normal); |
| 5202 | 5202 |
| 5203 Node* is_generator = assembler->Word32And( | 5203 Node* is_generator = assembler->Word32And( |
| 5204 compiler_hints, | 5204 compiler_hints, |
| 5205 assembler->Int32Constant(1 << SharedFunctionInfo::kIsGeneratorBit)); | 5205 assembler->Int32Constant(1 << SharedFunctionInfo::kIsGeneratorBit)); |
| 5206 assembler->GotoIf(is_generator, &if_generator); | 5206 assembler->GotoIf(is_generator, &if_generator); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 5221 compiler_hints, assembler->Int32Constant( | 5221 compiler_hints, assembler->Int32Constant( |
| 5222 SharedFunctionInfo::kAccessorFunctionBits | | 5222 SharedFunctionInfo::kAccessorFunctionBits | |
| 5223 (1 << SharedFunctionInfo::kIsArrowBit) | | 5223 (1 << SharedFunctionInfo::kIsArrowBit) | |
| 5224 (1 << SharedFunctionInfo::kIsConciseMethodBit)))); | 5224 (1 << SharedFunctionInfo::kIsConciseMethodBit)))); |
| 5225 } | 5225 } |
| 5226 assembler->Goto(&if_function_without_prototype); | 5226 assembler->Goto(&if_function_without_prototype); |
| 5227 | 5227 |
| 5228 assembler->Bind(&if_normal); | 5228 assembler->Bind(&if_normal); |
| 5229 { | 5229 { |
| 5230 map_index.Bind(assembler->Select( | 5230 map_index.Bind(assembler->Select( |
| 5231 is_strict, assembler->Int32Constant(Context::STRICT_FUNCTION_MAP_INDEX), | 5231 is_strict, |
| 5232 assembler->Int32Constant(Context::SLOPPY_FUNCTION_MAP_INDEX))); | 5232 assembler->IntPtrConstant(Context::STRICT_FUNCTION_MAP_INDEX), |
| 5233 assembler->IntPtrConstant(Context::SLOPPY_FUNCTION_MAP_INDEX))); |
| 5233 assembler->Goto(&load_map); | 5234 assembler->Goto(&load_map); |
| 5234 } | 5235 } |
| 5235 | 5236 |
| 5236 assembler->Bind(&if_generator); | 5237 assembler->Bind(&if_generator); |
| 5237 { | 5238 { |
| 5238 map_index.Bind(assembler->Select( | 5239 map_index.Bind(assembler->Select( |
| 5239 is_strict, | 5240 is_strict, |
| 5240 assembler->Int32Constant(Context::STRICT_GENERATOR_FUNCTION_MAP_INDEX), | 5241 assembler->IntPtrConstant(Context::STRICT_GENERATOR_FUNCTION_MAP_INDEX), |
| 5241 assembler->Int32Constant( | 5242 assembler->IntPtrConstant( |
| 5242 Context::SLOPPY_GENERATOR_FUNCTION_MAP_INDEX))); | 5243 Context::SLOPPY_GENERATOR_FUNCTION_MAP_INDEX))); |
| 5243 assembler->Goto(&load_map); | 5244 assembler->Goto(&load_map); |
| 5244 } | 5245 } |
| 5245 | 5246 |
| 5246 assembler->Bind(&if_async); | 5247 assembler->Bind(&if_async); |
| 5247 { | 5248 { |
| 5248 map_index.Bind(assembler->Select( | 5249 map_index.Bind(assembler->Select( |
| 5249 is_strict, | 5250 is_strict, |
| 5250 assembler->Int32Constant(Context::STRICT_ASYNC_FUNCTION_MAP_INDEX), | 5251 assembler->IntPtrConstant(Context::STRICT_ASYNC_FUNCTION_MAP_INDEX), |
| 5251 assembler->Int32Constant(Context::SLOPPY_ASYNC_FUNCTION_MAP_INDEX))); | 5252 assembler->IntPtrConstant(Context::SLOPPY_ASYNC_FUNCTION_MAP_INDEX))); |
| 5252 assembler->Goto(&load_map); | 5253 assembler->Goto(&load_map); |
| 5253 } | 5254 } |
| 5254 | 5255 |
| 5255 assembler->Bind(&if_class_constructor); | 5256 assembler->Bind(&if_class_constructor); |
| 5256 { | 5257 { |
| 5257 map_index.Bind( | 5258 map_index.Bind( |
| 5258 assembler->Int32Constant(Context::STRICT_FUNCTION_MAP_INDEX)); | 5259 assembler->IntPtrConstant(Context::STRICT_FUNCTION_MAP_INDEX)); |
| 5259 assembler->Goto(&load_map); | 5260 assembler->Goto(&load_map); |
| 5260 } | 5261 } |
| 5261 | 5262 |
| 5262 assembler->Bind(&if_function_without_prototype); | 5263 assembler->Bind(&if_function_without_prototype); |
| 5263 { | 5264 { |
| 5264 map_index.Bind(assembler->Int32Constant( | 5265 map_index.Bind(assembler->IntPtrConstant( |
| 5265 Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX)); | 5266 Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX)); |
| 5266 assembler->Goto(&load_map); | 5267 assembler->Goto(&load_map); |
| 5267 } | 5268 } |
| 5268 | 5269 |
| 5269 assembler->Bind(&load_map); | 5270 assembler->Bind(&load_map); |
| 5270 | 5271 |
| 5271 // Get the function map in the current native context and set that | 5272 // Get the function map in the current native context and set that |
| 5272 // as the map of the allocated object. | 5273 // as the map of the allocated object. |
| 5273 Node* native_context = assembler->LoadNativeContext(context); | 5274 Node* native_context = assembler->LoadNativeContext(context); |
| 5274 Node* map_slot_value = | 5275 Node* map_slot_value = |
| 5275 assembler->LoadFixedArrayElement(native_context, map_index.value()); | 5276 assembler->LoadFixedArrayElement(native_context, map_index.value(), 0, |
| 5277 CodeStubAssembler::INTPTR_PARAMETERS); |
| 5276 assembler->StoreMapNoWriteBarrier(result, map_slot_value); | 5278 assembler->StoreMapNoWriteBarrier(result, map_slot_value); |
| 5277 | 5279 |
| 5278 // Initialize the rest of the function. | 5280 // Initialize the rest of the function. |
| 5279 Node* empty_fixed_array = | 5281 Node* empty_fixed_array = |
| 5280 assembler->HeapConstant(factory->empty_fixed_array()); | 5282 assembler->HeapConstant(factory->empty_fixed_array()); |
| 5281 Node* empty_literals_array = | 5283 Node* empty_literals_array = |
| 5282 assembler->HeapConstant(factory->empty_literals_array()); | 5284 assembler->HeapConstant(factory->empty_literals_array()); |
| 5283 assembler->StoreObjectFieldNoWriteBarrier(result, JSObject::kPropertiesOffset, | 5285 assembler->StoreObjectFieldNoWriteBarrier(result, JSObject::kPropertiesOffset, |
| 5284 empty_fixed_array); | 5286 empty_fixed_array); |
| 5285 assembler->StoreObjectFieldNoWriteBarrier(result, JSObject::kElementsOffset, | 5287 assembler->StoreObjectFieldNoWriteBarrier(result, JSObject::kElementsOffset, |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5848 | 5850 |
| 5849 if (type == MachineType::Pointer()) { | 5851 if (type == MachineType::Pointer()) { |
| 5850 return Representation::External(); | 5852 return Representation::External(); |
| 5851 } | 5853 } |
| 5852 | 5854 |
| 5853 return Representation::Tagged(); | 5855 return Representation::Tagged(); |
| 5854 } | 5856 } |
| 5855 | 5857 |
| 5856 } // namespace internal | 5858 } // namespace internal |
| 5857 } // namespace v8 | 5859 } // namespace v8 |
| OLD | NEW |