Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / gc / array.c
CommitLineData
7f918cf1
CE
1/* Copyright (C) 2012 Matthew Fluet.
2 * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
5 *
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
8 */
9
10/* getArrayLengthp (p)
11 *
12 * Returns a pointer to the length for the array pointed to by p.
13 */
14GC_arrayLength* getArrayLengthp (pointer a) {
15 return (GC_arrayLength*)(a
16 - GC_HEADER_SIZE
17 - GC_ARRAY_LENGTH_SIZE);
18}
19
20/* getArrayLength (p)
21 *
22 * Returns the length for the array pointed to by p.
23 */
24GC_arrayLength getArrayLength (pointer a) {
25 return *(getArrayLengthp (a));
26}
27
28uintmax_t GC_getArrayLength (pointer a) {
29 return ((uintmax_t)(getArrayLength (a)));
30}
31
32/* getArrayCounterp (p)
33 *
34 * Returns a pointer to the counter for the array pointed to by p.
35 */
36GC_arrayCounter* getArrayCounterp (pointer a) {
37 return (GC_arrayCounter*)(a
38 - GC_HEADER_SIZE
39 - GC_ARRAY_LENGTH_SIZE
40 - GC_ARRAY_COUNTER_SIZE);
41}
42
43/* getArrayCounter (p)
44 *
45 * Returns the counter for the array pointed to by p.
46 */
47GC_arrayCounter getArrayCounter (pointer a) {
48 return *(getArrayCounterp (a));
49}
50
51
52#if ASSERT
53pointer indexArrayAtObjptrIndex (GC_state s, pointer a,
54 GC_arrayCounter arrayIndex,
55 uint32_t objptrIndex) {
56 GC_header header;
57 uint16_t bytesNonObjptrs;
58 uint16_t numObjptrs;
59 GC_objectTypeTag tag;
60
61 header = getHeader (a);
62 splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs);
63 assert (tag == ARRAY_TAG);
64
65 return a
66 + (arrayIndex * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)))
67 + bytesNonObjptrs
68 + (objptrIndex * OBJPTR_SIZE);
69}
70#endif
71
72
73/* GC_arrayCopy (ad, as, as, ss, l)
74 *
75 * Copy l elements of as starting at ss to ad starting at as.
76 */
77void GC_arrayCopy (GC_state s, pointer ad, size_t ds, pointer as, size_t ss, size_t l) {
78 GC_header header;
79 uint16_t bytesNonObjptrs;
80 uint16_t numObjptrs;
81 GC_objectTypeTag tag;
82 size_t eltSize;
83
84 header = getHeader (ad);
85 splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs);
86 assert (tag == ARRAY_TAG);
87
88 eltSize = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE);
89 GC_memmove (as + eltSize * ss, ad + eltSize * ds, eltSize * l);
90}