|
|
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: #ifndef KERNEL ! 25: | _objc_entryPoints and _objc_exitPoints are used by moninitobjc() to setup ! 26: | objective-C messages for profiling. The are made private_externs when in ! 27: | a shared library. ! 28: .reference _moninitobjc ! 29: .data ! 30: .globl _objc_entryPoints ! 31: _objc_entryPoints: ! 32: .long _objc_msgSend ! 33: .long _objc_msgSendSuper ! 34: .long 0 ! 35: ! 36: .globl _objc_exitPoints ! 37: _objc_exitPoints: ! 38: .long Lexit1 ! 39: .long Lexit5 ! 40: .long 0 ! 41: #endif /* KERNEL */ ! 42: ! 43: self = 4 ! 44: selector = 8 ! 45: cache = 32 ! 46: buckets = 8 ! 47: method_imp = 8 ! 48: ! 49: | optimized for 68040: 27 clocks (best case) + 16 clocks / probe ! 50: ! 51: .text ! 52: .align 1 ! 53: .globl _objc_msgSend ! 54: _objc_msgSend: ! 55: movel sp@(self),a0 | (1) ! 56: tstl a0 | if (self == nil) ! 57: jne L1 | ! 58: movel a0,d0 | return nil ! 59: rts | ! 60: L1: movel a0@,a0 | (1) class = self->isa; ! 61: movel a1,sp@- | (2) (save a1) ! 62: movel a0@(cache),a1 | (1) cache = class->cache; ! 63: movel sp@(selector+4),d1 | (1) index = selector; ! 64: L2: andl a1@,d1 | (1) index &= cache->mask; ! 65: movel a1@(buckets,d1:l:4),d0 | (4) method = cache->buckets[index]; ! 66: movel d0,a0 | (1) if (method == NULL) ! 67: jne L3 | (2) goto cache_miss; ! 68: jra L5 | ! 69: L3: movel sp@(selector+4),d0 | (1) ! 70: cmpl a0@,d0 | (1) if (method_name == selector) ! 71: jeq L4 | (2) goto cache_hit; ! 72: addql #1,d1 | index++ ! 73: jra L2 | goto loop; ! 74: L4: movel a0@(method_imp),a0 | (1) imp = method->method_imp; ! 75: movel sp@+,a1 | (1) (restore a1) ! 76: Lexit1: jmp a0@ | (3) goto *imp; ! 77: #ifdef MONINIT ! 78: .space 22 | /* area for moninitobjc to write */ ! 79: #endif ! 80: L5: movel sp@(self+4),a0 | cache_miss: ! 81: movel sp@(selector+4),sp@- | imp = ! 82: movel a0@,sp@- | _class_lookupMethodAndLoadCache ! 83: jbsr __class_lookupMethodAndLoadCache | (class, selector); ! 84: addql #8,sp | ! 85: movel d0,a0 | ! 86: movel sp@+,a1 | (restore a1) ! 87: Lexit2: jmp a0@ | goto *imp; ! 88: .space 22 | /* area for moninitobjc to write */ ! 89: ! 90: ! 91: ! 92: caller = 4 ! 93: ! 94: | optimized for 68040: 31 clocks (best case) + 16 clocks / probe ! 95: ! 96: .align 1 ! 97: .globl _objc_msgSendSuper ! 98: _objc_msgSendSuper: ! 99: movel sp@(caller),a0 | (1) ! 100: movel a2,sp@- | (2) (save a2) ! 101: movel a0@+,sp@(self+4) | (2) self = caller->receiver; ! 102: movel a0@,a2 | (1) class = caller->class; ! 103: movel a1,sp@- | (2) (save a1) ! 104: movel a2@(cache),a1 | (1) cache = class->cache; ! 105: movel sp@(selector+8),d1 | (1) index = selector; ! 106: L6: andl a1@,d1 | (1) index &= cache->mask; ! 107: movel a1@(buckets,d1:l:4),d0 | (4) method = cache->buckets[index]; ! 108: movel d0,a0 | (1) if (method == NULL) ! 109: jne L7 | (2) goto cache_miss; ! 110: jra L9 | ! 111: L7: movel sp@(selector+8),d0 | (1) ! 112: cmpl a0@,d0 | (1) if (method_name == selector) ! 113: jeq L8 | (2) goto cache_hit; ! 114: addql #1,d1 | index++ ! 115: jra L6 | goto loop; ! 116: L8: movel a0@(method_imp),a0 | (1) imp = method->method_imp; ! 117: movel sp@+,a1 | (1) (restore a1) ! 118: movel sp@+,a2 | (1) (restore a2) ! 119: Lexit5: jmp a0@ | (3) goto *imp; ! 120: #ifdef MONINIT ! 121: .space 22 | /* area for moninitobjc to write */ ! 122: #endif ! 123: L9: movel sp@(selector+8),sp@- | imp = ! 124: movel a2,sp@- | _class_lookupMethodAndLoadCache ! 125: jbsr __class_lookupMethodAndLoadCache | (class, selector); ! 126: addql #8,sp | ! 127: movel d0,a0 | ! 128: movel sp@+,a1 | (restore a1) ! 129: movel sp@+,a2 | (restore a2) ! 130: Lexit6: jmp a0@ | goto *imp; ! 131: #ifdef MONINIT ! 132: .space 22 | /* area for moninitobjc to write */ ! 133: #endif ! 134: ! 135: ! 136: ! 137: .objc_meth_var_names ! 138: .align 1 ! 139: L30: .ascii "forward::\0" ! 140: ! 141: .objc_message_refs ! 142: .align 2 ! 143: L31: .long L30 ! 144: ! 145: .cstring ! 146: .align 1 ! 147: L32: .ascii "Does not recognize selector %s\0" ! 148: ! 149: .text ! 150: .align 1 ! 151: .globl __objc_msgForward ! 152: __objc_msgForward: ! 153: linkw a6,#0x0 | set up frame pointer ! 154: movel sp@(selector+4),d0 | +n accounts for sp pushes ! 155: cmpl L31,d0 | if (sel == @selector (forward::)) ! 156: bne L33 | ! 157: pea L30 | __objc_error (self, ! 158: pea L32 | _errDoesntRecognize ! 159: movel sp@(self+12),sp@- | "forward::"); ! 160: bsr ___objc_error | ! 161: L33: pea sp@(self+4) | return [self forward: sel : &self]; ! 162: movel d0,sp@- | ! 163: movel L31,sp@- | ! 164: movel sp@(self+16),sp@- | ! 165: bsr _objc_msgSend | ! 166: unlk a6 | clear frame pointer ! 167: rts | ! 168: ! 169: ! 170: size = 12 ! 171: args = 16 ! 172: ! 173: .text ! 174: .align 1 ! 175: .globl _objc_msgSendv ! 176: _objc_msgSendv: ! 177: linkw a6,#0 | ! 178: movel a6@(size+4),d0 | ! 179: addql #3,d0 | size = round_up (size, 4); ! 180: andl #0xfffffffc,d0 | ! 181: movel a6@(args+4),a0 | ! 182: addl d0,a0 | arg_ptr = &args[size]; ! 183: subql #8,d0 | size -= 8; ! 184: ble L35 | while (size > 0) ! 185: L34: movel a0@-,sp@- | *--sp = *--arg_ptr; ! 186: subql #4,d0 | size -= 4; ! 187: bgt L34 | ! 188: L35: movel a6@(selector+4),sp@- | ! 189: movel a6@(self+4),sp@- | objc_msgSend (self, selector, ...); ! 190: bsr _objc_msgSend | ! 191: unlk a6 | (deallocate variable storage) ! 192: rts |
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.