| 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/typing-asm.h" | 5 #include "src/typing-asm.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 // Checking for asm extern types explicitly, as the type system | 993 // Checking for asm extern types explicitly, as the type system |
| 994 // doesn't correctly check their inheritance relationship. | 994 // doesn't correctly check their inheritance relationship. |
| 995 if (!computed_type_->Is(cache_.kAsmSigned) && | 995 if (!computed_type_->Is(cache_.kAsmSigned) && |
| 996 !computed_type_->Is(cache_.kAsmFixnum) && | 996 !computed_type_->Is(cache_.kAsmFixnum) && |
| 997 !computed_type_->Is(cache_.kAsmDouble)) { | 997 !computed_type_->Is(cache_.kAsmDouble)) { |
| 998 FAIL(arg, | 998 FAIL(arg, |
| 999 "foreign call argument expected to be int, double, or fixnum"); | 999 "foreign call argument expected to be int, double, or fixnum"); |
| 1000 } | 1000 } |
| 1001 } | 1001 } |
| 1002 intish_ = kMaxUncombinedAdditiveSteps; | 1002 intish_ = kMaxUncombinedAdditiveSteps; |
| 1003 expr->expression()->set_bounds(Bounds(Type::Function(zone()))); |
| 1003 IntersectResult(expr, expected_type); | 1004 IntersectResult(expr, expected_type); |
| 1004 } else { | 1005 } else { |
| 1005 FAIL(expr, "invalid callee"); | 1006 FAIL(expr, "invalid callee"); |
| 1006 } | 1007 } |
| 1007 } | 1008 } |
| 1008 | 1009 |
| 1009 | 1010 |
| 1010 void AsmTyper::VisitCallNew(CallNew* expr) { | 1011 void AsmTyper::VisitCallNew(CallNew* expr) { |
| 1011 if (in_function_) { | 1012 if (in_function_) { |
| 1012 FAIL(expr, "new not allowed in module function"); | 1013 FAIL(expr, "new not allowed in module function"); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 return; | 1129 return; |
| 1129 } | 1130 } |
| 1130 case Token::OR: | 1131 case Token::OR: |
| 1131 case Token::AND: | 1132 case Token::AND: |
| 1132 FAIL(expr, "illegal logical operator"); | 1133 FAIL(expr, "illegal logical operator"); |
| 1133 case Token::BIT_OR: { | 1134 case Token::BIT_OR: { |
| 1134 // BIT_OR allows Any since it is used as a type coercion. | 1135 // BIT_OR allows Any since it is used as a type coercion. |
| 1135 VisitIntegerBitwiseOperator(expr, Type::Any(zone()), cache_.kAsmInt, | 1136 VisitIntegerBitwiseOperator(expr, Type::Any(zone()), cache_.kAsmInt, |
| 1136 cache_.kAsmSigned, true); | 1137 cache_.kAsmSigned, true); |
| 1137 if (expr->left()->IsCall() && expr->op() == Token::BIT_OR) { | 1138 if (expr->left()->IsCall() && expr->op() == Token::BIT_OR) { |
| 1138 IntersectResult(expr->left(), cache_.kAsmSigned); | 1139 expr->left()->set_bounds(Bounds(cache_.kAsmSigned)); |
| 1139 } | 1140 } |
| 1140 return; | 1141 return; |
| 1141 } | 1142 } |
| 1142 case Token::BIT_XOR: { | 1143 case Token::BIT_XOR: { |
| 1143 // Handle booleans specially to handle de-sugared ! | 1144 // Handle booleans specially to handle de-sugared ! |
| 1144 Literal* left = expr->left()->AsLiteral(); | 1145 Literal* left = expr->left()->AsLiteral(); |
| 1145 if (left && left->value()->IsBoolean()) { | 1146 if (left && left->value()->IsBoolean()) { |
| 1146 if (left->ToBooleanIsTrue()) { | 1147 if (left->ToBooleanIsTrue()) { |
| 1147 left->set_bounds(Bounds(cache_.kSingletonOne)); | 1148 left->set_bounds(Bounds(cache_.kSingletonOne)); |
| 1148 RECURSE(VisitWithExpectation(expr->right(), cache_.kAsmInt, | 1149 RECURSE(VisitWithExpectation(expr->right(), cache_.kAsmInt, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1217 FAIL(expr, "too many consecutive multiplicative ops"); | 1218 FAIL(expr, "too many consecutive multiplicative ops"); |
| 1218 } | 1219 } |
| 1219 } | 1220 } |
| 1220 IntersectResult(expr, cache_.kAsmInt); | 1221 IntersectResult(expr, cache_.kAsmInt); |
| 1221 return; | 1222 return; |
| 1222 } | 1223 } |
| 1223 } else if (expr->op() == Token::MUL && expr->right()->IsLiteral() && | 1224 } else if (expr->op() == Token::MUL && expr->right()->IsLiteral() && |
| 1224 right_type->Is(cache_.kAsmDouble)) { | 1225 right_type->Is(cache_.kAsmDouble)) { |
| 1225 // For unary +, expressed as x * 1.0 | 1226 // For unary +, expressed as x * 1.0 |
| 1226 if (expr->left()->IsCall() && expr->op() == Token::MUL) { | 1227 if (expr->left()->IsCall() && expr->op() == Token::MUL) { |
| 1227 IntersectResult(expr->left(), cache_.kAsmDouble); | 1228 expr->left()->set_bounds(Bounds(cache_.kAsmDouble)); |
| 1228 } | 1229 } |
| 1229 IntersectResult(expr, cache_.kAsmDouble); | 1230 IntersectResult(expr, cache_.kAsmDouble); |
| 1230 return; | 1231 return; |
| 1231 } else if (type->Is(cache_.kAsmFloat) && expr->op() != Token::MOD) { | 1232 } else if (type->Is(cache_.kAsmFloat) && expr->op() != Token::MOD) { |
| 1232 if (left_intish != 0 || right_intish != 0) { | 1233 if (left_intish != 0 || right_intish != 0) { |
| 1233 FAIL(expr, "float operation before required fround"); | 1234 FAIL(expr, "float operation before required fround"); |
| 1234 } | 1235 } |
| 1235 IntersectResult(expr, cache_.kAsmFloat); | 1236 IntersectResult(expr, cache_.kAsmFloat); |
| 1236 intish_ = 1; | 1237 intish_ = 1; |
| 1237 return; | 1238 return; |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1531 | 1532 |
| 1532 | 1533 |
| 1533 void AsmTyper::VisitRewritableAssignmentExpression( | 1534 void AsmTyper::VisitRewritableAssignmentExpression( |
| 1534 RewritableAssignmentExpression* expr) { | 1535 RewritableAssignmentExpression* expr) { |
| 1535 RECURSE(Visit(expr->expression())); | 1536 RECURSE(Visit(expr->expression())); |
| 1536 } | 1537 } |
| 1537 | 1538 |
| 1538 | 1539 |
| 1539 } // namespace internal | 1540 } // namespace internal |
| 1540 } // namespace v8 | 1541 } // namespace v8 |
| OLD | NEW |