[macruby-changes] [3512] MacRuby/trunk/object.c
source_changes at macosforge.org
source_changes at macosforge.org
Fri Feb 12 01:23:41 PST 2010
Revision: 3512
http://trac.macosforge.org/projects/ruby/changeset/3512
Author: lsansonetti at apple.com
Date: 2010-02-12 01:23:39 -0800 (Fri, 12 Feb 2010)
Log Message:
-----------
Kernel.Integer: upgraded to 1.9
Modified Paths:
--------------
MacRuby/trunk/object.c
Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c 2010-02-12 09:06:40 UTC (rev 3511)
+++ MacRuby/trunk/object.c 2010-02-12 09:23:39 UTC (rev 3512)
@@ -2545,40 +2545,65 @@
return rb_to_integer(val, "to_int");
}
-VALUE
-rb_Integer(VALUE val)
+static VALUE
+rb_convert_to_integer(VALUE val, int base)
{
VALUE tmp;
switch (TYPE(val)) {
- case T_FLOAT:
- if (RFLOAT_VALUE(val) <= (double)FIXNUM_MAX
- && RFLOAT_VALUE(val) >= (double)FIXNUM_MIN) {
- break;
- }
- return rb_dbl2big(RFLOAT_VALUE(val));
+ case T_FLOAT:
+ if (base != 0) {
+ goto arg_error;
+ }
+ if (RFLOAT_VALUE(val) <= (double)FIXNUM_MAX
+ && RFLOAT_VALUE(val) >= (double)FIXNUM_MIN) {
+ break;
+ }
+ return rb_dbl2big(RFLOAT_VALUE(val));
- case T_FIXNUM:
- case T_BIGNUM:
- return val;
+ case T_FIXNUM:
+ case T_BIGNUM:
+ if (base != 0) {
+ goto arg_error;
+ }
+ return val;
- case T_STRING:
- return rb_str_to_inum(val, 0, Qtrue);
+ case T_STRING:
+string_conv:
+ return rb_str_to_inum(val, base, TRUE);
- case T_NIL:
- rb_raise(rb_eTypeError, "can't convert nil into Integer");
- break;
+ case T_NIL:
+ if (base != 0) {
+ goto arg_error;
+ }
+ rb_raise(rb_eTypeError, "can't convert nil into Integer");
+ break;
- default:
- break;
+ default:
+ break;
}
- tmp = convert_type(val, "Integer", "to_int", Qfalse);
+ if (base != 0) {
+ tmp = rb_check_string_type(val);
+ if (!NIL_P(tmp)) {
+ goto string_conv;
+ }
+arg_error:
+ rb_raise(rb_eArgError, "base specified for non string value");
+ }
+ tmp = convert_type(val, "Integer", "to_int", FALSE);
if (NIL_P(tmp)) {
return rb_to_integer(val, "to_i");
}
return tmp;
+
}
+VALUE
+rb_Integer(VALUE val)
+{
+ return rb_convert_to_integer(val, 0);
+}
+
/*
* call-seq:
* Integer(arg) => integer
@@ -2597,9 +2622,22 @@
*/
static VALUE
-rb_f_integer(VALUE obj, SEL sel, VALUE arg)
+rb_f_integer(VALUE obj, SEL sel, int argc, VALUE *argv)
{
- return rb_Integer(arg);
+ VALUE arg = Qnil;
+ int base = 0;
+
+ switch (argc) {
+ case 2:
+ base = NUM2INT(argv[1]);
+ case 1:
+ arg = argv[0];
+ break;
+ default:
+ // Should cause ArgumentError.
+ rb_scan_args(argc, argv, "11", NULL, NULL);
+ }
+ return rb_convert_to_integer(arg, base);
}
double
@@ -3047,7 +3085,7 @@
rb_objc_define_module_function(rb_mKernel, "sprintf", rb_f_sprintf_imp, -1); /* in sprintf.cpp */
rb_objc_define_module_function(rb_mKernel, "format", rb_f_sprintf_imp, -1); /* in sprintf.cpp */
- rb_objc_define_module_function(rb_mKernel, "Integer", rb_f_integer, 1);
+ rb_objc_define_module_function(rb_mKernel, "Integer", rb_f_integer, -1);
rb_objc_define_module_function(rb_mKernel, "Float", rb_f_float, 1);
rb_objc_define_module_function(rb_mKernel, "String", rb_f_string, 1);
rb_objc_define_module_function(rb_mKernel, "Array", rb_f_array, 1);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100212/bdef85e2/attachment-0001.html>
More information about the macruby-changes
mailing list