| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 11 matching lines...) Expand all Loading... |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 #include "v8.h" | 28 #include "v8.h" |
| 29 | 29 |
| 30 #include "api.h" | 30 #include "api.h" |
| 31 #include "arguments.h" | 31 #include "arguments.h" |
| 32 #include "code-stubs.h" |
| 32 #include "gdb-jit.h" | 33 #include "gdb-jit.h" |
| 33 #include "ic-inl.h" | 34 #include "ic-inl.h" |
| 34 #include "stub-cache.h" | 35 #include "stub-cache.h" |
| 35 #include "vm-state-inl.h" | 36 #include "vm-state-inl.h" |
| 36 | 37 |
| 37 namespace v8 { | 38 namespace v8 { |
| 38 namespace internal { | 39 namespace internal { |
| 39 | 40 |
| 40 // ----------------------------------------------------------------------- | 41 // ----------------------------------------------------------------------- |
| 41 // StubCache implementation. | 42 // StubCache implementation. |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 Code::KEYED_LOAD_IC, | 496 Code::KEYED_LOAD_IC, |
| 496 NORMAL, | 497 NORMAL, |
| 497 strict_mode); | 498 strict_mode); |
| 498 String* name = is_store | 499 String* name = is_store |
| 499 ? isolate()->heap()->KeyedStoreElementMonomorphic_symbol() | 500 ? isolate()->heap()->KeyedStoreElementMonomorphic_symbol() |
| 500 : isolate()->heap()->KeyedLoadElementMonomorphic_symbol(); | 501 : isolate()->heap()->KeyedLoadElementMonomorphic_symbol(); |
| 501 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); | 502 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); |
| 502 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); | 503 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); |
| 503 | 504 |
| 504 MaybeObject* maybe_new_code = NULL; | 505 MaybeObject* maybe_new_code = NULL; |
| 506 Map* receiver_map = receiver->map(); |
| 505 if (is_store) { | 507 if (is_store) { |
| 506 KeyedStoreStubCompiler compiler(strict_mode); | 508 KeyedStoreStubCompiler compiler(strict_mode); |
| 507 maybe_new_code = compiler.CompileStoreElement(receiver->map()); | 509 maybe_new_code = compiler.CompileStoreElement(receiver_map); |
| 508 } else { | 510 } else { |
| 509 KeyedLoadStubCompiler compiler; | 511 KeyedLoadStubCompiler compiler; |
| 510 maybe_new_code = compiler.CompileLoadElement(receiver->map()); | 512 maybe_new_code = compiler.CompileLoadElement(receiver_map); |
| 511 } | 513 } |
| 512 Code* code; | 514 Code* code; |
| 513 if (!maybe_new_code->To(&code)) return maybe_new_code; | 515 if (!maybe_new_code->To(&code)) return maybe_new_code; |
| 514 if (is_store) { | 516 if (is_store) { |
| 515 PROFILE(isolate_, | 517 PROFILE(isolate_, |
| 516 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 518 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 517 Code::cast(code), 0)); | 519 Code::cast(code), 0)); |
| 518 } else { | 520 } else { |
| 519 PROFILE(isolate_, | 521 PROFILE(isolate_, |
| 520 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, | 522 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, |
| (...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1638 Code::cast(result->ToObjectUnchecked()), | 1640 Code::cast(result->ToObjectUnchecked()), |
| 1639 name)); | 1641 name)); |
| 1640 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1642 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
| 1641 name, | 1643 name, |
| 1642 Code::cast(result->ToObjectUnchecked()))); | 1644 Code::cast(result->ToObjectUnchecked()))); |
| 1643 } | 1645 } |
| 1644 return result; | 1646 return result; |
| 1645 } | 1647 } |
| 1646 | 1648 |
| 1647 | 1649 |
| 1650 MaybeObject* KeyedLoadStubCompiler::ComputeSharedKeyedLoadElementStub( |
| 1651 Map* receiver_map) { |
| 1652 MaybeObject* maybe_stub = NULL; |
| 1653 if (receiver_map->has_fast_elements()) { |
| 1654 maybe_stub = KeyedLoadFastElementStub().TryGetCode(); |
| 1655 } else if (receiver_map->has_external_array_elements()) { |
| 1656 JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); |
| 1657 maybe_stub = KeyedLoadExternalArrayStub(elements_kind).TryGetCode(); |
| 1658 } else { |
| 1659 UNREACHABLE(); |
| 1660 } |
| 1661 return maybe_stub; |
| 1662 } |
| 1663 |
| 1664 |
| 1648 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { | 1665 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { |
| 1649 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1666 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 1650 Code::STORE_IC, type, strict_mode_); | 1667 Code::STORE_IC, type, strict_mode_); |
| 1651 MaybeObject* result = GetCodeWithFlags(flags, name); | 1668 MaybeObject* result = GetCodeWithFlags(flags, name); |
| 1652 if (!result->IsFailure()) { | 1669 if (!result->IsFailure()) { |
| 1653 PROFILE(isolate(), | 1670 PROFILE(isolate(), |
| 1654 CodeCreateEvent(Logger::STORE_IC_TAG, | 1671 CodeCreateEvent(Logger::STORE_IC_TAG, |
| 1655 Code::cast(result->ToObjectUnchecked()), | 1672 Code::cast(result->ToObjectUnchecked()), |
| 1656 name)); | 1673 name)); |
| 1657 GDBJIT(AddCode(GDBJITInterface::STORE_IC, | 1674 GDBJIT(AddCode(GDBJITInterface::STORE_IC, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1674 Code::cast(result->ToObjectUnchecked()), | 1691 Code::cast(result->ToObjectUnchecked()), |
| 1675 name)); | 1692 name)); |
| 1676 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, | 1693 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, |
| 1677 name, | 1694 name, |
| 1678 Code::cast(result->ToObjectUnchecked()))); | 1695 Code::cast(result->ToObjectUnchecked()))); |
| 1679 } | 1696 } |
| 1680 return result; | 1697 return result; |
| 1681 } | 1698 } |
| 1682 | 1699 |
| 1683 | 1700 |
| 1701 MaybeObject* KeyedStoreStubCompiler::ComputeSharedKeyedStoreElementStub( |
| 1702 Map* receiver_map) { |
| 1703 MaybeObject* maybe_stub = NULL; |
| 1704 if (receiver_map->has_fast_elements()) { |
| 1705 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| 1706 maybe_stub = KeyedStoreFastElementStub(is_js_array).TryGetCode(); |
| 1707 } else if (receiver_map->has_external_array_elements()) { |
| 1708 JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); |
| 1709 maybe_stub = KeyedStoreExternalArrayStub(elements_kind).TryGetCode(); |
| 1710 } else { |
| 1711 UNREACHABLE(); |
| 1712 } |
| 1713 return maybe_stub; |
| 1714 } |
| 1715 |
| 1716 |
| 1684 CallStubCompiler::CallStubCompiler(int argc, | 1717 CallStubCompiler::CallStubCompiler(int argc, |
| 1685 InLoopFlag in_loop, | 1718 InLoopFlag in_loop, |
| 1686 Code::Kind kind, | 1719 Code::Kind kind, |
| 1687 Code::ExtraICState extra_ic_state, | 1720 Code::ExtraICState extra_ic_state, |
| 1688 InlineCacheHolderFlag cache_holder) | 1721 InlineCacheHolderFlag cache_holder) |
| 1689 : arguments_(argc), | 1722 : arguments_(argc), |
| 1690 in_loop_(in_loop), | 1723 in_loop_(in_loop), |
| 1691 kind_(kind), | 1724 kind_(kind), |
| 1692 extra_ic_state_(extra_ic_state), | 1725 extra_ic_state_(extra_ic_state), |
| 1693 cache_holder_(cache_holder) { | 1726 cache_holder_(cache_holder) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1838 expected_receiver_type_ = | 1871 expected_receiver_type_ = |
| 1839 FunctionTemplateInfo::cast(signature->receiver()); | 1872 FunctionTemplateInfo::cast(signature->receiver()); |
| 1840 } | 1873 } |
| 1841 } | 1874 } |
| 1842 | 1875 |
| 1843 is_simple_api_call_ = true; | 1876 is_simple_api_call_ = true; |
| 1844 } | 1877 } |
| 1845 | 1878 |
| 1846 | 1879 |
| 1847 } } // namespace v8::internal | 1880 } } // namespace v8::internal |
| OLD | NEW |