Annotation of objc/Test/ForwardTest.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.0 (the 'License').  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License."
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: #import <objc/Object.h>
                     26: #import <objc/objc-runtime.h>
                     27: #import <stdio.h>
                     28: 
                     29: @interface Forwarder : Object
                     30: {
                     31:   id delegate;
                     32: }
                     33: 
                     34: - initWithDelegate: anObject;
                     35: - forward: (SEL) sel : (marg_list) args;
                     36: @end
                     37: 
                     38: @implementation Forwarder
                     39: 
                     40: - initWithDelegate: anObject
                     41: {
                     42:   [super init];
                     43:   delegate = anObject;
                     44:   return self;
                     45: }
                     46: 
                     47: - forward: (SEL) sel : (marg_list) args
                     48: {
                     49:   Method method = class_getInstanceMethod ([delegate class], sel);
                     50:   unsigned int size = method_getSizeOfArguments (method);
                     51:   id result;
                     52:   static int dummy = 0;
                     53:   
                     54:   fprintf (stderr, "[Forwarder forward: \"%s\" : %u]\n",
                     55:           sel_getName (sel), size);
                     56:   
                     57:   result = objc_msgSendv (delegate, sel, size, args);
                     58:   
                     59:   fprintf (stderr, "objc_msgSendv() returned\n");
                     60:   
                     61:   /* This computation causes d1 to get trashed. */
                     62:   dummy = dummy / 2 + size + 3;
                     63:   return result;
                     64: }
                     65: 
                     66: @end
                     67: 
                     68: struct foo
                     69: {
                     70:   int one;
                     71:   int two;
                     72:   int three;
                     73:   int four;
                     74: };
                     75: 
                     76: @interface Delegate : Object
                     77: {
                     78:   int x;
                     79:   float f;
                     80:   double d;
                     81:   struct foo s;
                     82: }
                     83: 
                     84: - (int) x;
                     85: - (void) setX: (int) anInt;
                     86: - (float) f;
                     87: - (void) setF: (float) aFloat;
                     88: - (double) d;
                     89: - (void) setD: (double) aDouble;
                     90: - (struct foo) s;
                     91: - (void) setS: (struct foo) aStruct;
                     92: @end
                     93: 
                     94: @implementation Delegate
                     95: 
                     96: - (int) x
                     97: {
                     98:   fprintf (stderr, "[Delegate x]\n");
                     99:   
                    100:   return x;
                    101: }
                    102: 
                    103: - (void) setX: (int) anInt
                    104: {
                    105:   fprintf (stderr, "[Delegate setX: %d]\n", anInt);
                    106:   
                    107:   x = anInt;
                    108: }
                    109: 
                    110: - (float) f
                    111: {
                    112:   fprintf (stderr, "[Delegate f]\n");
                    113:   
                    114:   return f;
                    115: }
                    116: 
                    117: - (void) setF: (float) aFloat
                    118: {
                    119:   fprintf (stderr, "[Delegate setF: %f]\n", aFloat);
                    120:   
                    121:   f = aFloat;
                    122: }
                    123: 
                    124: - (double) d
                    125: {
                    126:   fprintf (stderr, "[Delegate d]\n");
                    127:   
                    128:   return d;
                    129: }
                    130: 
                    131: - (void) setD: (double) aDouble
                    132: {
                    133:   fprintf (stderr, "[Delegate setD: %f]\n", aDouble);
                    134:   
                    135:   d = aDouble;
                    136: }
                    137: 
                    138: - (struct foo) s
                    139: {
                    140:   fprintf (stderr, "[Delegate s]\n");
                    141:   
                    142:   return s;
                    143: }
                    144: 
                    145: - (void) setS: (struct foo) aStruct
                    146: {
                    147:   fprintf (stderr, "[Delegate setS: {%d, %d, %d, %d}]\n",
                    148:           aStruct.one, aStruct.two, aStruct.three, aStruct.four);
                    149:   
                    150:   s = aStruct;
                    151: }
                    152: 
                    153: @end
                    154: 
                    155: void main (void)
                    156: {
                    157:   id forwarder = [[Forwarder alloc] initWithDelegate: [[Delegate alloc] init]];
                    158:   struct foo s = {1, 2, 3, 4}, t;
                    159:   
                    160:   fprintf (stderr, "About to forward setX: 13\n");
                    161:   [forwarder setX: 13];
                    162:   fprintf (stderr, "Forwarding succeeded!\n");
                    163:   if ([forwarder x] == 13)
                    164:     fprintf (stderr, "passed for int\n");
                    165:   else
                    166:     fprintf (stderr, "failed for int\n");
                    167:   
                    168:   [forwarder setF: 13.0];
                    169:   if ([forwarder f] == 13.0)
                    170:     fprintf (stderr, "passed for float\n");
                    171:   else
                    172:     fprintf (stderr, "failed for float\n");
                    173:   
                    174:   [forwarder setD: 13.0];
                    175:   if ([forwarder d] == 13.0)
                    176:     fprintf (stderr, "passed for double\n");
                    177:   else
                    178:     fprintf (stderr, "failed for double\n");
                    179:   
                    180:   [forwarder setS: s];
                    181:   t = [forwarder s];
                    182:   if (memcmp (&t, &s, sizeof (struct foo)) == 0)
                    183:     fprintf (stderr, "passed for struct\n");
                    184:   else
                    185:     fprintf (stderr, "failed for struct\n");
                    186:   
                    187:   fprintf (stderr, "done\n");
                    188: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.