Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 2189463006: [interpreter] Put object in register for ToObject/ForInPrepare (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix tests Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/bytecode-array-builder.cc ('k') | src/interpreter/bytecodes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/interpreter/bytecode-generator.h" 5 #include "src/interpreter/bytecode-generator.h"
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/compiler.h" 9 #include "src/compiler.h"
10 #include "src/interpreter/bytecode-flags.h" 10 #include "src/interpreter/bytecode-flags.h"
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 976
977 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { 977 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
978 builder()->SetStatementPosition(stmt); 978 builder()->SetStatementPosition(stmt);
979 VisitForAccumulatorValue(stmt->expression()); 979 VisitForAccumulatorValue(stmt->expression());
980 execution_control()->ReturnAccumulator(); 980 execution_control()->ReturnAccumulator();
981 } 981 }
982 982
983 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { 983 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) {
984 builder()->SetStatementPosition(stmt); 984 builder()->SetStatementPosition(stmt);
985 VisitForAccumulatorValue(stmt->expression()); 985 VisitForAccumulatorValue(stmt->expression());
986 builder()->CastAccumulatorToJSObject();
987 VisitNewLocalWithContext(); 986 VisitNewLocalWithContext();
988 VisitInScope(stmt->statement(), stmt->scope()); 987 VisitInScope(stmt->statement(), stmt->scope());
989 } 988 }
990 989
991 void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { 990 void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
992 // We need this scope because we visit for register values. We have to 991 // We need this scope because we visit for register values. We have to
993 // maintain a execution result scope where registers can be allocated. 992 // maintain a execution result scope where registers can be allocated.
994 ZoneList<CaseClause*>* clauses = stmt->cases(); 993 ZoneList<CaseClause*>* clauses = stmt->cases();
995 SwitchBuilder switch_builder(builder(), clauses->length()); 994 SwitchBuilder switch_builder(builder(), clauses->length());
996 ControlScopeForBreakable scope(this, stmt, &switch_builder); 995 ControlScopeForBreakable scope(this, stmt, &switch_builder);
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 1193
1195 LoopBuilder loop_builder(builder()); 1194 LoopBuilder loop_builder(builder());
1196 BytecodeLabel subject_null_label, subject_undefined_label; 1195 BytecodeLabel subject_null_label, subject_undefined_label;
1197 1196
1198 // Prepare the state for executing ForIn. 1197 // Prepare the state for executing ForIn.
1199 builder()->SetExpressionAsStatementPosition(stmt->subject()); 1198 builder()->SetExpressionAsStatementPosition(stmt->subject());
1200 VisitForAccumulatorValue(stmt->subject()); 1199 VisitForAccumulatorValue(stmt->subject());
1201 builder()->JumpIfUndefined(&subject_undefined_label); 1200 builder()->JumpIfUndefined(&subject_undefined_label);
1202 builder()->JumpIfNull(&subject_null_label); 1201 builder()->JumpIfNull(&subject_null_label);
1203 Register receiver = register_allocator()->NewRegister(); 1202 Register receiver = register_allocator()->NewRegister();
1204 builder()->CastAccumulatorToJSObject(); 1203 builder()->CastAccumulatorToJSObject(receiver);
1205 builder()->StoreAccumulatorInRegister(receiver);
1206 1204
1207 register_allocator()->PrepareForConsecutiveAllocations(3); 1205 register_allocator()->PrepareForConsecutiveAllocations(3);
1208 Register cache_type = register_allocator()->NextConsecutiveRegister(); 1206 Register cache_type = register_allocator()->NextConsecutiveRegister();
1209 Register cache_array = register_allocator()->NextConsecutiveRegister(); 1207 Register cache_array = register_allocator()->NextConsecutiveRegister();
1210 Register cache_length = register_allocator()->NextConsecutiveRegister(); 1208 Register cache_length = register_allocator()->NextConsecutiveRegister();
1211 // Used as kRegTriple and kRegPair in ForInPrepare and ForInNext. 1209 // Used as kRegTriple and kRegPair in ForInPrepare and ForInNext.
1212 USE(cache_array); 1210 USE(cache_array);
1213 builder()->ForInPrepare(cache_type); 1211 builder()->ForInPrepare(receiver, cache_type);
1214 1212
1215 // Set up loop counter 1213 // Set up loop counter
1216 Register index = register_allocator()->NewRegister(); 1214 Register index = register_allocator()->NewRegister();
1217 builder()->LoadLiteral(Smi::FromInt(0)); 1215 builder()->LoadLiteral(Smi::FromInt(0));
1218 builder()->StoreAccumulatorInRegister(index); 1216 builder()->StoreAccumulatorInRegister(index);
1219 1217
1220 // The loop 1218 // The loop
1221 VisitIterationHeader(stmt, &loop_builder); 1219 VisitIterationHeader(stmt, &loop_builder);
1222 builder()->SetExpressionAsStatementPosition(stmt->each()); 1220 builder()->SetExpressionAsStatementPosition(stmt->each());
1223 builder()->ForInDone(index, cache_length); 1221 builder()->ForInDone(index, cache_length);
(...skipping 1840 matching lines...) Expand 10 before | Expand all | Expand 10 after
3064 execution_result()->SetResultInAccumulator(); 3062 execution_result()->SetResultInAccumulator();
3065 } 3063 }
3066 3064
3067 void BytecodeGenerator::VisitNewLocalWithContext() { 3065 void BytecodeGenerator::VisitNewLocalWithContext() {
3068 AccumulatorResultScope accumulator_execution_result(this); 3066 AccumulatorResultScope accumulator_execution_result(this);
3069 3067
3070 register_allocator()->PrepareForConsecutiveAllocations(2); 3068 register_allocator()->PrepareForConsecutiveAllocations(2);
3071 Register extension_object = register_allocator()->NextConsecutiveRegister(); 3069 Register extension_object = register_allocator()->NextConsecutiveRegister();
3072 Register closure = register_allocator()->NextConsecutiveRegister(); 3070 Register closure = register_allocator()->NextConsecutiveRegister();
3073 3071
3074 builder()->StoreAccumulatorInRegister(extension_object); 3072 builder()->CastAccumulatorToJSObject(extension_object);
3075 VisitFunctionClosureForContext(); 3073 VisitFunctionClosureForContext();
3076 builder()->StoreAccumulatorInRegister(closure).CallRuntime( 3074 builder()->StoreAccumulatorInRegister(closure).CallRuntime(
3077 Runtime::kPushWithContext, extension_object, 2); 3075 Runtime::kPushWithContext, extension_object, 2);
3078 execution_result()->SetResultInAccumulator(); 3076 execution_result()->SetResultInAccumulator();
3079 } 3077 }
3080 3078
3081 void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable) { 3079 void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable) {
3082 AccumulatorResultScope accumulator_execution_result(this); 3080 AccumulatorResultScope accumulator_execution_result(this);
3083 DCHECK(variable->IsContextSlot()); 3081 DCHECK(variable->IsContextSlot());
3084 3082
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
3238 return execution_context()->scope()->language_mode(); 3236 return execution_context()->scope()->language_mode();
3239 } 3237 }
3240 3238
3241 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { 3239 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const {
3242 return TypeFeedbackVector::GetIndex(slot); 3240 return TypeFeedbackVector::GetIndex(slot);
3243 } 3241 }
3244 3242
3245 } // namespace interpreter 3243 } // namespace interpreter
3246 } // namespace internal 3244 } // namespace internal
3247 } // namespace v8 3245 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-builder.cc ('k') | src/interpreter/bytecodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698