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;
|