[cfe-commits] r76776 - /cfe/trunk/lib/AST/DeclCXX.cpp
Daniel Dunbar
daniel at zuster.org
Fri Jul 24 17:04:51 PDT 2009
On Wed, Jul 22, 2009 at 1:25 PM, Fariborz Jahanian<fjahanian at apple.com> wrote:
> Author: fjahanian
> Date: Wed Jul 22 15:25:00 2009
> New Revision: 76776
>
> URL: http://llvm.org/viewvc/llvm-project?rev=76776&view=rev
> Log:
> Improved on performance of the algorithm for proper ordering of
> ctor's initialization of bases and fields.
Cool
> + llvm::DenseMap<const void *, CXXBaseOrMemberInitializer*> AllBaseFields;
> +
> + for (unsigned i = 0; i < NumInitializers; i++) {
> + CXXBaseOrMemberInitializer *Member = Initializers[i];
> + const void * Key = Member->isBaseInitializer() ?
> + reinterpret_cast<const void *>(
> + Member->getBaseClass()->getAsRecordType()) :
> + reinterpret_cast<const void *>(Member->getMember());
> + AllBaseFields[Key] = Member;
> + }
I think this is more readable as:
--
for ... {
CXXBaseOrMemberInitializer *Member = Initializers[i];
if (Member->isBaseInitializer())
AllBaseFields[Member->getBaseClass()->getAsRecordType()] = Member;
else
AllBaseFields[Member->getMember()] = Member;
}
--
> +
> // Push virtual bases before others.
> for (CXXRecordDecl::base_class_iterator VBase =
> ClassDecl->vbases_begin(),
> E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
> - const Type * T = VBase->getType()->getAsRecordType();
> - unsigned int i = 0;
> - for (i = 0; i < NumInitializers; i++) {
> - CXXBaseOrMemberInitializer *Member = Initializers[i];
> - if (Member->isBaseInitializer() &&
> - Member->getBaseClass()->getAsRecordType() == T) {
> - AllToInit.push_back(Member);
> - break;
> - }
> - }
> - if (i == NumInitializers) {
> + const void *Key = reinterpret_cast<const void *>(
> + VBase->getType()->getAsRecordType());
I don't think this case is necessary?
> + if (AllBaseFields[Key])
> + AllToInit.push_back(AllBaseFields[Key]);
This should be
--
if (CXXBaseOrMemberInitializer *Value = AllBaseFields.lookup(Key))
AllToInit.push_back(Value)
--
Otherwise it looks up the value twice, and inserts a null binding into the map.
> + const void *Key = reinterpret_cast<const void *>(
> + Base->getType()->getAsRecordType());
> + if (AllBaseFields[Key])
> + AllToInit.push_back(AllBaseFields[Key]);
Same two comments as before.
> + const void * Key = reinterpret_cast<const void *>(*Field);
> + if (AllBaseFields[Key]) {
> + AllToInit.push_back(AllBaseFields[Key]);
> + continue;
Ditto.
- Daniel
More information about the cfe-commits
mailing list