diff options
Diffstat (limited to 'deps/v8/src/ast.cc')
-rw-r--r-- | deps/v8/src/ast.cc | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/deps/v8/src/ast.cc b/deps/v8/src/ast.cc index 1a9919b5a..f6cf18915 100644 --- a/deps/v8/src/ast.cc +++ b/deps/v8/src/ast.cc @@ -180,8 +180,8 @@ int FunctionLiteral::end_position() const { } -LanguageMode FunctionLiteral::language_mode() const { - return scope()->language_mode(); +StrictMode FunctionLiteral::strict_mode() const { + return scope()->strict_mode(); } @@ -357,8 +357,7 @@ void ArrayLiteral::BuildConstantElements(Isolate* isolate) { // Allocate a fixed array to hold all the object literals. Handle<JSArray> array = isolate->factory()->NewJSArray(0, FAST_HOLEY_SMI_ELEMENTS); - isolate->factory()->SetElementsCapacityAndLength( - array, values()->length(), values()->length()); + JSArray::Expand(array, values()->length()); // Fill in the literals. bool is_simple = true; @@ -379,9 +378,9 @@ void ArrayLiteral::BuildConstantElements(Isolate* isolate) { } else if (boilerplate_value->IsUninitialized()) { is_simple = false; JSObject::SetOwnElement( - array, i, handle(Smi::FromInt(0), isolate), kNonStrictMode); + array, i, handle(Smi::FromInt(0), isolate), SLOPPY); } else { - JSObject::SetOwnElement(array, i, boilerplate_value, kNonStrictMode); + JSObject::SetOwnElement(array, i, boilerplate_value, SLOPPY); } } @@ -593,6 +592,17 @@ void Expression::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) { } +int Call::ComputeFeedbackSlotCount(Isolate* isolate) { + CallType call_type = GetCallType(isolate); + if (call_type == LOOKUP_SLOT_CALL || call_type == OTHER_CALL) { + // Call only uses a slot in some cases. + return 1; + } + + return 0; +} + + Call::CallType Call::GetCallType(Isolate* isolate) const { VariableProxy* proxy = expression()->AsVariableProxy(); if (proxy != NULL) { @@ -632,11 +642,14 @@ bool Call::ComputeGlobalTarget(Handle<GlobalObject> global, void CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) { + int allocation_site_feedback_slot = FLAG_pretenuring_call_new + ? AllocationSiteFeedbackSlot() + : CallNewFeedbackSlot(); allocation_site_ = - oracle->GetCallNewAllocationSite(CallNewFeedbackId()); - is_monomorphic_ = oracle->CallNewIsMonomorphic(CallNewFeedbackId()); + oracle->GetCallNewAllocationSite(allocation_site_feedback_slot); + is_monomorphic_ = oracle->CallNewIsMonomorphic(CallNewFeedbackSlot()); if (is_monomorphic_) { - target_ = oracle->GetCallNewTarget(CallNewFeedbackId()); + target_ = oracle->GetCallNewTarget(CallNewFeedbackSlot()); if (!allocation_site_.is_null()) { elements_kind_ = allocation_site_->GetElementsKind(); } @@ -1039,6 +1052,11 @@ CaseClause::CaseClause(Zone* zone, void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ increase_node_count(); \ } +#define REGULAR_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ + void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ + add_slot_node(node); \ + } #define DONT_OPTIMIZE_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ increase_node_count(); \ @@ -1051,6 +1069,12 @@ CaseClause::CaseClause(Zone* zone, increase_node_count(); \ add_flag(kDontSelfOptimize); \ } +#define DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ + void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ + increase_node_count(); \ + add_slot_node(node); \ + add_flag(kDontSelfOptimize); \ + } #define DONT_CACHE_NODE(NodeType) \ void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ increase_node_count(); \ @@ -1085,8 +1109,8 @@ REGULAR_NODE(CountOperation) REGULAR_NODE(BinaryOperation) REGULAR_NODE(CompareOperation) REGULAR_NODE(ThisFunction) -REGULAR_NODE(Call) -REGULAR_NODE(CallNew) +REGULAR_NODE_WITH_FEEDBACK_SLOTS(Call) +REGULAR_NODE_WITH_FEEDBACK_SLOTS(CallNew) // In theory, for VariableProxy we'd have to add: // if (node->var()->IsLookupSlot()) add_flag(kDontInline); // But node->var() is usually not bound yet at VariableProxy creation time, and @@ -1111,11 +1135,12 @@ DONT_OPTIMIZE_NODE(NativeFunctionLiteral) DONT_SELFOPTIMIZE_NODE(DoWhileStatement) DONT_SELFOPTIMIZE_NODE(WhileStatement) DONT_SELFOPTIMIZE_NODE(ForStatement) -DONT_SELFOPTIMIZE_NODE(ForInStatement) +DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(ForInStatement) DONT_SELFOPTIMIZE_NODE(ForOfStatement) DONT_CACHE_NODE(ModuleLiteral) + void AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) { increase_node_count(); if (node->is_jsruntime()) { |