OLD | NEW |
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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/typing-asm.h" | 7 #include "src/typing-asm.h" |
8 | 8 |
9 #include "src/ast.h" | 9 #include "src/ast.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 if (right == NULL || right->raw_value()->ContainsDot()) { | 603 if (right == NULL || right->raw_value()->ContainsDot()) { |
604 FAIL(right, "call mask must be integer"); | 604 FAIL(right, "call mask must be integer"); |
605 } | 605 } |
606 RECURSE(VisitWithExpectation(bin->right(), cache_.kInt32, | 606 RECURSE(VisitWithExpectation(bin->right(), cache_.kInt32, |
607 "call mask expected to be integer")); | 607 "call mask expected to be integer")); |
608 if (static_cast<size_t>(right->raw_value()->AsNumber()) != size - 1) { | 608 if (static_cast<size_t>(right->raw_value()->AsNumber()) != size - 1) { |
609 FAIL(right, "call mask must match function table"); | 609 FAIL(right, "call mask must match function table"); |
610 } | 610 } |
611 bin->set_bounds(Bounds(cache_.kInt32)); | 611 bin->set_bounds(Bounds(cache_.kInt32)); |
612 } else { | 612 } else { |
613 BinaryOperation* bin = expr->key()->AsBinaryOperation(); | 613 Literal* literal = expr->key()->AsLiteral(); |
614 if (bin == NULL || bin->op() != Token::SAR) { | 614 if (literal) { |
615 FAIL(expr->key(), "expected >> in heap access"); | 615 RECURSE(VisitWithExpectation(literal, cache_.kInt32, |
| 616 "array index expected to be integer")); |
| 617 } else { |
| 618 BinaryOperation* bin = expr->key()->AsBinaryOperation(); |
| 619 if (bin == NULL || bin->op() != Token::SAR) { |
| 620 FAIL(expr->key(), "expected >> in heap access"); |
| 621 } |
| 622 RECURSE(VisitWithExpectation(bin->left(), cache_.kInt32, |
| 623 "array index expected to be integer")); |
| 624 Literal* right = bin->right()->AsLiteral(); |
| 625 if (right == NULL || right->raw_value()->ContainsDot()) { |
| 626 FAIL(right, "heap access shift must be integer"); |
| 627 } |
| 628 RECURSE(VisitWithExpectation(bin->right(), cache_.kInt32, |
| 629 "array shift expected to be integer")); |
| 630 int n = static_cast<int>(right->raw_value()->AsNumber()); |
| 631 int expected_shift = ElementShiftSize(type); |
| 632 if (expected_shift < 0 || n != expected_shift) { |
| 633 FAIL(right, "heap access shift must match element size"); |
| 634 } |
| 635 bin->set_bounds(Bounds(cache_.kInt32)); |
616 } | 636 } |
617 RECURSE(VisitWithExpectation(bin->left(), cache_.kInt32, | |
618 "array index expected to be integer")); | |
619 Literal* right = bin->right()->AsLiteral(); | |
620 if (right == NULL || right->raw_value()->ContainsDot()) { | |
621 FAIL(right, "heap access shift must be integer"); | |
622 } | |
623 RECURSE(VisitWithExpectation(bin->right(), cache_.kInt32, | |
624 "array shift expected to be integer")); | |
625 int n = static_cast<int>(right->raw_value()->AsNumber()); | |
626 int expected_shift = ElementShiftSize(type); | |
627 if (expected_shift < 0 || n != expected_shift) { | |
628 FAIL(right, "heap access shift must match element size"); | |
629 } | |
630 bin->set_bounds(Bounds(cache_.kInt32)); | |
631 } | 637 } |
632 IntersectResult(expr, type); | 638 IntersectResult(expr, type); |
633 } | 639 } |
634 | 640 |
635 | 641 |
636 void AsmTyper::VisitProperty(Property* expr) { | 642 void AsmTyper::VisitProperty(Property* expr) { |
637 // stdlib.Math.x | 643 // stdlib.Math.x |
638 Property* inner_prop = expr->obj()->AsProperty(); | 644 Property* inner_prop = expr->obj()->AsProperty(); |
639 if (inner_prop != NULL) { | 645 if (inner_prop != NULL) { |
640 // Get property name. | 646 // Get property name. |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 computed_type_->Print(); | 1106 computed_type_->Print(); |
1101 PrintF("Expected type: "); | 1107 PrintF("Expected type: "); |
1102 expected_type_->Print(); | 1108 expected_type_->Print(); |
1103 #endif | 1109 #endif |
1104 FAIL(expr, msg); | 1110 FAIL(expr, msg); |
1105 } | 1111 } |
1106 expected_type_ = save; | 1112 expected_type_ = save; |
1107 } | 1113 } |
1108 } // namespace internal | 1114 } // namespace internal |
1109 } // namespace v8 | 1115 } // namespace v8 |
OLD | NEW |