[Kde-bindings] KDE/kdebindings/kalyptus

Arno Rehn arno at arnorehn.de
Fri May 16 17:50:18 UTC 2008


Am Freitag 16 Mai 2008 18:57:58 schrieb Richard Dale:
> On Friday 16 May 2008 14:47:52 Arno Rehn wrote:
> > SVN commit 808387 by arnorehn:
> >
> > * Fixed enums being marked as t_voidp if the containing
> >   classes weren't preparsed.
> > * Added the kalyptus module for generating lists of classes.
> >
> > CCMAIL: kde-bindings at kde.org
> >
> >
> >
> >  A             kalyptusCxxToClasslist.pm
> >  M  +21 -1     kalyptusCxxToSmoke.pm
> >
> >
> > --- trunk/KDE/kdebindings/kalyptus/kalyptusCxxToSmoke.pm #808386:808387
> > @@ -448,7 +448,8 @@
> >  	    return;
> >  	}
> >  	# return if the class is not in the current module or an ancestor of a
> > class in the module -	return if (defined($excludeClasses{$className}) &&
> > !isAncestorOfModuleClass($className) && $className ne 'QMetaObject'); #
> > && $className ne 'Qt'); +	return if (defined($excludeClasses{$className})
> > && !isAncestorOfModuleClass($className) +	           && $className ne
> > 'QMetaObject' && !defined($externClasses{$className})); # && $className
> > ne 'Qt'); $externClasses{$className} = 1 if
> > defined($excludeClasses{$className});
> >
> >  	my $signalCount = 0;
> > @@ -1846,6 +1847,10 @@
> >      # For instance, if $type was Q_UINT16&, realType will be ushort
> >      $allTypes{$type}{realType} = applyTypeDef( $realType );
> >      $realType = $allTypes{$type}{realType};
> > +    if ($realType =~ /(.*)::/) {
> > +	my $c = $1;
> > +	$externClasses{$c} = 1 if defined($excludeClasses{$c});
> > +    }
> >      $externClasses{$realType} = 1 if
> > defined($excludeClasses{$realType});
> >
> >      # In the first phase we only create entries into allTypes.
> > @@ -2247,6 +2252,8 @@
> >  	}
> >  	# First write the name
> >  	print OUT "\t{ \"$type\", ";
> > +	my $retried;
> > +retry:
> >  	# Then write the classId (and find out the typeid at the same time)
> >  	if(exists $classidx{$realType}) { # this one first, we want t_class for
> > QBlah* $typeId = 't_class';
> > @@ -2284,6 +2291,19 @@
> >  		if ( $skippedClasses{$realType} ) {
> >  #		    print STDERR "$realType has been skipped, using t_voidp for
> > it\n"; } else {
> > +		    # If we have an enum in a class that has not been preparsed
> > +		    # because it is not needed in any other way, try to find the node
> > +		    # and preparse it now. Then jump to the beginning and test again.
> > +		    if(!$retried && $realType =~ /(.*)::/) {
> > +			$retried = 1;
> > +			my $c = $1;
> > +			my $cnode = kdocAstUtil::findRef( $rootnode, "$c" );
> > +			if ($cnode) {
> > +			    preParseClass($cnode);
> > +			    # ugly, but the easiest way without copying all the code again
> > +			    goto retry;
> > +			}
> > +		    }
> >  		    unless( $realType =~ /</ ) { # Don't warn for template stuff...
> >  			print STDERR "$realType isn't a known type (type=$type)\n";
> >  		    }
>
> I've been thinking about this and looking at the code too, and it is quite
> tricky. I'm not sure if this test is quite right - won't it trap nested
> classes as well as enums?
>
> if(!$retried && $realType =~ /(.*)::/) {
Yes, it will trap nested classes as well. But it won't make any difference in 
the generated code, since the cast function, the inheritance table and the 
class table have already been written. Types that refer to classes are marked 
external anyway and methods won't be added due to the class being external. 
So all in all it doesn't matter really if it also traps nested classes or 
only enums..

> I thought seemed like we need another pass after preprocessing the classes.
> In the first pass we register all types on all classes, and remove this
> condition:
>
> return if (defined($excludeClasses{$className}) &&
> !isAncestorOfModuleClass($className) && $className ne 'QMetaObject')
>
> In the second pass, any types which are used by methods which are either in
> the classes in the current module, or are in virtual methods from classes
> outside the module that are inherited, are marked as 'used' in the
> registered types table. Then we remove any types that aren't marked 'used'
> after the second pass. But maybe your version will amount to the same.

-- 
Arno Rehn
arno at arnorehn.de



More information about the Kde-bindings mailing list