3
3
#include <stdlib.h>
4
4
#include <stdbool.h>
5
5
6
- size_t _swiftEmptyArrayStorage [] = { /*isa*/ 0 , /*refcount*/ 0 , /*count*/ 0 , /*flags*/ 1 };
6
+ size_t _swiftEmptyArrayStorage [] = { /*isa*/ 0 , /*refcount*/ -1 , /*count*/ 0 , /*flags*/ 1 };
7
7
8
8
typedef struct HeapObject {
9
9
void * metadata ;
@@ -21,12 +21,12 @@ void *swift_allocObject(void *metadata, size_t requiredSize, size_t requiredAlig
21
21
}
22
22
23
23
void swift_deallocClassInstance (HeapObject * object , size_t allocatedSize , size_t allocatedAlignMask ) {
24
- // don't deallocate ¯\_(ツ)_/¯
24
+ free ( object );
25
25
}
26
26
27
27
HeapObject * swift_initStackObject (void * metadata , HeapObject * object ) {
28
28
object -> metadata = metadata ;
29
- object -> refcount = 1 ;
29
+ object -> refcount = - 1 ;
30
30
return object ;
31
31
}
32
32
@@ -35,17 +35,17 @@ bool swift_isUniquelyReferenced_nonNull_native(HeapObject *object) {
35
35
}
36
36
37
37
void swift_release (HeapObject * object ) {
38
- // don't release ¯\_(ツ)_/¯
38
+ if (object -> refcount == -1 ) return ;
39
+
40
+ object -> refcount -= 1 ;
41
+ if (object -> refcount == 0 ) {
42
+ free (object );
43
+ }
39
44
}
40
45
41
46
HeapObject * swift_retain (HeapObject * object ) {
47
+ if (object -> refcount == -1 ) return object ;
48
+
42
49
object -> refcount += 1 ;
43
50
return object ;
44
51
}
45
-
46
- void swift_setDeallocating (HeapObject * object ) {
47
- // don't deallocate ¯\_(ツ)_/¯
48
- }
49
-
50
- void swift_beginAccess (void * pointer , void * buffer , uintptr_t flags , void * pc ) { }
51
- void swift_endAccess (void * buffer ) { }
0 commit comments