PATCH: ObjC testsuite use simple NSConstantString implementation -- TAKE 2

Ziemowit Laski zlaski@apple.com
Mon Jun 7 11:26:00 GMT 2004


Well, turns out that an __attribute__((constructor)) function was also 
needed to get David's NSConstantString metaclass off the ground...

[gcc/testsuite/ChangeLog]
2004-06-07  David Ayers  <d.ayers@inode.at>
	    Ziemowit Laski  <zlaski@apple.com>

	* lib/objc.exp (objc_target_compile): Revert the '-framework
	Foundation' flag fix, since bare Darwin does not ship
	with the Foundation framework.
	* objc/execute/next_mapping.h: Provide a local NSConstantString
	@interface and @implementation.
	(objc_constant_string_init): A constructor function, used to
	initialize the NSConstantString meta-class object.
	* objc/execute/string1.m: Include "next_mapping.h" instead of
	<Foundation/NSString.h>.
	* objc/execute/string2.m: Likewise.
	* objc/execute/string3.m: Likewise.
	* objc/execute/string4.m: Likewise.

Index: gcc/testsuite/lib/objc.exp
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/lib/objc.exp,v
retrieving revision 1.22
diff -u -3 -p -r1.22 objc.exp
--- gcc/testsuite/lib/objc.exp  2 Jun 2004 19:48:49 -0000       1.22
+++ gcc/testsuite/lib/objc.exp  7 Jun 2004 08:37:21 -0000
@@ -144,7 +144,6 @@ proc objc_target_compile { source dest t
      global TOOL_OPTIONS
      global ld_library_path
      global objc_libgcc_s_path
-    global target_triplet

      set ld_library_path ".:${objc_libgcc_s_path}"
      lappend options "libs=-lobjc"
@@ -183,14 +182,6 @@ proc objc_target_compile { source dest t
         lappend options "additional_flags=${objc_link_flags}"
         append ld_library_path ":${libobjc_dir}"
      }
-
-    # If we are running on Darwin, we'll need to point the linker at
-    # the Foundation framework, where many goodies (e.g., 
NSConstantString)
-    # reside.
-    if { [string match "*-*-darwin*" $target_triplet] } {
-       lappend options "libs=-framework Foundation"
-    }
-
      lappend options "compiler=$OBJC_UNDER_TEST"

      # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
Index: gcc/testsuite/objc/execute/next_mapping.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/objc/execute/next_mapping.h,v
retrieving revision 1.2
diff -u -3 -p -r1.2 next_mapping.h
--- gcc/testsuite/objc/execute/next_mapping.h   25 Sep 2003 01:26:00 
-0000      1.2
+++ gcc/testsuite/objc/execute/next_mapping.h   7 Jun 2004 08:37:21 
-0000
@@ -1,10 +1,12 @@
  /* This file "renames" various ObjC GNU runtime entry points
     (and fakes the existence of several others)
     if the NeXT runtime is being used.  */
-/* Author: Ziemowit Laski <zlaski@apple.com>  */
+/* Authors: Ziemowit Laski <zlaski@apple.com>  */
+/*         David Ayers <d.ayers@inode.at>  */

  #ifdef __NEXT_RUNTIME__
  #include <objc/objc-class.h>
+#include <objc/Object.h>
  #include <ctype.h>

  #define objc_get_class(C)                      objc_getClass(C)
@@ -848,4 +850,52 @@ void objc_layout_structure_get_info (str
      *type = layout->prev_type;
  }

+/* A small, portable NSConstantString implementation for use with the 
NeXT
+   runtime.
+
+   On full-fledged Mac OS X systems, NSConstantString is provided
+   as part of the Foundation framework.  However, on bare Darwin 
systems,
+   Foundation is not included, and hence there is no NSConstantString
+   implementation to link against.
+
+   This code is derived from the GNU runtime's NXConstantString 
implementation.
+*/
+
+struct objc_class _NSConstantStringClassReference;
+
+@interface NSConstantString : Object
+{
+  char *c_string;
+  unsigned int len;
+}
+
+-(const char *) cString;
+-(unsigned int) length;
+
+@end
+
+@implementation NSConstantString
+
+-(const char *) cString
+{
+  return (c_string);
+}
+
+-(unsigned int) length
+{
+  return (len);
+}
+
+@end
+
+/* The NSConstantString metaclass will need to be initialized before 
we can
+   send messages to strings.  */
+
+void objc_constant_string_init (void) __attribute__((constructor));
+void objc_constant_string_init (void) {
+  memcpy (&_NSConstantStringClassReference,
+         objc_getClass ("NSConstantString"),
+         sizeof (_NSConstantStringClassReference));
+}
+
  #endif  /* #ifdef __NEXT_RUNTIME__ */
Index: gcc/testsuite/objc/execute/string1.m
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/objc/execute/string1.m,v
retrieving revision 1.3
diff -u -3 -p -r1.3 string1.m
--- gcc/testsuite/objc/execute/string1.m        25 Sep 2003 01:26:00 
-0000      1.3
+++ gcc/testsuite/objc/execute/string1.m        7 Jun 2004 08:37:21 
-0000
@@ -4,7 +4,7 @@
  #include <stdlib.h>

  #ifdef __NEXT_RUNTIME__
-#import <Foundation/NSString.h>
+#include "next_mapping.h"
  #else
  #include <objc/NXConstStr.h>
  #endif
Index: gcc/testsuite/objc/execute/string2.m
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/objc/execute/string2.m,v
retrieving revision 1.3
diff -u -3 -p -r1.3 string2.m
--- gcc/testsuite/objc/execute/string2.m        25 Sep 2003 01:26:00 
-0000      1.3
+++ gcc/testsuite/objc/execute/string2.m        7 Jun 2004 08:37:21 
-0000
@@ -4,7 +4,7 @@
  #include <stdlib.h>

  #ifdef __NEXT_RUNTIME__
-#import <Foundation/NSString.h>
+#include "next_mapping.h"
  #else
  #include <objc/NXConstStr.h>
  #endif
Index: gcc/testsuite/objc/execute/string3.m
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/objc/execute/string3.m,v
retrieving revision 1.2
diff -u -3 -p -r1.2 string3.m
--- gcc/testsuite/objc/execute/string3.m        25 Sep 2003 01:26:00 
-0000      1.2
+++ gcc/testsuite/objc/execute/string3.m        7 Jun 2004 08:37:21 
-0000
@@ -4,7 +4,7 @@
  #include <stdlib.h>

  #ifdef __NEXT_RUNTIME__
-#import <Foundation/NSString.h>
+#include "next_mapping.h"
  #else
  #include <objc/NXConstStr.h>
  #endif
Index: gcc/testsuite/objc/execute/string4.m
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/objc/execute/string4.m,v
retrieving revision 1.2
diff -u -3 -p -r1.2 string4.m
--- gcc/testsuite/objc/execute/string4.m        25 Sep 2003 01:26:00 
-0000      1.2
+++ gcc/testsuite/objc/execute/string4.m        7 Jun 2004 08:37:21 
-0000
@@ -4,7 +4,7 @@
  #include <stdlib.h>

  #ifdef __NEXT_RUNTIME__
-#import <Foundation/NSString.h>
+#include "next_mapping.h"
  #else
  #include <objc/NXConstStr.h>
  #endif



More information about the Gcc-patches mailing list