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
This commit is contained in:
parent
0c6dc2c5cb
commit
2252cc1bc9
@ -1276,7 +1276,6 @@ class FunctionLiteral: public Expression {
|
||||
ZoneList<Statement*>* body,
|
||||
int materialized_literal_count,
|
||||
int expected_property_count,
|
||||
bool has_only_this_property_assignments,
|
||||
bool has_only_simple_this_property_assignments,
|
||||
Handle<FixedArray> 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<Statement*>* body_;
|
||||
int materialized_literal_count_;
|
||||
int expected_property_count_;
|
||||
bool has_only_this_property_assignments_;
|
||||
bool has_only_simple_this_property_assignments_;
|
||||
Handle<FixedArray> this_property_assignments_;
|
||||
int num_parameters_;
|
||||
|
@ -465,7 +465,6 @@ bool Compiler::CompileLazy(Handle<SharedFunctionInfo> 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<JSFunction> 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());
|
||||
|
@ -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 = ");
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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<FixedArray> 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<FixedArray> 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<String> 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<String> 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<String> name, int index) {
|
||||
@ -1562,12 +1543,7 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder {
|
||||
assigned_constants_->Add(value);
|
||||
}
|
||||
|
||||
void AssignmentFromSomethingElse(Handle<String> 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<int>* assigned_arguments_;
|
||||
@ -1623,11 +1598,11 @@ void* Parser::ParseSourceElements(ZoneListWrapper<Statement>* 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<String> var_name,
|
||||
|
||||
int materialized_literal_count;
|
||||
int expected_property_count;
|
||||
bool only_this_property_assignments;
|
||||
bool only_simple_this_property_assignments;
|
||||
Handle<FixedArray> this_property_assignments;
|
||||
if (is_lazily_compiled && pre_data() != NULL) {
|
||||
@ -3634,15 +3608,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> 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<String> var_name,
|
||||
body.elements(),
|
||||
materialized_literal_count,
|
||||
expected_property_count,
|
||||
only_this_property_assignments,
|
||||
only_simple_this_property_assignments,
|
||||
this_property_assignments,
|
||||
num_parameters,
|
||||
|
38
test/mjsunit/regress/regress-502.js
Normal file
38
test/mjsunit/regress/regress-502.js
Normal file
@ -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);
|
Loading…
Reference in New Issue
Block a user