[macruby-changes] [4470] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 26 17:09:09 PDT 2010


Revision: 4470
          http://trac.macosforge.org/projects/ruby/changeset/4470
Author:   lsansonetti at apple.com
Date:     2010-08-26 17:09:08 -0700 (Thu, 26 Aug 2010)
Log Message:
-----------
fixed String#sum to accept bits argument greater than 64 (logic imported from 1.9 upstream sources)

Modified Paths:
--------------
    MacRuby/trunk/id.c
    MacRuby/trunk/id.h
    MacRuby/trunk/string.c

Modified: MacRuby/trunk/id.c
===================================================================
--- MacRuby/trunk/id.c	2010-08-26 23:33:33 UTC (rev 4469)
+++ MacRuby/trunk/id.c	2010-08-27 00:09:08 UTC (rev 4470)
@@ -48,6 +48,7 @@
     selMULT = sel_registerName("*:");
     selDIV = sel_registerName("/:");
     selMOD = sel_registerName("%:");
+    selAND = sel_registerName("&:");
     selEq = sel_registerName("==:");
     selNeq = sel_registerName("!=:");
     selCmp = sel_registerName("<=>:");

Modified: MacRuby/trunk/id.h
===================================================================
--- MacRuby/trunk/id.h	2010-08-26 23:33:33 UTC (rev 4469)
+++ MacRuby/trunk/id.h	2010-08-27 00:09:08 UTC (rev 4470)
@@ -58,6 +58,7 @@
 extern SEL selMULT;
 extern SEL selDIV;
 extern SEL selMOD;
+extern SEL selAND;
 extern SEL selEq;
 extern SEL selNeq;
 extern SEL selCmp;

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2010-08-26 23:33:33 UTC (rev 4469)
+++ MacRuby/trunk/string.c	2010-08-27 00:09:08 UTC (rev 4470)
@@ -5514,6 +5514,12 @@
  *  checksum.
  */
 
+static inline VALUE
+rb_vm_call_simple(VALUE rcv, SEL sel, VALUE arg)
+{
+    return rb_vm_call(rcv, sel, 1, &arg);
+}
+
 static VALUE
 rstr_sum(VALUE str, SEL sel, int argc, VALUE *argv)
 {
@@ -5524,19 +5530,39 @@
 	bits = NUM2INT(vbits);
     }
 
-    if (bits >= sizeof(long) * CHAR_BIT) {
-	rb_raise(rb_eArgError, "bits argument too big");
-    }
-
-    unsigned long sum = 0;
+    VALUE sum = INT2FIX(0);
+    unsigned long sum0 = 0;
     for (long i = 0; i < RSTR(str)->length_in_bytes; i++) {
-	sum += (unsigned char)RSTR(str)->data.bytes[i];
+	if (FIXNUM_MAX - UCHAR_MAX < sum0) {
+	    sum = rb_vm_call_simple(sum, selPLUS, LONG2FIX(sum0));
+	    sum0 = 0;
+	}
+	sum0 += (unsigned char)RSTR(str)->data.bytes[i];
     }
-    if (bits != 0) {
-	sum &= (((unsigned long)1) << bits) - 1;
+    if (bits == 0) {
+	if (sum0 != 0) {
+	    sum = rb_vm_call_simple(sum, selPLUS, LONG2FIX(sum0));
+	}
     }
+    else {
+        if (sum == INT2FIX(0)) {
+            if (bits < (int)sizeof(long) * CHAR_BIT) {
+                sum0 &= (((unsigned long)1) << bits) - 1;
+            }
+            sum = LONG2FIX(sum0);
+        }
+        else {
+            if (sum0 != 0) {
+                sum = rb_vm_call_simple(sum, selPLUS, LONG2FIX(sum0));
+            }
 
-    return rb_int2inum(sum);
+            VALUE mod = rb_vm_call_simple(INT2FIX(1), selLTLT, INT2FIX(bits));
+            mod = rb_vm_call_simple(mod, selMINUS, INT2FIX(1));
+            sum = rb_vm_call_simple(sum, selAND, mod);
+	}
+    }
+
+    return sum;
 }
 
 /*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100826/7dc09c00/attachment-0001.html>


More information about the macruby-changes mailing list