1 /* Copyright (C) 2016 Matthew Fluet.
2 * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
10 size_t sizeofWeak (GC_state s
) {
13 res
= GC_NORMAL_METADATA_SIZE
+ sizeof (struct GC_weak
);
14 res
= align (res
, s
->alignment
);
17 uint16_t bytesNonObjptrs
, numObjptrs
;
19 splitHeader (s
, GC_WEAK_GONE_HEADER
, NULL
, NULL
, &bytesNonObjptrs
, &numObjptrs
);
20 check
= GC_NORMAL_METADATA_SIZE
+ (bytesNonObjptrs
+ (numObjptrs
* OBJPTR_SIZE
));
23 "sizeofWeak: res = %"PRIuMAX
" check = %"PRIuMAX
"\n",
24 (uintmax_t)res
, (uintmax_t)check
);
25 assert (check
== res
);
27 assert (isAligned (res
, s
->alignment
));
31 size_t offsetofWeak (GC_state s
) {
32 return (sizeofWeak (s
)) - (GC_NORMAL_METADATA_SIZE
+ sizeof (struct GC_weak
));
35 uint32_t GC_weakCanGet (__attribute__ ((unused
)) GC_state s
, pointer p
) {
38 res
= GC_WEAK_GONE_HEADER
!= getHeader (p
);
40 fprintf (stderr
, "%s = GC_weakCanGet ("FMTPTR
")\n",
41 boolToString (res
), (uintptr_t)p
);
45 pointer
GC_weakGet (GC_state s
, pointer p
) {
49 weak
= (GC_weak
)(p
+ offsetofWeak (s
));
50 res
= objptrToPointer(weak
->objptr
, s
->heap
.start
);
52 fprintf (stderr
, FMTPTR
" = GC_weakGet ("FMTPTR
")\n",
53 (uintptr_t)res
, (uintptr_t)p
);
57 pointer
GC_weakNew (GC_state s
, GC_header header
, pointer p
) {
61 res
= newObject (s
, header
,
64 weak
= (GC_weak
)(res
+ offsetofWeak (s
));
65 weak
->objptr
= pointerToObjptr(p
, s
->heap
.start
);
67 fprintf (stderr
, FMTPTR
" = GC_weakNew ("FMTHDR
", "FMTPTR
")\n",
68 (uintptr_t)res
, header
, (uintptr_t)p
);