[macruby-changes] [4036] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Thu May 6 18:35:18 PDT 2010
Revision: 4036
http://trac.macosforge.org/projects/ruby/changeset/4036
Author: lsansonetti at apple.com
Date: 2010-05-06 18:35:15 -0700 (Thu, 06 May 2010)
Log Message:
-----------
get rid of the NSNumber glue, it's useless since NSNumbers are always converted
Modified Paths:
--------------
MacRuby/trunk/numeric.c
MacRuby/trunk/rakelib/builder/builder.rb
Removed Paths:
-------------
MacRuby/trunk/NSNumber.m
Deleted: MacRuby/trunk/NSNumber.m
===================================================================
--- MacRuby/trunk/NSNumber.m 2010-05-06 23:26:37 UTC (rev 4035)
+++ MacRuby/trunk/NSNumber.m 2010-05-07 01:35:15 UTC (rev 4036)
@@ -1,424 +0,0 @@
-/*
- * MacRuby extensions to NSNumber.
- *
- * This file is covered by the Ruby license. See COPYING for more details.
- *
- * Copyright (C) 2010, Apple Inc. All rights reserved.
- */
-
-#import <Foundation/Foundation.h>
-
-#include "ruby/ruby.h"
-#include "ruby/node.h"
-#include "objc.h"
-#include "vm.h"
-
-VALUE rb_cNSNumber;
-
- at interface NSNumber (IsFloatExtension)
-- (BOOL)isFloat;
- at end
-
-static id
-get_nsnumber(VALUE obj)
-{
- // TODO: handle bignums, #to_i / #to_f generic objects
- id num = RB2OC(obj);
- if (![num isKindOfClass:[NSNumber class]]) {
- rb_raise(rb_eTypeError, "excepted NSNumber-like object, got `%s'",
- [[[num class] description] UTF8String]);
- }
- return num;
-}
-
-static VALUE
-get_numeric(id obj)
-{
- return [obj isFloat]
- ? DOUBLE2NUM([obj doubleValue]) : LONG2NUM([obj longValue]);
-}
-
-static id
-nsnumber_to_s(id rcv, SEL sel)
-{
- return [rcv stringValue];
-}
-
-static id
-nsnumber_to_i(id rcv, SEL sel)
-{
- if ([rcv isFloat]) {
- const long val = [rcv longValue];
- return [NSNumber numberWithLong:val];
- }
- return rcv;
-}
-
-static id
-nsnumber_to_f(id rcv, SEL sel)
-{
- if (![rcv isFloat]) {
- const double val = [rcv doubleValue];
- return [NSNumber numberWithDouble:val];
- }
- return rcv;
-}
-
-static VALUE
-nsnumber_coerce(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- VALUE x = get_numeric(rcv);
- VALUE y = get_numeric(num);
-
- if (CLASS_OF(x) == CLASS_OF(y)) {
- return rb_assoc_new(y, x);
- }
- return rb_assoc_new(rb_Float(y), rb_Float(x));
-}
-
-static id
-nsnumber_uplus(id rcv, SEL sel)
-{
- return rcv;
-}
-
-static id
-nsnumber_uminus(id rcv, SEL sel)
-{
- return [rcv isFloat]
- ? [NSNumber numberWithDouble:-[rcv doubleValue]]
- : [NSNumber numberWithLong:-[rcv longValue]];
-}
-
-static id
-nsnumber_plus(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- if ([rcv isFloat] || [num isFloat]) {
- return [NSNumber numberWithDouble:
- [rcv doubleValue] + [num doubleValue]];
- }
- return [NSNumber numberWithLong:[rcv longValue] + [num longValue]];
-}
-
-static id
-nsnumber_minus(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- if ([rcv isFloat] || [num isFloat]) {
- return [NSNumber numberWithDouble:
- [rcv doubleValue] - [num doubleValue]];
- }
- return [NSNumber numberWithLong:[rcv longValue] - [num longValue]];
-}
-
-static id
-nsnumber_mul(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- if ([rcv isFloat] || [num isFloat]) {
- return [NSNumber numberWithDouble:
- [rcv doubleValue] * [num doubleValue]];
- }
- return [NSNumber numberWithLong:[rcv longValue] * [num longValue]];
-}
-
-static id
-nsnumber_divide(id x, id y, bool fdiv)
-{
- if (fdiv) {
- return [NSNumber numberWithDouble:
- [x doubleValue] / [y doubleValue]];
- }
- const long val = [y longValue];
- if (val == 0) {
- rb_raise(rb_eZeroDivError, "divided by 0");
- }
- return [NSNumber numberWithLong:[x longValue] / val];
-}
-
-static id
-nsnumber_div(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- return nsnumber_divide(rcv, num, [rcv isFloat] || [num isFloat]);
-}
-
-static id
-nsnumber_idiv(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- return nsnumber_divide(rcv, num, false);
-}
-
-static id
-nsnumber_fdiv(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- return nsnumber_divide(rcv, num, true);
-}
-
-static id
-nsnumber_mod(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- if ([rcv isFloat] || [num isFloat]) {
- return [NSNumber numberWithDouble:
- fmod([rcv doubleValue], [num doubleValue])];
- }
- const long val = [num longValue];
- if (val == 0) {
- rb_raise(rb_eZeroDivError, "divided by 0");
- }
- return [NSNumber numberWithLong:[rcv longValue] % val];
-}
-
-static id
-nsnumber_divmod(id rcv, SEL sel, VALUE other)
-{
- id num = get_nsnumber(other);
- NSNumber *div, *mod;
- if ([rcv isFloat] || [num isFloat]) {
- div = [NSNumber numberWithDouble:
- [rcv doubleValue] / [num doubleValue]];
- mod = [NSNumber numberWithDouble:
- fmod([rcv doubleValue], [num doubleValue])];
- }
- else {
- const long val = [num longValue];
- if (val == 0) {
- rb_raise(rb_eZeroDivError, "divided by 0");
- }
- div = [NSNumber numberWithLong:[rcv longValue] / val];
- mod = [NSNumber numberWithLong:[rcv longValue] % val];
- }
- return [NSArray arrayWithObjects:div, mod, NULL];
-}
-
-//static id
-//nsnumber_pow(id rcv, SEL sel, VALUE other)
-//{
-//}
-
-static id
-nsnumber_abs(id rcv, SEL sel)
-{
- if ([rcv isFloat]) {
- double val = [rcv doubleValue];
- if (val < 0) {
- val = -val;
- return [NSNumber numberWithDouble:val];
- }
- return rcv;
- }
- long val = [rcv longValue];
- if (val < 0) {
- val = -val;
- return [NSNumber numberWithLong:val];
- }
- return rcv;
-}
-
-static VALUE
-nsnumber_equal(id rcv, SEL sel, VALUE other)
-{
- return [rcv isEqualToNumber:get_nsnumber(other)] ? Qtrue : Qfalse;
-}
-
-static VALUE
-nsnumber_cmp(id rcv, SEL sel, VALUE other)
-{
- const int res = [rcv compare:get_nsnumber(other)];
- return res == 0
- ? INT2FIX(0)
- : res < 0
- ? INT2FIX(-1)
- : INT2FIX(1);
-}
-
-static VALUE
-nsnumber_gt(id rcv, SEL sel, VALUE other)
-{
- const int res = [rcv compare:get_nsnumber(other)];
- return res > 0 ? Qtrue : Qfalse;
-}
-
-static VALUE
-nsnumber_ge(id rcv, SEL sel, VALUE other)
-{
- const int res = [rcv compare:get_nsnumber(other)];
- return res >= 0 ? Qtrue : Qfalse;
-}
-
-static VALUE
-nsnumber_lt(id rcv, SEL sel, VALUE other)
-{
- const int res = [rcv compare:get_nsnumber(other)];
- return res < 0 ? Qtrue : Qfalse;
-}
-
-static VALUE
-nsnumber_le(id rcv, SEL sel, VALUE other)
-{
- const int res = [rcv compare:get_nsnumber(other)];
- return res <= 0 ? Qtrue : Qfalse;
-}
-
-static void
-assume_integral(id obj)
-{
- if ([obj isFloat]) {
- rb_raise(rb_eTypeError, "expected integral (non-float) NSNumber");
- }
-}
-
-static id
-nsnumber_rev(id rcv, SEL sel)
-{
- assume_integral(rcv);
- long val = [rcv longValue];
- val = ~val;
- return [NSNumber numberWithLong:val];
-}
-
-static id
-nsnumber_and(id rcv, SEL sel, VALUE other)
-{
- assume_integral(rcv);
- long val = [rcv longValue] & [get_nsnumber(other) longValue];
- return [NSNumber numberWithLong:val];
-}
-
-static id
-nsnumber_or(id rcv, SEL sel, VALUE other)
-{
- assume_integral(rcv);
- long val = [rcv longValue] | [get_nsnumber(other) longValue];
- return [NSNumber numberWithLong:val];
-}
-
-static id
-nsnumber_xor(id rcv, SEL sel, VALUE other)
-{
- assume_integral(rcv);
- long val = [rcv longValue] ^ [get_nsnumber(other) longValue];
- return [NSNumber numberWithLong:val];
-}
-
-static VALUE
-nsnumber_aref(id rcv, SEL sel, VALUE other)
-{
- assume_integral(rcv);
- const long val = [rcv longValue];
-
- const long i = FIX2LONG(other);
- if (i < 0) {
- return INT2FIX(0);
- }
- if (SIZEOF_LONG * CHAR_BIT-1 < i) {
- if (val < 0) {
- return INT2FIX(1);
- }
- return INT2FIX(0);
- }
- if (val & (1L << i)) {
- return INT2FIX(1);
- }
- return INT2FIX(0);
-}
-
-static VALUE
-nsnumber_lshift(id rcv, SEL sel, VALUE other)
-{
- assume_integral(rcv);
- long val = [rcv longValue];
- const long width = NUM2LONG(other);
-
- if (width < 0) {
- val = val >> -width;
- }
- else {
- val = val << width;
- }
- return LONG2NUM(val);
-}
-
-static VALUE
-nsnumber_rshift(id rcv, SEL sel, VALUE other)
-{
- assume_integral(rcv);
- long val = [rcv longValue];
- const long width = NUM2LONG(other);
-
- if (width < 0) {
- val = val << -width;
- }
- else {
- val = val >> width;
- }
- return LONG2NUM(val);
-}
-
-static void *
-imp_nsnumber_to_int(void *rcv, SEL sel)
-{
- // This is because some NSNumber subclasses must be converted to real
- // CFNumber objects, in order to be coerced into Fixnum objects.
- long val = 0;
- if (!CFNumberGetValue((CFNumberRef)rcv, kCFNumberLongType, &val)) {
- rb_raise(rb_eTypeError, "cannot get 'long' value out of NSNumber %p",
- rcv);
- }
- CFNumberRef new_num = CFNumberCreate(NULL, kCFNumberLongType, &val);
- CFMakeCollectable(new_num);
- return (void *)new_num;
-}
-
-void
-Init_NSNumber(void)
-{
- rb_cNSNumber = (VALUE)objc_getClass("NSNumber");
- assert(rb_cNSNumber != 0);
-
- rb_objc_define_method(rb_cNSNumber, "to_s", nsnumber_to_s, 0);
- rb_objc_define_method(rb_cNSNumber, "to_i", nsnumber_to_i, 0);
- rb_objc_define_method(rb_cNSNumber, "to_f", nsnumber_to_f, 0);
- rb_objc_define_method(rb_cNSNumber, "coerce", nsnumber_coerce, 1);
- rb_objc_define_method(rb_cNSNumber, "+@", nsnumber_uplus, 0);
- rb_objc_define_method(rb_cNSNumber, "-@", nsnumber_uminus, 0);
- rb_objc_define_method(rb_cNSNumber, "+", nsnumber_plus, 1);
- rb_objc_define_method(rb_cNSNumber, "-", nsnumber_minus, 1);
- rb_objc_define_method(rb_cNSNumber, "*", nsnumber_mul, 1);
- rb_objc_define_method(rb_cNSNumber, "/", nsnumber_div, 1);
- rb_objc_define_method(rb_cNSNumber, "div", nsnumber_idiv, 1);
- rb_objc_define_method(rb_cNSNumber, "%", nsnumber_mod, 1);
- rb_objc_define_method(rb_cNSNumber, "modulo", nsnumber_mod, 1);
- rb_objc_define_method(rb_cNSNumber, "divmod", nsnumber_divmod, 1);
- rb_objc_define_method(rb_cNSNumber, "fdiv", nsnumber_fdiv, 1);
- //rb_objc_define_method(rb_cNSNumber, "**", nsnumber_pow, 1);
- rb_objc_define_method(rb_cNSNumber, "abs", nsnumber_abs, 0);
- rb_objc_define_method(rb_cNSNumber, "==", nsnumber_equal, 1);
- rb_objc_define_method(rb_cNSNumber, "<=>", nsnumber_cmp, 1);
- rb_objc_define_method(rb_cNSNumber, ">", nsnumber_gt, 1);
- rb_objc_define_method(rb_cNSNumber, ">=", nsnumber_ge, 1);
- rb_objc_define_method(rb_cNSNumber, "<", nsnumber_lt, 1);
- rb_objc_define_method(rb_cNSNumber, "<=", nsnumber_le, 1);
- rb_objc_define_method(rb_cNSNumber, "~", nsnumber_rev, 0);
- rb_objc_define_method(rb_cNSNumber, "&", nsnumber_and, 1);
- rb_objc_define_method(rb_cNSNumber, "|", nsnumber_or, 1);
- rb_objc_define_method(rb_cNSNumber, "^", nsnumber_xor, 1);
- rb_objc_define_method(rb_cNSNumber, "[]", nsnumber_aref, 1);
- rb_objc_define_method(rb_cNSNumber, "<<", nsnumber_lshift, 1);
- rb_objc_define_method(rb_cNSNumber, ">>", nsnumber_rshift, 1);
-
- class_replaceMethod((Class)rb_cNSNumber, sel_registerName("to_int"),
- (IMP)imp_nsnumber_to_int, "@@:");
-}
-
- at implementation NSNumber (IsFLoatExtension)
-- (BOOL)isFloat
-{
- return CFNumberIsFloatType((CFNumberRef)self);
-}
- at end
Modified: MacRuby/trunk/numeric.c
===================================================================
--- MacRuby/trunk/numeric.c 2010-05-06 23:26:37 UTC (rev 4035)
+++ MacRuby/trunk/numeric.c 2010-05-07 01:35:15 UTC (rev 4036)
@@ -1,14 +1,12 @@
-/**********************************************************************
+/*
+ * MacRuby numeric types.
+ *
+ * This file is covered by the Ruby license. See COPYING for more details.
+ *
+ * Copyright (C) 2010, Apple Inc. All rights reserved.
+ * Copyright (C) 1993-2007 Yukihiro Matsumoto
+ */
- numeric.c -
-
- $Author: akr $
- created at: Fri Aug 13 18:33:09 JST 1993
-
- Copyright (C) 1993-2007 Yukihiro Matsumoto
-
-**********************************************************************/
-
#include "ruby/ruby.h"
#include "ruby/encoding.h"
#include <ctype.h>
@@ -92,6 +90,7 @@
VALUE rb_cFloat;
VALUE rb_cInteger;
VALUE rb_cFixnum;
+VALUE rb_cNSNumber;
VALUE rb_eZeroDivError;
VALUE rb_eFloatDomainError;
@@ -3304,12 +3303,26 @@
return Qtrue;
}
-void Init_NSNumber(void);
+static void *
+imp_nsnumber_to_int(void *rcv, SEL sel)
+{
+ // This is because some NSNumber subclasses must be converted to real
+ // CFNumber objects, in order to be coerced into Fixnum objects.
+ long val = 0;
+ if (!CFNumberGetValue((CFNumberRef)rcv, kCFNumberLongType, &val)) {
+ rb_raise(rb_eTypeError, "cannot get 'long' value out of NSNumber %p",
+ rcv);
+ }
+ CFNumberRef new_num = CFNumberCreate(NULL, kCFNumberLongType, &val);
+ CFMakeCollectable(new_num);
+ return (void *)new_num;
+}
void
Init_Numeric(void)
{
- Init_NSNumber();
+ rb_cNSNumber = (VALUE)objc_getClass("NSNumber");
+ assert(rb_cNSNumber != 0);
sel_coerce = sel_registerName("coerce:");
selDiv = sel_registerName("div:");
@@ -3493,4 +3506,7 @@
rb_objc_define_method(rb_cFloat, "nan?", flo_is_nan_p, 0);
rb_objc_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0);
rb_objc_define_method(rb_cFloat, "finite?", flo_is_finite_p, 0);
+
+ class_replaceMethod((Class)rb_cNSNumber, sel_registerName("to_int"),
+ (IMP)imp_nsnumber_to_int, "@@:");
}
Modified: MacRuby/trunk/rakelib/builder/builder.rb
===================================================================
--- MacRuby/trunk/rakelib/builder/builder.rb 2010-05-06 23:26:37 UTC (rev 4035)
+++ MacRuby/trunk/rakelib/builder/builder.rb 2010-05-07 01:35:15 UTC (rev 4036)
@@ -7,7 +7,7 @@
util variable version thread id objc bs ucnv encoding main dln dmyext marshal
gcd vm_eval prelude miniprelude gc-stub bridgesupport compiler dispatcher vm
symbol debugger MacRuby MacRubyDebuggerConnector NSArray NSDictionary
- NSString NSNumber
+ NSString
}
EXTENSIONS = %w{
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100506/2e1fdf0d/attachment-0001.html>
More information about the macruby-changes
mailing list