| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/hydrogen.h" | 5 #include "src/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
| 10 #include "src/ast-numbering.h" | 10 #include "src/ast-numbering.h" |
| (...skipping 9608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9619 if (!top_info()->is_tracking_positions()) SetSourcePosition(expr->position()); | 9619 if (!top_info()->is_tracking_positions()) SetSourcePosition(expr->position()); |
| 9620 Expression* callee = expr->expression(); | 9620 Expression* callee = expr->expression(); |
| 9621 int argument_count = expr->arguments()->length() + 1; // Plus receiver. | 9621 int argument_count = expr->arguments()->length() + 1; // Plus receiver. |
| 9622 HInstruction* call = NULL; | 9622 HInstruction* call = NULL; |
| 9623 | 9623 |
| 9624 Property* prop = callee->AsProperty(); | 9624 Property* prop = callee->AsProperty(); |
| 9625 if (prop != NULL) { | 9625 if (prop != NULL) { |
| 9626 CHECK_ALIVE(VisitForValue(prop->obj())); | 9626 CHECK_ALIVE(VisitForValue(prop->obj())); |
| 9627 HValue* receiver = Top(); | 9627 HValue* receiver = Top(); |
| 9628 | 9628 |
| 9629 // Sanity check: The receiver must be a JS-exposed kind of object, | |
| 9630 // not something internal (like a Map, or FixedArray). Check this here | |
| 9631 // to chase after a rare but recurring crash bug. It seems to always | |
| 9632 // occur for functions beginning with "this.foo.bar()", so be selective | |
| 9633 // and only insert the check for the first call (identified by slot). | |
| 9634 // TODO(chromium:527994): Remove this when we have a few crash reports. | |
| 9635 if (prop->key()->IsPropertyName() && | |
| 9636 prop->PropertyFeedbackSlot().ToInt() == 2) { | |
| 9637 IfBuilder if_heapobject(this); | |
| 9638 if_heapobject.IfNot<HIsSmiAndBranch>(receiver); | |
| 9639 if_heapobject.Then(); | |
| 9640 { | |
| 9641 IfBuilder special_map(this); | |
| 9642 Factory* factory = isolate()->factory(); | |
| 9643 special_map.If<HCompareMap>(receiver, factory->fixed_array_map()); | |
| 9644 special_map.OrIf<HCompareMap>(receiver, factory->meta_map()); | |
| 9645 special_map.Then(); | |
| 9646 Add<HDebugBreak>(); | |
| 9647 special_map.End(); | |
| 9648 } | |
| 9649 if_heapobject.End(); | |
| 9650 } | |
| 9651 | |
| 9652 SmallMapList* maps; | 9629 SmallMapList* maps; |
| 9653 ComputeReceiverTypes(expr, receiver, &maps, zone()); | 9630 ComputeReceiverTypes(expr, receiver, &maps, zone()); |
| 9654 | 9631 |
| 9655 if (prop->key()->IsPropertyName() && maps->length() > 0) { | 9632 if (prop->key()->IsPropertyName() && maps->length() > 0) { |
| 9656 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); | 9633 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |
| 9657 PropertyAccessInfo info(this, LOAD, maps->first(), name); | 9634 PropertyAccessInfo info(this, LOAD, maps->first(), name); |
| 9658 if (!info.CanAccessAsMonomorphic(maps)) { | 9635 if (!info.CanAccessAsMonomorphic(maps)) { |
| 9659 HandlePolymorphicCallNamed(expr, receiver, maps, name); | 9636 HandlePolymorphicCallNamed(expr, receiver, maps, name); |
| 9660 return; | 9637 return; |
| 9661 } | 9638 } |
| (...skipping 3958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13620 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13597 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13621 } | 13598 } |
| 13622 | 13599 |
| 13623 #ifdef DEBUG | 13600 #ifdef DEBUG |
| 13624 graph_->Verify(false); // No full verify. | 13601 graph_->Verify(false); // No full verify. |
| 13625 #endif | 13602 #endif |
| 13626 } | 13603 } |
| 13627 | 13604 |
| 13628 } // namespace internal | 13605 } // namespace internal |
| 13629 } // namespace v8 | 13606 } // namespace v8 |
| OLD | NEW |