From 2015adc94a98744e0ff614a163201f69ecdaffcd Mon Sep 17 00:00:00 2001 From: Stefan Urbanek Date: Sun, 15 Jun 2003 10:14:47 +0000 Subject: [PATCH] Fixed signature creation git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/steptalk/trunk@16927 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 1 + Examples/Shell/AppKit.txt | 2 +- Source/STObjCRuntime.m | 52 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d54f8bd..50f1016 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * NSInvocation+additions: added unknown selector creation; created a workaround for gnustep DO bug + * STObjCRuntime: Fixed creation of signature. 2003 May 11 Stefan Urbanek diff --git a/Examples/Shell/AppKit.txt b/Examples/Shell/AppKit.txt index b3c2127..ea79ab9 100644 --- a/Examples/Shell/AppKit.txt +++ b/Examples/Shell/AppKit.txt @@ -33,7 +33,7 @@ How to open a file using the open panel Text ---- -How to display an RTF file +How to display a RTF file > text := NSAttributedString alloc > text initWithPath: file documentAttributes:nil diff --git a/Source/STObjCRuntime.m b/Source/STObjCRuntime.m index f82ebba..43412f1 100644 --- a/Source/STObjCRuntime.m +++ b/Source/STObjCRuntime.m @@ -154,11 +154,61 @@ SEL STSelectorFromString(NSString *aString) return sel; } +SEL STCreateTypedSelector(SEL sel) +{ + const char *name = sel_get_name(sel); + const char *ptr; + int argc = 0; + + SEL newSel; + + ptr = name; + + while(*ptr) + { + if(*ptr == ':') + { + argc ++; + } + ptr++; + } + + if( argc < SELECTOR_TYPES_COUNT ) + { + NSDebugLLog(@"STSending", + @"registering selector '%s' " + @"with %i arguments, types:'%s'", + name,argc,selector_types[argc]); + + newSel = sel_register_typed_name(name, selector_types[argc]); + } + + if(!newSel) + { + [NSException raise:STInternalInconsistencyException + format:@"Unable to register typed selector '%s'", + name]; + return NULL; + } + + return newSel; +} + NSMethodSignature *STMethodSignatureForSelector(SEL sel) { - return [NSMethodSignature signatureWithObjCTypes:sel_get_type(sel)]; + char *types; + + types = sel_get_type(sel); + + if(!types) + { + sel = STCreateTypedSelector(sel); + types = sel_get_type(sel); + } + return [NSMethodSignature signatureWithObjCTypes:types]; } + static NSArray *selectors_from_list(struct objc_method_list *methods) { NSMutableArray *array = [NSMutableArray array];