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

Side by Side Diff: src/typing-asm.cc

Issue 2106683003: [wasm] Making compare and conditionals more correct. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix Created 4 years, 5 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/typing-asm.h ('k') | test/cctest/test-asm-validator.cc » ('j') | 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/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 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 RECURSE(VisitWithExpectation(expr->condition(), Type::Number(), 533 RECURSE(VisitWithExpectation(expr->condition(), Type::Number(),
534 "condition expected to be integer")); 534 "condition expected to be integer"));
535 if (!computed_type_->Is(cache_.kAsmInt)) { 535 if (!computed_type_->Is(cache_.kAsmInt)) {
536 FAIL(expr->condition(), "condition must be of type int"); 536 FAIL(expr->condition(), "condition must be of type int");
537 } 537 }
538 538
539 RECURSE(VisitWithExpectation( 539 RECURSE(VisitWithExpectation(
540 expr->then_expression(), expected_type_, 540 expr->then_expression(), expected_type_,
541 "conditional then branch type mismatch with enclosing expression")); 541 "conditional then branch type mismatch with enclosing expression"));
542 Type* then_type = StorageType(computed_type_); 542 Type* then_type = StorageType(computed_type_);
543 if (intish_ != 0 || !then_type->Is(cache_.kAsmComparable)) { 543 int then_intish = intish_;
544 FAIL(expr->then_expression(), "invalid type in ? then expression");
545 }
546 544
547 RECURSE(VisitWithExpectation( 545 RECURSE(VisitWithExpectation(
548 expr->else_expression(), expected_type_, 546 expr->else_expression(), expected_type_,
549 "conditional else branch type mismatch with enclosing expression")); 547 "conditional else branch type mismatch with enclosing expression"));
550 Type* else_type = StorageType(computed_type_); 548 Type* else_type = StorageType(computed_type_);
551 if (intish_ != 0 || !else_type->Is(cache_.kAsmComparable)) { 549 int else_intish = intish_;
552 FAIL(expr->else_expression(), "invalid type in ? else expression");
553 }
554 550
555 if (!then_type->Is(else_type) || !else_type->Is(then_type)) { 551 if (then_intish != 0 || else_intish != 0 ||
556 FAIL(expr, "then and else expressions in ? must have the same type"); 552 !((then_type->Is(cache_.kAsmInt) && else_type->Is(cache_.kAsmInt)) ||
553 (then_type->Is(cache_.kAsmFloat) && else_type->Is(cache_.kAsmFloat)) ||
554 (then_type->Is(cache_.kAsmDouble) &&
555 else_type->Is(cache_.kAsmDouble)))) {
556 FAIL(expr,
557 "then and else expressions in ? must have the same type "
558 "and be int, float, or double");
557 } 559 }
558 560
559 RECURSE(IntersectResult(expr, then_type)); 561 RECURSE(IntersectResult(expr, then_type));
560 } 562 }
561 563
562 564
563 void AsmTyper::VisitVariableProxy(VariableProxy* expr) { 565 void AsmTyper::VisitVariableProxy(VariableProxy* expr) {
564 Variable* var = expr->var(); 566 Variable* var = expr->var();
565 VariableInfo* info = GetVariableInfo(var); 567 VariableInfo* info = GetVariableInfo(var);
566 if (!in_function_ && !building_function_tables_ && !visiting_exports_) { 568 if (!in_function_ && !building_function_tables_ && !visiting_exports_) {
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 Token::Value op = expr->op(); 1374 Token::Value op = expr->op();
1373 if (op != Token::EQ && op != Token::NE && op != Token::LT && 1375 if (op != Token::EQ && op != Token::NE && op != Token::LT &&
1374 op != Token::LTE && op != Token::GT && op != Token::GTE) { 1376 op != Token::LTE && op != Token::GT && op != Token::GTE) {
1375 FAIL(expr, "illegal comparison operator"); 1377 FAIL(expr, "illegal comparison operator");
1376 } 1378 }
1377 1379
1378 RECURSE( 1380 RECURSE(
1379 VisitWithExpectation(expr->left(), Type::Number(), 1381 VisitWithExpectation(expr->left(), Type::Number(),
1380 "left comparison operand expected to be number")); 1382 "left comparison operand expected to be number"));
1381 Type* left_type = computed_type_; 1383 Type* left_type = computed_type_;
1382 if (!left_type->Is(cache_.kAsmComparable)) { 1384 int left_intish = intish_;
1383 FAIL(expr->left(), "bad type on left side of comparison");
1384 }
1385 1385
1386 RECURSE( 1386 RECURSE(
1387 VisitWithExpectation(expr->right(), Type::Number(), 1387 VisitWithExpectation(expr->right(), Type::Number(),
1388 "right comparison operand expected to be number")); 1388 "right comparison operand expected to be number"));
1389 Type* right_type = computed_type_; 1389 Type* right_type = computed_type_;
1390 if (!right_type->Is(cache_.kAsmComparable)) { 1390 int right_intish = intish_;
1391 FAIL(expr->right(), "bad type on right side of comparison");
1392 }
1393 1391
1394 if (!left_type->Is(right_type) && !right_type->Is(left_type)) { 1392 if (left_intish != 0 || right_intish != 0 ||
1395 FAIL(expr, "left and right side of comparison must match"); 1393 !((left_type->Is(cache_.kAsmUnsigned) &&
1394 right_type->Is(cache_.kAsmUnsigned)) ||
1395 (left_type->Is(cache_.kAsmSigned) &&
1396 right_type->Is(cache_.kAsmSigned)) ||
1397 (left_type->Is(cache_.kAsmFloat) && right_type->Is(cache_.kAsmFloat)) ||
1398 (left_type->Is(cache_.kAsmDouble) &&
1399 right_type->Is(cache_.kAsmDouble)))) {
1400 FAIL(expr,
1401 "left and right side of comparison must match type "
1402 "and be signed, unsigned, float, or double");
1396 } 1403 }
1397 1404
1398 RECURSE(IntersectResult(expr, cache_.kAsmSigned)); 1405 RECURSE(IntersectResult(expr, cache_.kAsmSigned));
1399 } 1406 }
1400 1407
1401 1408
1402 void AsmTyper::VisitThisFunction(ThisFunction* expr) { 1409 void AsmTyper::VisitThisFunction(ThisFunction* expr) {
1403 FAIL(expr, "this function not allowed"); 1410 FAIL(expr, "this function not allowed");
1404 } 1411 }
1405 1412
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1642 } 1649 }
1643 1650
1644 1651
1645 void AsmTyper::VisitRewritableExpression(RewritableExpression* expr) { 1652 void AsmTyper::VisitRewritableExpression(RewritableExpression* expr) {
1646 RECURSE(Visit(expr->expression())); 1653 RECURSE(Visit(expr->expression()));
1647 } 1654 }
1648 1655
1649 1656
1650 } // namespace internal 1657 } // namespace internal
1651 } // namespace v8 1658 } // namespace v8
OLDNEW
« no previous file with comments | « src/typing-asm.h ('k') | test/cctest/test-asm-validator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698