=== modified file 'lib/objc.ss'
--- lib/objc.ss	2009-01-09 08:40:55 +0000
+++ lib/objc.ss	2010-01-17 16:08:10 +0000
@@ -44,7 +44,7 @@
     (ikarus system $foreign)
     (except (ypsilon-compat) format))
 
-(define ptrsize 4)
+(define ptrsize 8)
 
 (define objc
   (load-shared-object "libobjc.A.dylib"))
@@ -58,15 +58,15 @@
        (c-function objc "Objective C Binding" ret __stdcall name args)))))
 
 (define-function int objc_getClassList (void* int))
-(define-function void objc_addClass (void*))
+(define-function void objc_registerClassPair (void*))
 (define-function void* objc_getClass (char*))
 (define-function void* sel_registerName (char*))
 (define-function void* sel_getUid (char*))
 (define-function void* class_getInstanceMethod (void* void*))
 (define-function void* class_getClassMethod (void* void*))
-(define-function void* class_nextMethodList (void* void*))
+(define-function void* class_copyMethodList (void* void*))
 (define-function void* class_getInstanceVariable (void* void*))
-(define-function void class_addMethods (void* void*))
+(define-function int class_addMethod (void* void* void* void*))
 
 (define-record-type class (fields ptr))
 (define-record-type object (fields ptr))
@@ -258,7 +258,7 @@
       (pointer-set-c-long! class objc-class-instance-size-offset instance-size)
       ;;; wire up
       (pointer-set class objc-class-isa-offset meta)
-      (when intern? (objc_addClass class))
+      (when intern? (objc_registerClassPair class))
       (make-class class))))
 
 (define (class-add-method who class sel rtype argtypes proc)
@@ -274,23 +274,12 @@
                    (lambda args
                      (convert-outgoing rtype
                        (apply proc (map convert-incoming argtypes args)))))])
-        (let ([p (malloc (+ objc-methodlist-methods-offset
-                            objc-method-size))])
-          (pointer-set-c-int! p objc-methodlist-count-offset 1)
-          (pointer-set p
-            (+ objc-methodlist-methods-offset objc-method-sel-offset)
-            (selector-ptr
-              (or (get-selector (symbol->string sel))
-                  (begin
-                    (free p)
-                    (error who "invalid selector")))))
-          (pointer-set p
-            (+ objc-methodlist-methods-offset objc-method-types-offset)
-            (string->char* type))
-          (pointer-set p
-            (+ objc-methodlist-methods-offset objc-method-imp-offset)
-            imp)
-          (class_addMethods (class-ptr class) p))))))
+        (class_addMethod (class-ptr class)
+                         (selector-ptr
+                           (or (get-selector (symbol->string sel))
+                               (error who "invalid selector")))
+                         imp
+                         (string->char* type))))))
 
 (define (class-add-instance-method class sel rtype argtypes proc)
   (define who 'class-add-instance-method)
@@ -345,17 +334,12 @@
   (check 'class-methods class? x)
   (when (class-is? x 'method-array)
     (error 'class-methods "BUG: not yet for method arrays"))
-  (let ([iterator (malloc ptrsize)])
-    (pointer-set-c-long! iterator 0 0)
-    (let f ()
-      (let ([methodlist (class_nextMethodList (class-ptr x) iterator)])
-        (cond
-          [(nil? methodlist)
-           (free iterator)
-           '()]
-          [else
-           (let ([ls (methods methodlist)])
-             (append ls (f)))])))))
+  (let* ([methodlist (class_copyMethodList (class-ptr x) 0)])
+    (if (not (nil? methodlist))
+      (let ([ret (methods methodlist)])
+        (free methodlist)
+        ret)
+      '())))
 
 (define (get-class-list)
   (let ([n (objc_getClassList (integer->pointer 0) 0)])
@@ -539,6 +523,8 @@
              [(#\#) (values 'class (+ i 1))]
              [(#\v) (values 'void (+ i 1))]
              [(#\f) (values 'float (+ i 1))]
+             [(#\Q) (values 'ulonglong (+ i 1))]
+             [(#\d) (values 'double (+ i 1))]
              [(#\i) (values 'int (+ i 1))]
              [(#\I) (values 'uint (+ i 1))]
              [(#\S) (values 'ushort (+ i 1))]
@@ -561,7 +547,8 @@
               (let-values ([(t i) (parse (+ i 1))])
                 (values (cons 'pointer t) i))]
              [(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9
-               #\r)
+               #\r
+               #\V)
               (values 'skip (+ i 1))]
              [else (error who "invalid char" c str)]))]))
     (define (cons/skip x y)
@@ -586,9 +573,11 @@
        [(void)     'void]
        [(float)    'float]
        [(uint)     'unsigned-int]
+       [(ulonglong) 'unsigned-long-long]
        [(int)      'signed-int]
        [(char)     'signed-char]
        [(char*)    'pointer]
+       [(double)   'double]
        [else (error 'objc-type->ikarus-type "invalid type" x)])]))
 
 (define (convert-incoming t x)
@@ -639,11 +628,11 @@
         (cond
           [(class? x) (class-ptr x)]
           [else (error 'convert-output "cannot convert to class" x)])]
-       [(float)
+       [(float double)
         (cond
           [(number? x) (inexact x)]
           [else (error 'convert-output "cannot convert to float" x)])]
-       [(uint int char)
+       [(uint int char ulonglong)
         (cond
           [(or (fixnum? x) (bignum? x)) x]
           [(boolean? x) (if x 1 0)]

