Author: rfm
Date: Fri Mar 25 09:37:36 2016
New Revision: 39604

URL: http://svn.gna.org/viewcvs/gnustep?rev=39604&view=rev
Log:
attempt to fix archiving endianness issue

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/NSNumber.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=39604&r1=39603&r2=39604&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Fri Mar 25 09:37:36 2016
@@ -1,3 +1,7 @@
+2016-03-25  Richard Frith-Macdonald <[email protected]>
+
+       * Source/NSNumber.m: Attempt to fix endianness archiving issue.
+
 2016-03-23  Richard Frith-Macdonald <[email protected]>
 
        * Source/NSPropertyList.m: Remove unused function.  Change binary

Modified: libs/base/trunk/Source/NSNumber.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSNumber.m?rev=39604&r1=39603&r2=39604&view=diff
==============================================================================
--- libs/base/trunk/Source/NSNumber.m   (original)
+++ libs/base/trunk/Source/NSNumber.m   Fri Mar 25 09:37:36 2016
@@ -1024,14 +1024,40 @@
 - (void) encodeWithCoder: (NSCoder *) coder
 {
   const char *type = [self objCType];
-  char buffer[16] __attribute__ ((aligned (16)));
+  unsigned char charbuf;
+  unsigned short shortbuf;
+  unsigned int intbuf;
+  unsigned long longbuf;
+  unsigned long long llongbuf;
+  float floatbuf;
+  double doublebuf;
+  void  *buffer;
 
   [coder encodeValueOfObjCType: @encode (char) at: type];
-  /* The most we currently store in an NSNumber is 8 bytes (double or long
-   * long), but we may add support for vectors or long doubles in future, so
-   * make this 16 bytes now so stuff doesn't break in fun and exciting ways
-   * later.
-   */
+
+  switch (type[0])
+    {
+      case 'c':
+      case 'C':
+        buffer = &charbuf; break;
+      case 's':
+      case 'S':
+        buffer = &shortbuf; break;
+      case 'i':
+      case 'I':
+        buffer = &intbuf; break;
+      case 'l':
+      case 'L':
+        buffer = &longbuf; break;
+      case 'q':
+      case 'Q':
+        buffer = &llongbuf; break;
+      case 'f':
+        buffer = &floatbuf; break;
+      case 'd':
+        buffer = &doublebuf; break;
+    }
+
   [self getValue: buffer];
   [coder encodeValueOfObjCType: type at: buffer];
 }
@@ -1045,9 +1071,38 @@
 - (id) initWithCoder: (NSCoder *) coder
 {
   char type[2] = { 0 };
-  char buffer[16] __attribute__ ((aligned (16)));
+  unsigned char charbuf;
+  unsigned short shortbuf;
+  unsigned int intbuf;
+  unsigned long longbuf;
+  unsigned long long llongbuf;
+  float floatbuf;
+  double doublebuf;
+  void *buffer;
 
   [coder decodeValueOfObjCType: @encode (char) at: type];
+  switch (type[0])
+    {
+      case 'c':
+      case 'C':
+        buffer = &charbuf; break;
+      case 's':
+      case 'S':
+        buffer = &shortbuf; break;
+      case 'i':
+      case 'I':
+        buffer = &intbuf; break;
+      case 'l':
+      case 'L':
+        buffer = &longbuf; break;
+      case 'q':
+      case 'Q':
+        buffer = &llongbuf; break;
+      case 'f':
+        buffer = &floatbuf; break;
+      case 'd':
+        buffer = &doublebuf; break;
+    }
   [coder decodeValueOfObjCType: type at: buffer];
   return [self initWithBytes: buffer objCType: type];
 }


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to