ObjFW  Diff

Differences From Artifact [46b4e85118]:

To Artifact [e9f2e9fced]:


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
86

87
88

89
90
91

92

93
94
95
96
97
98
99
100
101
102



103
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
86

87
88

89
90
91
92
93

94
95
96
97
98
99
100
101



102
103
104
105







-
-
+
+




-
+


-
-
+
+
+


-
+



-
+

-
-
-
+
+
+



-
-
+
+

-
+

-
+

-
+











-
-
+
+

-
+


-
-
+
+


-
+



-
+

-
+

-
+



+
-
+







-
-
-
+
+
+


#include <stdio.h>
#include <stdlib.h>

#import "ObjFW_RT.h"
#import "private.h"

static struct objc_abi_static_instances **static_instances = NULL;
static size_t static_instances_cnt = 0;
static struct objc_abi_static_instances **staticInstancesList = NULL;
static size_t staticInstancesCount = 0;

void
objc_init_static_instances(struct objc_abi_symtab *symtab)
{
	struct objc_abi_static_instances **si;
	struct objc_abi_static_instances **staticInstances;

	/* Check if the class for a static instance became available */
	for (size_t i = 0; i < static_instances_cnt; i++) {
		Class cls = objc_lookUpClass(static_instances[i]->class_name);
	for (size_t i = 0; i < staticInstancesCount; i++) {
		Class cls = objc_lookUpClass(
		    staticInstancesList[i]->className);

		if (cls != Nil) {
			for (id *instances = static_instances[i]->instances;
			for (id *instances = staticInstancesList[i]->instances;
			    *instances != nil; instances++)
				object_setClass(*instances, cls);

			static_instances_cnt--;
			staticInstancesCount--;

			if (static_instances_cnt == 0) {
				free(static_instances);
				static_instances = NULL;
			if (staticInstancesCount == 0) {
				free(staticInstancesList);
				staticInstancesList = NULL;
				break;
			}

			static_instances[i] =
			    static_instances[static_instances_cnt];
			staticInstancesList[i] =
			    staticInstancesList[staticInstancesCount];

			static_instances = realloc(static_instances,
			staticInstancesList = realloc(staticInstancesList,
			    sizeof(struct objc_abi_static_instances *) *
			    static_instances_cnt);
			    staticInstancesCount);

			if (static_instances == NULL)
			if (staticInstancesList == NULL)
				OBJC_ERROR("Not enough memory for list of "
				    "static instances!");

			/*
			 * We moved the last entry to the current index,
			 * therefore we need to run again for the current index.
			 */
			i--;
		}
	}

	si = (struct objc_abi_static_instances **)
	    symtab->defs[symtab->cls_def_cnt + symtab->cat_def_cnt];
	staticInstances = (struct objc_abi_static_instances **)
	    symtab->defs[symtab->classDefsCount + symtab->categoryDefsCount];

	if (si == NULL)
	if (staticInstances == NULL)
		return;

	for (; *si != NULL; si++) {
		Class cls = objc_lookUpClass((*si)->class_name);
	for (; *staticInstances != NULL; staticInstances++) {
		Class cls = objc_lookUpClass((*staticInstances)->className);

		if (cls != Nil) {
			for (id *instances = (*si)->instances;
			for (id *instances = (*staticInstances)->instances;
			    *instances != nil; instances++)
				object_setClass(*instances, cls);
		} else {
			static_instances = realloc(static_instances,
			staticInstancesList = realloc(staticInstancesList,
			    sizeof(struct objc_abi_static_instances *) *
			    (static_instances_cnt + 1));
			    (staticInstancesCount + 1));

			if (static_instances == NULL)
			if (staticInstancesList == NULL)
				OBJC_ERROR("Not enough memory for list of "
				    "static instances!");

			staticInstancesList[staticInstancesCount++] =
			static_instances[static_instances_cnt++] = *si;
			    *staticInstances;
		}
	}
}

void
objc_forget_pending_static_instances()
{
	free(static_instances);
	static_instances = NULL;
	static_instances_cnt = 0;
	free(staticInstancesList);
	staticInstancesList = NULL;
	staticInstancesCount = 0;
}