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

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

Issue 2764113002: [type-profile] Handle returns correctly. (Closed)
Patch Set: Private slot. Created 3 years, 9 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
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/compile-time-value.h" 7 #include "src/ast/compile-time-value.h"
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/builtins/builtins-constructor.h" 9 #include "src/builtins/builtins-constructor.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 } 1085 }
1086 1086
1087 void BytecodeGenerator::VisitBreakStatement(BreakStatement* stmt) { 1087 void BytecodeGenerator::VisitBreakStatement(BreakStatement* stmt) {
1088 builder()->SetStatementPosition(stmt); 1088 builder()->SetStatementPosition(stmt);
1089 execution_control()->Break(stmt->target()); 1089 execution_control()->Break(stmt->target());
1090 } 1090 }
1091 1091
1092 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { 1092 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
1093 builder()->SetStatementPosition(stmt); 1093 builder()->SetStatementPosition(stmt);
1094 VisitForAccumulatorValue(stmt->expression()); 1094 VisitForAccumulatorValue(stmt->expression());
1095
1096 if (stmt->HasTypeProfileSlot()) {
1097 FeedbackSlot collect_type_feedback_slot = stmt->TypeProfileSlot();
1098 builder()->CollectTypeProfile(stmt->position(),
1099 feedback_index(collect_type_feedback_slot));
1100 }
1101
1102 if (stmt->is_async_return()) { 1095 if (stmt->is_async_return()) {
1103 execution_control()->AsyncReturnAccumulator(); 1096 execution_control()->AsyncReturnAccumulator();
1104 } else { 1097 } else {
1105 execution_control()->ReturnAccumulator(); 1098 execution_control()->ReturnAccumulator();
1106 } 1099 }
1107 } 1100 }
1108 1101
1109 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { 1102 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) {
1110 builder()->SetStatementPosition(stmt); 1103 builder()->SetStatementPosition(stmt);
1111 VisitForAccumulatorValue(stmt->expression()); 1104 VisitForAccumulatorValue(stmt->expression());
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
2023 } 2016 }
2024 2017
2025 void BytecodeGenerator::BuildReturn() { 2018 void BytecodeGenerator::BuildReturn() {
2026 if (FLAG_trace) { 2019 if (FLAG_trace) {
2027 RegisterAllocationScope register_scope(this); 2020 RegisterAllocationScope register_scope(this);
2028 Register result = register_allocator()->NewRegister(); 2021 Register result = register_allocator()->NewRegister();
2029 // Runtime returns {result} value, preserving accumulator. 2022 // Runtime returns {result} value, preserving accumulator.
2030 builder()->StoreAccumulatorInRegister(result).CallRuntime( 2023 builder()->StoreAccumulatorInRegister(result).CallRuntime(
2031 Runtime::kTraceExit, result); 2024 Runtime::kTraceExit, result);
2032 } 2025 }
2026 if (!info()->literal()->TypeProfileSlot().IsInvalid()) {
2027 builder()->CollectTypeProfile(
2028 info()->literal()->position(),
2029 feedback_index(info()->literal()->TypeProfileSlot()));
2030 }
2033 builder()->Return(); 2031 builder()->Return();
2034 } 2032 }
2035 2033
2036 void BytecodeGenerator::BuildAsyncReturn() { 2034 void BytecodeGenerator::BuildAsyncReturn() {
2037 DCHECK(IsAsyncFunction(info()->literal()->kind())); 2035 DCHECK(IsAsyncFunction(info()->literal()->kind()));
2038 RegisterAllocationScope register_scope(this); 2036 RegisterAllocationScope register_scope(this);
2039 RegisterList args = register_allocator()->NewRegisterList(3); 2037 RegisterList args = register_allocator()->NewRegisterList(3);
2040 Register receiver = args[0]; 2038 Register receiver = args[0];
2041 Register promise = args[1]; 2039 Register promise = args[1];
2042 Register return_value = args[2]; 2040 Register return_value = args[2];
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
2332 .CallRuntime(StoreToSuperRuntimeId(), super_property_args); 2330 .CallRuntime(StoreToSuperRuntimeId(), super_property_args);
2333 break; 2331 break;
2334 } 2332 }
2335 case KEYED_SUPER_PROPERTY: { 2333 case KEYED_SUPER_PROPERTY: {
2336 builder() 2334 builder()
2337 ->StoreAccumulatorInRegister(super_property_args[3]) 2335 ->StoreAccumulatorInRegister(super_property_args[3])
2338 .CallRuntime(StoreKeyedToSuperRuntimeId(), super_property_args); 2336 .CallRuntime(StoreKeyedToSuperRuntimeId(), super_property_args);
2339 break; 2337 break;
2340 } 2338 }
2341 } 2339 }
2342
2343 // Value is in accumulator.
2344 // TODO(franzih): Collect type profile once we can handle more than just
2345 // return statements.
2346 if (false && expr->HasTypeProfileSlot()) {
2347 FeedbackSlot collect_type_feedback_slot = expr->TypeProfileSlot();
2348
2349 builder()->CollectTypeProfile(expr->position(),
2350 feedback_index(collect_type_feedback_slot));
2351 }
2352 } 2340 }
2353 2341
2354 void BytecodeGenerator::VisitYield(Yield* expr) { 2342 void BytecodeGenerator::VisitYield(Yield* expr) {
2355 builder()->SetExpressionPosition(expr); 2343 builder()->SetExpressionPosition(expr);
2356 Register value = VisitForRegisterValue(expr->expression()); 2344 Register value = VisitForRegisterValue(expr->expression());
2357 2345
2358 Register generator = VisitForRegisterValue(expr->generator_object()); 2346 Register generator = VisitForRegisterValue(expr->generator_object());
2359 2347
2360 // Save context, registers, and state. Then return. 2348 // Save context, registers, and state. Then return.
2361 builder() 2349 builder()
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after
3504 } 3492 }
3505 3493
3506 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { 3494 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() {
3507 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict 3495 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict
3508 : Runtime::kStoreKeyedToSuper_Sloppy; 3496 : Runtime::kStoreKeyedToSuper_Sloppy;
3509 } 3497 }
3510 3498
3511 } // namespace interpreter 3499 } // namespace interpreter
3512 } // namespace internal 3500 } // namespace internal
3513 } // namespace v8 3501 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698