OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 } | 386 } |
387 | 387 |
388 | 388 |
389 void AstTyper::VisitAssignment(Assignment* expr) { | 389 void AstTyper::VisitAssignment(Assignment* expr) { |
390 // TODO(rossberg): Can we clean this up? | 390 // TODO(rossberg): Can we clean this up? |
391 if (expr->is_compound()) { | 391 if (expr->is_compound()) { |
392 // Collect type feedback. | 392 // Collect type feedback. |
393 Expression* target = expr->target(); | 393 Expression* target = expr->target(); |
394 Property* prop = target->AsProperty(); | 394 Property* prop = target->AsProperty(); |
395 if (prop != NULL) { | 395 if (prop != NULL) { |
396 prop->RecordTypeFeedback(oracle(), zone()); | 396 RECURSE(Visit(expr->target())); |
397 expr->RecordTypeFeedback(oracle(), zone()); | 397 expr->RecordTypeFeedback(oracle(), zone()); |
398 } | 398 } |
399 | 399 |
400 RECURSE(Visit(expr->binary_operation())); | 400 RECURSE(Visit(expr->binary_operation())); |
401 | 401 |
402 NarrowType(expr, expr->binary_operation()->bounds()); | 402 NarrowType(expr, expr->binary_operation()->bounds()); |
403 } else { | 403 } else { |
404 // Collect type feedback. | 404 // Collect type feedback. |
405 if (expr->target()->IsProperty()) { | 405 if (expr->target()->IsProperty()) { |
406 expr->RecordTypeFeedback(oracle(), zone()); | 406 expr->RecordTypeFeedback(oracle(), zone()); |
(...skipping 23 matching lines...) Expand all Loading... |
430 void AstTyper::VisitThrow(Throw* expr) { | 430 void AstTyper::VisitThrow(Throw* expr) { |
431 RECURSE(Visit(expr->exception())); | 431 RECURSE(Visit(expr->exception())); |
432 // TODO(rossberg): is it worth having a non-termination effect? | 432 // TODO(rossberg): is it worth having a non-termination effect? |
433 | 433 |
434 NarrowType(expr, Bounds(Type::None(), isolate_)); | 434 NarrowType(expr, Bounds(Type::None(), isolate_)); |
435 } | 435 } |
436 | 436 |
437 | 437 |
438 void AstTyper::VisitProperty(Property* expr) { | 438 void AstTyper::VisitProperty(Property* expr) { |
439 // Collect type feedback. | 439 // Collect type feedback. |
440 expr->RecordTypeFeedback(oracle(), zone()); | 440 TypeFeedbackId id = expr->PropertyFeedbackId(); |
| 441 expr->set_is_uninitialized(oracle()->LoadIsUninitialized(id)); |
| 442 if (!expr->IsUninitialized()) { |
| 443 expr->set_is_pre_monomorphic(oracle()->LoadIsPreMonomorphic(id)); |
| 444 expr->set_is_monomorphic(oracle()->LoadIsMonomorphicNormal(id)); |
| 445 ASSERT(!expr->IsPreMonomorphic() || !expr->IsMonomorphic()); |
| 446 if (expr->key()->IsPropertyName()) { |
| 447 Literal* lit_key = expr->key()->AsLiteral(); |
| 448 ASSERT(lit_key != NULL && lit_key->value()->IsString()); |
| 449 Handle<String> name = Handle<String>::cast(lit_key->value()); |
| 450 bool is_prototype; |
| 451 oracle()->PropertyReceiverTypes( |
| 452 id, name, expr->GetReceiverTypes(), &is_prototype); |
| 453 expr->set_is_function_prototype(is_prototype); |
| 454 } else { |
| 455 bool is_string; |
| 456 oracle()->KeyedPropertyReceiverTypes( |
| 457 id, expr->GetReceiverTypes(), &is_string); |
| 458 expr->set_is_string_access(is_string); |
| 459 } |
| 460 } |
441 | 461 |
442 RECURSE(Visit(expr->obj())); | 462 RECURSE(Visit(expr->obj())); |
443 RECURSE(Visit(expr->key())); | 463 RECURSE(Visit(expr->key())); |
444 | 464 |
445 // We don't know anything about the result type. | 465 // We don't know anything about the result type. |
446 } | 466 } |
447 | 467 |
448 | 468 |
449 void AstTyper::VisitCall(Call* expr) { | 469 void AstTyper::VisitCall(Call* expr) { |
450 // Collect type feedback. | 470 // Collect type feedback. |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 void AstTyper::VisitModuleUrl(ModuleUrl* module) { | 731 void AstTyper::VisitModuleUrl(ModuleUrl* module) { |
712 } | 732 } |
713 | 733 |
714 | 734 |
715 void AstTyper::VisitModuleStatement(ModuleStatement* stmt) { | 735 void AstTyper::VisitModuleStatement(ModuleStatement* stmt) { |
716 RECURSE(Visit(stmt->body())); | 736 RECURSE(Visit(stmt->body())); |
717 } | 737 } |
718 | 738 |
719 | 739 |
720 } } // namespace v8::internal | 740 } } // namespace v8::internal |
OLD | NEW |