Skip to content

Commit 078d02a

Browse files
committed
Mark & Sweep GC done.
1 parent 265cd28 commit 078d02a

File tree

5 files changed

+48
-2
lines changed

5 files changed

+48
-2
lines changed

JawaScriptExecutive-iOS/JawaExecutor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#import "JawaExternalCallback.h"
1313

1414
extern NSMutableDictionary* builtinFunctions;
15-
15+
extern int release_count;
1616
@class JawaObjectRef;
1717

1818

JawaScriptExecutive-iOS/JawaExecutor.m

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,51 @@ -(NSMutableDictionary*)invoke:(NSString *)funcName with:(NSMutableDictionary*)as
205205
setObject:n.boolValue ? @"true" : @"false"
206206
forKey:@"retValue"];
207207
}
208+
//printf("%lu objects are in pool.\n", jawaObjectPool.count);
209+
[self gc];
208210

209211
return retJSON;
210212
}
211213

214+
-(void)gc {
215+
for (JawaObjectRef* obj in jawaObjectPool) {
216+
obj.marked = false;
217+
obj.discovered = false;
218+
}
219+
for (NSString* key in self.global) {
220+
JawaObjectRef *objRef = [self.global objectForKey:key];
221+
[self markAndTraverse:objRef];
222+
}
223+
224+
NSMutableArray *markedObj = [NSMutableArray array];
225+
for (JawaObjectRef* obj in jawaObjectPool) {
226+
if (obj.marked)
227+
[markedObj addObject:obj];
228+
}
229+
//printf("%lu objects recycled.\n", jawaObjectPool.count - markedObj.count);
230+
[jawaObjectPool setArray:markedObj];
231+
}
232+
233+
-(void)markAndTraverse:(JawaObjectRef*)objRef {
234+
objRef.marked = true;
235+
objRef.discovered = true;
236+
237+
if ([objRef.object isMemberOfClass:[JawaArray class]]) {
238+
JawaArray* arr = ((JawaArray*)objRef.object);
239+
for (JawaObjectRef* elementRef in arr.elements) {
240+
if (!elementRef.discovered)
241+
[self markAndTraverse:elementRef];
242+
}
243+
} else if ([objRef.object isMemberOfClass:[JawaObject class]]) {
244+
JawaObject* obj = ((JawaObject*)objRef.object);
245+
for (NSString* key in obj.properties) {
246+
JawaObjectRef *elementRef = [obj.properties objectForKey:key];
247+
if (!elementRef.discovered)
248+
[self markAndTraverse:elementRef];
249+
}
250+
}
251+
}
252+
212253
-(NSInteger)compare:(JawaObjectRef*)o1 and:(JawaObjectRef*)o2 with:(JawaObjectRef*)comparator {
213254
if (comparator != nil && comparator.object != nil) {
214255
if (![comparator.object isMemberOfClass:[JawaFunc class]])

JawaScriptExecutive-iOS/JawaObjectRef.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
@class JawaObject;
1717

1818
extern NSMutableArray* jawaObjectPool;
19-
19+
extern int release_count;
2020
@interface JawaObjectRef : NSObject
2121
{
2222

2323
}
2424

25+
@property bool marked;
26+
@property bool discovered;
2527
@property (strong) NSObject* object;
2628
@property (weak) JawaObjectRef* appliedOn;
2729
@property (weak) JawaExecutor* executor;

JawaScriptExecutive-iOS/JawaObjectRef.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#import "JawaObjectRef.h"
1515

1616
NSMutableArray* jawaObjectPool;
17+
int release_count;
1718

1819
@implementation JawaObjectRef
1920

@@ -124,6 +125,7 @@ -(id)transfer {
124125
return self.object;
125126
}
126127
-(void)dealloc {
128+
release_count++;
127129
//printf("Releasing %s\n", [NSStringFromClass([self class]) cStringUsingEncoding:NSUTF8StringEncoding]);
128130
}
129131

JawaScriptExecutive-iOS/test.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,7 @@ int main(int argc, char *argv[]) {
866866
if (!test33()) return -1;
867867
if (!test34()) return -1;
868868
}
869+
//printf("%d\n", release_count);
869870
return 0;
870871
}
871872

0 commit comments

Comments
 (0)