| 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());
|
| }
|
|
|
| // 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_;
|
| };
|
|
|
|
|
|
|