Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index bd1dd403a79cbd397b2a9c56a48a590c71443216..6449ffcb1fd158c3d8d940a3f8a4acae24b398bf 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -2226,6 +2226,8 @@ class HInvokeFunction: public HBinaryCall { |
| int argument_count) |
| : HBinaryCall(context, function, argument_count), |
| known_function_(known_function) { |
| + formal_parameter_count_ = known_function.is_null() |
| + ? 0 : known_function->shared()->formal_parameter_count(); |
| } |
| virtual Representation RequiredInputRepresentation(int index) { |
| @@ -2235,20 +2237,25 @@ class HInvokeFunction: public HBinaryCall { |
| HValue* context() { return first(); } |
| HValue* function() { return second(); } |
| Handle<JSFunction> known_function() { return known_function_; } |
| + int formal_parameter_count() const { return formal_parameter_count_; } |
| DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) |
| private: |
| Handle<JSFunction> known_function_; |
| + int formal_parameter_count_; |
| }; |
| class HCallConstantFunction: public HCall<0> { |
| public: |
| HCallConstantFunction(Handle<JSFunction> function, int argument_count) |
| - : HCall<0>(argument_count), function_(function) { } |
| + : HCall<0>(argument_count), |
| + function_(function), |
| + formal_parameter_count_(function->shared()->formal_parameter_count()) {} |
| Handle<JSFunction> function() const { return function_; } |
| + int formal_parameter_count() const { return formal_parameter_count_; } |
| bool IsApplyFunction() const { |
| return function_->code() == |
| @@ -2265,6 +2272,7 @@ class HCallConstantFunction: public HCall<0> { |
| private: |
| Handle<JSFunction> function_; |
| + int formal_parameter_count_; |
| }; |
| @@ -2349,11 +2357,14 @@ class HCallGlobal: public HUnaryCall { |
| class HCallKnownGlobal: public HCall<0> { |
| public: |
| HCallKnownGlobal(Handle<JSFunction> target, int argument_count) |
| - : HCall<0>(argument_count), target_(target) { } |
| + : HCall<0>(argument_count), |
| + target_(target), |
| + formal_parameter_count_(target->shared()->formal_parameter_count()) { } |
| virtual void PrintDataTo(StringStream* stream); |
| Handle<JSFunction> target() const { return target_; } |
| + int formal_parameter_count() const { return formal_parameter_count_; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| return Representation::None(); |
| @@ -2363,6 +2374,7 @@ class HCallKnownGlobal: public HCall<0> { |
| private: |
| Handle<JSFunction> target_; |
| + int formal_parameter_count_; |
| }; |
| @@ -3231,8 +3243,9 @@ class HConstant: public HTemplateInstruction<0> { |
| Handle<Object> handle() { |
| if (handle_.is_null()) { |
| - handle_ = FACTORY->NewNumber(double_value_, TENURED); |
| + handle_ = isolate()->factory()->NewNumber(double_value_, TENURED); |
| } |
| + ALLOW_HANDLE_DEREF(isolate(), "smi check"); |
| ASSERT(has_int32_value_ || !handle_->IsSmi()); |
| return handle_; |
| } |
| @@ -3256,8 +3269,6 @@ class HConstant: public HTemplateInstruction<0> { |
| } |
| ASSERT(!handle_.is_null()); |
| - HandleDereferenceGuard allow_dereference_for_immovable_check( |
| - isolate(), HandleDereferenceGuard::ALLOW); |
| Heap* heap = isolate()->heap(); |
| ASSERT(unique_id_ != UniqueValueId(heap->minus_zero_value())); |
| ASSERT(unique_id_ != UniqueValueId(heap->nan_value())); |
| @@ -4880,6 +4891,12 @@ class HAllocateObject: public HTemplateInstruction<1> { |
| SetOperandAt(0, context); |
| set_representation(Representation::Tagged()); |
| SetGVNFlag(kChangesNewSpacePromotion); |
| + constructor_initial_map_ = constructor->has_initial_map() |
| + ? Handle<Map>(constructor->initial_map()) |
| + : Handle<Map>::null(); |
| + // If slack tracking finished, the instance size and property counts |
| + // remain unchanged so that we can allocate memory for the object. |
| + ASSERT(!constructor->shared()->IsInobjectSlackTrackingInProgress()); |
|
mvstanton
2013/04/23 08:58:50
I like the assert but how do you know slack tracki
Yang
2013/04/23 09:19:09
I simply moved this assertion from lithium. The us
|
| } |
| // Maximum instance size for which allocations will be inlined. |
| @@ -4887,13 +4904,14 @@ class HAllocateObject: public HTemplateInstruction<1> { |
| HValue* context() { return OperandAt(0); } |
| Handle<JSFunction> constructor() { return constructor_; } |
| + Handle<Map> constructor_initial_map() { return constructor_initial_map_; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| return Representation::Tagged(); |
| } |
| virtual Handle<Map> GetMonomorphicJSObjectMap() { |
| - ASSERT(constructor()->has_initial_map()); |
| - return Handle<Map>(constructor()->initial_map()); |
| + ASSERT(!constructor_initial_map_.is_null()); |
| + return constructor_initial_map_; |
| } |
| virtual HType CalculateInferredType(); |
| @@ -4904,6 +4922,7 @@ class HAllocateObject: public HTemplateInstruction<1> { |
| // virtual bool IsDeletable() const { return true; } |
| Handle<JSFunction> constructor_; |
| + Handle<Map> constructor_initial_map_; |
| }; |
| @@ -6051,27 +6070,35 @@ class HArrayLiteral: public HMaterializedLiteral<1> { |
| public: |
| HArrayLiteral(HValue* context, |
| Handle<HeapObject> boilerplate_object, |
| + Handle<FixedArray> literals, |
| int length, |
| int literal_index, |
| int depth, |
| AllocationSiteMode mode) |
| : HMaterializedLiteral<1>(literal_index, depth, mode), |
| length_(length), |
| - boilerplate_object_(boilerplate_object) { |
| + boilerplate_object_(boilerplate_object), |
| + literals_(literals) { |
| SetOperandAt(0, context); |
| SetGVNFlag(kChangesNewSpacePromotion); |
| + |
| + boilerplate_elements_kind_ = boilerplate_object_->IsJSObject() |
| + ? Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind() |
| + : TERMINAL_FAST_ELEMENTS_KIND; |
| + |
| + is_copy_on_write_ = boilerplate_object_->IsJSObject() && |
| + (Handle<JSObject>::cast(boilerplate_object_)->elements()->map() == |
| + HEAP->fixed_cow_array_map()); |
| } |
| HValue* context() { return OperandAt(0); } |
| ElementsKind boilerplate_elements_kind() const { |
| - if (!boilerplate_object_->IsJSObject()) { |
| - return TERMINAL_FAST_ELEMENTS_KIND; |
| - } |
| - return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind(); |
| + return boilerplate_elements_kind_; |
| } |
| Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; } |
| + Handle<FixedArray> literals() const { return literals_; } |
| int length() const { return length_; } |
| - bool IsCopyOnWrite() const; |
| + bool IsCopyOnWrite() const { return is_copy_on_write_; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| return Representation::Tagged(); |
| @@ -6083,6 +6110,9 @@ class HArrayLiteral: public HMaterializedLiteral<1> { |
| private: |
| int length_; |
| Handle<HeapObject> boilerplate_object_; |
| + Handle<FixedArray> literals_; |
| + ElementsKind boilerplate_elements_kind_; |
| + bool is_copy_on_write_; |
| }; |
| @@ -6090,12 +6120,15 @@ class HObjectLiteral: public HMaterializedLiteral<1> { |
| public: |
| HObjectLiteral(HValue* context, |
| Handle<FixedArray> constant_properties, |
| + Handle<FixedArray> literals, |
| bool fast_elements, |
| int literal_index, |
| int depth, |
| bool has_function) |
| : HMaterializedLiteral<1>(literal_index, depth), |
| constant_properties_(constant_properties), |
| + constant_properties_length_(constant_properties->length()), |
| + literals_(literals), |
| fast_elements_(fast_elements), |
| has_function_(has_function) { |
| SetOperandAt(0, context); |
| @@ -6106,6 +6139,10 @@ class HObjectLiteral: public HMaterializedLiteral<1> { |
| Handle<FixedArray> constant_properties() const { |
| return constant_properties_; |
| } |
| + int constant_properties_length() const { |
| + return constant_properties_length_; |
| + } |
| + Handle<FixedArray> literals() const { return literals_; } |
| bool fast_elements() const { return fast_elements_; } |
| bool has_function() const { return has_function_; } |
| @@ -6118,8 +6155,10 @@ class HObjectLiteral: public HMaterializedLiteral<1> { |
| private: |
| Handle<FixedArray> constant_properties_; |
| - bool fast_elements_; |
| - bool has_function_; |
| + int constant_properties_length_; |
| + Handle<FixedArray> literals_; |
| + bool fast_elements_ : 1; |
| + bool has_function_ : 1; |
| }; |
| @@ -6162,7 +6201,11 @@ class HFunctionLiteral: public HTemplateInstruction<1> { |
| HFunctionLiteral(HValue* context, |
| Handle<SharedFunctionInfo> shared, |
| bool pretenure) |
| - : shared_info_(shared), pretenure_(pretenure) { |
| + : shared_info_(shared), |
| + pretenure_(pretenure), |
| + has_no_literals_(shared->num_literals() == 0), |
| + is_generator_(shared->is_generator()), |
| + language_mode_(shared->language_mode()) { |
| SetOperandAt(0, context); |
| set_representation(Representation::Tagged()); |
| SetGVNFlag(kChangesNewSpacePromotion); |
| @@ -6179,12 +6222,18 @@ class HFunctionLiteral: public HTemplateInstruction<1> { |
| Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
| bool pretenure() const { return pretenure_; } |
| + bool has_no_literals() const { return has_no_literals_; } |
| + bool is_generator() const { return is_generator_; } |
| + LanguageMode language_mode() const { return language_mode_; } |
| private: |
| virtual bool IsDeletable() const { return true; } |
| Handle<SharedFunctionInfo> shared_info_; |
| - bool pretenure_; |
| + bool pretenure_ : 1; |
| + bool has_no_literals_ : 1; |
| + bool is_generator_ : 1; |
| + LanguageMode language_mode_; |
| }; |