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