Changeset 167326 in webkit for trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm
- Timestamp:
- Apr 15, 2014, 2:05:09 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm
r166835 r167326 88 88 NSMapTable *m_contextCache; 89 89 NSMapTable *m_externalObjectGraph; 90 NSMapTable *m_externalRememberedSet; 90 91 } 91 92 … … 114 115 NSPointerFunctionsOptions strongIDOptions = NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality; 115 116 m_externalObjectGraph = [[NSMapTable alloc] initWithKeyOptions:weakIDOptions valueOptions:strongIDOptions capacity:0]; 117 118 NSPointerFunctionsOptions integerOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsIntegerPersonality; 119 m_externalRememberedSet = [[NSMapTable alloc] initWithKeyOptions:weakIDOptions valueOptions:integerOptions capacity:0]; 116 120 117 121 [JSVMWrapperCache addWrapper:self forJSContextGroupRef:group]; … … 125 129 [m_contextCache release]; 126 130 [m_externalObjectGraph release]; 131 [m_externalRememberedSet release]; 127 132 [super dealloc]; 128 133 } … … 144 149 145 150 return object; 151 } 152 153 - (bool)isOldExternalObject:(id)object 154 { 155 JSC::VM* vm = toJS(m_group); 156 return vm->heap.slotVisitor().containsOpaqueRoot(object); 157 } 158 159 - (void)addExternalRememberedObject:(id)object 160 { 161 ASSERT([self isOldExternalObject:object]); 162 [m_externalRememberedSet setObject:[NSNumber numberWithBool:true] forKey:object]; 146 163 } 147 164 … … 158 175 159 176 JSC::JSLockHolder locker(toJS(m_group)); 160 177 if ([self isOldExternalObject:owner] && ![self isOldExternalObject:object]) 178 [self addExternalRememberedObject:owner]; 179 161 180 NSMapTable *ownedObjects = [m_externalObjectGraph objectForKey:owner]; 162 181 if (!ownedObjects) { … … 199 218 NSMapRemove(ownedObjects, object); 200 219 201 if (![ownedObjects count]) 220 if (![ownedObjects count]) { 202 221 [m_externalObjectGraph removeObjectForKey:owner]; 222 [m_externalRememberedSet removeObjectForKey:owner]; 223 } 203 224 } 204 225 … … 233 254 { 234 255 return m_externalObjectGraph; 256 } 257 258 - (NSMapTable *)externalRememberedSet 259 { 260 return m_externalRememberedSet; 235 261 } 236 262 … … 254 280 255 281 NSMapTable *ownedObjects = [externalObjectGraph objectForKey:static_cast<id>(nextRoot)]; 256 id ownedObject; 257 NSEnumerator *enumerator = [ownedObjects keyEnumerator]; 258 while ((ownedObject = [enumerator nextObject])) 282 for (id ownedObject in ownedObjects) 259 283 stack.append(static_cast<void*>(ownedObject)); 260 284 } … … 262 286 } 263 287 264 #endif 265 288 void scanExternalRememberedSet(JSC::VM& vm, JSC::SlotVisitor& visitor) 289 { 290 @autoreleasepool { 291 JSVirtualMachine *virtualMachine = [JSVMWrapperCache wrapperForJSContextGroupRef:toRef(&vm)]; 292 if (!virtualMachine) 293 return; 294 NSMapTable *externalObjectGraph = [virtualMachine externalObjectGraph]; 295 NSMapTable *externalRememberedSet = [virtualMachine externalRememberedSet]; 296 for (id key in externalRememberedSet) { 297 NSMapTable *ownedObjects = [externalObjectGraph objectForKey:key]; 298 for (id ownedObject in ownedObjects) 299 scanExternalObjectGraph(vm, visitor, ownedObject); 300 } 301 [externalRememberedSet removeAllObjects]; 302 } 303 } 304 305 #endif // JSC_OBJC_API_ENABLED
Note:
See TracChangeset
for help on using the changeset viewer.