Type::bits_t Type::bitsFromDataType(DataType outer, DataType inner) { assert(outer != KindOfInvalid); assert(inner != KindOfRef); assert(IMPLIES(inner == KindOfNone, outer != KindOfRef)); switch (outer) { case KindOfUninit : return kUninit; case KindOfNull : return kInitNull; case KindOfBoolean : return kBool; case KindOfInt64 : return kInt; case KindOfDouble : return kDbl; case KindOfStaticString : return kStaticStr; case KindOfString : return kStr; case KindOfArray : return kArr; case KindOfResource : return kRes; case KindOfObject : return kObj; case KindOfClass : return kCls; case KindOfUncountedInit : return kUncountedInit; case KindOfUncounted : return kUncounted; case KindOfAny : return kGen; case KindOfRef: { if (inner == KindOfAny) { return kBoxedCell; } else { assert(inner != KindOfUninit); return bitsFromDataType(inner, KindOfNone) << kBoxShift; } } default : always_assert(false && "Unsupported DataType"); } }
Type::Type(const RuntimeType& rtt) : m_bits(bitsFromDataType(rtt.outerType(), rtt.innerType())) , m_class(nullptr) { if (rtt.outerType() == KindOfObject && rtt.hasKnownClass()) { m_class = rtt.knownClass(); } else if (rtt.outerType() == KindOfArray && rtt.hasArrayKind()) { m_arrayKindValid = true; m_arrayKind = rtt.arrayKind(); } }
Type::Type(const RuntimeType& rtt) : m_bits(bitsFromDataType(rtt.outerType(), rtt.innerType())) , m_hasConstVal(false) , m_class(nullptr) { if (rtt.outerType() == KindOfObject && rtt.hasKnownClass()) { m_class = rtt.knownClass(); } else if (rtt.outerType() == KindOfArray && rtt.hasArrayKind()) { m_arrayInfo = makeArrayInfo(rtt.arrayKind(), nullptr); } }
Type::bits_t Type::bitsFromDataType(DataType outer, DataType inner) { assertx(inner != KindOfRef); assertx(inner == KindOfUninit || outer == KindOfRef); switch (outer) { case KindOfUninit : return kUninit; case KindOfNull : return kInitNull; case KindOfBoolean : return kBool; case KindOfInt64 : return kInt; case KindOfDouble : return kDbl; case KindOfStaticString : return kStaticStr; case KindOfString : return kStr; case KindOfArray : return kArr; case KindOfResource : return kRes; case KindOfObject : return kObj; case KindOfClass : return kCls; case KindOfRef: assertx(inner != KindOfUninit); return bitsFromDataType(inner, KindOfUninit) << kBoxShift; } not_reached(); }