X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/bytecode/PolymorphicPutByIdList.cpp diff --git a/bytecode/PolymorphicPutByIdList.cpp b/bytecode/PolymorphicPutByIdList.cpp index 170615b..91b87d4 100644 --- a/bytecode/PolymorphicPutByIdList.cpp +++ b/bytecode/PolymorphicPutByIdList.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2014 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,17 +32,18 @@ namespace JSC { -PutByIdAccess PutByIdAccess::fromStructureStubInfo( - StructureStubInfo& stubInfo, - MacroAssemblerCodePtr initialSlowPath) +PutByIdAccess PutByIdAccess::fromStructureStubInfo(StructureStubInfo& stubInfo) { + MacroAssemblerCodePtr initialSlowPath = + stubInfo.callReturnLocation.labelAtOffset(stubInfo.patch.deltaCallToSlowCase); + PutByIdAccess result; switch (stubInfo.accessType) { case access_put_by_id_replace: result.m_type = Replace; result.m_oldStructure.copyFrom(stubInfo.u.putByIdReplace.baseObjectStructure); - result.m_stubRoutine = MacroAssemblerCodeRef::createSelfManagedCodeRef(initialSlowPath); + result.m_stubRoutine = JITStubRoutine::createSelfManagedRoutine(initialSlowPath); break; case access_put_by_id_transition_direct: @@ -55,13 +56,13 @@ PutByIdAccess PutByIdAccess::fromStructureStubInfo( break; default: - ASSERT_NOT_REACHED(); + RELEASE_ASSERT_NOT_REACHED(); } return result; } -bool PutByIdAccess::visitWeak() const +bool PutByIdAccess::visitWeak(RepatchBuffer& repatchBuffer) const { switch (m_type) { case Replace: @@ -76,36 +77,43 @@ bool PutByIdAccess::visitWeak() const if (!Heap::isMarked(m_chain.get())) return false; break; + case Setter: + case CustomSetter: + if (!Heap::isMarked(m_oldStructure.get())) + return false; + if (m_chain && !Heap::isMarked(m_chain.get())) + return false; + break; default: - ASSERT_NOT_REACHED(); + RELEASE_ASSERT_NOT_REACHED(); return false; } + if (!m_stubRoutine->visitWeak(repatchBuffer)) + return false; return true; } PolymorphicPutByIdList::PolymorphicPutByIdList( - PutKind putKind, - StructureStubInfo& stubInfo, - MacroAssemblerCodePtr initialSlowPath) + PutKind putKind, StructureStubInfo& stubInfo) : m_kind(putKind) { - m_list.append(PutByIdAccess::fromStructureStubInfo(stubInfo, initialSlowPath)); + if (stubInfo.accessType != access_unset) + m_list.append(PutByIdAccess::fromStructureStubInfo(stubInfo)); } PolymorphicPutByIdList* PolymorphicPutByIdList::from( - PutKind putKind, - StructureStubInfo& stubInfo, - MacroAssemblerCodePtr initialSlowPath) + PutKind putKind, StructureStubInfo& stubInfo) { if (stubInfo.accessType == access_put_by_id_list) return stubInfo.u.putByIdList.list; ASSERT(stubInfo.accessType == access_put_by_id_replace - || stubInfo.accessType == access_put_by_id_transition_normal - || stubInfo.accessType == access_put_by_id_transition_direct); + || stubInfo.accessType == access_put_by_id_transition_normal + || stubInfo.accessType == access_put_by_id_transition_direct + || stubInfo.accessType == access_unset); PolymorphicPutByIdList* result = - new PolymorphicPutByIdList(putKind, stubInfo, initialSlowPath); + new PolymorphicPutByIdList(putKind, stubInfo); stubInfo.initPutByIdList(result); @@ -130,14 +138,14 @@ void PolymorphicPutByIdList::addAccess(const PutByIdAccess& putByIdAccess) { ASSERT(!isFull()); // Make sure that the resizing optimizes for space, not time. - m_list.resize(m_list.size() + 1); + m_list.resizeToFit(m_list.size() + 1); m_list.last() = putByIdAccess; } -bool PolymorphicPutByIdList::visitWeak() const +bool PolymorphicPutByIdList::visitWeak(RepatchBuffer& repatchBuffer) const { for (unsigned i = 0; i < size(); ++i) { - if (!at(i).visitWeak()) + if (!at(i).visitWeak(repatchBuffer)) return false; } return true;