1.1 --- a/src/TypeManager.cpp Tue Dec 25 17:02:07 2012 -0800
1.2 +++ b/src/TypeManager.cpp Tue Dec 25 18:13:02 2012 -0800
1.3 @@ -28,7 +28,8 @@
1.4
1.5
1.6 TypeManager::TypeManager(Zone *zone)
1.7 - : zone_(zone)
1.8 + : zone_(zone),
1.9 + qualTable_(ZoneAllocatorPolicy())
1.10 {
1.11 }
1.12
1.13 @@ -65,6 +66,9 @@
1.14 return false;
1.15 }
1.16
1.17 + if (!qualTable_.init(32))
1.18 + return false;
1.19 +
1.20 return true;
1.21 }
1.22
1.23 @@ -97,6 +101,32 @@
1.24 return EnumType::New(zone_, name);
1.25 }
1.26
1.27 +Type *
1.28 +TypeManager::qualify(Handle<Type> type, TypeQualifiers quals)
1.29 +{
1.30 + assert(!type->hasTypeQualifiers());
1.31 +
1.32 + LookupKey key(type, quals);
1.33 +
1.34 + // We can't use findForAdd because a GC could rehash the table.
1.35 + TypeHashTable::Result r = qualTable_.find(key);
1.36 + if (r.found())
1.37 + return *r;
1.38 +
1.39 + Type *quald = Type::NewQualified(zone_, quals, type);
1.40 + if (!quald)
1.41 + return NULL;
1.42 +
1.43 + // :TODO: assert-no-gc
1.44 + TypeHashTable::Insert i = qualTable_.findForAdd(key);
1.45 + assert(!i.found());
1.46 +
1.47 + if (!qualTable_.add(i, quald))
1.48 + return NULL;
1.49 +
1.50 + return quald;
1.51 +}
1.52 +
1.53 void
1.54 TypeManager::accept(VirtualObjectVisitor *visitor)
1.55 {
1.56 @@ -108,3 +138,17 @@
1.57 visitor->visit(referenceTypes_[i].address());
1.58 }
1.59 }
1.60 +
1.61 +void
1.62 +TypeManager::sweep()
1.63 +{
1.64 + for (TypeHashTable::iterator i(&qualTable_); !i.empty(); i.next()) {
1.65 + Type *obj = *i;
1.66 + MarkBit bits = HeapChunk::GetMarkBit(obj);
1.67 + if (HeapChunk::IsWhite(bits))
1.68 + i.erase();
1.69 + else
1.70 + assert(HeapChunk::IsBlack(bits));
1.71 + }
1.72 + qualTable_.checkDensity();
1.73 +}