| 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 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 IntersectResult(expr, computed_type_); | 1152 IntersectResult(expr, computed_type_); |
| 1153 return; | 1153 return; |
| 1154 } | 1154 } |
| 1155 case Token::OR: | 1155 case Token::OR: |
| 1156 case Token::AND: | 1156 case Token::AND: |
| 1157 FAIL(expr, "illegal logical operator"); | 1157 FAIL(expr, "illegal logical operator"); |
| 1158 case Token::BIT_OR: { | 1158 case Token::BIT_OR: { |
| 1159 // BIT_OR allows Any since it is used as a type coercion. | 1159 // BIT_OR allows Any since it is used as a type coercion. |
| 1160 VisitIntegerBitwiseOperator(expr, Type::Any(), cache_.kAsmIntQ, | 1160 VisitIntegerBitwiseOperator(expr, Type::Any(), cache_.kAsmIntQ, |
| 1161 cache_.kAsmSigned, true); | 1161 cache_.kAsmSigned, true); |
| 1162 if (expr->left()->IsCall() && expr->op() == Token::BIT_OR) { | 1162 if (expr->left()->IsCall() && expr->op() == Token::BIT_OR && |
| 1163 Type::Number()->Is(expr->left()->bounds().upper)) { |
| 1164 // Force the return types of foreign functions. |
| 1163 expr->left()->set_bounds(Bounds(cache_.kAsmSigned)); | 1165 expr->left()->set_bounds(Bounds(cache_.kAsmSigned)); |
| 1164 } | 1166 } |
| 1165 return; | 1167 return; |
| 1166 } | 1168 } |
| 1167 case Token::BIT_XOR: { | 1169 case Token::BIT_XOR: { |
| 1168 // Handle booleans specially to handle de-sugared ! | 1170 // Handle booleans specially to handle de-sugared ! |
| 1169 Literal* left = expr->left()->AsLiteral(); | 1171 Literal* left = expr->left()->AsLiteral(); |
| 1170 if (left && left->value()->IsBoolean()) { | 1172 if (left && left->value()->IsBoolean()) { |
| 1171 if (left->ToBooleanIsTrue()) { | 1173 if (left->ToBooleanIsTrue()) { |
| 1172 left->set_bounds(Bounds(cache_.kSingletonOne)); | 1174 left->set_bounds(Bounds(cache_.kSingletonOne)); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 if (intish_ > kMaxUncombinedMultiplicativeSteps) { | 1248 if (intish_ > kMaxUncombinedMultiplicativeSteps) { |
| 1247 FAIL(expr, "too many consecutive multiplicative ops"); | 1249 FAIL(expr, "too many consecutive multiplicative ops"); |
| 1248 } | 1250 } |
| 1249 } | 1251 } |
| 1250 IntersectResult(expr, cache_.kAsmInt); | 1252 IntersectResult(expr, cache_.kAsmInt); |
| 1251 return; | 1253 return; |
| 1252 } | 1254 } |
| 1253 } else if (expr->op() == Token::MUL && expr->right()->IsLiteral() && | 1255 } else if (expr->op() == Token::MUL && expr->right()->IsLiteral() && |
| 1254 right_type->Is(cache_.kAsmDouble)) { | 1256 right_type->Is(cache_.kAsmDouble)) { |
| 1255 // For unary +, expressed as x * 1.0 | 1257 // For unary +, expressed as x * 1.0 |
| 1256 if (expr->left()->IsCall() && expr->op() == Token::MUL) { | 1258 if (expr->left()->IsCall() && expr->op() == Token::MUL && |
| 1259 Type::Number()->Is(expr->left()->bounds().upper)) { |
| 1260 // Force the return types of foreign functions. |
| 1257 expr->left()->set_bounds(Bounds(cache_.kAsmDouble)); | 1261 expr->left()->set_bounds(Bounds(cache_.kAsmDouble)); |
| 1258 } | 1262 } |
| 1259 IntersectResult(expr, cache_.kAsmDouble); | 1263 IntersectResult(expr, cache_.kAsmDouble); |
| 1260 return; | 1264 return; |
| 1261 } else if (expr->op() == Token::MUL && left_type->Is(cache_.kAsmDouble) && | 1265 } else if (expr->op() == Token::MUL && left_type->Is(cache_.kAsmDouble) && |
| 1262 expr->right()->IsLiteral() && | 1266 expr->right()->IsLiteral() && |
| 1263 !expr->right()->AsLiteral()->raw_value()->ContainsDot() && | 1267 !expr->right()->AsLiteral()->raw_value()->ContainsDot() && |
| 1264 expr->right()->AsLiteral()->raw_value()->AsNumber() == -1.0) { | 1268 expr->right()->AsLiteral()->raw_value()->AsNumber() == -1.0) { |
| 1265 // For unary -, expressed as x * -1 | 1269 // For unary -, expressed as x * -1 |
| 1266 expr->right()->set_bounds(Bounds(cache_.kAsmDouble)); | 1270 expr->right()->set_bounds(Bounds(cache_.kAsmDouble)); |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 } | 1572 } |
| 1569 | 1573 |
| 1570 | 1574 |
| 1571 void AsmTyper::VisitRewritableExpression(RewritableExpression* expr) { | 1575 void AsmTyper::VisitRewritableExpression(RewritableExpression* expr) { |
| 1572 RECURSE(Visit(expr->expression())); | 1576 RECURSE(Visit(expr->expression())); |
| 1573 } | 1577 } |
| 1574 | 1578 |
| 1575 | 1579 |
| 1576 } // namespace internal | 1580 } // namespace internal |
| 1577 } // namespace v8 | 1581 } // namespace v8 |
| OLD | NEW |