| Index: src/typing-asm.cc
|
| diff --git a/src/typing-asm.cc b/src/typing-asm.cc
|
| index 9a8cf8f1bf3b9c55314ba5218638c64052a3ba15..e541539a78329622030aea37dcb3556c31d05458 100644
|
| --- a/src/typing-asm.cc
|
| +++ b/src/typing-asm.cc
|
| @@ -62,7 +62,8 @@ AsmTyper::AsmTyper(Isolate* isolate, Zone* zone, Script* script,
|
| in_function_(false),
|
| building_function_tables_(false),
|
| visiting_exports_(false),
|
| - cache_(TypeCache::Get()) {
|
| + cache_(TypeCache::Get()),
|
| + bounds_(zone) {
|
| InitializeAstVisitor(isolate);
|
| InitializeStdlib();
|
| }
|
| @@ -494,11 +495,11 @@ void AsmTyper::VisitFunctionLiteral(FunctionLiteral* expr) {
|
| Scope* scope = expr->scope();
|
| DCHECK(scope->is_function_scope());
|
|
|
| - if (!expr->bounds().upper->IsFunction()) {
|
| + if (!bounds_.get(expr).upper->IsFunction()) {
|
| FAIL(expr, "invalid function literal");
|
| }
|
|
|
| - Type* type = expr->bounds().upper;
|
| + Type* type = bounds_.get(expr).upper;
|
| Type* save_return_type = return_type_;
|
| return_type_ = type->AsFunction()->Result();
|
| in_function_ = true;
|
| @@ -803,7 +804,7 @@ void AsmTyper::VisitHeapAccess(Property* expr, bool assigning,
|
| FAIL(right, "heap access shift must match element size");
|
| }
|
| }
|
| - expr->key()->set_bounds(Bounds(cache_.kAsmSigned));
|
| + bounds_.set(expr->key(), Bounds(cache_.kAsmSigned));
|
| }
|
| Type* result_type;
|
| if (type->Is(cache_.kAsmIntArrayElement)) {
|
| @@ -954,7 +955,7 @@ void AsmTyper::CheckPolymorphicStdlibArguments(
|
| }
|
| // Handle polymorphic stdlib functions specially.
|
| Expression* arg0 = args->at(0);
|
| - Type* arg0_type = arg0->bounds().upper;
|
| + Type* arg0_type = bounds_.get(arg0).upper;
|
| switch (standard_member) {
|
| case kMathFround: {
|
| if (!arg0_type->Is(cache_.kAsmFloat) &&
|
| @@ -983,8 +984,8 @@ void AsmTyper::CheckPolymorphicStdlibArguments(
|
| FAIL(arg0, "illegal function argument type");
|
| }
|
| if (args->length() > 1) {
|
| - Type* other = Type::Intersect(args->at(0)->bounds().upper,
|
| - args->at(1)->bounds().upper, zone());
|
| + Type* other = Type::Intersect(bounds_.get(args->at(0)).upper,
|
| + bounds_.get(args->at(1)).upper, zone());
|
| if (!other->Is(cache_.kAsmFloat) && !other->Is(cache_.kAsmDouble) &&
|
| !other->Is(cache_.kAsmSigned)) {
|
| FAIL(arg0, "function arguments types don't match");
|
| @@ -1031,8 +1032,8 @@ void AsmTyper::VisitCall(Call* expr) {
|
| }
|
| }
|
| intish_ = 0;
|
| - expr->expression()->set_bounds(
|
| - Bounds(Type::Function(Type::Any(), zone())));
|
| + bounds_.set(expr->expression(),
|
| + Bounds(Type::Function(Type::Any(), zone())));
|
| IntersectResult(expr, expected_type);
|
| } else {
|
| if (fun_type->Arity() != args->length()) {
|
| @@ -1198,11 +1199,12 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| RECURSE(VisitIntegerBitwiseOperator(expr, Type::Any(), cache_.kAsmIntQ,
|
| cache_.kAsmSigned, true));
|
| if (expr->left()->IsCall() && expr->op() == Token::BIT_OR &&
|
| - Type::Number()->Is(expr->left()->bounds().upper)) {
|
| + Type::Number()->Is(bounds_.get(expr->left()).upper)) {
|
| // Force the return types of foreign functions.
|
| - expr->left()->set_bounds(Bounds(cache_.kAsmSigned));
|
| + bounds_.set(expr->left(), Bounds(cache_.kAsmSigned));
|
| }
|
| - if (in_function_ && !expr->left()->bounds().upper->Is(cache_.kAsmIntQ)) {
|
| + if (in_function_ &&
|
| + !bounds_.get(expr->left()).upper->Is(cache_.kAsmIntQ)) {
|
| FAIL(expr->left(), "intish required");
|
| }
|
| return;
|
| @@ -1212,7 +1214,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| Literal* left = expr->left()->AsLiteral();
|
| if (left && left->value()->IsBoolean()) {
|
| if (left->ToBooleanIsTrue()) {
|
| - left->set_bounds(Bounds(cache_.kSingletonOne));
|
| + bounds_.set(left, Bounds(cache_.kSingletonOne));
|
| RECURSE(VisitWithExpectation(expr->right(), cache_.kAsmIntQ,
|
| "not operator expects an integer"));
|
| IntersectResult(expr, cache_.kAsmSigned);
|
| @@ -1299,13 +1301,13 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| expr->right()->AsLiteral()->raw_value()->AsNumber() == 1.0) {
|
| // For unary +, expressed as x * 1.0
|
| if (expr->left()->IsCall() &&
|
| - Type::Number()->Is(expr->left()->bounds().upper)) {
|
| + Type::Number()->Is(bounds_.get(expr->left()).upper)) {
|
| // Force the return types of foreign functions.
|
| - expr->left()->set_bounds(Bounds(cache_.kAsmDouble));
|
| - left_type = expr->left()->bounds().upper;
|
| + bounds_.set(expr->left(), Bounds(cache_.kAsmDouble));
|
| + left_type = bounds_.get(expr->left()).upper;
|
| }
|
| if (!(expr->left()->IsProperty() &&
|
| - Type::Number()->Is(expr->left()->bounds().upper))) {
|
| + Type::Number()->Is(bounds_.get(expr->left()).upper))) {
|
| if (!left_type->Is(cache_.kAsmSigned) &&
|
| !left_type->Is(cache_.kAsmUnsigned) &&
|
| !left_type->Is(cache_.kAsmFixnum) &&
|
| @@ -1323,7 +1325,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| !expr->right()->AsLiteral()->raw_value()->ContainsDot() &&
|
| expr->right()->AsLiteral()->raw_value()->AsNumber() == -1.0) {
|
| // For unary -, expressed as x * -1
|
| - expr->right()->set_bounds(Bounds(cache_.kAsmDouble));
|
| + bounds_.set(expr->right(), Bounds(cache_.kAsmDouble));
|
| IntersectResult(expr, cache_.kAsmDouble);
|
| return;
|
| } else if (type->Is(cache_.kAsmFloat) && expr->op() != Token::MOD) {
|
| @@ -1589,14 +1591,14 @@ AsmTyper::StandardMember AsmTyper::VariableAsStandardMember(
|
|
|
| void AsmTyper::SetResult(Expression* expr, Type* type) {
|
| computed_type_ = type;
|
| - expr->set_bounds(Bounds(computed_type_));
|
| + bounds_.set(expr, Bounds(computed_type_));
|
| }
|
|
|
|
|
| void AsmTyper::IntersectResult(Expression* expr, Type* type) {
|
| computed_type_ = type;
|
| Type* bounded_type = Type::Intersect(computed_type_, expected_type_, zone());
|
| - expr->set_bounds(Bounds(bounded_type));
|
| + bounds_.set(expr, Bounds(bounded_type));
|
| }
|
|
|
|
|
|
|