|
From: Martin R. <ru...@us...> - 2004-08-09 17:30:56
|
Update of /cvsroot/foo/foo/elkfoo/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12837 Modified Files: pointer.m tell.m Log Message: cleaned up message passing stuff Index: pointer.m =================================================================== RCS file: /cvsroot/foo/foo/elkfoo/src/pointer.m,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** pointer.m 9 Aug 2004 01:47:34 -0000 1.7 --- pointer.m 9 Aug 2004 17:30:47 -0000 1.8 *************** *** 93,97 **** SchemeObject A_Make_Pointer (int address, ! int type) { SchemeObject pointer; --- 93,97 ---- SchemeObject A_Make_Pointer (int address, ! elkfoo_type_t type) { SchemeObject pointer; *************** *** 108,112 **** SchemeObject type) { ! int i; if (TYPE(type) != T_String && TYPE(type) != T_Symbol) --- 108,112 ---- SchemeObject type) { ! elkfoo_type_t i; if (TYPE(type) != T_String && TYPE(type) != T_Symbol) *************** *** 191,195 **** pointer = argv[0]; Check_Type(pointer, T_Pointer); - GC_Link(pointer); type = POINTER_T(pointer)->type.data; addr = POINTER_T(pointer)->pointer; --- 191,194 ---- *************** *** 215,218 **** --- 214,218 ---- result = Make_Vector(items, Null); + GC_Link(result); for (i = 0; i < items; i++) *************** *** 270,275 **** } } } - GC_Unlink; return result; --- 270,275 ---- } } + GC_Unlink; } return result; *************** *** 304,308 **** int length) { ! int type; GC_Node2; --- 304,308 ---- int length) { ! elkfoo_type_t type; GC_Node2; *************** *** 310,313 **** --- 310,314 ---- type = POINTER_T(x)->type.data; + if (type < C_base || type > C_last) { *************** *** 320,326 **** else { - // FIXME: THIS MIGHT GET BETTER USING HIGHLEVEL CALLS - Printf(port, "#[pointer <%s>", elkfoo_type_names[type]); if (type == C_ID) { --- 321,326 ---- else { Printf(port, "#[pointer <%s>", elkfoo_type_names[type]); + if (type == C_ID) { Index: tell.m =================================================================== RCS file: /cvsroot/foo/foo/elkfoo/src/tell.m,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** tell.m 9 Aug 2004 01:43:27 -0000 1.13 --- tell.m 9 Aug 2004 17:30:47 -0000 1.14 *************** *** 63,73 **** NSInvocation *invoc; NSMethodSignature *sign; ! int i, retsize; ! elkfoo_type_t rettype; ! char valbuf[16]; receiver = argv[0]; selector = argv[1]; switch (TYPE(receiver)) { --- 63,72 ---- NSInvocation *invoc; NSMethodSignature *sign; ! int i; receiver = argv[0]; selector = argv[1]; + // check receiver switch (TYPE(receiver)) { *************** *** 102,105 **** --- 101,105 ---- } + // check selector switch (TYPE(selector)) { *************** *** 138,141 **** --- 138,142 ---- } + // get signature if ((sign = [obj methodSignatureForSelector: sel]) == nil) { *************** *** 143,161 **** } 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"); } for (i = 0; i < argc; i++) { elkfoo_type_t etype = A_Map_ObjC_Type([sign getArgumentTypeAtIndex: i + 2]); if (A_Get_Buffer_From_Object(valbuf, argv[i], etype)) --- 144,164 ---- } + // create invocation invoc = [NSInvocation invocationWithMethodSignature: sign]; ! if (([sign numberOfArguments]) != argc) { Primitive_Error("wrong number of arguments"); } + // omit _self and _cmd resp. receiver and selector + argc -= 2; + argv += 2; + + // fill invocation with arg values for (i = 0; i < argc; i++) { + char valbuf[16]; + elkfoo_type_t etype = A_Map_ObjC_Type([sign getArgumentTypeAtIndex: i + 2]); if (A_Get_Buffer_From_Object(valbuf, argv[i], etype)) *************** *** 167,180 **** } - rettype = A_Map_ObjC_Type([sign methodReturnType]); - retsize = [sign methodReturnLength]; - // fire [invoc invoke]; - [invoc getReturnValue: valbuf]; ! RELEASE(invoc); ! ret = A_Get_Object_From_Buffer(valbuf, rettype); if (Nullp(ret)) --- 170,195 ---- } // fire + [invoc setTarget: obj]; + [invoc setSelector: sel]; [invoc invoke]; ! { // get return value ! elkfoo_type_t rettype; ! int retsize; ! char *valbuf; ! rettype = A_Map_ObjC_Type([sign methodReturnType]); ! retsize = [sign methodReturnLength]; ! if (! (valbuf = malloc(retsize))) ! { ! Primitive_Error("malloc failed. giving up"); ! } ! [invoc getReturnValue: valbuf]; ! ! ret = A_Get_Object_From_Buffer(valbuf, rettype); ! ! RELEASE(invoc); ! free(valbuf); if (Nullp(ret)) *************** *** 182,185 **** --- 197,201 ---- Primitive_Error("internal error with return"); } + } return ret; |