[Top][All Lists]
[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.
- Problem with services (DO ?) with svn trunk, Philippe Roussel, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk, David Chisnall, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk, Philippe Roussel, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk, David Chisnall, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk, Philippe Roussel, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk,
Philippe Roussel <=
- Re: Problem with services (DO ?) with svn trunk, David Chisnall, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk, Richard Frith-Macdonald, 2010/08/17
- Re: Problem with services (DO ?) with svn trunk, Philippe Roussel, 2010/08/18
- Re: Problem with services (DO ?) with svn trunk, Eric Wasylishen, 2010/08/18