src/TypeManager.cpp
changeset 240 e3c851a14f16
parent 235 43287eef2fff
child 241 18f3010a358c
     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 +}