1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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
|
/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh
* Jagannathan, and Stephen Weeks.
* Copyright (C) 1997-2000 NEC Research Institute.
*
* MLton is released under a BSD-style license.
* See the file MLton-LICENSE for details.
*/
size_t sizeofWeak (GC_state s) {
size_t res;
res = GC_NORMAL_HEADER_SIZE + sizeof (struct GC_weak);
res = align (res, s->alignment);
if (DEBUG) {
size_t check;
uint16_t bytesNonObjptrs, numObjptrs;
splitHeader (s, GC_WEAK_GONE_HEADER, NULL, NULL, &bytesNonObjptrs, &numObjptrs);
check = GC_NORMAL_HEADER_SIZE + (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE));
if (DEBUG_DETAILED)
fprintf (stderr,
"sizeofWeak: res = %"PRIuMAX" check = %"PRIuMAX"\n",
(uintmax_t)res, (uintmax_t)check);
assert (check == res);
}
assert (isAligned (res, s->alignment));
return res;
}
size_t offsetofWeak (GC_state s) {
return (sizeofWeak (s)) - (GC_NORMAL_HEADER_SIZE + sizeof (struct GC_weak));
}
uint32_t GC_weakCanGet (__attribute__ ((unused)) GC_state s, pointer p) {
uint32_t res;
res = GC_WEAK_GONE_HEADER != getHeader (p);
if (DEBUG_WEAK)
fprintf (stderr, "%s = GC_weakCanGet ("FMTPTR")\n",
boolToString (res), (uintptr_t)p);
return res;
}
pointer GC_weakGet (GC_state s, pointer p) {
GC_weak weak;
pointer res;
weak = (GC_weak)(p + offsetofWeak (s));
res = objptrToPointer(weak->objptr, s->heap.start);
if (DEBUG_WEAK)
fprintf (stderr, FMTPTR" = GC_weakGet ("FMTPTR")\n",
(uintptr_t)res, (uintptr_t)p);
return res;
}
pointer GC_weakNew (GC_state s, GC_header header, pointer p) {
GC_weak weak;
pointer res;
res = newObject (s, header,
sizeofWeak (s),
FALSE);
weak = (GC_weak)(res + offsetofWeak (s));
weak->objptr = pointerToObjptr(p, s->heap.start);
if (DEBUG_WEAK)
fprintf (stderr, FMTPTR" = GC_weakNew ("FMTHDR", "FMTPTR")\n",
(uintptr_t)res, header, (uintptr_t)p);
return (pointer)res;
}
|