# New Ticket Created by  Jarkko Hietaniemi 
# Please include the string:  [perl #30995]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=30995 >


Anyone who thinks sizeof(int) == sizeof(long) == sizeof(*)
should now as a penance run ten times around the building, backwards.
Anyone who thinks one can dereference unaligned pointers must do twenty.
 Anyone who thinks that C char is always signed should do five.

The unmanagedstruct tried to dereference unaligned pointers.

(a) in unmanagedstruct.pmc fixed ret_int to align properly (the main
    thing was to separate INTVAL and int cases, but I added some other
    types while I was at it)
(b) config.h.in: added SHORT_SIZE and INT_SIZE to support (a)
(c) nci.t: the test assumed that (char)(3*64) would be -64 and therefore
    explicitly abs()ed the result - that the result would be 192 was not
    expected at all.
(d) pdd16_native_call.pod: added a note about signedness of the C char.
    Not that anyone ever reads documentation.

-- 
Jarkko Hietaniemi <[EMAIL PROTECTED]> http://www.iki.fi/jhi/ "There is this special
biologist word we use for 'stable'.  It is 'dead'." -- Jack Cohen

--- config/gen/config_h/config_h.in     2004-04-13 17:18:20.000000000 +0300
+++ ../parrot-nci/config/gen/config_h/config_h.in       2004-08-08 19:06:23.000000000 
+0300
@@ -65,6 +65,8 @@
 #define NUMVAL_SIZE ${nvsize}
 #define OPCODE_T_SIZE ${opcode_t_size}
 #define PTR_SIZE ${ptrsize}
+#define SHORT_SIZE ${shortsize}
+#define INT_SIZE ${intsize}
 #define LONG_SIZE ${longsize}
 #define HUGEINTVAL_SIZE ${hugeintvalsize}
 
--- t/pmc/nci.t 2004-07-20 09:28:32.000000000 +0300
+++ ../parrot-nci/t/pmc/nci.t   2004-08-08 15:02:34.000000000 +0300
@@ -12,8 +12,8 @@
 
 =head1 DESCRIPTION
 
-Tests the NCI PMC. These are all skipped unless JIT CPU architecture is
-i386 and the F<libnci.so> library is found.
+Tests the NCI PMC. These are all skipped unless the F<libnci.so>
+library is found.
 
 =cut
 
@@ -174,11 +174,10 @@
   dlfunc P0, P1, "nci_csc", "csc"
   print "dlfunced\n"
   set I0, 1    # prototype used - unchecked
-  set I5, 64
-  set I6, 3
+  set I5, 6
+  set I6, 7
   invoke
-  abs I5        # 3 * 64 as char may be signed/unsigned
-  ne I5, 64, nok_1
+  ne I5, 42, nok_1
   print "ok 1\n"
   ne I0, 0, nok_2      # test return value convention
   ne I1, 1, nok_2
@@ -192,6 +191,16 @@
   print "\n"
   end
 nok_2: print "nok 2\n"
+  print I0
+  print "\n"
+  print I1
+  print "\n"
+  print I2
+  print "\n"
+  print I3
+  print "\n"
+  print I4
+  print "\n"
   end
 CODE
 loaded
--- docs/pdds/pdd16_native_call.pod     2004-07-20 09:26:49.000000000 +0300
+++ ../parrot-nci/docs/pdds/pdd16_native_call.pod       2004-08-08 15:20:59.000000000 
+0300
@@ -62,18 +62,23 @@
 =item c
 
 Char. This is an integer type, taken from (or put into) an I register.
+NOTE: it might be signed or unsigned because that is how an unadorned
+C 'char' works.
 
 =item s
 
-short. An integer type, taken from or put into an I register
+short. An integer type, taken from or put into an I register.
+It is always signed, not unsigned.
 
 =item i
 
 int. An integer type.
+It is always signed, not unsigned.
 
 =item l
 
 long. An integer type. You know the drill.
+It is always signed, not unsigned.
 
 =item f
 
--- classes/unmanagedstruct.pmc 2004-07-29 22:02:05.000000000 +0300
+++ ../parrot-nci/classes/unmanagedstruct.pmc   2004-08-08 19:24:42.000000000 +0300
@@ -214,10 +214,33 @@
 {
     switch (type) {
         case enum_type_INTVAL:
-        case enum_type_int:
             return *(INTVAL*) p;
+#if INT_SIZE == 4
+        case enum_type_int32:
+        case enum_type_uint32:
+#endif
+#if INT_SIZE == 8
+        case enum_type_int64:
+        case enum_type_uint64:
+#endif
+        case enum_type_int:
+            return *(int*) p;
+#if LONG_SIZE == 4
+        case enum_type_int32:
+        case enum_type_uint32:
+#endif
+#if LONG_SIZE == 8
+        case enum_type_int64:
+        case enum_type_uint64:
+#endif
+        case enum_type_long:
+        case enum_type_ulong:
+            return *(long*) p;
+#if SHORT_SIZE == 2
         case enum_type_int16:
         case enum_type_uint16:
+#endif
+        /* If SHORT_SIZE != 2 getting int16s requires extra tricks. */
         case enum_type_short:
             return *(short*) p;
         case enum_type_uint8:

Reply via email to