ObjFW  Diff

Differences From Artifact [89119220a2]:

To Artifact [584c3797d2]:


19
20
21
22
23
24
25
26

27
28
29
30

31
32
33

34
35
36
37
38
39
40
19
20
21
22
23
24
25

26
27
28
29

30
31
32

33
34
35
36
37
38
39
40







-
+



-
+


-
+








.globl objc_msg_lookup
.globl objc_msg_lookup_stret
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret

.section .text
.macro generate_lookup name not_found
.macro GENERATE_LOOKUP name notFound
\name:
	movl	4(%esp), %edx
	testl	%edx, %edx
	jz	ret_nil
	jz	returnNilMethod

	testb	$1, %dl
	jnz	.Ltagged_pointer_\name
	jnz	.LtaggedPointer_\name

	movl	(%edx), %edx
	movl	32(%edx), %edx

.Lmain_\name:
	movl	8(%esp), %eax

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
86
87
88
89
90
91
92
93
94
95
96
97




98
99
100


101
102

103
104
105

106
107
108
109

110
111
112
113
114
115
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
86
87
88
89
90
91
92
93




94
95
96
97
98


99
100
101

102
103
104

105
106
107
108

109
110
111
112
113
114
115







-
+

-
+


-
-
+
+


-
+




-
+








-
+




-
+









-
-
-
-
+
+
+
+

-
-
+
+

-
+


-
+



-
+







	testl	%eax, %eax
	jz	0f

	ret

0:
	call	get_eip
	call	getEIP
	addl	$_GLOBAL_OFFSET_TABLE_, %eax
	lea	\not_found@GOTOFF(%eax), %eax
	lea	\notFound@GOTOFF(%eax), %eax
	jmp	*%eax

.Ltagged_pointer_\name:
	call	get_eip
.LtaggedPointer_\name:
	call	getEIP
	addl	$_GLOBAL_OFFSET_TABLE_, %eax

	leal	objc_tagged_pointer_secret@GOTOFF(%eax), %ecx
	leal	objc_taggedPointerSecret@GOTOFF(%eax), %ecx
	xorl	(%ecx), %edx
	andb	$0xE, %dl
	movzbl	%dl, %edx

	leal	objc_tagged_pointer_classes@GOTOFF(%eax), %eax
	leal	objc_taggedPointerClasses@GOTOFF(%eax), %eax
	movl	(%eax,%edx,2), %edx
	movl	32(%edx), %edx

	jmp	.Lmain_\name
.type \name, %function
.size \name, .-\name
.endm

.macro generate_lookup_super name lookup
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
	movl	4(%esp), %edx
	movl	(%edx), %eax
	testl	%eax, %eax
	jz	ret_nil
	jz	returnNilMethod

	movl	%eax, 4(%esp)
	mov	4(%edx), %edx
	mov	32(%edx), %edx
	jmp	.Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm

generate_lookup objc_msg_lookup objc_method_not_found
generate_lookup objc_msg_lookup_stret objc_method_not_found_stret
generate_lookup_super objc_msg_lookup_super objc_msg_lookup
generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret

ret_nil:
	call	get_eip
returnNilMethod:
	call	getEIP
	addl	$_GLOBAL_OFFSET_TABLE_, %eax
	leal	nil_method@GOTOFF(%eax), %eax
	leal	nilMethod@GOTOFF(%eax), %eax
	ret

nil_method:
nilMethod:
	xorl	%eax, %eax
	ret

get_eip:
getEIP:
	movl	(%esp), %eax
	ret

#ifdef OF_LINUX
.section .note.GNU-stack, "", %progbits
#endif