|
From: Martin R. <ru...@us...> - 2004-08-08 17:47:59
|
Update of /cvsroot/foo/foo/elkfoo/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22220/src Modified Files: tell.m Log Message: removed all objC-runtime dependent calls Index: tell.m =================================================================== RCS file: /cvsroot/foo/foo/elkfoo/src/tell.m,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** tell.m 8 Aug 2004 02:28:13 -0000 1.8 --- tell.m 8 Aug 2004 17:47:50 -0000 1.9 *************** *** 40,55 **** #import <Foundation/NSMethodSignature.h> - #include <objc/objc.h> - - #ifdef NeXT_RUNTIME - #include <objc/objc-class.h> /* for id, objc_class, etc */ - #include <objc/objc-runtime.h> - #elif GNU_RUNTIME - #include <objc/objc-api.h> - #include <objc/encoding.h> - #else - #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** - #endif - #include <strings.h> --- 40,43 ---- *************** *** 67,71 **** static int ! Convert_Type (char *type) { int t; --- 55,59 ---- static int ! Convert_Type (const char *type) { int t; *************** *** 158,265 **** ! static objc_return ! Send (id obj, ! SEL sel, ! int size, ! #ifdef NeXT_RUNTIME ! marg_list frame, ! #elif GNU_RUNTIME ! arglist_t frame, ! #else ! #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** ! #endif ! int retsize) { ! objc_return ret; ! ! if (retsize == sizeof(double)) ! { ! #ifdef NeXT_RUNTIME ! ret.d = ((double (*) ())objc_msgSendv)(obj, sel, size, frame); ! #elif GNU_RUNTIME ! ret.d = ((double (*) ())objc_msg_sendv)(obj, sel, frame); ! #else ! #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** ! #endif ! } ! else { ! #ifdef NeXT_RUNTIME ! ret.V = objc_msgSendv(obj, sel, size, frame); ! #elif GNU_RUNTIME ! ret.V = objc_msg_sendv(obj, sel, frame); ! #else ! #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** ! #endif ! } ! return ret; ! } ! #define PUSH(type, value) marg_setValue(frame, offset, type, value); break ! static SchemeObject ! Objc_Send (id obj, ! SEL sel, ! #ifdef NeXT_RUNTIME ! Method meth, ! #elif GNU_RUNTIME ! Method_t meth, ! #else ! #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** ! #endif ! int argc, ! SchemeObject *argv) ! { ! char *type; ! int offset, size, i, rettype, retsize, t; ! // objc_return ret; ! char retval[16]; ! // static char framebuf[MAXFRAMESIZE]; ! // marg_list frame = (marg_list) framebuf; ! // arglist_t frame = (arglist_t) framebuf; // no longer used ! NSInvocation *targetInvoc; // new ! NSMethodSignature *targetSign; ! Alloca_Begin; ! ! // new ! targetSign = [NSMethodSignature signatureWithObjCTypes: meth->method_types]; ! targetInvoc = [NSInvocation invocationWithMethodSignature: targetSign]; ! [targetInvoc setTarget: obj]; ! [targetInvoc setSelector: sel]; ! // targetSign = [targetInvoc methodSignature]; ! // if ((method_getNumberOfArguments(meth) - 2) != argc) ! // if ((method_get_number_of_arguments(meth) - 2) != argc) ! if (([targetSign numberOfArguments] - 2) != argc) ! Primitive_Error("wrong number of arguments"); ! // rettype = Convert_Type(meth->method_types); ! rettype = Convert_Type([targetSign methodReturnType]); ! // switch (rettype) { ! // case C_double: ! // retsize = sizeof(double); ! // break; ! // default: ! // retsize = sizeof(void *); ! // } ! retsize = [targetSign methodReturnLength]; ! // now handled by NSInvocation class ! // if ((size = method_getSizeOfArguments(meth)) > MAXFRAMESIZE) ! // if ((size = method_get_sizeof_arguments(meth)) > MAXFRAMESIZE) ! // Primitive_Error("tell stack frame too small for arguments"); ! #define SET_OBJC_ARG [targetInvoc setArgument: &value atIndex: i + 2]; break for (i = 0; i < argc; i++) { ! type = (char *)[targetSign getArgumentTypeAtIndex: i + 2]; switch (t = Convert_Type(type)) --- 146,262 ---- ! static SchemeObject ! P_Tell (int argc, ! SchemeObject *argv) { ! SchemeObject receiver, selector, result; ! NSString *name; ! SEL sel; ! id obj; ! NSInvocation *invoc; ! NSMethodSignature *sign; ! const char *type; ! int offset, size, i, rettype, retsize, t; ! char retval[16]; ! ! receiver = argv[0]; ! selector = argv[1]; ! ! switch (TYPE(receiver)) { ! case T_Symbol: ! receiver = SYMBOL(receiver)->name; ! case T_String: ! name = [NSString stringWithCString: Get_String(receiver)]; ! AUTORELEASE(name); + if ((obj = NSClassFromString(name)) == nil) + { + Primitive_Error("class not found: ~s", receiver); + } + break; ! default: ! if (TYPE(receiver) == T_Pointer) ! { ! if (POINTER_T(receiver)->type.data != C_ID) ! { ! Primitive_Error("illegal receiver type: ~s", receiver); ! } ! if ((obj = (id)POINTER_T(receiver)->pointer) == nil) ! { ! Primitive_Error("null pointer: ~s", receiver); ! } ! } ! else ! { ! Wrong_Type_Combination(receiver, "string, symbol or pointer"); ! } ! } ! switch (TYPE(selector)) ! { ! case T_Symbol: ! selector = SYMBOL(selector)->name; ! case T_String: ! name = [NSString stringWithCString: Get_String(selector)]; ! AUTORELEASE(name); ! if ((sel = NSSelectorFromString(name)) == 0) ! { ! Primitive_Error("method not found: ~s", selector); ! } ! if ([obj respondsToSelector: sel] == NO) ! { ! Primitive_Error("object does not understand selector: ~s", selector); ! } ! break; ! default: ! if (TYPE(selector) == T_Pointer) ! { ! if (POINTER_T(selector)->type.data != C_SEL) ! { ! Primitive_Error("illegal selector type: ~s", selector); ! } ! if ((sel = (SEL)POINTER_T(selector)->pointer) == NULL) ! { ! Primitive_Error("null pointer: ~s", selector); ! } ! } ! else ! { ! Wrong_Type_Combination(receiver, "string, symbol or sel"); ! } ! } ! if ((sign = [obj methodSignatureForSelector: sel]) == nil) ! { ! Primitive_Error("can't access method for selector: ~s", selector); ! } ! invoc = [NSInvocation invocationWithMethodSignature: sign]; ! [invoc setTarget: obj]; ! [invoc setSelector: sel]; ! argc -= 2; ! argv += 2; ! if (([sign numberOfArguments] - 2) != argc) ! { ! Primitive_Error("wrong number of arguments"); ! } ! rettype = Convert_Type([sign methodReturnType]); ! retsize = [sign methodReturnLength]; ! ! #define SET_OBJC_ARG [invoc setArgument: &value atIndex: i + 2]; break for (i = 0; i < argc; i++) { ! type = [sign getArgumentTypeAtIndex: i + 2]; switch (t = Convert_Type(type)) *************** *** 308,318 **** { float value = Get_Double(argv[i]); ! [targetInvoc setArgument: &value atIndex: i + 2]; break; } case C_double: { ! double double_value = Get_Double(argv[i]); ! [targetInvoc setArgument: &double_value atIndex: i + 2]; break; } --- 305,315 ---- { float value = Get_Double(argv[i]); ! SET_OBJC_ARG; break; } case C_double: { ! double value = Get_Double(argv[i]); ! SET_OBJC_ARG; break; } *************** *** 321,325 **** char *value; value = Get_String(argv[i]); ! [targetInvoc setArgument: value atIndex: i + 2]; break; } --- 318,322 ---- char *value; value = Get_String(argv[i]); ! SET_OBJC_ARG; break; } *************** *** 348,352 **** Primitive_Error("pointer type mismatch: ~s", argv[i]); } ! [targetInvoc setArgument: POINTER_T(argv[i])->pointer atIndex: i + 2]; break; --- 345,349 ---- Primitive_Error("pointer type mismatch: ~s", argv[i]); } ! [invoc setArgument: POINTER_T(argv[i])->pointer atIndex: i + 2]; break; *************** *** 356,421 **** } ! // original ! // method_getArgumentInfo(meth, i + 2, &type, &offset); ! // switch (t = Convert_Type(type)) { ! // case C_char: PUSH(char, Get_Integer(argv[i])); ! // case C_short: PUSH(short, Get_Integer(argv[i])); ! // case C_int: PUSH(int, Get_Integer(argv[i])); ! // case C_long: PUSH(long, Get_Integer(argv[i])); ! // case C_unsigned_char: PUSH(unsigned char, Get_Integer(argv[i])); ! // case C_unsigned_short: PUSH(unsigned short, Get_Integer(argv[i])); ! // case C_unsigned_int: PUSH(unsigned int, Get_Integer(argv[i])); ! // case C_unsigned_long: PUSH(unsigned long, Get_Integer(argv[i])); ! // case C_float: PUSH(float, Get_Double(argv[i])); ! // case C_double: PUSH(double, Get_Double(argv[i])); ! // case C_CHAR: ! // Make_C_String(argv[i], string); ! // PUSH(char *, string); ! // case C_VOID: ! // case C_SHORT: ! // case C_INT: ! // case C_LONG: ! // case C_UNSIGNED_CHAR: ! // case C_UNSIGNED_SHORT: ! // case C_UNSIGNED_INT: ! // case C_UNSIGNED_LONG: ! // case C_FLOAT: ! // case C_DOUBLE: ! // case C_ID: ! // case C_CLASS: ! // case C_SEL: ! // case C_STRUCT: ! // case C_UNION: ! // case C_ARRAY: ! // case C_CHARPTR: ! // case C_UNDEF: ! // Check_Type(argv[i], T_Pointer); ! // if (POINTER_T(argv[i])->pointer != (void *)0 && ! // POINTER_T(argv[i])->type.data != t) ! // Primitive_Error("pointer type mismatch: ~s", argv[i]); ! // PUSH(void *, POINTER_T(argv[i])->pointer); ! // default: ! // Primitive_Error("internal error when pushing args"); ! // } ! // } ! ! // ret = Send(obj, sel, size, frame, retsize); ! ! // replaced message passing mechanism ! [targetInvoc invoke]; ! ! // if (retsize == sizeof(double)) ! // { ! // [targetInvoc getReturnValue: (void *)ret.chars]; ! // } ! // else ! // { ! // [targetInvoc getReturnValue: ret.V]; ! // } ! ! [targetInvoc getReturnValue: retval]; ! RELEASE(targetInvoc); ! RELEASE(targetSign); switch (rettype) --- 353,361 ---- } ! // fire ! [invoc invoke]; ! [invoc getReturnValue: retval]; ! RELEASE(invoc); switch (rettype) *************** *** 471,656 **** case C_UNDEF: if ((void *)retval == NULL) - return Null_Pointer; - else - return A_Make_Pointer(*(void **)retval, rettype); - default: - Primitive_Error("internal error with return"); - } - - - // original - - // switch (rettype) { - // /* - // * The original idea was to avoid indices with the union but either - // * it never worked or NeXT changed something in the Obj-C runtime - // * system ... since we discovered problems we hacked with indices - // */ - // case C_char: return Make_Integer(ret.chars[3]); - // case C_short: return Make_Integer(ret.shorts[1]); - // case C_int: return Make_Integer(ret.i); - // case C_long: return Make_Integer(ret.l); - // case C_unsigned_char: return Make_Unsigned(ret.chars[3]); - // case C_unsigned_short: return Make_Unsigned(ret.shorts[1]); - // case C_unsigned_int: return Make_Unsigned(ret.i); - // case C_unsigned_long: return Make_Unsigned(ret.l); - // case C_float: return Make_Reduced_Flonum(ret.f); - // case C_double: return Make_Reduced_Flonum(ret.d); - // case C_undef: return Make_Reduced_Flonum(ret.i); - // case C_CHAR: - // if (ret.C == (char *)0) - // return False; - // else - // return Make_String(ret.C, strlen(ret.C)); - // case C_VOID: - // case C_SHORT: - // case C_INT: - // case C_LONG: - // case C_UNSIGNED_CHAR: - // case C_UNSIGNED_SHORT: - // case C_UNSIGNED_INT: - // case C_UNSIGNED_LONG: - // case C_FLOAT: - // case C_DOUBLE: - // case C_ID: - // case C_CLASS: - // case C_SEL: - // case C_STRUCT: - // case C_UNION: - // case C_ARRAY: - // case C_CHARPTR: - // case C_UNDEF: - // if (ret.V == (void *)0) - // return Null_Pointer; - // else - // return A_Make_Pointer(ret.V, rettype); - // default: - // Primitive_Error("internal error with return"); - // } - - /* NOTREACHED */ - Alloca_End; - return Null_Pointer; /* avoid warning */ - } - - - static SchemeObject - P_Tell (int argc, - SchemeObject *argv) - { - SchemeObject receiver, selector, result; - STR name; - SEL sel = @selector(name); // to make compiler shut up - id obj = nil; // idem - #ifdef NeXT_RUNTIME - Method meth; - #elif GNU_RUNTIME - Method_t meth; - #else - #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** - #endif - // Alloca_Begin; - GC_Node2; - - receiver = argv[0]; - selector = argv[1]; - GC_Link2(receiver, selector); - switch (TYPE(receiver)) - { - case T_Symbol: - receiver = SYMBOL(receiver)->name; - - case T_String: - name = Get_String(receiver); - #ifdef NeXT_RUNTIME - if ((obj = objc_getClass(name)) == nil) - #elif GNU_RUNTIME - if ((obj = objc_get_class(name)) == nil) - #else - #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** - #endif - { - Primitive_Error("class not found: ~s", receiver); - } - break; - - default: - if (TYPE(receiver) == T_Pointer) { ! if (POINTER_T(receiver)->type.data != C_ID) ! { ! Primitive_Error("illegal receiver type: ~s", receiver); ! } ! if ((obj = (id) POINTER_T(receiver)->pointer) == nil) ! { ! Primitive_Error("null pointer: ~s", receiver); ! } } else { ! Wrong_Type_Combination(receiver, "string, symbol or pointer"); ! } ! } ! ! switch (TYPE(selector)) ! { ! case T_Symbol: ! selector = SYMBOL(selector)->name; ! ! case T_String: ! name = Get_String(selector); ! #ifdef NeXT_RUNTIME ! if ((sel = sel_getUid(name)) == 0) ! #elif GNU_RUNTIME ! if ((sel = sel_get_uid(name)) == 0) ! #else ! #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** ! #endif ! { ! Primitive_Error("method not found: ~s", selector); ! } ! ! // new: this avoids breakdown in class_get_instance_method ! if ([obj respondsToSelector: sel] == NO) ! { ! Primitive_Error("object does not understand selector: ~s", selector); } - break; default: ! if (TYPE(selector) == T_Pointer) ! { ! if (POINTER_T(selector)->type.data != C_SEL) ! { ! Primitive_Error("illegal selector type: ~s", selector); ! } ! if ((sel = (SEL)POINTER_T(selector)->pointer) == NULL) ! { ! Primitive_Error("null pointer: ~s", selector); ! } ! if (sel_isMapped(sel) == NO) ! { ! Primitive_Error("selector not mapped: ~s", selector); ! } ! } ! else ! { ! Wrong_Type_Combination(receiver, "string, symbol or sel"); ! } } ! #ifdef NeXT_RUNTIME ! if ((meth = class_getInstanceMethod(obj->isa, sel)) == NULL) ! #elif GNU_RUNTIME ! if ((meth = class_get_instance_method(obj->class_pointer, sel)) == NULL) ! #else ! #error *** NEITHER NeXT NOR GNU RUNTIME PRESENT *** ! #endif ! { ! Primitive_Error("can't access method for selector: ~s", selector); ! } ! result = Objc_Send(obj, sel, meth, argc - 2, argv + 2); ! GC_Unlink; ! // Alloca_End; ! return result; } --- 411,428 ---- case C_UNDEF: if ((void *)retval == NULL) { ! return Null_Pointer; } else { ! return A_Make_Pointer(*(void **)retval, rettype); } default: ! Primitive_Error("internal error with return"); } ! ! /* NOTREACHED */ ! return Null_Pointer; /* avoid warning */ } *************** *** 664,670 **** SEL sel; id obj; ! char *types; ! int i, k; ! SchemeObject ret; switch (TYPE(receiver)) --- 436,441 ---- SEL sel; id obj; ! char types[256]; ! int i; switch (TYPE(receiver)) *************** *** 725,729 **** } - types = malloc([signature frameLength]); *types = 0; --- 496,499 ---- *************** *** 731,740 **** { strcat(types, [signature getArgumentTypeAtIndex: i]); - } ! ret = Make_String(types, strlen(types)); ! free(types); ! return ret; } --- 501,513 ---- { strcat(types, [signature getArgumentTypeAtIndex: i]); ! if (strlen(types) > 220) ! { ! strcat(types, "!!truncated"); ! break; ! } ! } ! return Make_String(types, strlen(types)); } |