-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGCObject.cpp
More file actions
62 lines (56 loc) · 1.75 KB
/
GCObject.cpp
File metadata and controls
62 lines (56 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "pch.h"
#include "JSString.h"
#include "JSVM.h"
#include "JSArray.h"
#include "JSFunction.h"
GCObjectManager* GCObjectManager::s_ins;
GCObjectManager::~GCObjectManager() {
ASSERT(m_head == NULL && m_objCount == 0);
}
void GCObjectManager::link(GCObject *obj) {
obj->next = m_head;
m_head = obj;
++m_objCount;
}
void GCObjectManager::performFullGC() {
vector<GCObject*> unscans;
JSVM::instance()->accessGCObjects(unscans);
while (!unscans.empty()) {
GCObject *obj = unscans.back();
unscans.pop_back();
switch (obj->type) {
case GCObject::GCT_Array:
static_cast<JSArray*>(obj)->accessGCObjects(unscans);
default: break;
}
obj->state = GCObject::GCS_Scan;
}
GCObject *oldHead = m_head;
m_head = NULL;
m_objCount = 0;
while (oldHead != NULL) {
GCObject *next = oldHead->next;
if (oldHead->state == GCObject::GCS_Unaccess) {
switch (oldHead->type) {
case GCObject::GCT_Array:
delete static_cast<JSArray*>(oldHead);
break;
case GCObject::GCT_String:
delete static_cast<JSString*>(oldHead);
break;
case GCObject::GCT_Function:
static_cast<Function*>(oldHead)->destroy();
break;
default: ASSERT(0); break;
}
} else {
ASSERT(oldHead->state == GCObject::GCS_Scan);
oldHead->state = GCObject::GCS_Unaccess;
oldHead->next = m_head;
m_head = oldHead;
++m_objCount;
}
oldHead = next;
}
JSStringManager::instance()->notifyValidGCObjects(m_head);
}