1c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/typing.h" 6c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/frames.h" 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/frames-inl.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ostreams.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/parser.h" // for CompileTimeValue; TODO(rossberg): should move 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopes.h" 12c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 13c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgnamespace v8 { 14c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgnamespace internal { 15c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 16c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 17c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgAstTyper::AstTyper(CompilationInfo* info) 18c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org : info_(info), 19c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org oracle_( 20a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org handle(info->closure()->shared()->code()), 21a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org handle(info->closure()->shared()->feedback_vector()), 22a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org handle(info->closure()->context()->native_context()), 23594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org info->zone()), 24594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_(info->zone()) { 256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org InitializeAstVisitor(info->zone()); 26c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 27c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 28c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 29bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org#define RECURSE(call) \ 30c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org do { \ 31e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!visitor->HasStackOverflow()); \ 32c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org call; \ 33c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (visitor->HasStackOverflow()) return; \ 34c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } while (false) 35c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 3641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgvoid AstTyper::Run(CompilationInfo* info) { 37c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org AstTyper* visitor = new(info->zone()) AstTyper(info); 38c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Scope* scope = info->scope(); 39c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 40c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // Handle implicit declaration of the function name in named function 41c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // expressions before other declarations. 42c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (scope->is_function_scope() && scope->function() != NULL) { 43bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(visitor->VisitVariableDeclaration(scope->function())); 44c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 45bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(visitor->VisitDeclarations(scope->declarations())); 46bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(visitor->VisitStatements(info->function()->body())); 47c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 48c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 49bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org#undef RECURSE 50c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 514f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 524f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#ifdef OBJECT_PRINT 536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org static void PrintObserved(Variable* var, Object* value, Type* type) { 54d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org OFStream os(stdout); 55d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org os << " observed " << (var->IsParameter() ? "param" : "local") << " "; 56f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org var->name()->Print(os); 57f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << " : " << Brief(value) << " -> "; 58d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org type->PrintTo(os); 59d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org os << endl; 604f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 614f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#endif // OBJECT_PRINT 624f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 634f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 64034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgEffect AstTyper::ObservedOnStack(Object* value) { 654edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org Type* lower = Type::NowOf(value, zone()); 666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org return Effect(Bounds(lower, Type::Any(zone()))); 67034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org} 68034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org 69034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org 704f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgvoid AstTyper::ObserveTypesAtOsrEntry(IterationStatement* stmt) { 714f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org if (stmt->OsrEntryId() != info_->osr_ast_id()) return; 724f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 734f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org DisallowHeapAllocation no_gc; 744f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org JavaScriptFrameIterator it(isolate()); 754f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org JavaScriptFrame* frame = it.frame(); 764f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org Scope* scope = info_->scope(); 774f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 784f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org // Assert that the frame on the stack belongs to the function we want to OSR. 79e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(*info_->closure(), frame->function()); 804f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 814f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org int params = scope->num_parameters(); 824f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org int locals = scope->StackLocalCount(); 834f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 844f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org // Use sequential composition to achieve desired narrowing. 854f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org // The receiver is a parameter with index -1. 864f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org store_.Seq(parameter_index(-1), ObservedOnStack(frame->receiver())); 874f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < params; i++) { 884f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org store_.Seq(parameter_index(i), ObservedOnStack(frame->GetParameter(i))); 894f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 904f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 914f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < locals; i++) { 924f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org store_.Seq(stack_local_index(i), ObservedOnStack(frame->GetExpression(i))); 934f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 944f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 954f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#ifdef OBJECT_PRINT 964f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org if (FLAG_trace_osr && FLAG_print_scopes) { 974f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org PrintObserved(scope->receiver(), 984f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org frame->receiver(), 994f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org store_.LookupBounds(parameter_index(-1)).lower); 1004f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 1014f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < params; i++) { 1024f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org PrintObserved(scope->parameter(i), 1034f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org frame->GetParameter(i), 1044f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org store_.LookupBounds(parameter_index(i)).lower); 1054f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 1064f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 1074f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ZoneList<Variable*> local_vars(locals, zone()); 1084f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ZoneList<Variable*> context_vars(scope->ContextLocalCount(), zone()); 1094f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org scope->CollectStackAndContextLocals(&local_vars, &context_vars); 1104f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org for (int i = 0; i < locals; i++) { 1114f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org PrintObserved(local_vars.at(i), 1124f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org frame->GetExpression(i), 1134f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org store_.LookupBounds(stack_local_index(i)).lower); 1144f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 1154f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org } 1164f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#endif // OBJECT_PRINT 1174f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org} 1184f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 1194f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 120bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org#define RECURSE(call) \ 121c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org do { \ 122e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!HasStackOverflow()); \ 123c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org call; \ 124c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (HasStackOverflow()) return; \ 125c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } while (false) 126c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 127c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 128c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitStatements(ZoneList<Statement*>* stmts) { 129c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < stmts->length(); ++i) { 130c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Statement* stmt = stmts->at(i); 131bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt)); 132594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (stmt->IsJump()) break; 133c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 134c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 135c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 136c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 137c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitBlock(Block* stmt) { 138bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(VisitStatements(stmt->statements())); 139594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (stmt->labels() != NULL) { 140594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via 'break l'. 141594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 142c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 143c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 144c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 145c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitExpressionStatement(ExpressionStatement* stmt) { 146bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->expression())); 147c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 148c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 149c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 150c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitEmptyStatement(EmptyStatement* stmt) { 151c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 152c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 153c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 154c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitIfStatement(IfStatement* stmt) { 155594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 156c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (!stmt->condition()->ToBooleanIsTrue() && 157c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org !stmt->condition()->ToBooleanIsFalse()) { 158c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org stmt->condition()->RecordToBooleanTypeFeedback(oracle()); 159c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 160594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 161594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->condition())); 162594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects then_effects = EnterEffects(); 163594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->then_statement())); 164594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 165594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects else_effects = EnterEffects(); 166594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->else_statement())); 167594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 168594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org then_effects.Alt(else_effects); 169594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(then_effects); 170c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 171c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 172c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 173c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitContinueStatement(ContinueStatement* stmt) { 174594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // TODO(rossberg): is it worth having a non-termination effect? 175c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 176c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 177c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 178c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitBreakStatement(BreakStatement* stmt) { 179594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // TODO(rossberg): is it worth having a non-termination effect? 180c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 181c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 182c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 183c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitReturnStatement(ReturnStatement* stmt) { 184594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 185c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // TODO(rossberg): we only need this for inlining into test contexts... 186c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org stmt->expression()->RecordToBooleanTypeFeedback(oracle()); 187594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 188594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->expression())); 189594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // TODO(rossberg): is it worth having a non-termination effect? 190c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 191c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 192c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 193c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitWithStatement(WithStatement* stmt) { 194bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(stmt->expression()); 195bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(stmt->statement()); 196c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 197c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 198c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 199c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitSwitchStatement(SwitchStatement* stmt) { 200bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->tag())); 201594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 202c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ZoneList<CaseClause*>* clauses = stmt->cases(); 203594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects local_effects(zone()); 204594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool complex_effects = false; // True for label effects or fall-through. 205594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 206c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < clauses->length(); ++i) { 207c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CaseClause* clause = clauses->at(i); 2084f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 209594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects clause_effects = EnterEffects(); 210594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 211c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (!clause->is_default()) { 212c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* label = clause->label(); 2134f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org // Collect type feedback. 2146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* tag_type; 2156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* label_type; 2166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* combined_type; 2174f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org oracle()->CompareType(clause->CompareId(), 2184f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org &tag_type, &label_type, &combined_type); 2194f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org NarrowLowerType(stmt->tag(), tag_type); 2204f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org NarrowLowerType(label, label_type); 2214f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org clause->set_compare_type(combined_type); 222594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 223594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(label)); 224594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (!clause_effects.IsEmpty()) complex_effects = true; 225594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 226594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 227594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ZoneList<Statement*>* stmts = clause->statements(); 228594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(VisitStatements(stmts)); 229594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 230594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (stmts->is_empty() || stmts->last()->IsJump()) { 231594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org local_effects.Alt(clause_effects); 232594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else { 233594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org complex_effects = true; 234c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 235c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 236594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 237594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (complex_effects) { 238594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Reached this in unknown state. 239594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else { 240594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(local_effects); 241594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 242c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 243c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 244c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 245a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid AstTyper::VisitCaseClause(CaseClause* clause) { 246a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org UNREACHABLE(); 247a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} 248a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 249a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 250c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitDoWhileStatement(DoWhileStatement* stmt) { 251594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 252c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (!stmt->cond()->ToBooleanIsTrue()) { 253c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org stmt->cond()->RecordToBooleanTypeFeedback(oracle()); 254c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 255594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 256594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // TODO(rossberg): refine the unconditional Forget (here and elsewhere) by 257594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // computing the set of variables assigned in only some of the origins of the 258594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // control transfer (such as the loop body here). 259594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via looping or 'continue'. 2604f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ObserveTypesAtOsrEntry(stmt); 261594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->body())); 262594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->cond())); 263594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via 'break'. 264c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 265c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 266c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 267c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitWhileStatement(WhileStatement* stmt) { 268594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 269c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (!stmt->cond()->ToBooleanIsTrue()) { 270c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org stmt->cond()->RecordToBooleanTypeFeedback(oracle()); 271c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 272594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 273594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via looping or 'continue'. 274594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->cond())); 2754f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ObserveTypesAtOsrEntry(stmt); 276594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->body())); 277594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via termination or 'break'. 278c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 279c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 280c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 281c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitForStatement(ForStatement* stmt) { 282c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (stmt->init() != NULL) { 283bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->init())); 284c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 285594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via looping. 286c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (stmt->cond() != NULL) { 287594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 28893ac16660289dfb548b5caa1f0e4ed29863aa445danno@chromium.org stmt->cond()->RecordToBooleanTypeFeedback(oracle()); 289594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 290594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(stmt->cond())); 291c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 2924f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ObserveTypesAtOsrEntry(stmt); 293bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->body())); 294c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (stmt->next() != NULL) { 295a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org store_.Forget(); // Control may transfer here via 'continue'. 296bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->next())); 297c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 298594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via termination or 'break'. 299c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 300c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 301c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 302c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitForInStatement(ForInStatement* stmt) { 303594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 3049f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org stmt->set_for_in_type(static_cast<ForInStatement::ForInType>( 305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org oracle()->ForInType(stmt->ForInFeedbackSlot()))); 306594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 307bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->enumerable())); 308594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via looping or 'continue'. 3094f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org ObserveTypesAtOsrEntry(stmt); 310bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->body())); 311594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via 'break'. 312c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 313c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 314c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 3151fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid AstTyper::VisitForOfStatement(ForOfStatement* stmt) { 316bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->iterable())); 317594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via looping or 'continue'. 318bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->body())); 319594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via 'break'. 3201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org} 3211fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 3221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 323c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitTryCatchStatement(TryCatchStatement* stmt) { 324594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects try_effects = EnterEffects(); 325bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->try_block())); 326594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 327594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects catch_effects = EnterEffects(); 328594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via 'throw'. 329bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->catch_block())); 330594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 331594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org try_effects.Alt(catch_effects); 332594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(try_effects); 333594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // At this point, only variables that were reassigned in the catch block are 334594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // still remembered. 335c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 336c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 337c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 338c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitTryFinallyStatement(TryFinallyStatement* stmt) { 339bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->try_block())); 340594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Control may transfer here via 'throw'. 341bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->finally_block())); 342c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 343c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 344c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 345c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitDebuggerStatement(DebuggerStatement* stmt) { 346594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // May do whatever. 347c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 348c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 349c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 350c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitFunctionLiteral(FunctionLiteral* expr) { 3514610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org expr->InitializeSharedInfo(Handle<Code>(info_->closure()->shared()->code())); 352c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 353c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 354c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 355a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid AstTyper::VisitClassLiteral(ClassLiteral* expr) {} 356a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 357a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 358fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgvoid AstTyper::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { 359c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 360c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 361c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 362c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitConditional(Conditional* expr) { 363594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 364594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org expr->condition()->RecordToBooleanTypeFeedback(oracle()); 365594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 366bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->condition())); 367594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects then_effects = EnterEffects(); 368bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->then_expression())); 369594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 370594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects else_effects = EnterEffects(); 371bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->else_expression())); 372594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 373594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org then_effects.Alt(else_effects); 374594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(then_effects); 375bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 376169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowType(expr, Bounds::Either( 377169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org expr->then_expression()->bounds(), 3786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org expr->else_expression()->bounds(), zone())); 379c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 380c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 381c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 382c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitVariableProxy(VariableProxy* expr) { 383594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Variable* var = expr->var(); 384594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (var->IsStackAllocated()) { 385594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org NarrowType(expr, store_.LookupBounds(variable_index(var))); 386594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 387c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 388c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 389c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 390c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitLiteral(Literal* expr) { 3916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* type = Type::Constant(expr->value(), zone()); 392034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org NarrowType(expr, Bounds(type)); 393c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 394c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 395c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 396c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitRegExpLiteral(RegExpLiteral* expr) { 3976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::RegExp(zone()))); 398c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 399c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 400c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 401c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitObjectLiteral(ObjectLiteral* expr) { 402c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ZoneList<ObjectLiteral::Property*>* properties = expr->properties(); 403c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < properties->length(); ++i) { 404c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ObjectLiteral::Property* prop = properties->at(i); 405c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 406594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 407c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if ((prop->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL && 408c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org !CompileTimeValue::IsCompileTimeValue(prop->value())) || 409c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org prop->kind() == ObjectLiteral::Property::COMPUTED) { 410bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org if (prop->key()->value()->IsInternalizedString() && prop->emit_store()) { 411c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org prop->RecordTypeFeedback(oracle()); 412bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 413c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 414594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 415594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(prop->value())); 416c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 417bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 4186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::Object(zone()))); 419c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 420c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 421c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 422c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitArrayLiteral(ArrayLiteral* expr) { 423c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ZoneList<Expression*>* values = expr->values(); 424c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < values->length(); ++i) { 425c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* value = values->at(i); 426bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(value)); 427c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 428bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 4296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::Array(zone()))); 430c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 431c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 432c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 433c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitAssignment(Assignment* expr) { 434ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org // Collect type feedback. 435ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org Property* prop = expr->target()->AsProperty(); 436ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org if (prop != NULL) { 437ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org TypeFeedbackId id = expr->AssignmentFeedbackId(); 438ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org expr->set_is_uninitialized(oracle()->StoreIsUninitialized(id)); 439ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org if (!expr->IsUninitialized()) { 440ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org if (prop->key()->IsPropertyName()) { 441ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org Literal* lit_key = prop->key()->AsLiteral(); 442e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(lit_key != NULL && lit_key->value()->IsString()); 443ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org Handle<String> name = Handle<String>::cast(lit_key->value()); 444ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org oracle()->AssignmentReceiverTypes(id, name, expr->GetReceiverTypes()); 445ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org } else { 446ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org KeyedAccessStoreMode store_mode; 447ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org oracle()->KeyedAssignmentReceiverTypes( 448ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org id, expr->GetReceiverTypes(), &store_mode); 449ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org expr->set_store_mode(store_mode); 450ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org } 45193ac16660289dfb548b5caa1f0e4ed29863aa445danno@chromium.org } 4526b37f82c80d35e427dff21ff88b4f97df19f87c2dslomov@chromium.org } 453594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 454ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org Expression* rhs = 455ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org expr->is_compound() ? expr->binary_operation() : expr->value(); 456ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org RECURSE(Visit(expr->target())); 457ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org RECURSE(Visit(rhs)); 458ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org NarrowType(expr, rhs->bounds()); 459ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org 460594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org VariableProxy* proxy = expr->target()->AsVariableProxy(); 461594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (proxy != NULL && proxy->var()->IsStackAllocated()) { 462594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(variable_index(proxy->var()), Effect(expr->bounds())); 463594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 464c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 465c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 466c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 467c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitYield(Yield* expr) { 468bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->generator_object())); 469bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->expression())); 470bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 471594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // We don't know anything about the result type. 472c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 473c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 474c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 475c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitThrow(Throw* expr) { 476bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->exception())); 477594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // TODO(rossberg): is it worth having a non-termination effect? 478bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 4796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::None(zone()))); 480c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 481c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 482c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 483c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitProperty(Property* expr) { 484594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 485cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org TypeFeedbackId id = expr->PropertyFeedbackId(); 486cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org expr->set_is_uninitialized(oracle()->LoadIsUninitialized(id)); 487cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org if (!expr->IsUninitialized()) { 488cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org if (expr->key()->IsPropertyName()) { 489cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org Literal* lit_key = expr->key()->AsLiteral(); 490e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(lit_key != NULL && lit_key->value()->IsString()); 491cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org Handle<String> name = Handle<String>::cast(lit_key->value()); 49251e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org oracle()->PropertyReceiverTypes(id, name, expr->GetReceiverTypes()); 493cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org } else { 494cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org bool is_string; 495cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org oracle()->KeyedPropertyReceiverTypes( 496cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org id, expr->GetReceiverTypes(), &is_string); 497cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org expr->set_is_string_access(is_string); 498cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org } 499cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org } 500594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 501bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->obj())); 502bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->key())); 503c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 504594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // We don't know anything about the result type. 505c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 506c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 507c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 508c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitCall(Call* expr) { 509594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 510594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->expression())); 511a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org if (!expr->expression()->IsProperty() && 512a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org expr->IsUsingCallFeedbackSlot(isolate()) && 513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org oracle()->CallIsMonomorphic(expr->CallFeedbackSlot())) { 514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org expr->set_target(oracle()->GetCallTarget(expr->CallFeedbackSlot())); 5157e6132b924829c353864933f29124419916db550machenbach@chromium.org Handle<AllocationSite> site = 5167e6132b924829c353864933f29124419916db550machenbach@chromium.org oracle()->GetCallAllocationSite(expr->CallFeedbackSlot()); 5177e6132b924829c353864933f29124419916db550machenbach@chromium.org expr->set_allocation_site(site); 518a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org } 519a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org 520594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ZoneList<Expression*>* args = expr->arguments(); 521594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (int i = 0; i < args->length(); ++i) { 522594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Expression* arg = args->at(i); 523594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(arg)); 524594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 525594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 526594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org VariableProxy* proxy = expr->expression()->AsVariableProxy(); 527594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) { 528594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Forget(); // Eval could do whatever to local variables. 529594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 530594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 531594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // We don't know anything about the result type. 532c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 533c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 534c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 535c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitCallNew(CallNew* expr) { 536594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 537594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org expr->RecordTypeFeedback(oracle()); 538594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 539bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(expr->expression())); 540c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ZoneList<Expression*>* args = expr->arguments(); 541c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < args->length(); ++i) { 542c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* arg = args->at(i); 543bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(arg)); 544c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 545c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 5466b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org NarrowType(expr, Bounds(Type::None(zone()), Type::Receiver(zone()))); 547c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 548c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 549c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 550c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitCallRuntime(CallRuntime* expr) { 551c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ZoneList<Expression*>* args = expr->arguments(); 552c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < args->length(); ++i) { 553c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* arg = args->at(i); 554bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(arg)); 555c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 556bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 557594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // We don't know anything about the result type. 558c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 559c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 560c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 561c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitUnaryOperation(UnaryOperation* expr) { 5621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Collect type feedback. 563c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (expr->op() == Token::NOT) { 564c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // TODO(rossberg): only do in test or value context. 565c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org expr->expression()->RecordToBooleanTypeFeedback(oracle()); 566c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 567bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 568594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->expression())); 569594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 570bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org switch (expr->op()) { 571bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::NOT: 572bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::DELETE: 5736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::Boolean(zone()))); 574bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 575bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::VOID: 5766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::Undefined(zone()))); 577bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 578bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::TYPEOF: 5796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::InternalizedString(zone()))); 580bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 581bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org default: 582bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org UNREACHABLE(); 583bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 584c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 585c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 586c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 587c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitCountOperation(CountOperation* expr) { 588594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Collect type feedback. 5899f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org TypeFeedbackId store_id = expr->CountStoreFeedbackId(); 5909f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org expr->set_store_mode(oracle()->GetStoreMode(store_id)); 5919f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org oracle()->CountReceiverTypes(store_id, expr->GetReceiverTypes()); 5929f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org expr->set_type(oracle()->CountType(expr->CountBinOpFeedbackId())); 5939f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org // TODO(rossberg): merge the count type with the generic expression type. 594bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 595594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->expression())); 596594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 5974452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org NarrowType(expr, Bounds(Type::SignedSmall(zone()), Type::Number(zone()))); 598594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 599594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org VariableProxy* proxy = expr->expression()->AsVariableProxy(); 600594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (proxy != NULL && proxy->var()->IsStackAllocated()) { 601594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(variable_index(proxy->var()), Effect(expr->bounds())); 602594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 603c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 604c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 605c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 606c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitBinaryOperation(BinaryOperation* expr) { 6071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Collect type feedback. 6086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* type; 6096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* left_type; 6106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* right_type; 6111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Maybe<int> fixed_right_arg; 6120f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org Handle<AllocationSite> allocation_site; 6131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org oracle()->BinaryType(expr->BinaryOperationFeedbackId(), 6140f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org &left_type, &right_type, &type, &fixed_right_arg, 6150f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org &allocation_site, expr->op()); 616169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowLowerType(expr, type); 617169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowLowerType(expr->left(), left_type); 618169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowLowerType(expr->right(), right_type); 6190f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org expr->set_allocation_site(allocation_site); 6201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org expr->set_fixed_right_arg(fixed_right_arg); 621c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (expr->op() == Token::OR || expr->op() == Token::AND) { 622c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org expr->left()->RecordToBooleanTypeFeedback(oracle()); 623c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 624bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 625bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org switch (expr->op()) { 626bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::COMMA: 627594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 628594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 629169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowType(expr, expr->right()->bounds()); 630bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 631bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::OR: 632594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org case Token::AND: { 633594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects left_effects = EnterEffects(); 634594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 635594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 636594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects right_effects = EnterEffects(); 637594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 638594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ExitEffects(); 639594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org left_effects.Alt(right_effects); 640594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_.Seq(left_effects); 641594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 642169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowType(expr, Bounds::Either( 6436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org expr->left()->bounds(), expr->right()->bounds(), zone())); 644bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 645594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 646bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::BIT_OR: 647bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::BIT_AND: { 648594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 649594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 6506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* upper = Type::Union( 6516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org expr->left()->bounds().upper, expr->right()->bounds().upper, zone()); 6526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org if (!upper->Is(Type::Signed32())) upper = Type::Signed32(zone()); 6534452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Type* lower = Type::Intersect(Type::SignedSmall(zone()), upper, zone()); 654a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org NarrowType(expr, Bounds(lower, upper)); 655bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 656bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 657bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::BIT_XOR: 658bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::SHL: 659bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::SAR: 660594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 661594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 6624452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org NarrowType(expr, 6634452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Bounds(Type::SignedSmall(zone()), Type::Signed32(zone()))); 664bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 665bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::SHR: 666594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 667594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 6682ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // TODO(rossberg): The upper bound would be Unsigned32, but since there 6692ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // is no 'positive Smi' type for the lower bound, we use the smallest 6702ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // union of Smi and Unsigned32 as upper bound instead. 6714452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org NarrowType(expr, Bounds(Type::SignedSmall(zone()), Type::Number(zone()))); 672bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 673bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::ADD: { 674594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 675594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 676169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Bounds l = expr->left()->bounds(); 677169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Bounds r = expr->right()->bounds(); 6786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* lower = 679d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !l.lower->IsInhabited() || !r.lower->IsInhabited() ? 6806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type::None(zone()) : 681169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org l.lower->Is(Type::String()) || r.lower->Is(Type::String()) ? 6826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type::String(zone()) : 683a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org l.lower->Is(Type::Number()) && r.lower->Is(Type::Number()) ? 6844452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Type::SignedSmall(zone()) : Type::None(zone()); 6856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* upper = 686169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org l.upper->Is(Type::String()) || r.upper->Is(Type::String()) ? 6876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type::String(zone()) : 688a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org l.upper->Is(Type::Number()) && r.upper->Is(Type::Number()) ? 6896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type::Number(zone()) : Type::NumberOrString(zone()); 690034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org NarrowType(expr, Bounds(lower, upper)); 691bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 692bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 693bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::SUB: 694bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::MUL: 695bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::DIV: 696bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org case Token::MOD: 697594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 698594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 6994452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org NarrowType(expr, Bounds(Type::SignedSmall(zone()), Type::Number(zone()))); 700bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org break; 701bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org default: 702bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org UNREACHABLE(); 703bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 704c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 705c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 706c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 707c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitCompareOperation(CompareOperation* expr) { 7081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Collect type feedback. 7096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* left_type; 7106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* right_type; 7116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* combined_type; 7121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org oracle()->CompareType(expr->CompareOperationFeedbackId(), 7131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org &left_type, &right_type, &combined_type); 714169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowLowerType(expr->left(), left_type); 715169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org NarrowLowerType(expr->right(), right_type); 7161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org expr->set_combined_type(combined_type); 717bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 718594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->left())); 719594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org RECURSE(Visit(expr->right())); 720594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 7216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org NarrowType(expr, Bounds(Type::Boolean(zone()))); 722c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 723c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 724c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 725c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitThisFunction(ThisFunction* expr) { 726c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 727c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 728c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 7295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvoid AstTyper::VisitSuperReference(SuperReference* expr) {} 7305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 732c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitDeclarations(ZoneList<Declaration*>* decls) { 733c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org for (int i = 0; i < decls->length(); ++i) { 734c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Declaration* decl = decls->at(i); 735bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(decl)); 736c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 737c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 738c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 739c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 740c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitVariableDeclaration(VariableDeclaration* declaration) { 741c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 742c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 743c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 744c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitFunctionDeclaration(FunctionDeclaration* declaration) { 745bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(declaration->fun())); 746c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 747c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 748c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 749c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitModuleDeclaration(ModuleDeclaration* declaration) { 750bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(declaration->module())); 751c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 752c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 753c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 754c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitImportDeclaration(ImportDeclaration* declaration) { 755bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(declaration->module())); 756c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 757c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 758c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 759c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitExportDeclaration(ExportDeclaration* declaration) { 760c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 761c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 762c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 763c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitModuleLiteral(ModuleLiteral* module) { 764bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(module->body())); 765c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 766c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 767c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 768c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitModuleVariable(ModuleVariable* module) { 769c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 770c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 771c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 772c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitModulePath(ModulePath* module) { 773bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(module->module())); 774c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 775c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 776c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 777c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitModuleUrl(ModuleUrl* module) { 778c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 779c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 780c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 781c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid AstTyper::VisitModuleStatement(ModuleStatement* stmt) { 782bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org RECURSE(Visit(stmt->body())); 783c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 784c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 785c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 786c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} } // namespace v8::internal 787