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

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

Issue 2002833005: [interpreter] Add BytecodeGenerator::Abort(). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 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-generator.h ('k') | no next file » | 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-register-allocator.h" 10 #include "src/interpreter/bytecode-register-allocator.h"
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 ZoneVector<BytecodeLabel>& targets) { 650 ZoneVector<BytecodeLabel>& targets) {
651 // TODO(neis): Optimize this by using a proper jump table. 651 // TODO(neis): Optimize this by using a proper jump table.
652 for (size_t i = start_index; i < start_index + size; i++) { 652 for (size_t i = start_index; i < start_index + size; i++) {
653 DCHECK(0 <= i && i < targets.size()); 653 DCHECK(0 <= i && i < targets.size());
654 builder() 654 builder()
655 ->LoadLiteral(Smi::FromInt(static_cast<int>(i))) 655 ->LoadLiteral(Smi::FromInt(static_cast<int>(i)))
656 .CompareOperation(Token::Value::EQ_STRICT, index) 656 .CompareOperation(Token::Value::EQ_STRICT, index)
657 .JumpIfTrue(&(targets[i])); 657 .JumpIfTrue(&(targets[i]));
658 } 658 }
659 659
660 RegisterAllocationScope register_scope(this); 660 BuildAbort(BailoutReason::kInvalidJumpTableIndex);
661 Register reason = register_allocator()->NewRegister();
662 BailoutReason bailout_reason = BailoutReason::kInvalidJumpTableIndex;
663 builder()
664 ->LoadLiteral(Smi::FromInt(static_cast<int>(bailout_reason)))
665 .StoreAccumulatorInRegister(reason)
666 .CallRuntime(Runtime::kAbort, reason, 1);
667 } 661 }
668 662
669 void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt, 663 void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt,
670 LoopBuilder* loop_builder) { 664 LoopBuilder* loop_builder) {
671 // Recall that stmt->yield_count() is always zero inside ordinary 665 // Recall that stmt->yield_count() is always zero inside ordinary
672 // (i.e. non-generator) functions. 666 // (i.e. non-generator) functions.
673 667
674 // Collect all labels for generator resume points within the loop (if any) so 668 // Collect all labels for generator resume points within the loop (if any) so
675 // that they can be bound to the loop header below. Also create fresh labels 669 // that they can be bound to the loop header below. Also create fresh labels
676 // for these resume points, to be used inside the loop. 670 // for these resume points, to be used inside the loop.
(...skipping 1275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1952 Register home_object, 1946 Register home_object,
1953 Register key, 1947 Register key,
1954 Register value) { 1948 Register value) {
1955 DCHECK(Register::AreContiguous(receiver, home_object, key, value)); 1949 DCHECK(Register::AreContiguous(receiver, home_object, key, value));
1956 Runtime::FunctionId function_id = is_strict(language_mode()) 1950 Runtime::FunctionId function_id = is_strict(language_mode())
1957 ? Runtime::kStoreKeyedToSuper_Strict 1951 ? Runtime::kStoreKeyedToSuper_Strict
1958 : Runtime::kStoreKeyedToSuper_Sloppy; 1952 : Runtime::kStoreKeyedToSuper_Sloppy;
1959 builder()->CallRuntime(function_id, receiver, 4); 1953 builder()->CallRuntime(function_id, receiver, 4);
1960 } 1954 }
1961 1955
1956 void BytecodeGenerator::BuildAbort(BailoutReason bailout_reason) {
1957 RegisterAllocationScope register_scope(this);
1958 Register reason = register_allocator()->NewRegister();
1959 builder()
1960 ->LoadLiteral(Smi::FromInt(static_cast<int>(bailout_reason)))
1961 .StoreAccumulatorInRegister(reason)
1962 .CallRuntime(Runtime::kAbort, reason, 1);
1963 }
1964
1962 void BytecodeGenerator::BuildThrowReferenceError(Handle<String> name) { 1965 void BytecodeGenerator::BuildThrowReferenceError(Handle<String> name) {
1963 RegisterAllocationScope register_scope(this); 1966 RegisterAllocationScope register_scope(this);
1964 Register name_reg = register_allocator()->NewRegister(); 1967 Register name_reg = register_allocator()->NewRegister();
1965 builder()->LoadLiteral(name).StoreAccumulatorInRegister(name_reg).CallRuntime( 1968 builder()->LoadLiteral(name).StoreAccumulatorInRegister(name_reg).CallRuntime(
1966 Runtime::kThrowReferenceError, name_reg, 1); 1969 Runtime::kThrowReferenceError, name_reg, 1);
1967 } 1970 }
1968 1971
1969 void BytecodeGenerator::BuildThrowIfHole(Handle<String> name) { 1972 void BytecodeGenerator::BuildThrowIfHole(Handle<String> name) {
1970 // TODO(interpreter): Can the parser reduce the number of checks 1973 // TODO(interpreter): Can the parser reduce the number of checks
1971 // performed? Or should there be a ThrowIfHole bytecode. 1974 // performed? Or should there be a ThrowIfHole bytecode.
(...skipping 1303 matching lines...) Expand 10 before | Expand all | Expand 10 after
3275 } 3278 }
3276 3279
3277 3280
3278 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { 3281 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const {
3279 return info()->shared_info()->feedback_vector()->GetIndex(slot); 3282 return info()->shared_info()->feedback_vector()->GetIndex(slot);
3280 } 3283 }
3281 3284
3282 } // namespace interpreter 3285 } // namespace interpreter
3283 } // namespace internal 3286 } // namespace internal
3284 } // namespace v8 3287 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-generator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698