<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -259,6 +259,10 @@ void *ffi_add_ptr(char *ptr, int offset) {
   return (void*)(ptr + offset); 
 }
 
+unsigned int ffi_cast(unsigned int val) {
+  return val;
+}
+
 long ffi_major(dev_t n) {
 #if defined(major)
   return major(n);</diff>
      <filename>shotgun/lib/ffi_util.c</filename>
    </modified>
    <modified>
      <diff>@@ -219,15 +219,16 @@ static inline OBJECT rbs_int_to_numeric(STATE, native_int num) {
   }
 }
 
+/* Do NOT use the APPLY_TAG/STRIP_TAG test in the unsigned cases.
+ * C doesn't let you cast from a unsigned to signed type and remove
+ * the sign bit, so for large unsigned ints, the test is a false
+ * positive for it fitting properly. */
 static inline OBJECT rbs_uint_to_numeric(STATE, unsigned int num) {
-  OBJECT ret;
-  ret = APPLY_TAG((native_int)num, TAG_FIXNUM);
-
   /* Number is too big for Fixnum. Use Bignum. */
-  if((native_int)STRIP_TAG(ret) != num) {
+  if(num &gt; FIXNUM_MAX) {
     return bignum_new_unsigned(state, num);
   } else {
-    return ret;
+    return APPLY_TAG((native_int)num, TAG_FIXNUM);
   }
 }
 
@@ -243,15 +244,13 @@ static inline OBJECT rbs_ll_to_numeric(STATE, long long num) {
   }
 }
 
+/* See comment before rbs_uint_to_numeric */
 static inline OBJECT rbs_ull_to_numeric(STATE, unsigned long long num) {
-  OBJECT ret;
-  ret = APPLY_TAG((native_int)num, TAG_FIXNUM);
-
   /* Number is too big for Fixnum. Use Bignum. */
-  if((native_int)STRIP_TAG(ret) != num) {
+  if(num &gt; FIXNUM_MAX) {
     return bignum_from_ull(state, num);
   } else {
-    return ret;
+    return APPLY_TAG((native_int)num, TAG_FIXNUM);
   }
 }
 </diff>
      <filename>shotgun/lib/state.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>60fbbc62cb04b2fddcd406f01f906482fbc84370</id>
    </parent>
  </parents>
  <author>
    <name>Evan Phoenix</name>
    <email>ephoenix@engineyard.com</email>
  </author>
  <url>http://github.com/evanphx/rubinius/commit/886c3fe5ade6e62a1d073aa3b45aa8a182197851</url>
  <id>886c3fe5ade6e62a1d073aa3b45aa8a182197851</id>
  <committed-date>2008-02-12T00:25:01-08:00</committed-date>
  <authored-date>2008-02-12T00:24:38-08:00</authored-date>
  <message>Fix unsigned number conversions</message>
  <tree>7c54cd79c2a0b98d39e3ce5f178510c851392075</tree>
  <committer>
    <name>Evan Phoenix</name>
    <email>ephoenix@engineyard.com</email>
  </committer>
</commit>
