diff --git a/src/ast.h b/src/ast.h index 92d3cb6a6c..6d6e566c03 100644 --- a/src/ast.h +++ b/src/ast.h @@ -1276,7 +1276,6 @@ class FunctionLiteral: public Expression { ZoneList* body, int materialized_literal_count, int expected_property_count, - bool has_only_this_property_assignments, bool has_only_simple_this_property_assignments, Handle this_property_assignments, int num_parameters, @@ -1288,7 +1287,6 @@ class FunctionLiteral: public Expression { body_(body), materialized_literal_count_(materialized_literal_count), expected_property_count_(expected_property_count), - has_only_this_property_assignments_(has_only_this_property_assignments), has_only_simple_this_property_assignments_( has_only_simple_this_property_assignments), this_property_assignments_(this_property_assignments), @@ -1321,9 +1319,6 @@ class FunctionLiteral: public Expression { int materialized_literal_count() { return materialized_literal_count_; } int expected_property_count() { return expected_property_count_; } - bool has_only_this_property_assignments() { - return has_only_this_property_assignments_; - } bool has_only_simple_this_property_assignments() { return has_only_simple_this_property_assignments_; } @@ -1358,7 +1353,6 @@ class FunctionLiteral: public Expression { ZoneList* body_; int materialized_literal_count_; int expected_property_count_; - bool has_only_this_property_assignments_; bool has_only_simple_this_property_assignments_; Handle this_property_assignments_; int num_parameters_; diff --git a/src/compiler.cc b/src/compiler.cc index 6be922ceed..b06a6b7e59 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -465,7 +465,6 @@ bool Compiler::CompileLazy(Handle shared, // Set the optimication hints after performing lazy compilation, as these are // not set when the function is set up as a lazily compiled function. shared->SetThisPropertyAssignmentsInfo( - lit->has_only_this_property_assignments(), lit->has_only_simple_this_property_assignments(), *lit->this_property_assignments()); @@ -576,7 +575,6 @@ void Compiler::SetFunctionInfo(Handle fun, fun->shared()->set_is_toplevel(is_toplevel); fun->shared()->set_inferred_name(*lit->inferred_name()); fun->shared()->SetThisPropertyAssignmentsInfo( - lit->has_only_this_property_assignments(), lit->has_only_simple_this_property_assignments(), *lit->this_property_assignments()); fun->shared()->set_try_fast_codegen(lit->try_fast_codegen()); diff --git a/src/objects-debug.cc b/src/objects-debug.cc index 55438eca1c..49b6cb1385 100644 --- a/src/objects-debug.cc +++ b/src/objects-debug.cc @@ -784,8 +784,6 @@ void SharedFunctionInfo::SharedFunctionInfoPrint() { PrintF("\n - debug info = "); debug_info()->ShortPrint(); PrintF("\n - length = %d", length()); - PrintF("\n - has_only_this_property_assignments = %d", - has_only_this_property_assignments()); PrintF("\n - has_only_simple_this_property_assignments = %d", has_only_simple_this_property_assignments()); PrintF("\n - this_property_assignments = "); diff --git a/src/objects-inl.h b/src/objects-inl.h index 8de9d360d9..309f1aeba1 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -2479,9 +2479,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression, kIsExpressionBit) BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel, kIsTopLevelBit) -BOOL_GETTER(SharedFunctionInfo, compiler_hints, - has_only_this_property_assignments, - kHasOnlyThisPropertyAssignments) BOOL_GETTER(SharedFunctionInfo, compiler_hints, has_only_simple_this_property_assignments, kHasOnlySimpleThisPropertyAssignments) diff --git a/src/objects.cc b/src/objects.cc index 6582fc1a09..45865f27c2 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -4813,12 +4813,8 @@ int SharedFunctionInfo::CalculateInObjectProperties() { void SharedFunctionInfo::SetThisPropertyAssignmentsInfo( - bool only_this_property_assignments, bool only_simple_this_property_assignments, FixedArray* assignments) { - set_compiler_hints(BooleanBit::set(compiler_hints(), - kHasOnlyThisPropertyAssignments, - only_this_property_assignments)); set_compiler_hints(BooleanBit::set(compiler_hints(), kHasOnlySimpleThisPropertyAssignments, only_simple_this_property_assignments)); @@ -4828,9 +4824,6 @@ void SharedFunctionInfo::SetThisPropertyAssignmentsInfo( void SharedFunctionInfo::ClearThisPropertyAssignmentsInfo() { - set_compiler_hints(BooleanBit::set(compiler_hints(), - kHasOnlyThisPropertyAssignments, - false)); set_compiler_hints(BooleanBit::set(compiler_hints(), kHasOnlySimpleThisPropertyAssignments, false)); diff --git a/src/objects.h b/src/objects.h index f802246347..1d55e237c3 100644 --- a/src/objects.h +++ b/src/objects.h @@ -3289,17 +3289,12 @@ class SharedFunctionInfo: public HeapObject { // Add information on assignments of the form this.x = ...; void SetThisPropertyAssignmentsInfo( - bool has_only_this_property_assignments, bool has_only_simple_this_property_assignments, FixedArray* this_property_assignments); // Clear information on assignments of the form this.x = ...; void ClearThisPropertyAssignmentsInfo(); - // Indicate that this function only consists of assignments of the form - // this.x = ...;. - inline bool has_only_this_property_assignments(); - // Indicate that this function only consists of assignments of the form // this.x = y; where y is either a constant or refers to an argument. inline bool has_only_simple_this_property_assignments(); @@ -3385,9 +3380,8 @@ class SharedFunctionInfo: public HeapObject { static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); // Bit positions in compiler_hints. - static const int kHasOnlyThisPropertyAssignments = 0; - static const int kHasOnlySimpleThisPropertyAssignments = 1; - static const int kTryFastCodegen = 2; + static const int kHasOnlySimpleThisPropertyAssignments = 0; + static const int kTryFastCodegen = 1; DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); }; diff --git a/src/parser.cc b/src/parser.cc index d64d8befd5..fd9a80b9f3 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -676,17 +676,12 @@ class TemporaryScope BASE_EMBEDDED { int materialized_literal_count() { return materialized_literal_count_; } void SetThisPropertyAssignmentInfo( - bool only_this_property_assignments, bool only_simple_this_property_assignments, Handle this_property_assignments) { - only_this_property_assignments_ = only_this_property_assignments; only_simple_this_property_assignments_ = only_simple_this_property_assignments; this_property_assignments_ = this_property_assignments; } - bool only_this_property_assignments() { - return only_this_property_assignments_; - } bool only_simple_this_property_assignments() { return only_simple_this_property_assignments_; } @@ -705,7 +700,6 @@ class TemporaryScope BASE_EMBEDDED { // Properties count estimation. int expected_property_count_; - bool only_this_property_assignments_; bool only_simple_this_property_assignments_; Handle this_property_assignments_; @@ -720,7 +714,6 @@ class TemporaryScope BASE_EMBEDDED { TemporaryScope::TemporaryScope(Parser* parser) : materialized_literal_count_(0), expected_property_count_(0), - only_this_property_assignments_(false), only_simple_this_property_assignments_(false), this_property_assignments_(Factory::empty_fixed_array()), parser_(parser), @@ -1227,7 +1220,6 @@ FunctionLiteral* Parser::ParseProgram(Handle source, body.elements(), temp_scope.materialized_literal_count(), temp_scope.expected_property_count(), - temp_scope.only_this_property_assignments(), temp_scope.only_simple_this_property_assignments(), temp_scope.this_property_assignments(), 0, @@ -1441,16 +1433,15 @@ class InitializationBlockFinder : public ParserFinder { class ThisNamedPropertyAssigmentFinder : public ParserFinder { public: ThisNamedPropertyAssigmentFinder() - : only_this_property_assignments_(true), - only_simple_this_property_assignments_(true), + : only_simple_this_property_assignments_(true), names_(NULL), assigned_arguments_(NULL), assigned_constants_(NULL) {} void Update(Scope* scope, Statement* stat) { - // Bail out if function already has non this property assignment - // statements. - if (!only_this_property_assignments_) { + // Bail out if function already has property assignment that are + // not simple this property assignments. + if (!only_simple_this_property_assignments_) { return; } @@ -1459,16 +1450,10 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { if (IsThisPropertyAssignment(assignment)) { HandleThisPropertyAssignment(scope, assignment); } else { - only_this_property_assignments_ = false; only_simple_this_property_assignments_ = false; } } - // Returns whether only statements of the form this.x = ...; was encountered. - bool only_this_property_assignments() { - return only_this_property_assignments_; - } - // Returns whether only statements of the form this.x = y; where y is either a // constant or a function argument was encountered. bool only_simple_this_property_assignments() { @@ -1524,28 +1509,24 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { // Constant assigned. Literal* literal = assignment->value()->AsLiteral(); AssignmentFromConstant(key, literal->handle()); + return; } else if (assignment->value()->AsVariableProxy() != NULL) { // Variable assigned. Handle name = assignment->value()->AsVariableProxy()->name(); // Check whether the variable assigned matches an argument name. - int index = -1; for (int i = 0; i < scope->num_parameters(); i++) { if (*scope->parameter(i)->name() == *name) { // Assigned from function argument. - index = i; - break; + AssignmentFromParameter(key, i); + return; } } - if (index != -1) { - AssignmentFromParameter(key, index); - } else { - AssignmentFromSomethingElse(key); - } - } else { - AssignmentFromSomethingElse(key); } } + // It is not a simple "this.x = value;" assignment with a constant + // or parameter value. + AssignmentFromSomethingElse(); } void AssignmentFromParameter(Handle name, int index) { @@ -1562,12 +1543,7 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { assigned_constants_->Add(value); } - void AssignmentFromSomethingElse(Handle name) { - EnsureAllocation(); - names_->Add(name); - assigned_arguments_->Add(-1); - assigned_constants_->Add(Factory::undefined_value()); - + void AssignmentFromSomethingElse() { // The this assignment is not a simple one. only_simple_this_property_assignments_ = false; } @@ -1582,7 +1558,6 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { } } - bool only_this_property_assignments_; bool only_simple_this_property_assignments_; ZoneStringList* names_; ZoneList* assigned_arguments_; @@ -1623,11 +1598,11 @@ void* Parser::ParseSourceElements(ZoneListWrapper* processor, // Propagate the collected information on this property assignments. if (top_scope_->is_function_scope()) { - if (this_property_assignment_finder.only_this_property_assignments()) { + bool only_simple_this_property_assignments = + this_property_assignment_finder.only_simple_this_property_assignments(); + if (only_simple_this_property_assignments) { temp_scope_->SetThisPropertyAssignmentInfo( - this_property_assignment_finder.only_this_property_assignments(), - this_property_assignment_finder. - only_simple_this_property_assignments(), + only_simple_this_property_assignments, this_property_assignment_finder.GetThisPropertyAssignments()); } } @@ -3624,7 +3599,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle var_name, int materialized_literal_count; int expected_property_count; - bool only_this_property_assignments; bool only_simple_this_property_assignments; Handle this_property_assignments; if (is_lazily_compiled && pre_data() != NULL) { @@ -3634,15 +3608,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle var_name, scanner_.SeekForward(end_pos); materialized_literal_count = entry.literal_count(); expected_property_count = entry.property_count(); - only_this_property_assignments = false; only_simple_this_property_assignments = false; this_property_assignments = Factory::empty_fixed_array(); } else { ParseSourceElements(&body, Token::RBRACE, CHECK_OK); materialized_literal_count = temp_scope.materialized_literal_count(); expected_property_count = temp_scope.expected_property_count(); - only_this_property_assignments = - temp_scope.only_this_property_assignments(); only_simple_this_property_assignments = temp_scope.only_simple_this_property_assignments(); this_property_assignments = temp_scope.this_property_assignments(); @@ -3664,7 +3635,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle var_name, body.elements(), materialized_literal_count, expected_property_count, - only_this_property_assignments, only_simple_this_property_assignments, this_property_assignments, num_parameters, diff --git a/test/mjsunit/regress/regress-502.js b/test/mjsunit/regress/regress-502.js new file mode 100644 index 0000000000..d3c9381da8 --- /dev/null +++ b/test/mjsunit/regress/regress-502.js @@ -0,0 +1,38 @@ +// Copyright 2009 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Regression test for http://code.google.com/p/v8/issues/detail?id=502. +// +// Test that we do not generate an inlined version of the constructor +// function C. + +var X = 'x'; +function C() { this[X] = 42; } +var a = new C(); +var b = new C(); +assertEquals(42, a.x); +assertEquals(42, b.x);