ObjFW  Check-in [1ec18e57bc]

Overview
Comment:Implement forwarding target for Apple/i386.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 1ec18e57bc05e14abe2996d2d37ce296b54e77b04e30d7738b05d14c43d57836
User & Date: js on 2012-11-16 23:07:44
Other Links: manifest | tags
Context
2012-11-17
13:26
Fix forwarding with stret. check-in: b490df80c4 user: js tags: trunk
2012-11-16
23:07
Implement forwarding target for Apple/i386. check-in: 1ec18e57bc user: js tags: trunk
21:26
Bridge: Fix some type inconsistencies. check-in: 4b6dc80314 user: js tags: trunk
Changes

Modified src/OFObject.m from [43abec3b5d] to [62c904a387].

63
64
65
66
67
68
69
70

71
72
73

74
75
76
77
78
79
80
#import "instance.h"
#if defined(OF_ATOMIC_OPS)
# import "atomic.h"
#elif defined(OF_THREADS)
# import "threading.h"
#endif

#if defined(OF_APPLE_RUNTIME) && defined(__x86_64__)

extern id of_forward(id, SEL, ...);
extern struct stret of_forward_stret(id, SEL, ...);
#endif


struct pre_ivar {
	int32_t retainCount;
	struct pre_mem *firstMem, *lastMem;
#if !defined(OF_ATOMIC_OPS) && defined(OF_THREADS)
	of_spinlock_t retainCountSpinlock;
#endif







|
>



>







63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#import "instance.h"
#if defined(OF_ATOMIC_OPS)
# import "atomic.h"
#elif defined(OF_THREADS)
# import "threading.h"
#endif

#ifdef OF_APPLE_RUNTIME
# if defined(__x86_64__) || defined(__i386__)
extern id of_forward(id, SEL, ...);
extern struct stret of_forward_stret(id, SEL, ...);
#endif
#endif

struct pre_ivar {
	int32_t retainCount;
	struct pre_mem *firstMem, *lastMem;
#if !defined(OF_ATOMIC_OPS) && defined(OF_THREADS)
	of_spinlock_t retainCountSpinlock;
#endif
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
#if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__)
	objc_setUncaughtExceptionHandler(uncaught_exception_handler);
#endif

#if defined(OF_OBJFW_RUNTIME)
	objc_forward_handler = forward_handler;
#elif defined(OF_APPLE_RUNTIME)
# ifdef __x86_64__
	objc_setForwardHandler(of_forward, of_forward_stret);
# endif
#endif

#ifdef HAVE_OBJC_ENUMERATIONMUTATION
	objc_setEnumerationMutationHandler(enumeration_mutation_handler);
#endif







|







256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__)
	objc_setUncaughtExceptionHandler(uncaught_exception_handler);
#endif

#if defined(OF_OBJFW_RUNTIME)
	objc_forward_handler = forward_handler;
#elif defined(OF_APPLE_RUNTIME)
# if defined(__x86_64__) || defined(__i386__)
	objc_setForwardHandler(of_forward, of_forward_stret);
# endif
#endif

#ifdef HAVE_OBJC_ENUMERATIONMUTATION
	objc_setEnumerationMutationHandler(enumeration_mutation_handler);
#endif

Added src/apple-forwarding-i386.S version [f7e556eeea].











































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 * Copyright (c) 2008, 2009, 2010, 2011, 2012
 *   Jonathan Schleifer <js@webkeks.org>
 *
 * All rights reserved.
 *
 * This file is part of ObjFW. It may be distributed under the terms of the
 * Q Public License 1.0, which can be found in the file LICENSE.QPL included in
 * the packaging of this file.
 *
 * Alternatively, it may be distributed under the terms of the GNU General
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

.globl _of_forward
.globl _of_forward_stret

.section __TEXT, __cstring, cstring_literals
L_str_forwardingTargetForSelector:
	.asciz "forwardingTargetForSelector:"

.section __OBJC, __message_refs, literal_pointers, no_dead_strip
L_sel_forwardingTargetForSelector:
	.long L_str_forwardingTargetForSelector

.section __OBJC, __image_info
	.long 0, 0

.section __TEXT, __text, regular, pure_instructions
.macro forward dispatch_func
	pushl	%ebp
	movl	%esp, %ebp

	pushl	8(%ebp)
	call	_object_getClass
	addl	$4, %esp
	movl	%eax, %edx

	call	get_eip
L0_\dispatch_func:
	pushl	L_sel_forwardingTargetForSelector-L0_\dispatch_func(%eax)
	pushl	%edx
	call	_class_respondsToSelector
	addl	$8, %esp
	testl	%eax, %eax
	jz	fail

	pushl	12(%ebp)
	call	get_eip
L1_\dispatch_func:
	pushl	L_sel_forwardingTargetForSelector-L1_\dispatch_func(%eax)
	pushl	8(%ebp)
	call	_objc_msgSend

	testl	%eax, %eax
	jz	fail

	cmpl	8(%ebp), %eax
	je	fail

	movl	%eax, 8(%ebp)

	movl	%ebp, %esp
	popl	%ebp

	jmp	\dispatch_func
.endmacro

_of_forward:
	forward	_objc_msgSend

_of_forward_stret:
	forward	_objc_msgSend_stret

fail:
	movl	%ebp, %esp
	popl	%ebp

	jmp	_of_method_not_found

get_eip:
	movl	(%esp), %eax
	ret

Modified src/apple-forwarding-x86_64.S from [f7c3563b91] to [944516a548].

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
	.quad L_str_forwardingTargetForSelector

.section __DATA, __objc_imageinfo, regular, no_dead_strip
	.long 0, 0

.section __TEXT, __text, regular, pure_instructions
.macro forward dispatch_func
	push	%rbp
	movq	%rsp, %rbp

	/* Save all arguments */
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	 %rax, 0xA8(%rsp)
	movq	 %rdi, 0xA0(%rsp)
	movq	 %rsi, 0x98(%rsp)







|







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
	.quad L_str_forwardingTargetForSelector

.section __DATA, __objc_imageinfo, regular, no_dead_strip
	.long 0, 0

.section __TEXT, __text, regular, pure_instructions
.macro forward dispatch_func
	pushq	%rbp
	movq	%rsp, %rbp

	/* Save all arguments */
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	 %rax, 0xA8(%rsp)
	movq	 %rdi, 0xA0(%rsp)
	movq	 %rsi, 0x98(%rsp)
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

97
98
99
100
101
102
103
104
105
106
107
	movd	%xmm6, 0x10(%rsp)
	movd	%xmm7,     (%rsp)

	call	_object_getClass
	movq	%rax, %rdi
	movq	L_sel_forwardingTargetForSelector(%rip), %rsi
	call	_class_respondsToSelector
	test	%rax, %rax
	jz	fail

	movq	0xA0(%rsp), %rdi
	movq	L_sel_forwardingTargetForSelector(%rip), %rsi
	movq	0x98(%rsp), %rdx
	call	\dispatch_func
	movq	%rax, %rdi

	test	%rdi, %rdi
	jz	fail

	cmp	0xA0(%rsp), %rdi
	je	fail

	/* Restore all arguments, except %rdi */
	movd	    (%rsp), %xmm7
	movd	0x10(%rsp), %xmm6
	movd	0x20(%rsp), %xmm5
	movd	0x30(%rsp), %xmm4
	movd	0x40(%rsp), %xmm3
	movd	0x50(%rsp), %xmm2
	movd	0x60(%rsp), %xmm1
	movd	0x70(%rsp), %xmm0
	movq	0x78(%rsp),   %r9
	movq	0x80(%rsp),   %r8
	movq	0x88(%rsp),  %rcx
	movq	0x90(%rsp),  %rdx
	movq	0x98(%rsp),  %rsi
	movq	0xA8(%rsp),  %rax

	movq	%rbp, %rsp
	pop	%rbp

	jmp	\dispatch_func
.endmacro

_of_forward:
	forward	_objc_msgSend

_of_forward_stret:
	forward	_objc_msgSend_stret

fail:
	movq	0xA0(%rsp),  %rdi
	movq	0x98(%rsp),  %rsi

	movq	%rbp, %rsp
	pop	%rbp

	jmp	_of_method_not_found







|








|


|



















|






>








|


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
	movd	%xmm6, 0x10(%rsp)
	movd	%xmm7,     (%rsp)

	call	_object_getClass
	movq	%rax, %rdi
	movq	L_sel_forwardingTargetForSelector(%rip), %rsi
	call	_class_respondsToSelector
	testq	%rax, %rax
	jz	fail

	movq	0xA0(%rsp), %rdi
	movq	L_sel_forwardingTargetForSelector(%rip), %rsi
	movq	0x98(%rsp), %rdx
	call	\dispatch_func
	movq	%rax, %rdi

	testq	%rdi, %rdi
	jz	fail

	cmpq	0xA0(%rsp), %rdi
	je	fail

	/* Restore all arguments, except %rdi */
	movd	    (%rsp), %xmm7
	movd	0x10(%rsp), %xmm6
	movd	0x20(%rsp), %xmm5
	movd	0x30(%rsp), %xmm4
	movd	0x40(%rsp), %xmm3
	movd	0x50(%rsp), %xmm2
	movd	0x60(%rsp), %xmm1
	movd	0x70(%rsp), %xmm0
	movq	0x78(%rsp),   %r9
	movq	0x80(%rsp),   %r8
	movq	0x88(%rsp),  %rcx
	movq	0x90(%rsp),  %rdx
	movq	0x98(%rsp),  %rsi
	movq	0xA8(%rsp),  %rax

	movq	%rbp, %rsp
	popq	%rbp

	jmp	\dispatch_func
.endmacro

_of_forward:
	forward	_objc_msgSend

_of_forward_stret:
	forward	_objc_msgSend_stret

fail:
	movq	0xA0(%rsp),  %rdi
	movq	0x98(%rsp),  %rsi

	movq	%rbp, %rsp
	popq	%rbp

	jmp	_of_method_not_found

Modified src/apple-forwarding.S from [9e82925ad3] to [ea041816ca].

12
13
14
15
16
17
18
19
20


21
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

#ifdef __x86_64__
# include "apple-forwarding-x86_64.S"


#endif







|

>
>

12
13
14
15
16
17
18
19
20
21
22
23
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

#if defined(__x86_64__)
# include "apple-forwarding-x86_64.S"
#elif defined(__i386__)
# include "apple-forwarding-i386.S"
#endif