X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..ef99ff287df9046eb88937225e0554eabb00e33c:/bytecode/PolymorphicPutByIdList.h diff --git a/bytecode/PolymorphicPutByIdList.h b/bytecode/PolymorphicPutByIdList.h index 6e88e70..15d7bde 100644 --- a/bytecode/PolymorphicPutByIdList.h +++ b/bytecode/PolymorphicPutByIdList.h @@ -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 @@ -26,19 +26,19 @@ #ifndef PolymorphicPutByIdList_h #define PolymorphicPutByIdList_h -#include - #if ENABLE(JIT) #include "CodeOrigin.h" #include "MacroAssembler.h" #include "Opcode.h" #include "PutKind.h" +#include "PutPropertySlot.h" #include "Structure.h" #include namespace JSC { +class CodeBlock; struct StructureStubInfo; class PutByIdAccess { @@ -46,7 +46,9 @@ public: enum AccessType { Invalid, Transition, - Replace + Replace, + Setter, + CustomSetter }; PutByIdAccess() @@ -67,10 +69,11 @@ public: result.m_oldStructure.set(vm, owner, oldStructure); result.m_newStructure.set(vm, owner, newStructure); result.m_chain.set(vm, owner, chain); + result.m_customSetter = 0; result.m_stubRoutine = stubRoutine; return result; } - + static PutByIdAccess replace( VM& vm, JSCell* owner, @@ -80,13 +83,33 @@ public: PutByIdAccess result; result.m_type = Replace; result.m_oldStructure.set(vm, owner, structure); + result.m_customSetter = 0; + result.m_stubRoutine = stubRoutine; + return result; + } + + + static PutByIdAccess setter( + VM& vm, + JSCell* owner, + AccessType accessType, + Structure* structure, + StructureChain* chain, + PutPropertySlot::PutValueFunc customSetter, + PassRefPtr stubRoutine) + { + RELEASE_ASSERT(accessType == Setter || accessType == CustomSetter); + PutByIdAccess result; + result.m_oldStructure.set(vm, owner, structure); + result.m_type = accessType; + if (chain) + result.m_chain.set(vm, owner, chain); + result.m_customSetter = customSetter; result.m_stubRoutine = stubRoutine; return result; } - static PutByIdAccess fromStructureStubInfo( - StructureStubInfo&, - MacroAssemblerCodePtr initialSlowPath); + static PutByIdAccess fromStructureStubInfo(StructureStubInfo&); bool isSet() const { return m_type != Invalid; } bool operator!() const { return !isSet(); } @@ -95,12 +118,14 @@ public: bool isTransition() const { return m_type == Transition; } bool isReplace() const { return m_type == Replace; } + bool isSetter() const { return m_type == Setter; } + bool isCustom() const { return m_type == CustomSetter; } Structure* oldStructure() const { // Using this instead of isSet() to make this assertion robust against the possibility // of additional access types being added. - ASSERT(isTransition() || isReplace()); + ASSERT(isTransition() || isReplace() || isSetter() || isCustom()); return m_oldStructure.get(); } @@ -119,43 +144,41 @@ public: StructureChain* chain() const { - ASSERT(isTransition()); + ASSERT(isTransition() || isSetter() || isCustom()); return m_chain.get(); } - PassRefPtr stubRoutine() const + JITStubRoutine* stubRoutine() const { - ASSERT(isTransition() || isReplace()); - return m_stubRoutine; + ASSERT(isTransition() || isReplace() || isSetter() || isCustom()); + return m_stubRoutine.get(); } - - bool visitWeak() const; + + PutPropertySlot::PutValueFunc customSetter() const + { + ASSERT(isCustom()); + return m_customSetter; + } + + bool visitWeak(RepatchBuffer&) const; private: + friend class CodeBlock; + AccessType m_type; WriteBarrier m_oldStructure; WriteBarrier m_newStructure; WriteBarrier m_chain; + PutPropertySlot::PutValueFunc m_customSetter; RefPtr m_stubRoutine; }; class PolymorphicPutByIdList { WTF_MAKE_FAST_ALLOCATED; public: - // Initialize from a stub info; this will place one element in the list and it will - // be created by converting the stub info's put by id access information into our - // PutByIdAccess. - PolymorphicPutByIdList( - PutKind, - StructureStubInfo&, - MacroAssemblerCodePtr initialSlowPath); - // Either creates a new polymorphic put list, or returns the one that is already // in place. - static PolymorphicPutByIdList* from( - PutKind, - StructureStubInfo&, - MacroAssemblerCodePtr initialSlowPath); + static PolymorphicPutByIdList* from(PutKind, StructureStubInfo&); ~PolymorphicPutByIdList(); @@ -175,9 +198,16 @@ public: PutKind kind() const { return m_kind; } - bool visitWeak() const; + bool visitWeak(RepatchBuffer&) const; private: + friend class CodeBlock; + + // Initialize from a stub info; this will place one element in the list and it will + // be created by converting the stub info's put by id access information into our + // PutByIdAccess. + PolymorphicPutByIdList(PutKind, StructureStubInfo&); + Vector m_list; PutKind m_kind; };