[Kde-bindings] Re: KDE/kdebindings/perl/qtcore/src

Richard Dale richard.dale at telefonica.net
Fri Oct 1 19:50:42 UTC 2010


Thanks for the patch, but it is inline in a mail message and has got mangled 
for me. I had trouble finding it because the subject is 'Re: [Kde-bindings] 
KDE/kdebindings/perl/qtcore/src'. 

We really need to switch to using reviewboard and git, and the current KDE 
infrastructure just isn't good enough by 2010 standards IHMO. 

My aim with improving QtRuby for the 3.0 release was to use the JSmoke project 
as a test bed for developing entirely C++ based code that could be used as a 
basis for replacing the QtRuby mixed Ruby and C++ code that the current 
version of QtRuby uses for overloaded method resolution. If you can post the 
actual diff as an attachment, I can post the JSmoke code and we can compare and 
contrast how they look on this list.

I've just had an email about a proposal to move the smoke/qtscript bindings 
from gitorious to the kde git repository. I think this is great news, and 
maybe we can start developing QtRuby 3.0 as a sister project to JSmoke in the 
KDE repo, and merge the codebases.

-- Richard

On Wednesday, September 22, 2010 03:17:14 am Ryan Melton wrote:
> Here are patches to qtruby that fix the issue reported below.   The
> draggableicons and puzzle examples now work!
> 
> diff --git a/ext/ruby/qtruby/src/Qt.cpp b/ext/ruby/qtruby/src/Qt.cpp
> index 36fcddd..d0c3288 100644
> --- a/ext/ruby/qtruby/src/Qt.cpp
> +++ b/ext/ruby/qtruby/src/Qt.cpp
> @@ -526,6 +526,7 @@ findMethod(VALUE /*self*/, VALUE c_value, VALUE
> name_value)
>      VALUE result = rb_ary_new();
>      Smoke::ModuleIndex classId = Smoke::findClass(c);
>      Smoke::ModuleIndex meth = Smoke::NullModuleIndex;
> +    QList<Smoke::ModuleIndex> milist;
>      if (classId.smoke != 0) {
>          meth = classId.smoke->findMethod(c, name);
>      }
> @@ -540,39 +541,47 @@ findMethod(VALUE /*self*/, VALUE c_value, VALUE
> name_value)
>              Smoke::ModuleIndex mnid = s->idMethodName(name);
>              if (!cid.index || !mnid.index) continue;
>              meth = s->idMethod(cid.index, mnid.index);
> -            if (meth.index) break;
> +            if (meth.index) milist.append(meth);
>          }
>  #ifdef DEBUG
>          if (do_debug & qtdb_calls) qWarning("Found method QGlobalSpace::%s
> => %d", name, meth.index);
>  #endif
>      }
> +    else
> +    {
> +        milist.append(meth);
> +    }
> 
> -    if (meth.index == 0) {
> +    if (milist.count() == 0) {
>          return result;
>      // empty list
> -    } else if (meth.index > 0) {
> -        Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
> -        if (i == 0) {        // shouldn't happen
> -            rb_raise(rb_eArgError, "Corrupt method %s::%s", c, name);
> -        } else if(i > 0) {    // single match
> -            const Smoke::Method &methodRef = meth.smoke->methods[i];
> -            if ((methodRef.flags & Smoke::mf_internal) == 0) {
> -                rb_ary_push(result, rb_funcall(moduleindex_class,
> rb_intern("new"), 2, INT2NUM(smokeList.indexOf(meth.smoke)), INT2NUM(i)));
> -            }
> -        } else {        // multiple match
> -            i = -i;        // turn into ambiguousMethodList index
> -            while (meth.smoke->ambiguousMethodList[i]) {
> -                const Smoke::Method &methodRef =
> meth.smoke->methods[meth.smoke->ambiguousMethodList[i]];
> -                if ((methodRef.flags & Smoke::mf_internal) == 0) {
> -                    rb_ary_push(result, rb_funcall(moduleindex_class,
> rb_intern("new"), 2, INT2NUM(smokeList.indexOf(meth.smoke)),
> INT2NUM(meth.smoke->ambiguousMethodList[i])));
> +    } else {
> +        foreach (Smoke::ModuleIndex meth, milist) {
> +            if (meth.index > 0) {
> +                Smoke::Index i =
> meth.smoke->methodMaps[meth.index].method; +                if (i == 0) { 
>       // shouldn't happen
> +                    rb_raise(rb_eArgError, "Corrupt method %s::%s", c,
> name);
> +                } else if(i > 0) {    // single match
> +                    const Smoke::Method &methodRef =
> meth.smoke->methods[i];
> +                    if ((methodRef.flags & Smoke::mf_internal) == 0) {
> +                        rb_ary_push(result, rb_funcall(moduleindex_class,
> rb_intern("new"), 2, INT2NUM(smokeList.indexOf(meth.smoke)), INT2NUM(i)));
> +                    }
> +                } else {        // multiple match
> +                    i = -i;        // turn into ambiguousMethodList index
> +                    while (meth.smoke->ambiguousMethodList[i]) {
> +                        const Smoke::Method &methodRef =
> meth.smoke->methods[meth.smoke->ambiguousMethodList[i]];
> +                        if ((methodRef.flags & Smoke::mf_internal) == 0) {
> +                            rb_ary_push(result,
> rb_funcall(moduleindex_class, rb_intern("new"), 2,
> INT2NUM(smokeList.indexOf(meth.smoke)),
> INT2NUM(meth.smoke->ambiguousMethodList[i])));
>  //#ifdef DEBUG
> -                    if (do_debug & qtdb_calls) qWarning("Ambiguous Method
> %s::%s => %d", c, name, meth.smoke->ambiguousMethodList[i]);
> +                            if (do_debug & qtdb_calls) qWarning("Ambiguous
> Method %s::%s => %d", c, name, meth.smoke->ambiguousMethodList[i]);
>  //#endif
> 
> -                }
> -            i++;
> +                        }
> +                        i++;
> +                    }
> +            }
>              }
> -        }
> +        }
>      }
>      return result;
>  }
> 
> diff --git a/lib/Qt/qtruby4.rb b/lib/Qt/qtruby4.rb
> index 7acb006..cf235c7 100755
> --- a/lib/Qt/qtruby4.rb
> +++ b/lib/Qt/qtruby4.rb
> @@ -2740,11 +2740,11 @@ module Qt
>                      # Multiple matches are an error; the equality test
> below _cannot_ be commented out.
>                      # If ambiguous matches occur the problem must be fixed
> be adjusting the relative
>                      # ranking of the arg types involved in checkarg().
> -                    elsif current_match == best_match
> +                    elsif current_match == best_match && id.smoke ==
> chosen.smoke
>                          puts "multiple methods matching, this is an error"
> if debug_level >= DebugLevel::Minimal
>                          chosen = nil
>                      end
> -                    puts "match => #{id.index} score: #{current_match}" if
> debug_level >= DebugLevel::High
> +                    puts "match => #{id.index} score: #{current_match}
> chosen: #{chosen}" if debug_level >= DebugLevel::High
>                  end
> 
>                  puts "Resolved to id: #{chosen.index}" if !chosen.nil? &&
> debug_level >= DebugLevel::High
> @@ -2764,7 +2764,7 @@ module Qt
>                  method_ids = hash.values_at(*constructor_names).flatten
>                  puts dumpCandidates(method_ids)
>              else
> -                puts "setCurrentMethod(smokeList index: #{chosen.smoke},
> meth index: #{chosen.index})" if debug_level >= DebugLevel::High
> +                puts "setCurrentMethod(smokeList index: #{chosen.smoke},
> meth index: #{chosen.index})" if debug_level >= DebugLevel::High && chosen
>              end
>              setCurrentMethod(chosen) if chosen
>              return nil
> 
> On Mon, Sep 20, 2010 at 10:09 PM, Ryan Melton <ryanmelt at gmail.com> wrote:
> > Looks like this is probably the same probable affecting me in qtruby.
> > I'll work on a patch.
> > Ryan
> > 
> > On Thu, Sep 2, 2010 at 8:49 PM, Chris Michael Burel 
<chrisburel at gmail.com>wrote:
> >> SVN commit 1171223 by burel:
> >> 
> >> When calling a method in QGlobalSpace, don't stop when you find the
> >> first smoke module that provides the method you're looking for.  Look
> >> through all smoke modules.  This was breaking when calling operator<<
> >> on a QPixmap, because that method was defined by the QtGui module.  The
> >> code would find the methods from QtCore and stop there.
> >> 
> >> I think the other bindings may want this too.  I checked Ruby, and it
> >> looked incorrect to me.
> >> 
> >> CCMAIL: kde-bindings at kde.org
> >> 
> >>  M  +7 -4      QtCore4.xs
> >> 
> >> --- trunk/KDE/kdebindings/perl/qtcore/src/QtCore4.xs #1171222:1171223
> >> @@ -48,21 +48,23 @@
> >> 
> >>         char* classname
> >>         char* methodname
> >>     
> >>     PPCODE:
> >> -        Smoke::ModuleIndex mi;
> >> +        QList<Smoke::ModuleIndex> milist;
> >> 
> >>         if ( strcmp( classname, "QGlobalSpace" ) == 0 ) {
> >>         
> >>             // All modules put their global functions in "QGlobalSpace".
> >>  
> >>  So we
> >>  
> >>             // have to use each smoke object to look for this method.
> >>             for (int i = 0; i < smokeList.size(); ++i) {
> >> 
> >> -                mi = smokeList.at(i)->findMethod(classname,
> >> methodname); +                Smoke::ModuleIndex mi =
> >> smokeList.at(i)->findMethod(classname, methodname);
> >> 
> >>                 if( mi.smoke ) {
> >> 
> >> -                    break;
> >> +                    // Found a result, add it to the return
> >> +                    milist.append(mi);
> >> 
> >>                 }
> >>             
> >>             }
> >>         
> >>         }
> >>         else {
> >>         
> >>             // qtcore_Smoke will be able to find any method not in
> >> 
> >> QGlobalSpace
> >> -            mi = qtcore_Smoke->findMethod(classname, methodname);
> >> +            milist.append( qtcore_Smoke->findMethod(classname,
> >> methodname) );
> >> 
> >>         }
> >> 
> >> +        foreach (Smoke::ModuleIndex mi, milist) {
> >> 
> >>         if ( !mi.index ) {
> >>         
> >>             // empty list
> >>         
> >>         }
> >> 
> >> @@ -95,6 +97,7 @@
> >> 
> >>                 }
> >>             
> >>             }
> >>         
> >>         }
> >> 
> >> +        }
> >> 
> >>  #// Args: none
> >>  #// Returns: an array of all classes that qtcore_Smoke knows about
> >> 
> >> _______________________________________________
> >> Kde-bindings mailing list
> >> Kde-bindings at kde.org
> >> https://mail.kde.org/mailman/listinfo/kde-bindings



More information about the Kde-bindings mailing list