Changeset 82519 in webkit
- Timestamp:
- Mar 30, 2011 4:53:25 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r82516 r82519 1 2011-03-30 Oliver Hunt <oliver@apple.com> 2 3 Rollout r82500 4 5 * bytecode/CodeBlock.cpp: 6 (JSC::CodeBlock::dump): 7 (JSC::CodeBlock::derefStructures): 8 (JSC::CodeBlock::refStructures): 9 (JSC::CodeBlock::markAggregate): 10 * bytecode/Instruction.h: 11 (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): 12 (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): 13 (JSC::PolymorphicAccessStructureList::derefStructures): 14 (JSC::Instruction::Instruction): 15 * bytecode/StructureStubInfo.cpp: 16 (JSC::StructureStubInfo::deref): 17 * bytecode/StructureStubInfo.h: 18 (JSC::StructureStubInfo::initGetByIdChain): 19 (JSC::StructureStubInfo::initPutByIdTransition): 20 * bytecompiler/BytecodeGenerator.cpp: 21 (JSC::BytecodeGenerator::emitJumpIfNotFunctionCall): 22 (JSC::BytecodeGenerator::emitJumpIfNotFunctionApply): 23 * interpreter/Interpreter.cpp: 24 (JSC::Interpreter::privateExecute): 25 * jit/JITOpcodes.cpp: 26 (JSC::JIT::emit_op_jneq_ptr): 27 * jit/JITOpcodes32_64.cpp: 28 (JSC::JIT::emit_op_jneq_ptr): 29 * jit/JITPropertyAccess.cpp: 30 (JSC::JIT::privateCompileGetByIdChainList): 31 * jit/JITPropertyAccess32_64.cpp: 32 (JSC::JIT::privateCompileGetByIdChainList): 33 * jit/JITStubs.cpp: 34 (JSC::getPolymorphicAccessStructureListSlot): 35 (JSC::DEFINE_STUB_FUNCTION): 36 * runtime/JSCell.h: 37 * runtime/JSGlobalData.cpp: 38 (JSC::JSGlobalData::JSGlobalData): 39 * runtime/JSGlobalData.h: 40 * runtime/JSGlobalObject.cpp: 41 (JSC::markIfNeeded): 42 * runtime/JSGlobalObject.h: 43 (JSC::Structure::prototypeChain): 44 * runtime/JSObject.h: 45 (JSC::JSObject::markChildrenDirect): 46 * runtime/JSPropertyNameIterator.cpp: 47 (JSC::JSPropertyNameIterator::create): 48 (JSC::JSPropertyNameIterator::get): 49 (JSC::JSPropertyNameIterator::markChildren): 50 * runtime/JSPropertyNameIterator.h: 51 (JSC::JSPropertyNameIterator::setCachedPrototypeChain): 52 * runtime/MarkStack.h: 53 (JSC::MarkStack::append): 54 * runtime/Structure.h: 55 * runtime/StructureChain.cpp: 56 (JSC::StructureChain::StructureChain): 57 * runtime/StructureChain.h: 58 (JSC::StructureChain::create): 59 1 60 2011-03-29 Matthew Delaney <mdelaney@apple.com> 2 61 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r82500 r82519 732 732 int r0 = (++it)->u.operand; 733 733 int id0 = (++it)->u.operand; 734 JSValue scope = JSValue((++it)->u.jsCell .get());734 JSValue scope = JSValue((++it)->u.jsCell); 735 735 ++it; 736 736 int depth = (++it)->u.operand; … … 1438 1438 if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_chain)) { 1439 1439 vPC[4].u.structure->deref(); 1440 vPC[5].u.structureChain->deref(); 1440 1441 return; 1441 1442 } … … 1443 1444 vPC[4].u.structure->deref(); 1444 1445 vPC[5].u.structure->deref(); 1446 vPC[6].u.structureChain->deref(); 1445 1447 return; 1446 1448 } … … 1485 1487 if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_chain)) { 1486 1488 vPC[4].u.structure->ref(); 1489 vPC[5].u.structureChain->ref(); 1487 1490 return; 1488 1491 } … … 1490 1493 vPC[4].u.structure->ref(); 1491 1494 vPC[5].u.structure->ref(); 1495 vPC[6].u.structureChain->ref(); 1492 1496 return; 1493 1497 } … … 1524 1528 markStack.append(&callLinkInfo(i).callee); 1525 1529 #endif 1526 #if ENABLE(INTERPRETER)1527 Interpreter* interpreter = m_globalData->interpreter;1528 for (size_t size = m_propertyAccessInstructions.size(), i = 0; i < size; ++i) {1529 Instruction* vPC = &m_instructions[m_propertyAccessInstructions[i]];1530 if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_chain))1531 markStack.append(&vPC[5].u.structureChain);1532 else if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition))1533 markStack.append(&vPC[6].u.structureChain);1534 }1535 #endif1536 #if ENABLE(JIT)1537 for (size_t size = m_structureStubInfos.size(), i = 0; i < size; ++i)1538 m_structureStubInfos[i].markAggregate(markStack);1539 #endif1540 1530 } 1541 1531 -
trunk/Source/JavaScriptCore/bytecode/Instruction.h
r82500 r82519 64 64 union { 65 65 Structure* proto; 66 WriteBarrierBase<StructureChain>chain;66 StructureChain* chain; 67 67 } u; 68 68 … … 83 83 } 84 84 85 void set( JSGlobalData& globalData, JSCell* owner,PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, StructureChain* _chain)85 void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, StructureChain* _chain) 86 86 { 87 87 stubRoutine = _stubRoutine; 88 88 base = _base; 89 u.chain .set(globalData, owner, _chain);89 u.chain = _chain; 90 90 isChain = true; 91 91 } … … 102 102 } 103 103 104 PolymorphicAccessStructureList( JSGlobalData& globalData, JSCell* owner,PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, StructureChain* firstChain)104 PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, StructureChain* firstChain) 105 105 { 106 list[0].set( globalData, owner,stubRoutine, firstBase, firstChain);106 list[0].set(stubRoutine, firstBase, firstChain); 107 107 } 108 108 … … 116 116 117 117 if (info.u.proto) { 118 if (!info.isChain) 118 if (info.isChain) 119 info.u.chain->deref(); 120 else 119 121 info.u.proto->deref(); 120 122 } 121 }122 }123 124 void markAggregate(MarkStack& markStack, int count)125 {126 for (int i = 0; i < count; ++i) {127 PolymorphicStubInfo& info = list[i];128 ASSERT(info.base);129 130 if (info.u.proto && info.isChain)131 markStack.append(&info.u.chain);132 123 } 133 124 } … … 140 131 // We have to initialize one of the pointer members to ensure that 141 132 // the entire struct is initialized, when opcode is not a pointer. 142 u.jsCell .clear();133 u.jsCell = 0; 143 134 #endif 144 135 u.opcode = opcode; … … 149 140 // We have to initialize one of the pointer members to ensure that 150 141 // the entire struct is initialized in 64-bit. 151 u.jsCell .clear();142 u.jsCell = 0; 152 143 u.operand = operand; 153 144 } 154 145 155 146 Instruction(Structure* structure) { u.structure = structure; } 156 Instruction(JSGlobalData& globalData, JSCell* owner, StructureChain* structureChain) 157 { 158 u.structureChain.clear(); 159 u.structureChain.set(globalData, owner, structureChain); 160 } 161 Instruction(JSGlobalData& globalData, JSCell* owner, JSCell* jsCell) 162 { 163 u.jsCell.clear(); 164 u.jsCell.set(globalData, owner, jsCell); 165 } 147 Instruction(StructureChain* structureChain) { u.structureChain = structureChain; } 148 Instruction(JSCell* jsCell) { u.jsCell = jsCell; } 166 149 Instruction(PolymorphicAccessStructureList* polymorphicStructures) { u.polymorphicStructures = polymorphicStructures; } 167 150 Instruction(PropertySlot::GetValueFunc getterFunc) { u.getterFunc = getterFunc; } … … 171 154 int operand; 172 155 Structure* structure; 173 WriteBarrierBase<StructureChain>structureChain;174 WriteBarrierBase<JSCell>jsCell;156 StructureChain* structureChain; 157 JSCell* jsCell; 175 158 PolymorphicAccessStructureList* polymorphicStructures; 176 159 PropertySlot::GetValueFunc getterFunc; -
trunk/Source/JavaScriptCore/bytecode/StructureStubInfo.cpp
r82500 r82519 45 45 case access_get_by_id_chain: 46 46 u.getByIdChain.baseObjectStructure->deref(); 47 u.getByIdChain.chain->deref(); 47 48 return; 48 49 case access_get_by_id_self_list: { … … 61 62 u.putByIdTransition.previousStructure->deref(); 62 63 u.putByIdTransition.structure->deref(); 64 u.putByIdTransition.chain->deref(); 63 65 return; 64 66 case access_put_by_id_replace: … … 77 79 } 78 80 } 79 80 void StructureStubInfo::markAggregate(MarkStack& markStack)81 {82 switch (accessType) {83 case access_get_by_id_self:84 return;85 case access_get_by_id_proto:86 return;87 case access_get_by_id_chain:88 return;89 case access_get_by_id_self_list: {90 PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList;91 polymorphicStructures->markAggregate(markStack, u.getByIdSelfList.listSize);92 return;93 }94 case access_get_by_id_proto_list: {95 PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList;96 polymorphicStructures->markAggregate(markStack, u.getByIdProtoList.listSize);97 return;98 }99 case access_put_by_id_transition:100 return;101 case access_put_by_id_replace:102 return;103 case access_get_by_id:104 case access_put_by_id:105 case access_get_by_id_generic:106 case access_put_by_id_generic:107 case access_get_array_length:108 case access_get_string_length:109 // These instructions don't ref their Structures.110 return;111 default:112 ASSERT_NOT_REACHED();113 }114 }115 81 #endif 116 82 -
trunk/Source/JavaScriptCore/bytecode/StructureStubInfo.h
r82500 r82519 86 86 87 87 u.getByIdChain.chain = chain; 88 chain->ref(); 88 89 } 89 90 … … 117 118 118 119 u.putByIdTransition.chain = chain; 120 chain->ref(); 119 121 } 120 122 … … 128 130 129 131 void deref(); 130 void markAggregate(MarkStack&);131 132 132 133 bool seenOnce() -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r82500 r82519 926 926 emitOpcode(op_jneq_ptr); 927 927 instructions().append(cond->index()); 928 instructions().append( Instruction(*m_globalData, m_codeBlock->ownerExecutable(), m_scopeChain->globalObject->callFunction()));928 instructions().append(m_scopeChain->globalObject->callFunction()); 929 929 instructions().append(target->bind(begin, instructions().size())); 930 930 return target; … … 937 937 emitOpcode(op_jneq_ptr); 938 938 instructions().append(cond->index()); 939 instructions().append( Instruction(*m_globalData, m_codeBlock->ownerExecutable(), m_scopeChain->globalObject->applyFunction()));939 instructions().append(m_scopeChain->globalObject->applyFunction()); 940 940 instructions().append(target->bind(begin, instructions().size())); 941 941 return target; -
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r82500 r82519 3538 3538 */ 3539 3539 int src = vPC[1].u.operand; 3540 JSValue ptr = JSValue(vPC[2].u.jsCell); 3540 3541 int target = vPC[3].u.operand; 3541 3542 JSValue srcValue = callFrame->r(src).jsValue(); 3542 if (srcValue != vPC[2].u.jsCell.get()) {3543 if (srcValue != ptr) { 3543 3544 vPC += target; 3544 3545 NEXT_INSTRUCTION(); -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r82500 r82519 763 763 { 764 764 unsigned src = currentInstruction[1].u.operand; 765 JSCell* ptr = currentInstruction[2].u.jsCell .get();765 JSCell* ptr = currentInstruction[2].u.jsCell; 766 766 unsigned target = currentInstruction[3].u.operand; 767 767 -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r82500 r82519 980 980 { 981 981 unsigned src = currentInstruction[1].u.operand; 982 JSCell* ptr = currentInstruction[2].u.jsCell .get();982 JSCell* ptr = currentInstruction[2].u.jsCell; 983 983 unsigned target = currentInstruction[3].u.operand; 984 984 -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r82500 r82519 980 980 // Track the stub we have created so that it will be deleted later. 981 981 structure->ref(); 982 prototypeStructures->list[currentIndex].set(callFrame->globalData(), m_codeBlock->ownerExecutable(), entryLabel, structure, chain); 982 chain->ref(); 983 prototypeStructures->list[currentIndex].set(entryLabel, structure, chain); 983 984 984 985 // Finally patch the jump to slow case back in the hot path to jump here instead. -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
r82500 r82519 1008 1008 // Track the stub we have created so that it will be deleted later. 1009 1009 structure->ref(); 1010 prototypeStructures->list[currentIndex].set(callFrame->globalData(), m_codeBlock->ownerExecutable(), entryLabel, structure, chain); 1010 chain->ref(); 1011 prototypeStructures->list[currentIndex].set(entryLabel, structure, chain); 1011 1012 1012 1013 // Finally patch the jump to slow case back in the hot path to jump here instead. -
trunk/Source/JavaScriptCore/jit/JITStubs.cpp
r82500 r82519 1554 1554 } 1555 1555 1556 static PolymorphicAccessStructureList* getPolymorphicAccessStructureListSlot( JSGlobalData& globalData, ScriptExecutable* owner,StructureStubInfo* stubInfo, int& listIndex)1556 static PolymorphicAccessStructureList* getPolymorphicAccessStructureListSlot(StructureStubInfo* stubInfo, int& listIndex) 1557 1557 { 1558 1558 PolymorphicAccessStructureList* prototypeStructureList = 0; … … 1566 1566 break; 1567 1567 case access_get_by_id_chain: 1568 prototypeStructureList = new PolymorphicAccessStructureList( globalData, owner,stubInfo->stubRoutine, stubInfo->u.getByIdChain.baseObjectStructure, stubInfo->u.getByIdChain.chain);1568 prototypeStructureList = new PolymorphicAccessStructureList(stubInfo->stubRoutine, stubInfo->u.getByIdChain.baseObjectStructure, stubInfo->u.getByIdChain.chain); 1569 1569 stubInfo->stubRoutine = CodeLocationLabel(); 1570 1570 stubInfo->initGetByIdProtoList(prototypeStructureList, 2); … … 1654 1654 1655 1655 int listIndex; 1656 PolymorphicAccessStructureList* prototypeStructureList = getPolymorphicAccessStructureListSlot( callFrame->globalData(), codeBlock->ownerExecutable(),stubInfo, listIndex);1656 PolymorphicAccessStructureList* prototypeStructureList = getPolymorphicAccessStructureListSlot(stubInfo, listIndex); 1657 1657 if (listIndex < POLYMORPHIC_LIST_CACHE_SIZE) { 1658 1658 JIT::compileGetByIdProtoList(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, prototypeStructureList, listIndex, structure, slotBaseObject->structure(), propertyName, slot, offset); … … 1664 1664 ASSERT(!baseValue.asCell()->structure()->isDictionary()); 1665 1665 int listIndex; 1666 PolymorphicAccessStructureList* prototypeStructureList = getPolymorphicAccessStructureListSlot( callFrame->globalData(), codeBlock->ownerExecutable(),stubInfo, listIndex);1666 PolymorphicAccessStructureList* prototypeStructureList = getPolymorphicAccessStructureListSlot(stubInfo, listIndex); 1667 1667 1668 1668 if (listIndex < POLYMORPHIC_LIST_CACHE_SIZE) { -
trunk/Source/JavaScriptCore/runtime/JSCell.h
r82500 r82519 69 69 friend class MarkedBlock; 70 70 friend class ScopeChainNode; 71 friend class StructureChain;72 71 73 72 private: -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.cpp
r82500 r82519 185 185 functionExecutableStructure = FunctionExecutable::createStructure(*this, jsNull()); 186 186 dummyMarkableCellStructure = JSCell::createDummyStructure(*this); 187 structureChainStructure = StructureChain::createStructure(*this, jsNull());188 187 189 188 interpreter = new Interpreter(*this); -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.h
r82500 r82519 162 162 RefPtr<Structure> functionExecutableStructure; 163 163 RefPtr<Structure> dummyMarkableCellStructure; 164 RefPtr<Structure> structureChainStructure;165 164 166 165 static void storeVPtrs(); -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r82500 r82519 89 89 if (s && s->storedPrototype()) 90 90 markStack.append(s->storedPrototypeSlot()); 91 if (s && *s->cachedPrototypeChainSlot())92 markStack.append(s->cachedPrototypeChainSlot());93 91 } 94 92 -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h
r82500 r82519 29 29 #include "NumberPrototype.h" 30 30 #include "StringPrototype.h" 31 #include "StructureChain.h"32 31 #include <wtf/HashSet.h> 33 32 #include <wtf/OwnPtr.h> … … 364 363 if (!isValid(exec, m_cachedPrototypeChain.get())) { 365 364 JSValue prototype = prototypeForLookup(exec); 366 m_cachedPrototypeChain = StructureChain::create( exec->globalData(),prototype.isNull() ? 0 : asObject(prototype)->structure());365 m_cachedPrototypeChain = StructureChain::create(prototype.isNull() ? 0 : asObject(prototype)->structure()); 367 366 } 368 367 return m_cachedPrototypeChain.get(); -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r82500 r82519 815 815 { 816 816 JSCell::markChildren(markStack); 817 817 818 818 markStack.append(m_structure->storedPrototypeSlot()); 819 if (*m_structure->cachedPrototypeChainSlot())820 markStack.append(m_structure->cachedPrototypeChainSlot());821 819 PropertyStorage storage = propertyStorage(); 822 820 size_t storageSize = m_structure->propertyStorageSize(); -
trunk/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
r82500 r82519 78 78 } 79 79 80 jsPropertyNameIterator->setCachedPrototypeChain( exec->globalData(),structureChain);80 jsPropertyNameIterator->setCachedPrototypeChain(structureChain); 81 81 jsPropertyNameIterator->setCachedStructure(o->structure()); 82 82 o->structure()->setEnumerationCache(exec->globalData(), jsPropertyNameIterator); … … 87 87 { 88 88 JSValue identifier = m_jsStrings[i].get(); 89 if (m_cachedStructure == base->structure() && m_cachedPrototypeChain .get()== base->structure()->prototypeChain(exec))89 if (m_cachedStructure == base->structure() && m_cachedPrototypeChain == base->structure()->prototypeChain(exec)) 90 90 return identifier; 91 91 … … 98 98 { 99 99 markStack.appendValues(m_jsStrings.get(), m_jsStringsSize, MayContainNullValues); 100 if (m_cachedPrototypeChain)101 markStack.append(&m_cachedPrototypeChain);102 100 } 103 101 -
trunk/Source/JavaScriptCore/runtime/JSPropertyNameIterator.h
r82500 r82519 74 74 Structure* cachedStructure() { return m_cachedStructure.get(); } 75 75 76 void setCachedPrototypeChain( JSGlobalData& globalData, StructureChain* cachedPrototypeChain) { m_cachedPrototypeChain.set(globalData, this, cachedPrototypeChain); }76 void setCachedPrototypeChain(NonNullPassRefPtr<StructureChain> cachedPrototypeChain) { m_cachedPrototypeChain = cachedPrototypeChain; } 77 77 StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); } 78 78 … … 85 85 86 86 RefPtr<Structure> m_cachedStructure; 87 WriteBarrier<StructureChain> m_cachedPrototypeChain;87 RefPtr<StructureChain> m_cachedPrototypeChain; 88 88 uint32_t m_numCacheableSlots; 89 89 uint32_t m_jsStringsSize; -
trunk/Source/JavaScriptCore/runtime/MarkStack.h
r82500 r82519 216 216 template <typename T> inline void MarkStack::append(DeprecatedPtr<T>* slot) 217 217 { 218 internalAppend( *slot->slot());218 internalAppend(slot->get()); 219 219 } 220 220 221 221 template <typename T> inline void MarkStack::append(WriteBarrierBase<T>* slot) 222 222 { 223 internalAppend( *slot->slot());223 internalAppend(slot->get()); 224 224 } 225 225 -
trunk/Source/JavaScriptCore/runtime/Structure.h
r82500 r82519 33 33 #include "PropertyNameArray.h" 34 34 #include "Protect.h" 35 #include "StructureChain.h" 35 36 #include "StructureTransitionTable.h" 36 37 #include "JSTypeInfo.h" … … 46 47 class PropertyNameArray; 47 48 class PropertyNameArrayData; 48 class StructureChain;49 49 50 50 struct ClassInfo; … … 108 108 JSValue prototypeForLookup(ExecState*) const; 109 109 StructureChain* prototypeChain(ExecState*) const; 110 DeprecatedPtr<StructureChain>* cachedPrototypeChainSlot() { return &m_cachedPrototypeChain; }111 110 112 111 Structure* previousID() const { return m_previous.get(); } … … 212 211 213 212 DeprecatedPtr<Unknown> m_prototype; 214 mutable DeprecatedPtr<StructureChain> m_cachedPrototypeChain;213 mutable RefPtr<StructureChain> m_cachedPrototypeChain; 215 214 216 215 RefPtr<Structure> m_previous; -
trunk/Source/JavaScriptCore/runtime/StructureChain.cpp
r82500 r82519 33 33 namespace JSC { 34 34 35 StructureChain::StructureChain(NonNullPassRefPtr<Structure> structure, Structure* head) 36 : JSCell(structure.releaseRef()) 35 StructureChain::StructureChain(Structure* head) 37 36 { 38 37 size_t size = 0; -
trunk/Source/JavaScriptCore/runtime/StructureChain.h
r82500 r82519 27 27 #define StructureChain_h 28 28 29 #include "JSCell.h"30 31 29 #include <wtf/OwnArrayPtr.h> 32 30 #include <wtf/PassRefPtr.h> … … 38 36 class Structure; 39 37 40 class StructureChain : public JSCell{38 class StructureChain : public RefCounted<StructureChain> { 41 39 friend class JIT; 42 40 43 41 public: 44 static StructureChain* create(JSGlobalData& globalData, Structure* head) { return new (&globalData) StructureChain(globalData.structureChainStructure, head); }42 static PassRefPtr<StructureChain> create(Structure* head) { return adoptRef(new StructureChain(head)); } 45 43 RefPtr<Structure>* head() { return m_vector.get(); } 46 44 47 static PassRefPtr<Structure> createStructure(JSGlobalData& globalData, JSValue prototype) { return Structure::create(globalData, prototype, TypeInfo(CompoundType, OverridesMarkChildren), 0, 0); }48 45 private: 49 StructureChain( NonNullPassRefPtr<Structure>,Structure* head);46 StructureChain(Structure* head); 50 47 51 48 OwnArrayPtr<RefPtr<Structure> > m_vector;
Note: See TracChangeset
for help on using the changeset viewer.