bool ObjCLanguageRuntime::GetTypeBitSize(const CompilerType &compiler_type, uint64_t &size) { void *opaque_ptr = compiler_type.GetOpaqueQualType(); size = m_type_size_cache.Lookup(opaque_ptr); // an ObjC object will at least have an ISA, so 0 is definitely not OK if (size > 0) return true; ClassDescriptorSP class_descriptor_sp = GetClassDescriptorFromClassName(compiler_type.GetTypeName()); if (!class_descriptor_sp) return false; int32_t max_offset = INT32_MIN; uint64_t sizeof_max = 0; bool found = false; for (size_t idx = 0; idx < class_descriptor_sp->GetNumIVars(); idx++) { const auto &ivar = class_descriptor_sp->GetIVarAtIndex(idx); int32_t cur_offset = ivar.m_offset; if (cur_offset > max_offset) { max_offset = cur_offset; sizeof_max = ivar.m_size; found = true; } } size = 8 * (max_offset + sizeof_max); if (found) m_type_size_cache.Insert(opaque_ptr, size); return found; }
CompilerType JavaASTContext::CreateReferenceType(const CompilerType &pointee_type) { ConstString name = pointee_type.GetTypeName(); auto it = m_reference_type_map.find(name); if (it == m_reference_type_map.end()) it = m_reference_type_map .emplace(name, std::unique_ptr<JavaType>( new JavaReferenceType(pointee_type))) .first; return CompilerType(this, it->second.get()); }
CompilerType JavaASTContext::CreateArrayType( const ConstString &linkage_name, const CompilerType &element_type, const DWARFExpression &length_expression, const lldb::addr_t data_offset) { ConstString name = element_type.GetTypeName(); auto it = m_array_type_map.find(name); if (it == m_array_type_map.end()) { std::unique_ptr<JavaType> array_type(new JavaArrayType( linkage_name, element_type, length_expression, data_offset)); it = m_array_type_map.emplace(name, std::move(array_type)).first; } return CompilerType(this, it->second.get()); }