check archiving

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3142 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
richard 1998-10-28 15:18:38 +00:00
parent 4050627c7b
commit 5e80346763

View file

@ -1,7 +1,8 @@
#include <Foundation/NSMethodSignature.h> #include <Foundation/NSMethodSignature.h>
#include <Foundation/NSInvocation.h> #include <Foundation/NSInvocation.h>
#include <Foundation/NSString.h> #include <Foundation/NSString.h>
#include <Foundation/NSAutoreleasePool.h> #include <Foundation/NSAutoreleasePool.h>
#include <Foundation/NSArchiver.h>
typedef struct { typedef struct {
char c; char c;
@ -43,104 +44,104 @@ typedef struct {
@implementation Target @implementation Target
- (char) loopChar: (char)v - (char) loopChar: (char)v
{ {
return v+1; return v+1;
} }
- (double) loopDouble: (double)v - (double) loopDouble: (double)v
{ {
return v+1.0; return v+1.0;
} }
- (float) loopFloat: (float)v - (float) loopFloat: (float)v
{ {
return v+1.0; return v+1.0;
} }
- (int) loopInt: (int)v - (int) loopInt: (int)v
{ {
return v+1; return v+1;
} }
- (large) loopLarge: (large)v - (large) loopLarge: (large)v
{ {
return v; return v;
} }
- (long) loopLong: (long)v - (long) loopLong: (long)v
{ {
return v+1; return v+1;
} }
- (large) loopLargePtr: (large*)v - (large) loopLargePtr: (large*)v
{ {
return *v; return *v;
} }
- (id) loopObject: (id)v - (id) loopObject: (id)v
{ {
return v; return v;
} }
- (short) loopShort: (short)v - (short) loopShort: (short)v
{ {
return v+1; return v+1;
} }
- (small) loopSmall: (small)v - (small) loopSmall: (small)v
{ {
return v; return v;
} }
- (small) loopSmallPtr: (small*)v - (small) loopSmallPtr: (small*)v
{ {
return *v; return *v;
} }
- (char*) loopString: (char*)v - (char*) loopString: (char*)v
{ {
return v; return v;
} }
- (char) retChar - (char) retChar
{ {
return (char)99; return (char)99;
} }
- (double) retDouble - (double) retDouble
{ {
return 123.456; return 123.456;
} }
- (float) retFloat - (float) retFloat
{ {
return 123.456; return 123.456;
} }
- (int) retInt - (int) retInt
{ {
return 123456; return 123456;
} }
- (large) retLarge - (large) retLarge
{ {
static large l = { static large l = {
99, "large", 99.99 99, "large", 99.99
}; };
return l; return l;
} }
- (long) retLong - (long) retLong
{ {
return 123456; return 123456;
} }
- (id) retObject - (id) retObject
{ {
return self; return self;
} }
- (short) retShort - (short) retShort
{ {
return 12345; return 12345;
} }
- (small) retSmall - (small) retSmall
{ {
static small s = { static small s = {
11, 22 11, 22
}; };
return s; return s;
} }
- (char*) retString - (char*) retString
{ {
return "string"; return "string";
} }
@end @end
@interface MyProxy : NSObject @interface MyProxy : NSObject
{ {
id obj; id obj;
} }
- (void) forwardInvocation: (NSInvocation*)inv; - (void) forwardInvocation: (NSInvocation*)inv;
- (id) initWithTarget: (id)target; - (id) initWithTarget: (id)target;
@ -149,252 +150,264 @@ typedef struct {
@implementation MyProxy @implementation MyProxy
- (id) initWithTarget: (id)target - (id) initWithTarget: (id)target
{ {
obj = target; obj = target;
return self; return self;
} }
- (void) forwardInvocation: (NSInvocation*)inv - (void) forwardInvocation: (NSInvocation*)inv
{ {
[inv invokeWithTarget: obj]; NSData *d = [NSArchiver archivedDataWithRootObject: inv];
NSInvocation *i = [NSUnarchiver unarchiveObjectWithData: d];
unsigned l;
void *b;
[i invokeWithTarget: obj];
d = [NSArchiver archivedDataWithRootObject: i];
i = [NSUnarchiver unarchiveObjectWithData: d];
l = [[i methodSignature] methodReturnLength];
b = (void *)objc_malloc(l);
[i getReturnValue: b];
[inv setReturnValue: b];
objc_free(b);
} }
@end @end
int int
main () main ()
{ {
large la; large la;
small sm; small sm;
large tmpla; large tmpla;
large *laptr = &tmpla; large *laptr = &tmpla;
small tmpsm; small tmpsm;
small *smptr = &tmpsm; small *smptr = &tmpsm;
int i; int i;
char c; char c;
short s; short s;
long l; long l;
float f; float f;
double d; double d;
id o; id o;
char* str; char* str;
NSInvocation *inv; NSInvocation *inv;
NSMethodSignature *sig; NSMethodSignature *sig;
Target *t; Target *t;
id p; id p;
NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSAutoreleasePool *arp = [NSAutoreleasePool new];
t = [Target new]; t = [Target new];
p = [[MyProxy alloc] initWithTarget: t]; p = [[MyProxy alloc] initWithTarget: t];
#define SETUP(X) \ #define SETUP(X) \
sig = [t methodSignatureForSelector: @selector(X)]; \ sig = [t methodSignatureForSelector: @selector(X)]; \
inv = [NSInvocation invocationWithMethodSignature: sig]; \ inv = [NSInvocation invocationWithMethodSignature: sig]; \
[inv setSelector: @selector(X)]; [inv setSelector: @selector(X)];
tmpsm.c = 8; tmpsm.c = 8;
tmpsm.i = 9; tmpsm.i = 9;
tmpla.i = 1; tmpla.i = 1;
tmpla.s = "hello"; tmpla.s = "hello";
tmpla.f = 1.23; tmpla.f = 1.23;
SETUP(retChar); SETUP(retChar);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 99, "); printf("Expect: 99, ");
[inv getReturnValue: &c]; [inv getReturnValue: &c];
printf("invoke: %d ", c); printf("invoke: %d ", c);
c = [p retChar]; c = [p retChar];
printf("forward: %d\n", c); printf("forward: %d\n", c);
SETUP(retShort); SETUP(retShort);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 12345, "); printf("Expect: 12345, ");
[inv getReturnValue: &s]; [inv getReturnValue: &s];
printf("invoke: %d ", s); printf("invoke: %d ", s);
s = [p retShort]; s = [p retShort];
printf("forward: %d\n", s); printf("forward: %d\n", s);
SETUP(retInt); SETUP(retInt);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 123456, "); printf("Expect: 123456, ");
[inv getReturnValue: &i]; [inv getReturnValue: &i];
printf("invoke: %d ", i); printf("invoke: %d ", i);
i = [p retInt]; i = [p retInt];
printf("forward: %d\n", i); printf("forward: %d\n", i);
SETUP(retLong); SETUP(retLong);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 123456, "); printf("Expect: 123456, ");
[inv getReturnValue: &l]; [inv getReturnValue: &l];
printf("invoke: %ld ", l); printf("invoke: %ld ", l);
l = [p retLong]; l = [p retLong];
printf("forward: %ld\n", l); printf("forward: %ld\n", l);
SETUP(retFloat); SETUP(retFloat);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 123.456, "); printf("Expect: 123.456, ");
[inv getReturnValue: &f]; [inv getReturnValue: &f];
printf("invoke: %.3f ", f); printf("invoke: %.3f ", f);
f = [p retFloat]; f = [p retFloat];
printf("forward: %.3f\n", f); printf("forward: %.3f\n", f);
SETUP(retDouble); SETUP(retDouble);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 123.456, "); printf("Expect: 123.456, ");
[inv getReturnValue: &d]; [inv getReturnValue: &d];
printf("invoke: %.3f ", d); printf("invoke: %.3f ", d);
d = [p retDouble]; d = [p retDouble];
printf("forward: %.3f\n", d); printf("forward: %.3f\n", d);
SETUP(retObject); SETUP(retObject);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: %x, ", t); printf("Expect: %x, ", t);
[inv getReturnValue: &o]; [inv getReturnValue: &o];
printf("invoke: %x ", o); printf("invoke: %x ", o);
o = [p retObject]; o = [p retObject];
printf("forward: %x\n", o); printf("forward: %x\n", o);
SETUP(retString); SETUP(retString);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 'string', "); printf("Expect: 'string', ");
[inv getReturnValue: &str]; [inv getReturnValue: &str];
printf("invoke: '%s' ", str); printf("invoke: '%s' ", str);
str = [p retString]; str = [p retString];
printf("forward: '%s'\n", str); printf("forward: '%s'\n", str);
SETUP(retSmall); SETUP(retSmall);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: {11,22}, "); printf("Expect: {11,22}, ");
[inv getReturnValue: &sm]; [inv getReturnValue: &sm];
printf("invoke: {%d,%d} ", sm.c, sm.i); printf("invoke: {%d,%d} ", sm.c, sm.i);
sm = [p retSmall]; sm = [p retSmall];
printf("forward: {%d,%d}\n", sm.c, sm.i); printf("forward: {%d,%d}\n", sm.c, sm.i);
SETUP(retLarge); SETUP(retLarge);
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: {99,large,99.99}, "); printf("Expect: {99,large,99.99}, ");
[inv getReturnValue: &la]; [inv getReturnValue: &la];
printf("invoke: {%d,%s,%.2f} ", la.i, la.s, la.f); printf("invoke: {%d,%s,%.2f} ", la.i, la.s, la.f);
la = [p retLarge]; la = [p retLarge];
printf("forward: {%d,%s,%.2f}\n", la.i, la.s, la.f); printf("forward: {%d,%s,%.2f}\n", la.i, la.s, la.f);
SETUP(loopChar:); SETUP(loopChar:);
c = 0; c = 0;
[inv setArgument: &c atIndex: 2]; [inv setArgument: &c atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 1, "); printf("Expect: 1, ");
[inv getReturnValue: &c]; [inv getReturnValue: &c];
printf("invoke: %d ", c); printf("invoke: %d ", c);
c = [p loopChar: 0]; c = [p loopChar: 0];
printf("forward: %d\n", c); printf("forward: %d\n", c);
SETUP(loopShort:); SETUP(loopShort:);
s = 1; s = 1;
[inv setArgument: &s atIndex: 2]; [inv setArgument: &s atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 2, "); printf("Expect: 2, ");
[inv getReturnValue: &s]; [inv getReturnValue: &s];
printf("invoke: %d ", s); printf("invoke: %d ", s);
s = [p loopShort: 1]; s = [p loopShort: 1];
printf("forward: %d\n", s); printf("forward: %d\n", s);
SETUP(loopInt:); SETUP(loopInt:);
i = 2; i = 2;
[inv setArgument: &i atIndex: 2]; [inv setArgument: &i atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 3, "); printf("Expect: 3, ");
[inv getReturnValue: &i]; [inv getReturnValue: &i];
printf("invoke: %d ", i); printf("invoke: %d ", i);
i = [p loopInt: 2]; i = [p loopInt: 2];
printf("forward: %d\n", i); printf("forward: %d\n", i);
SETUP(loopLong:); SETUP(loopLong:);
l = 3; l = 3;
[inv setArgument: &l atIndex: 2]; [inv setArgument: &l atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 4, "); printf("Expect: 4, ");
[inv getReturnValue: &l]; [inv getReturnValue: &l];
printf("invoke: %d ", l); printf("invoke: %d ", l);
l = [p loopLong: 3]; l = [p loopLong: 3];
printf("forward: %d\n", l); printf("forward: %d\n", l);
SETUP(loopFloat:); SETUP(loopFloat:);
f = 4.0; f = 4.0;
[inv setArgument: &f atIndex: 2]; [inv setArgument: &f atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 5.0, "); printf("Expect: 5.0, ");
[inv getReturnValue: &f]; [inv getReturnValue: &f];
printf("invoke: %.1f ", f); printf("invoke: %.1f ", f);
f = [p loopFloat: 4.0]; f = [p loopFloat: 4.0];
printf("forward: %.1f\n", f); printf("forward: %.1f\n", f);
SETUP(loopDouble:); SETUP(loopDouble:);
d = 5.0; d = 5.0;
[inv setArgument: &d atIndex: 2]; [inv setArgument: &d atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 6.0, "); printf("Expect: 6.0, ");
[inv getReturnValue: &d]; [inv getReturnValue: &d];
printf("invoke: %.1f ", d); printf("invoke: %.1f ", d);
d = [p loopDouble: 5.0]; d = [p loopDouble: 5.0];
printf("forward: %.1f\n", d); printf("forward: %.1f\n", d);
SETUP(loopObject:); SETUP(loopObject:);
[inv setArgument: &p atIndex: 2]; [inv setArgument: &p atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: %x, ", p); printf("Expect: %x, ", p);
[inv getReturnValue: &o]; [inv getReturnValue: &o];
printf("invoke: %x ", o); printf("invoke: %x ", o);
o = [p loopObject: p]; o = [p loopObject: p];
printf("forward: %x\n", o); printf("forward: %x\n", o);
SETUP(loopString:); SETUP(loopString:);
str = "Hello"; str = "Hello";
[inv setArgument: &str atIndex: 2]; [inv setArgument: &str atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
printf("Expect: 'Hello', "); printf("Expect: 'Hello', ");
[inv getReturnValue: &str]; [inv getReturnValue: &str];
printf("invoke: '%s' ", str); printf("invoke: '%s' ", str);
str = [p loopString: str]; str = [p loopString: str];
printf("forward: '%s'\n", str); printf("forward: '%s'\n", str);
SETUP(loopSmall:); SETUP(loopSmall:);
printf("Expect: {8,9}, "); printf("Expect: {8,9}, ");
[inv setArgument: &tmpsm atIndex: 2]; [inv setArgument: &tmpsm atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
[inv getReturnValue: &sm]; [inv getReturnValue: &sm];
printf("invoke: {%d,%d} ", sm.c, sm.i); printf("invoke: {%d,%d} ", sm.c, sm.i);
sm = [p loopSmall: tmpsm]; sm = [p loopSmall: tmpsm];
printf("forward: {%d,%d}\n", sm.c, sm.i); printf("forward: {%d,%d}\n", sm.c, sm.i);
SETUP(loopLarge:); SETUP(loopLarge:);
printf("Expect: {1,hello,1.23}, "); printf("Expect: {1,hello,1.23}, ");
[inv setArgument: &tmpla atIndex: 2]; [inv setArgument: &tmpla atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
[inv getReturnValue: &la]; [inv getReturnValue: &la];
printf("invoke: {%d,%s,%.2f} ", la.i, la.s, la.f); printf("invoke: {%d,%s,%.2f} ", la.i, la.s, la.f);
la = [p loopLarge: tmpla]; la = [p loopLarge: tmpla];
printf("forward: {%d,%s,%.2f}\n", la.i, la.s, la.f); printf("forward: {%d,%s,%.2f}\n", la.i, la.s, la.f);
SETUP(loopSmallPtr:); SETUP(loopSmallPtr:);
printf("Expect: {8,9}, "); printf("Expect: {8,9}, ");
[inv setArgument: &smptr atIndex: 2]; [inv setArgument: &smptr atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
[inv getReturnValue: &sm]; [inv getReturnValue: &sm];
printf("invoke: {%d,%d} ", sm.c, sm.i); printf("invoke: {%d,%d} ", sm.c, sm.i);
sm = [p loopSmallPtr: smptr]; sm = [p loopSmallPtr: smptr];
printf("forward: {%d,%d}\n", sm.c, sm.i); printf("forward: {%d,%d}\n", sm.c, sm.i);
SETUP(loopLargePtr:); SETUP(loopLargePtr:);
printf("Expect: {1,hello,1.23}, "); printf("Expect: {1,hello,1.23}, ");
[inv setArgument: &laptr atIndex: 2]; [inv setArgument: &laptr atIndex: 2];
[inv invokeWithTarget: t]; [inv invokeWithTarget: t];
[inv getReturnValue: &la]; [inv getReturnValue: &la];
printf("invoke: {%d,%s,%.2f} ", la.i, la.s, la.f); printf("invoke: {%d,%s,%.2f} ", la.i, la.s, la.f);
la = [p loopLargePtr: laptr]; la = [p loopLargePtr: laptr];
printf("forward: {%d,%s,%.2f}\n", la.i, la.s, la.f); printf("forward: {%d,%s,%.2f}\n", la.i, la.s, la.f);
[arp release]; [arp release];
return 0; return 0;
} }