ObjFW  Check-in [9e23a50de7]

Overview
Comment:runtime: Add class_getInstanceMethod()
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 9e23a50de70b58b7afe835373558565229f7ff9cafe2c311cb772599e354bc3d
User & Date: js on 2019-12-13 00:00:54
Other Links: manifest | tags
Context
2019-12-14
18:48
OFNumber: Add -[stringValue] check-in: f5558d0919 user: js tags: trunk
2019-12-13
00:00
runtime: Add class_getInstanceMethod() check-in: 9e23a50de7 user: js tags: trunk
2019-12-12
23:30
Remove OFIntrospection check-in: a989f0ab6f user: js tags: trunk
Changes

Modified src/OFObject.m from [349b3d550a] to [507689f6ed].

101
102
103
104
105
106
107
108
109
110
111

112
113

114
115
116

117
118
119
120
121
122
123
124
101
102
103
104
105
106
107




108
109

110
111
112

113

114
115
116
117
118
119
120







-
-
-
-
+

-
+


-
+
-







} allocFailedException;

uint32_t of_hash_seed;

static const char *
typeEncodingForSelector(Class class, SEL selector)
{
#if defined(OF_OBJFW_RUNTIME)
	return class_getMethodTypeEncoding(class, selector);
#elif defined(OF_APPLE_RUNTIME)
	Method m;
	Method method;

	if ((m = class_getInstanceMethod(class, selector)) == NULL)
	if ((method = class_getInstanceMethod(class, selector)) == NULL)
		return NULL;

	return method_getTypeEncoding(m);
	return method_getTypeEncoding(method);
#endif
}

#if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__)
static void
uncaughtExceptionHandler(id exception)
{
	OFString *description = [exception description];

Modified src/runtime/ObjFWRT.h from [752b8568a9] to [b950544256].

106
107
108
109
110
111
112
113

114
115
116
117
118
119
120
106
107
108
109
110
111
112

113
114
115
116
117
118
119
120







-
+







    SEL _Nonnull selector);
extern bool class_conformsToProtocol(Class _Nullable class_,
    Protocol *_Nonnull protocol);
extern IMP _Nullable class_getMethodImplementation(Class _Nullable class_,
    SEL _Nonnull selector);
extern IMP _Nullable class_getMethodImplementation_stret(Class _Nullable class_,
    SEL _Nonnull selector);
extern const char *_Nullable class_getMethodTypeEncoding(Class _Nullable class_,
extern Method _Nullable class_getInstanceMethod(Class _Nullable class_,
    SEL _Nonnull selector);
extern bool class_addMethod(Class _Nonnull class_, SEL _Nonnull selector,
    IMP _Nonnull implementation, const char *_Nullable typeEncoding);
extern IMP _Nullable class_replaceMethod(Class _Nonnull class_,
    SEL _Nonnull selector, IMP _Nonnull implementation,
    const char *_Nullable typeEncoding);
extern Class _Nullable object_getClass(id _Nullable object);

Modified src/runtime/amiga-glue.m from [2e81cbccc1] to [066d6109b5].

503
504
505
506
507
508
509
510
511


512
513
514
515
516

517
518
519
520
521
522
523
503
504
505
506
507
508
509


510
511
512
513
514
515

516
517
518
519
520
521
522
523







-
-
+
+




-
+







{
	M68K_ARG(Class, class, a0)
	M68K_ARG(SEL, selector, a1)

	return class_getMethodImplementation_stret(class, selector);
}

const char *__saveds
glue_class_getMethodTypeEncoding PPC_PARAMS(Class class, SEL selector)
Method __saveds
glue_class_getInstanceMethod PPC_PARAMS(Class class, SEL selector)
{
	M68K_ARG(Class, class, a0)
	M68K_ARG(SEL, selector, a1)

	return class_getMethodTypeEncoding(class, selector);
	return class_getInstanceMethod(class, selector);
}

bool __saveds
glue_class_addMethod PPC_PARAMS(Class class, SEL selector, IMP implementation,
    const char *typeEncoding)
{
	M68K_ARG(Class, class, a0)

Modified src/runtime/amiga-library.m from [9e632d2539] to [947d91885b].

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
116



117
118
119
120
121
122





123
124
125

126
127
128
129
130
131
132
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
116
117





118
119
120
121
122
123
124

125
126
127
128
129
130
131
132







-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+



-
+





-
-
-
+
+
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
+


-
-
+
+

-
+


-
+

-
-
+
+



-
-
-
+
+
+

-
-
-
-
-
+
+
+
+
+


-
+







extern uintptr_t __CTOR_LIST__[];
extern const void *_EH_FRAME_BEGINS__;
extern void *_EH_FRAME_OBJECTS__;
#endif

extern bool glue_objc_init(void);
extern void glue___objc_exec_class(void);
extern IMP _Nonnull glue_objc_msg_lookup(void);
extern IMP _Nonnull glue_objc_msg_lookup_stret(void);
extern IMP _Nonnull glue_objc_msg_lookup_super(void);
extern IMP _Nonnull glue_objc_msg_lookup_super_stret(void);
extern Class _Nullable glue_objc_lookUpClass(void);
extern Class _Nullable glue_objc_getClass(void);
extern Class _Nonnull glue_objc_getRequiredClass(void);
extern Class _Nullable glue_objc_lookup_class(void);
extern Class _Nonnull glue_objc_get_class(void);
extern IMP glue_objc_msg_lookup(void);
extern IMP glue_objc_msg_lookup_stret(void);
extern IMP glue_objc_msg_lookup_super(void);
extern IMP glue_objc_msg_lookup_super_stret(void);
extern Class glue_objc_lookUpClass(void);
extern Class glue_objc_getClass(void);
extern Class glue_objc_getRequiredClass(void);
extern Class glue_objc_lookup_class(void);
extern Class glue_objc_get_class(void);
extern void glue_objc_exception_throw(void);
extern int glue_objc_sync_enter(void);
extern int glue_objc_sync_exit(void);
extern id _Nullable glue_objc_getProperty(void);
extern id glue_objc_getProperty(void);
extern void glue_objc_setProperty(void);
extern void glue_objc_getPropertyStruct(void);
extern void glue_objc_setPropertyStruct(void);
extern void glue_objc_enumerationMutation(void);
extern int glue___gnu_objc_personality(void);
extern id _Nullable glue_objc_retain(void);
extern id _Nullable glue_objc_retainBlock(void);
extern id _Nullable glue_objc_retainAutorelease(void);
extern id glue_objc_retain(void);
extern id glue_objc_retainBlock(void);
extern id glue_objc_retainAutorelease(void);
extern void glue_objc_release(void);
extern id _Nullable glue_objc_autorelease(void);
extern id _Nullable glue_objc_autoreleaseReturnValue(void);
extern id _Nullable glue_objc_retainAutoreleaseReturnValue(void);
extern id _Nullable glue_objc_retainAutoreleasedReturnValue(void);
extern id _Nullable glue_objc_storeStrong(void);
extern id _Nullable glue_objc_storeWeak(void);
extern id _Nullable glue_objc_loadWeakRetained(void);
extern id _Nullable glue_objc_initWeak(void);
extern id glue_objc_autorelease(void);
extern id glue_objc_autoreleaseReturnValue(void);
extern id glue_objc_retainAutoreleaseReturnValue(void);
extern id glue_objc_retainAutoreleasedReturnValue(void);
extern id glue_objc_storeStrong(void);
extern id glue_objc_storeWeak(void);
extern id glue_objc_loadWeakRetained(void);
extern id glue_objc_initWeak(void);
extern void glue_objc_destroyWeak(void);
extern id _Nullable glue_objc_loadWeak(void);
extern id glue_objc_loadWeak(void);
extern void glue_objc_copyWeak(void);
extern void glue_objc_moveWeak(void);
extern SEL _Nonnull glue_sel_registerName(void);
extern const char *_Nonnull glue_sel_getName(void);
extern SEL glue_sel_registerName(void);
extern const char *glue_sel_getName(void);
extern bool glue_sel_isEqual(void);
extern Class _Nonnull glue_objc_allocateClassPair(void);
extern Class glue_objc_allocateClassPair(void);
extern void glue_objc_registerClassPair(void);
extern unsigned int glue_objc_getClassList(void);
extern Class _Nonnull *_Nonnull glue_objc_copyClassList(void);
extern Class *glue_objc_copyClassList(void);
extern bool glue_class_isMetaClass(void);
extern const char *_Nullable glue_class_getName(void);
extern Class _Nullable glue_class_getSuperclass(void);
extern const char *glue_class_getName(void);
extern Class glue_class_getSuperclass(void);
extern unsigned long glue_class_getInstanceSize(void);
extern bool glue_class_respondsToSelector(void);
extern bool glue_class_conformsToProtocol(void);
extern IMP _Nullable glue_class_getMethodImplementation(void);
extern IMP _Nullable glue_class_getMethodImplementation_stret(void);
extern const char *_Nullable glue_class_getMethodTypeEncoding(void);
extern IMP glue_class_getMethodImplementation(void);
extern IMP glue_class_getMethodImplementation_stret(void);
extern Method glue_class_getInstanceMethod(void);
extern bool glue_class_addMethod(void);
extern IMP _Nullable glue_class_replaceMethod(void);
extern Class _Nullable glue_object_getClass(void);
extern Class _Nullable glue_object_setClass(void);
extern const char *_Nullable glue_object_getClassName(void);
extern const char *_Nonnull glue_protocol_getName(void);
extern IMP glue_class_replaceMethod(void);
extern Class glue_object_getClass(void);
extern Class glue_object_setClass(void);
extern const char *glue_object_getClassName(void);
extern const char *glue_protocol_getName(void);
extern bool glue_protocol_isEqual(void);
extern bool glue_protocol_conformsToProtocol(void);
extern _Nullable objc_uncaught_exception_handler_t
extern objc_uncaught_exception_handler_t
    glue_objc_setUncaughtExceptionHandler(void);
extern void glue_objc_setForwardHandler(void);
extern void glue_objc_setEnumerationMutationHandler(void);
extern void glue_objc_zero_weak_references(void);
extern void glue_objc_exit(void);
extern Ivar *glue_class_copyIvarList(void);
extern const char *glue_ivar_getName(void);
627
628
629
630
631
632
633
634

635
636
637
638
639
640
641
627
628
629
630
631
632
633

634
635
636
637
638
639
640
641







-
+







	(CONST_APTR)glue_class_getName,
	(CONST_APTR)glue_class_getSuperclass,
	(CONST_APTR)glue_class_getInstanceSize,
	(CONST_APTR)glue_class_respondsToSelector,
	(CONST_APTR)glue_class_conformsToProtocol,
	(CONST_APTR)glue_class_getMethodImplementation,
	(CONST_APTR)glue_class_getMethodImplementation_stret,
	(CONST_APTR)glue_class_getMethodTypeEncoding,
	(CONST_APTR)glue_class_getInstanceMethod,
	(CONST_APTR)glue_class_addMethod,
	(CONST_APTR)glue_class_replaceMethod,
	(CONST_APTR)glue_object_getClass,
	(CONST_APTR)glue_object_setClass,
	(CONST_APTR)glue_object_getClassName,
	(CONST_APTR)glue_protocol_getName,
	(CONST_APTR)glue_protocol_isEqual,

Modified src/runtime/amigaos3.sfd from [313504d85b] to [49f4c1e562].

53
54
55
56
57
58
59
60

61
62
63
64
65
66
67
53
54
55
56
57
58
59

60
61
62
63
64
65
66
67







-
+







const char *_Nullable glue_class_getName(Class _Nullable class_)(a0)
Class _Nullable glue_class_getSuperclass(Class _Nullable class_)(a0)
unsigned long glue_class_getInstanceSize(Class _Nullable class_)(a0)
bool glue_class_respondsToSelector(Class _Nullable class_, SEL _Nonnull selector)(a0,a1)
bool glue_class_conformsToProtocol(Class _Nullable class_, Protocol *_Nonnull p)(a0,a1)
IMP _Nullable glue_class_getMethodImplementation(Class _Nullable class_, SEL _Nonnull selector)(a0,a1)
IMP _Nullable glue_class_getMethodImplementation_stret(Class _Nullable class_, SEL _Nonnull selector)(a0,a1)
const char *_Nullable glue_class_getMethodTypeEncoding(Class _Nullable class_, SEL _Nonnull selector)(a0,a1)
Method _Nullable glue_class_getInstanceMethod(Class _Nullable class_, SEL _Nonnull selector)(a0,a1)
bool glue_class_addMethod(Class _Nonnull class_, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding)(a0,a1,a2,a3)
IMP _Nullable glue_class_replaceMethod(Class _Nonnull class_, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding)(a0,a1,a2,a3)
Class _Nullable glue_object_getClass(id _Nullable object)(a0)
Class _Nullable glue_object_setClass(id _Nullable object, Class _Nonnull class_)(a0,a1)
const char *_Nullable glue_object_getClassName(id _Nullable object)(a0)
const char *_Nonnull glue_protocol_getName(Protocol *_Nonnull protocol)(a0)
bool glue_protocol_isEqual(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2)(a0,a1)

Modified src/runtime/class.m from [9e1fe8b99e] to [415251c564].

766
767
768
769
770
771
772
773
774


775
776


777
778
779
780
781
782
783
784
785
786

787


788
789
790
791
792


793
794
795
796
797
798
799
766
767
768
769
770
771
772


773
774
775

776
777
778
779
780
781
782
783
784

785

786
787
788
789
790
791
792


793
794
795
796
797
798
799
800
801







-
-
+
+

-
+
+







-

-
+

+
+



-
-
+
+







	methodList->methods[0].implementation = implementation;

	class->methodList = methodList;

	objc_update_dtable(class);
}

const char *
class_getMethodTypeEncoding(Class class, SEL selector)
Method
class_getInstanceMethod(Class class, SEL selector)
{
	struct objc_method *method;
	Method method;
	Class superclass;

	if (class == Nil)
		return NULL;

	objc_global_mutex_lock();

	if ((method = getMethod(class, selector)) != NULL) {
		const char *ret = method->selector.typeEncoding;
		objc_global_mutex_unlock();
		return ret;
		return method;
	}

	superclass = class->superclass;

	objc_global_mutex_unlock();

	if (class->superclass != Nil)
		return class_getMethodTypeEncoding(class->superclass, selector);
	if (superclass != Nil)
		return class_getInstanceMethod(superclass, selector);

	return NULL;
}

bool
class_addMethod(Class class, SEL selector, IMP implementation,
    const char *typeEncoding)

Modified src/runtime/linklib/linklib.m from [962890f13f] to [df8b8ee743].

500
501
502
503
504
505
506
507
508


509
510

511
512
513
514
515
516
517
500
501
502
503
504
505
506


507
508
509

510
511
512
513
514
515
516
517







-
-
+
+

-
+








IMP
class_getMethodImplementation_stret(Class class, SEL selector)
{
	return glue_class_getMethodImplementation_stret(class, selector);
}

const char *
class_getMethodTypeEncoding(Class class, SEL selector)
Method
class_getInstanceMethod(Class class, SEL selector)
{
	return glue_class_getMethodTypeEncoding(class, selector);
	return glue_class_getInstanceMethod(class, selector);
}

bool
class_addMethod(Class class, SEL selector, IMP implementation,
    const char *typeEncoding)
{
	return glue_class_addMethod(class, selector, implementation,

Modified src/runtime/morphos-clib.h from [c0d4505658] to [ad80976596].

47
48
49
50
51
52
53
54

55
56
57
58
59
60
61
47
48
49
50
51
52
53

54
55
56
57
58
59
60
61







-
+







const char *glue_class_getName(Class);
Class glue_class_getSuperclass(Class);
unsigned long glue_class_getInstanceSize(Class);
bool glue_class_respondsToSelector(Class, SEL);
bool glue_class_conformsToProtocol(Class, Protocol *);
IMP glue_class_getMethodImplementation(Class, SEL);
IMP glue_class_getMethodImplementation_stret(Class, SEL);
const char *glue_class_getMethodTypeEncoding(Class, SEL);
Method glue_class_getInstanceMethod(Class, SEL);
bool glue_class_addMethod(Class class_, SEL selector, IMP, const char *);
IMP glue_class_replaceMethod(Class, SEL, IMP, const char *);
Class glue_object_getClass(id);
Class glue_object_setClass(id, Class);
const char *glue_object_getClassName(id);
const char *glue_protocol_getName(Protocol *);
bool glue_protocol_isEqual(Protocol *, Protocol *);

Modified src/runtime/morphos.fd from [946400c8ab] to [826761c847].

49
50
51
52
53
54
55
56

57
58
59
60
61
62
63
49
50
51
52
53
54
55

56
57
58
59
60
61
62
63







-
+







glue_class_getName(class_)(sysv,r12base)
glue_class_getSuperclass(class_)(sysv,r12base)
glue_class_getInstanceSize(class_)(sysv,r12base)
glue_class_respondsToSelector(class_,selector)(sysv,r12base)
glue_class_conformsToProtocol(class_,p)(sysv,r12base)
glue_class_getMethodImplementation(class_,selector)(sysv,r12base)
glue_class_getMethodImplementation_stret(class_,selector)(sysv,r12base)
glue_class_getMethodTypeEncoding(class_,selector)(sysv,r12base)
glue_class_getInstanceMethod(class_,selector)(sysv,r12base)
glue_class_addMethod(class_,selector,implementation,typeEncoding)(sysv,r12base)
glue_class_replaceMethod(class_,selector,implementation,typeEncoding)(sysv,r12base)
glue_object_getClass(object)(sysv,r12base)
glue_object_setClass(object,class_)(sysv,r12base)
glue_object_getClassName(object)(sysv,r12base)
glue_protocol_getName(protocol)(sysv,r12base)
glue_protocol_isEqual(protocol1,protocol2)(sysv,r12base)