gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem with services (DO ?) with svn trunk


From: Philippe Roussel
Subject: Re: Problem with services (DO ?) with svn trunk
Date: Tue, 17 Aug 2010 17:18:51 +0200
User-agent: Mutt/1.5.17+20080114 (2008-01-14)

On Tue, Aug 17, 2010 at 05:01:01PM +0200, Philippe Roussel wrote:
> On Tue, Aug 17, 2010 at 03:54:06PM +0100, David Chisnall wrote:
> > On 17 Aug 2010, at 15:21, Philippe Roussel wrote:
> > 
> > > This seems to come from NSPerformService in GSServicesManager.m line
> > > 1717 : selName is "makeThumbnail:userData:error:" and
> > > NSSelectorFromString(selName) return 0.
> > 
> > This function should not be returning 0 with a valid string, and is a 
> > simple wrapper around the lower-level runtime function.  
> > 
> > I /think/ that the problem is that NSSelectorFromString() wraps 
> > GSSelectorFromName() (for irrelevant legacy reasons - this indirection can 
> > probably be deleted now), which calls sel_getUid(), not sel_registerName(). 
> >  The former function returns 0 when the selector is not already in the 
> > selector table.  The latter always returns a valid selector.
> > 
> > I believe that the correct fix is modifying NSSelectorFromString() to use 
> > sel_registerName() and replace all other references to GSSelectorFromName() 
> > with sel_registerName. The not-quite-so-correct fix is to modify 
> > GSSelectorFromName() to call sel_registerName().
> 
> Ok, I'll try to use sel_registerName() and see if it changes something.

Things work a lot better with the appended patch.

Thanks a lot,
Philippe

Index: Source/NSKeyValueCoding.m
===================================================================
--- Source/NSKeyValueCoding.m   (révision 31173)
+++ Source/NSKeyValueCoding.m   (copie de travail)
@@ -101,11 +101,11 @@
 
       name = &buf[1];  // setKey:
       type = NULL;
-      sel = GSSelectorFromName(name);
+      sel = sel_registerName(name);
       if (sel == 0 || [self respondsToSelector: sel] == NO)
        {
          name = buf;   // _setKey:
-         sel = GSSelectorFromName(name);
+         sel = sel_registerName(name);
          if (sel == 0 || [self respondsToSelector: sel] == NO)
            {
              sel = 0;
@@ -170,19 +170,19 @@
       buf[4] = hi;
 
       name = &buf[1];  // getKey
-      sel = GSSelectorFromName(name);
+      sel = sel_registerName(name);
       if (sel == 0 || [self respondsToSelector: sel] == NO)
        {
          buf[4] = lo;
          name = &buf[4];       // key
-         sel = GSSelectorFromName(name);
+         sel = sel_registerName(name);
          if (sel == 0 || [self respondsToSelector: sel] == NO)
            {
               buf[4] = hi;
               buf[3] = 's';
               buf[2] = 'i';
               name = &buf[2];  // isKey
-              sel = GSSelectorFromName(name);
+              sel = sel_registerName(name);
               if (sel == 0 || [self respondsToSelector: sel] == NO)
                 {
                   sel = 0;
@@ -194,13 +194,13 @@
        {
          buf[4] = hi;
          name = buf;   // _getKey
-         sel = GSSelectorFromName(name);
+         sel = sel_registerName(name);
          if (sel == 0 || [self respondsToSelector: sel] == NO)
            {
              buf[4] = lo;
              buf[3] = '_';
              name = &buf[3];   // _key
-             sel = GSSelectorFromName(name);
+             sel = sel_registerName(name);
              if (sel == 0 || [self respondsToSelector: sel] == NO)
                {
                  sel = 0;
@@ -486,7 +486,7 @@
        {
          name[8] = toupper(name[8]);
        }
-      sel = GSSelectorFromName(name);
+      sel = sel_registerName(name);
       if (sel != 0 && [self respondsToSelector: sel] == YES)
        {
          imp = (BOOL (*)(id,SEL,id*,id*))[self methodForSelector: sel];
@@ -623,13 +623,13 @@
       buf[4] = hi;
 
       name = buf;      // _getKey
-      sel = GSSelectorFromName(name);
+      sel = sel_registerName(name);
       if (sel == 0 || [self respondsToSelector: sel] == NO)
        {
          buf[3] = '_';
          buf[4] = lo;
          name = &buf[3]; // _key
-         sel = GSSelectorFromName(name);
+         sel = sel_registerName(name);
          if (sel == 0 || [self respondsToSelector: sel] == NO)
            {
              sel = 0;
@@ -651,12 +651,12 @@
              buf[3] = 't';
              buf[4] = hi;
              name = &buf[1]; // getKey
-             sel = GSSelectorFromName(name);
+             sel = sel_registerName(name);
              if (sel == 0 || [self respondsToSelector: sel] == NO)
                {
                  buf[4] = lo;
                  name = &buf[4];       // key
-                 sel = GSSelectorFromName(name);
+                 sel = sel_registerName(name);
                  if (sel == 0 || [self respondsToSelector: sel] == NO)
                    {
                      sel = 0;
@@ -710,7 +710,7 @@
 
       name = buf;      // _setKey:
       type = NULL;
-      sel = GSSelectorFromName(name);
+      sel = sel_registerName(name);
       if (sel == 0 || [self respondsToSelector: sel] == NO)
        {
          sel = 0;
@@ -732,7 +732,7 @@
              buf[4] = hi;
              buf[3] = 't';
              name = &buf[1];           // setKey:
-             sel = GSSelectorFromName(name);
+             sel = sel_registerName(name);
              if (sel == 0 || [self respondsToSelector: sel] == NO)
                {
                  sel = 0;
@@ -827,11 +827,11 @@
 
       name = &buf[1];  // setKey:
       type = NULL;
-      sel = GSSelectorFromName(name);
+      sel = sel_registerName(name);
       if (sel == 0 || [self respondsToSelector: sel] == NO)
        {
          name = buf;   // _setKey:
-         sel = GSSelectorFromName(name);
+         sel = sel_registerName(name);
          if (sel == 0 || [self respondsToSelector: sel] == NO)
            {
              sel = 0;
Index: Source/NSObjCRuntime.m
===================================================================
--- Source/NSObjCRuntime.m      (révision 31173)
+++ Source/NSObjCRuntime.m      (copie de travail)
@@ -87,8 +87,8 @@
 
       [aSelectorName getCString: buf
                      maxLength: len + 1
-                      encoding: NSASCIIStringEncoding];
-      return GSSelectorFromName (buf);
+              encoding: NSASCIIStringEncoding];
+      return sel_registerName(buf);
     }
   return (SEL)0;
 }

-- 
Etre dans le vent est une ambition de feuille morte.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]