Commit | Line | Data |
---|---|---|
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 | */ | |
14 | GC_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 | */ | |
24 | GC_arrayLength getArrayLength (pointer a) { | |
25 | return *(getArrayLengthp (a)); | |
26 | } | |
27 | ||
28 | uintmax_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 | */ | |
36 | GC_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 | */ | |
47 | GC_arrayCounter getArrayCounter (pointer a) { | |
48 | return *(getArrayCounterp (a)); | |
49 | } | |
50 | ||
51 | ||
52 | #if ASSERT | |
53 | pointer 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 | */ | |
77 | void 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 | } |