Commit 2252cc1b authored by ager@chromium.org's avatar ager@chromium.org

Fix inline constructor code bailout.

Remove variable that is currently unused.

BUG=http://code.google.com/p/v8/issues/detail?id=502
Review URL: http://codereview.chromium.org/392001

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3267 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 0c6dc2c5
...@@ -1276,7 +1276,6 @@ class FunctionLiteral: public Expression { ...@@ -1276,7 +1276,6 @@ class FunctionLiteral: public Expression {
ZoneList<Statement*>* body, ZoneList<Statement*>* body,
int materialized_literal_count, int materialized_literal_count,
int expected_property_count, int expected_property_count,
bool has_only_this_property_assignments,
bool has_only_simple_this_property_assignments, bool has_only_simple_this_property_assignments,
Handle<FixedArray> this_property_assignments, Handle<FixedArray> this_property_assignments,
int num_parameters, int num_parameters,
...@@ -1288,7 +1287,6 @@ class FunctionLiteral: public Expression { ...@@ -1288,7 +1287,6 @@ class FunctionLiteral: public Expression {
body_(body), body_(body),
materialized_literal_count_(materialized_literal_count), materialized_literal_count_(materialized_literal_count),
expected_property_count_(expected_property_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_(
has_only_simple_this_property_assignments), has_only_simple_this_property_assignments),
this_property_assignments_(this_property_assignments), this_property_assignments_(this_property_assignments),
...@@ -1321,9 +1319,6 @@ class FunctionLiteral: public Expression { ...@@ -1321,9 +1319,6 @@ class FunctionLiteral: public Expression {
int materialized_literal_count() { return materialized_literal_count_; } int materialized_literal_count() { return materialized_literal_count_; }
int expected_property_count() { return expected_property_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() { bool has_only_simple_this_property_assignments() {
return has_only_simple_this_property_assignments_; return has_only_simple_this_property_assignments_;
} }
...@@ -1358,7 +1353,6 @@ class FunctionLiteral: public Expression { ...@@ -1358,7 +1353,6 @@ class FunctionLiteral: public Expression {
ZoneList<Statement*>* body_; ZoneList<Statement*>* body_;
int materialized_literal_count_; int materialized_literal_count_;
int expected_property_count_; int expected_property_count_;
bool has_only_this_property_assignments_;
bool has_only_simple_this_property_assignments_; bool has_only_simple_this_property_assignments_;
Handle<FixedArray> this_property_assignments_; Handle<FixedArray> this_property_assignments_;
int num_parameters_; int num_parameters_;
......
...@@ -465,7 +465,6 @@ bool Compiler::CompileLazy(Handle<SharedFunctionInfo> shared, ...@@ -465,7 +465,6 @@ bool Compiler::CompileLazy(Handle<SharedFunctionInfo> shared,
// Set the optimication hints after performing lazy compilation, as these are // Set the optimication hints after performing lazy compilation, as these are
// not set when the function is set up as a lazily compiled function. // not set when the function is set up as a lazily compiled function.
shared->SetThisPropertyAssignmentsInfo( shared->SetThisPropertyAssignmentsInfo(
lit->has_only_this_property_assignments(),
lit->has_only_simple_this_property_assignments(), lit->has_only_simple_this_property_assignments(),
*lit->this_property_assignments()); *lit->this_property_assignments());
...@@ -576,7 +575,6 @@ void Compiler::SetFunctionInfo(Handle<JSFunction> fun, ...@@ -576,7 +575,6 @@ void Compiler::SetFunctionInfo(Handle<JSFunction> fun,
fun->shared()->set_is_toplevel(is_toplevel); fun->shared()->set_is_toplevel(is_toplevel);
fun->shared()->set_inferred_name(*lit->inferred_name()); fun->shared()->set_inferred_name(*lit->inferred_name());
fun->shared()->SetThisPropertyAssignmentsInfo( fun->shared()->SetThisPropertyAssignmentsInfo(
lit->has_only_this_property_assignments(),
lit->has_only_simple_this_property_assignments(), lit->has_only_simple_this_property_assignments(),
*lit->this_property_assignments()); *lit->this_property_assignments());
fun->shared()->set_try_fast_codegen(lit->try_fast_codegen()); fun->shared()->set_try_fast_codegen(lit->try_fast_codegen());
......
...@@ -784,8 +784,6 @@ void SharedFunctionInfo::SharedFunctionInfoPrint() { ...@@ -784,8 +784,6 @@ void SharedFunctionInfo::SharedFunctionInfoPrint() {
PrintF("\n - debug info = "); PrintF("\n - debug info = ");
debug_info()->ShortPrint(); debug_info()->ShortPrint();
PrintF("\n - length = %d", length()); 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", PrintF("\n - has_only_simple_this_property_assignments = %d",
has_only_simple_this_property_assignments()); has_only_simple_this_property_assignments());
PrintF("\n - this_property_assignments = "); PrintF("\n - this_property_assignments = ");
......
...@@ -2479,9 +2479,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression, ...@@ -2479,9 +2479,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
kIsExpressionBit) kIsExpressionBit)
BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel, BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
kIsTopLevelBit) kIsTopLevelBit)
BOOL_GETTER(SharedFunctionInfo, compiler_hints,
has_only_this_property_assignments,
kHasOnlyThisPropertyAssignments)
BOOL_GETTER(SharedFunctionInfo, compiler_hints, BOOL_GETTER(SharedFunctionInfo, compiler_hints,
has_only_simple_this_property_assignments, has_only_simple_this_property_assignments,
kHasOnlySimpleThisPropertyAssignments) kHasOnlySimpleThisPropertyAssignments)
......
...@@ -4813,12 +4813,8 @@ int SharedFunctionInfo::CalculateInObjectProperties() { ...@@ -4813,12 +4813,8 @@ int SharedFunctionInfo::CalculateInObjectProperties() {
void SharedFunctionInfo::SetThisPropertyAssignmentsInfo( void SharedFunctionInfo::SetThisPropertyAssignmentsInfo(
bool only_this_property_assignments,
bool only_simple_this_property_assignments, bool only_simple_this_property_assignments,
FixedArray* assignments) { FixedArray* assignments) {
set_compiler_hints(BooleanBit::set(compiler_hints(),
kHasOnlyThisPropertyAssignments,
only_this_property_assignments));
set_compiler_hints(BooleanBit::set(compiler_hints(), set_compiler_hints(BooleanBit::set(compiler_hints(),
kHasOnlySimpleThisPropertyAssignments, kHasOnlySimpleThisPropertyAssignments,
only_simple_this_property_assignments)); only_simple_this_property_assignments));
...@@ -4828,9 +4824,6 @@ void SharedFunctionInfo::SetThisPropertyAssignmentsInfo( ...@@ -4828,9 +4824,6 @@ void SharedFunctionInfo::SetThisPropertyAssignmentsInfo(
void SharedFunctionInfo::ClearThisPropertyAssignmentsInfo() { void SharedFunctionInfo::ClearThisPropertyAssignmentsInfo() {
set_compiler_hints(BooleanBit::set(compiler_hints(),
kHasOnlyThisPropertyAssignments,
false));
set_compiler_hints(BooleanBit::set(compiler_hints(), set_compiler_hints(BooleanBit::set(compiler_hints(),
kHasOnlySimpleThisPropertyAssignments, kHasOnlySimpleThisPropertyAssignments,
false)); false));
......
...@@ -3289,17 +3289,12 @@ class SharedFunctionInfo: public HeapObject { ...@@ -3289,17 +3289,12 @@ class SharedFunctionInfo: public HeapObject {
// Add information on assignments of the form this.x = ...; // Add information on assignments of the form this.x = ...;
void SetThisPropertyAssignmentsInfo( void SetThisPropertyAssignmentsInfo(
bool has_only_this_property_assignments,
bool has_only_simple_this_property_assignments, bool has_only_simple_this_property_assignments,
FixedArray* this_property_assignments); FixedArray* this_property_assignments);
// Clear information on assignments of the form this.x = ...; // Clear information on assignments of the form this.x = ...;
void ClearThisPropertyAssignmentsInfo(); 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 // 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. // this.x = y; where y is either a constant or refers to an argument.
inline bool has_only_simple_this_property_assignments(); inline bool has_only_simple_this_property_assignments();
...@@ -3385,9 +3380,8 @@ class SharedFunctionInfo: public HeapObject { ...@@ -3385,9 +3380,8 @@ class SharedFunctionInfo: public HeapObject {
static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1);
// Bit positions in compiler_hints. // Bit positions in compiler_hints.
static const int kHasOnlyThisPropertyAssignments = 0; static const int kHasOnlySimpleThisPropertyAssignments = 0;
static const int kHasOnlySimpleThisPropertyAssignments = 1; static const int kTryFastCodegen = 1;
static const int kTryFastCodegen = 2;
DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo);
}; };
......
...@@ -676,17 +676,12 @@ class TemporaryScope BASE_EMBEDDED { ...@@ -676,17 +676,12 @@ class TemporaryScope BASE_EMBEDDED {
int materialized_literal_count() { return materialized_literal_count_; } int materialized_literal_count() { return materialized_literal_count_; }
void SetThisPropertyAssignmentInfo( void SetThisPropertyAssignmentInfo(
bool only_this_property_assignments,
bool only_simple_this_property_assignments, bool only_simple_this_property_assignments,
Handle<FixedArray> this_property_assignments) { Handle<FixedArray> this_property_assignments) {
only_this_property_assignments_ = only_this_property_assignments;
only_simple_this_property_assignments_ = only_simple_this_property_assignments_ =
only_simple_this_property_assignments; only_simple_this_property_assignments;
this_property_assignments_ = 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() { bool only_simple_this_property_assignments() {
return only_simple_this_property_assignments_; return only_simple_this_property_assignments_;
} }
...@@ -705,7 +700,6 @@ class TemporaryScope BASE_EMBEDDED { ...@@ -705,7 +700,6 @@ class TemporaryScope BASE_EMBEDDED {
// Properties count estimation. // Properties count estimation.
int expected_property_count_; int expected_property_count_;
bool only_this_property_assignments_;
bool only_simple_this_property_assignments_; bool only_simple_this_property_assignments_;
Handle<FixedArray> this_property_assignments_; Handle<FixedArray> this_property_assignments_;
...@@ -720,7 +714,6 @@ class TemporaryScope BASE_EMBEDDED { ...@@ -720,7 +714,6 @@ class TemporaryScope BASE_EMBEDDED {
TemporaryScope::TemporaryScope(Parser* parser) TemporaryScope::TemporaryScope(Parser* parser)
: materialized_literal_count_(0), : materialized_literal_count_(0),
expected_property_count_(0), expected_property_count_(0),
only_this_property_assignments_(false),
only_simple_this_property_assignments_(false), only_simple_this_property_assignments_(false),
this_property_assignments_(Factory::empty_fixed_array()), this_property_assignments_(Factory::empty_fixed_array()),
parser_(parser), parser_(parser),
...@@ -1227,7 +1220,6 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source, ...@@ -1227,7 +1220,6 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source,
body.elements(), body.elements(),
temp_scope.materialized_literal_count(), temp_scope.materialized_literal_count(),
temp_scope.expected_property_count(), temp_scope.expected_property_count(),
temp_scope.only_this_property_assignments(),
temp_scope.only_simple_this_property_assignments(), temp_scope.only_simple_this_property_assignments(),
temp_scope.this_property_assignments(), temp_scope.this_property_assignments(),
0, 0,
...@@ -1441,16 +1433,15 @@ class InitializationBlockFinder : public ParserFinder { ...@@ -1441,16 +1433,15 @@ class InitializationBlockFinder : public ParserFinder {
class ThisNamedPropertyAssigmentFinder : public ParserFinder { class ThisNamedPropertyAssigmentFinder : public ParserFinder {
public: public:
ThisNamedPropertyAssigmentFinder() ThisNamedPropertyAssigmentFinder()
: only_this_property_assignments_(true), : only_simple_this_property_assignments_(true),
only_simple_this_property_assignments_(true),
names_(NULL), names_(NULL),
assigned_arguments_(NULL), assigned_arguments_(NULL),
assigned_constants_(NULL) {} assigned_constants_(NULL) {}
void Update(Scope* scope, Statement* stat) { void Update(Scope* scope, Statement* stat) {
// Bail out if function already has non this property assignment // Bail out if function already has property assignment that are
// statements. // not simple this property assignments.
if (!only_this_property_assignments_) { if (!only_simple_this_property_assignments_) {
return; return;
} }
...@@ -1459,16 +1450,10 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { ...@@ -1459,16 +1450,10 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder {
if (IsThisPropertyAssignment(assignment)) { if (IsThisPropertyAssignment(assignment)) {
HandleThisPropertyAssignment(scope, assignment); HandleThisPropertyAssignment(scope, assignment);
} else { } else {
only_this_property_assignments_ = false;
only_simple_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 // Returns whether only statements of the form this.x = y; where y is either a
// constant or a function argument was encountered. // constant or a function argument was encountered.
bool only_simple_this_property_assignments() { bool only_simple_this_property_assignments() {
...@@ -1524,28 +1509,24 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { ...@@ -1524,28 +1509,24 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder {
// Constant assigned. // Constant assigned.
Literal* literal = assignment->value()->AsLiteral(); Literal* literal = assignment->value()->AsLiteral();
AssignmentFromConstant(key, literal->handle()); AssignmentFromConstant(key, literal->handle());
return;
} else if (assignment->value()->AsVariableProxy() != NULL) { } else if (assignment->value()->AsVariableProxy() != NULL) {
// Variable assigned. // Variable assigned.
Handle<String> name = Handle<String> name =
assignment->value()->AsVariableProxy()->name(); assignment->value()->AsVariableProxy()->name();
// Check whether the variable assigned matches an argument name. // Check whether the variable assigned matches an argument name.
int index = -1;
for (int i = 0; i < scope->num_parameters(); i++) { for (int i = 0; i < scope->num_parameters(); i++) {
if (*scope->parameter(i)->name() == *name) { if (*scope->parameter(i)->name() == *name) {
// Assigned from function argument. // Assigned from function argument.
index = i; AssignmentFromParameter(key, i);
break; 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<String> name, int index) { void AssignmentFromParameter(Handle<String> name, int index) {
...@@ -1562,12 +1543,7 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { ...@@ -1562,12 +1543,7 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder {
assigned_constants_->Add(value); assigned_constants_->Add(value);
} }
void AssignmentFromSomethingElse(Handle<String> name) { void AssignmentFromSomethingElse() {
EnsureAllocation();
names_->Add(name);
assigned_arguments_->Add(-1);
assigned_constants_->Add(Factory::undefined_value());
// The this assignment is not a simple one. // The this assignment is not a simple one.
only_simple_this_property_assignments_ = false; only_simple_this_property_assignments_ = false;
} }
...@@ -1582,7 +1558,6 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder { ...@@ -1582,7 +1558,6 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder {
} }
} }
bool only_this_property_assignments_;
bool only_simple_this_property_assignments_; bool only_simple_this_property_assignments_;
ZoneStringList* names_; ZoneStringList* names_;
ZoneList<int>* assigned_arguments_; ZoneList<int>* assigned_arguments_;
...@@ -1623,11 +1598,11 @@ void* Parser::ParseSourceElements(ZoneListWrapper<Statement>* processor, ...@@ -1623,11 +1598,11 @@ void* Parser::ParseSourceElements(ZoneListWrapper<Statement>* processor,
// Propagate the collected information on this property assignments. // Propagate the collected information on this property assignments.
if (top_scope_->is_function_scope()) { 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( temp_scope_->SetThisPropertyAssignmentInfo(
this_property_assignment_finder.only_this_property_assignments(), only_simple_this_property_assignments,
this_property_assignment_finder.
only_simple_this_property_assignments(),
this_property_assignment_finder.GetThisPropertyAssignments()); this_property_assignment_finder.GetThisPropertyAssignments());
} }
} }
...@@ -3624,7 +3599,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, ...@@ -3624,7 +3599,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
int materialized_literal_count; int materialized_literal_count;
int expected_property_count; int expected_property_count;
bool only_this_property_assignments;
bool only_simple_this_property_assignments; bool only_simple_this_property_assignments;
Handle<FixedArray> this_property_assignments; Handle<FixedArray> this_property_assignments;
if (is_lazily_compiled && pre_data() != NULL) { if (is_lazily_compiled && pre_data() != NULL) {
...@@ -3634,15 +3608,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, ...@@ -3634,15 +3608,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
scanner_.SeekForward(end_pos); scanner_.SeekForward(end_pos);
materialized_literal_count = entry.literal_count(); materialized_literal_count = entry.literal_count();
expected_property_count = entry.property_count(); expected_property_count = entry.property_count();
only_this_property_assignments = false;
only_simple_this_property_assignments = false; only_simple_this_property_assignments = false;
this_property_assignments = Factory::empty_fixed_array(); this_property_assignments = Factory::empty_fixed_array();
} else { } else {
ParseSourceElements(&body, Token::RBRACE, CHECK_OK); ParseSourceElements(&body, Token::RBRACE, CHECK_OK);
materialized_literal_count = temp_scope.materialized_literal_count(); materialized_literal_count = temp_scope.materialized_literal_count();
expected_property_count = temp_scope.expected_property_count(); expected_property_count = temp_scope.expected_property_count();
only_this_property_assignments =
temp_scope.only_this_property_assignments();
only_simple_this_property_assignments = only_simple_this_property_assignments =
temp_scope.only_simple_this_property_assignments(); temp_scope.only_simple_this_property_assignments();
this_property_assignments = temp_scope.this_property_assignments(); this_property_assignments = temp_scope.this_property_assignments();
...@@ -3664,7 +3635,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, ...@@ -3664,7 +3635,6 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
body.elements(), body.elements(),
materialized_literal_count, materialized_literal_count,
expected_property_count, expected_property_count,
only_this_property_assignments,
only_simple_this_property_assignments, only_simple_this_property_assignments,
this_property_assignments, this_property_assignments,
num_parameters, num_parameters,
......
// 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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment