Mercurial > projects > ldc
annotate druntime/src/compiler/dmd/arrayassign.d @ 759:d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 11 Nov 2008 01:52:37 +0100 |
parents | |
children |
rev | line source |
---|---|
759
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
1 /** |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
2 * Part of the D programming language runtime library. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
3 * http://www.digitalmars.com |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
4 * Written by Walter Bright |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
5 * Placed in the Public Domain |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
6 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
7 module rt.arrayassign; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
8 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
9 private |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
10 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
11 import util.string; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
12 import stdc.string; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
13 import stdc.stdlib; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
14 debug(PRINTF) import stdc.stdio; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
15 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
16 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
17 /** |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
18 * Does array assignment (not construction) from another |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
19 * array of the same element type. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
20 * ti is the element type. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
21 * Handles overlapping copies. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
22 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
23 extern (C) void[] _d_arrayassign(TypeInfo ti, void[] from, void[] to) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
24 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
25 debug(PRINTF) printf("_d_arrayassign(from = %p,%d, to = %p,%d) size = %d\n", from.ptr, from.length, to.ptr, to.length, ti.tsize()); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
26 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
27 if (to.length != from.length) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
28 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
29 char[10] tmp = void; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
30 string msg = "lengths don't match for array copy,"c; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
31 msg ~= tmp.intToString(to.length) ~ " = " ~ tmp.intToString(from.length); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
32 throw new Exception(msg); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
33 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
34 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
35 auto element_size = ti.tsize(); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
36 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
37 /* Need a temporary buffer tmp[] big enough to hold one element |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
38 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
39 void[16] buf = void; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
40 void[] tmp; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
41 if (element_size > buf.sizeof) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
42 tmp = alloca(element_size)[0 .. element_size]; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
43 else |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
44 tmp = buf; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
45 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
46 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
47 if (to.ptr <= from.ptr) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
48 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
49 foreach (i; 0 .. to.length) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
50 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
51 void* pto = to.ptr + i * element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
52 void* pfrom = from.ptr + i * element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
53 memcpy(tmp.ptr, pto, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
54 memcpy(pto, pfrom, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
55 ti.postblit(pto); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
56 ti.destroy(tmp.ptr); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
57 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
58 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
59 else |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
60 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
61 for (int i = to.length; i--; ) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
62 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
63 void* pto = to.ptr + i * element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
64 void* pfrom = from.ptr + i * element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
65 memcpy(tmp.ptr, pto, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
66 memcpy(pto, pfrom, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
67 ti.postblit(pto); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
68 ti.destroy(tmp.ptr); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
69 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
70 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
71 return to; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
72 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
73 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
74 /** |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
75 * Does array initialization (not assignment) from another |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
76 * array of the same element type. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
77 * ti is the element type. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
78 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
79 extern (C) void[] _d_arrayctor(TypeInfo ti, void[] from, void[] to) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
80 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
81 debug(PRINTF) printf("_d_arrayctor(from = %p,%d, to = %p,%d) size = %d\n", from.ptr, from.length, to.ptr, to.length, ti.tsize()); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
82 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
83 if (to.length != from.length) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
84 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
85 char[10] tmp = void; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
86 string msg = "lengths don't match for array initialization,"c; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
87 msg ~= tmp.intToString(to.length) ~ " = " ~ tmp.intToString(from.length); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
88 throw new Exception(msg); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
89 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
90 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
91 auto element_size = ti.tsize(); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
92 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
93 int i; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
94 try |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
95 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
96 for (i = 0; i < to.length; i++) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
97 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
98 // Copy construction is defined as bit copy followed by postblit. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
99 memcpy(to.ptr + i * element_size, from.ptr + i * element_size, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
100 ti.postblit(to.ptr + i * element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
101 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
102 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
103 catch (Object o) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
104 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
105 /* Destroy, in reverse order, what we've constructed so far |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
106 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
107 while (i--) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
108 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
109 ti.destroy(to.ptr + i * element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
110 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
111 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
112 throw o; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
113 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
114 return to; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
115 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
116 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
117 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
118 /** |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
119 * Do assignment to an array. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
120 * p[0 .. count] = value; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
121 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
122 extern (C) void* _d_arraysetassign(void* p, void* value, int count, TypeInfo ti) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
123 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
124 void* pstart = p; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
125 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
126 auto element_size = ti.tsize(); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
127 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
128 //Need a temporary buffer tmp[] big enough to hold one element |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
129 void[16] buf = void; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
130 void[] tmp; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
131 if (element_size > buf.sizeof) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
132 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
133 tmp = alloca(element_size)[0 .. element_size]; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
134 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
135 else |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
136 tmp = buf; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
137 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
138 foreach (i; 0 .. count) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
139 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
140 memcpy(tmp.ptr, p, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
141 memcpy(p, value, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
142 ti.postblit(p); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
143 ti.destroy(tmp.ptr); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
144 p += element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
145 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
146 return pstart; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
147 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
148 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
149 /** |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
150 * Do construction of an array. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
151 * ti[count] p = value; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
152 */ |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
153 extern (C) void* _d_arraysetctor(void* p, void* value, int count, TypeInfo ti) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
154 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
155 void* pstart = p; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
156 auto element_size = ti.tsize(); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
157 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
158 try |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
159 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
160 foreach (i; 0 .. count) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
161 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
162 // Copy construction is defined as bit copy followed by postblit. |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
163 memcpy(p, value, element_size); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
164 ti.postblit(p); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
165 p += element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
166 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
167 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
168 catch (Object o) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
169 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
170 // Destroy, in reverse order, what we've constructed so far |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
171 while (p > pstart) |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
172 { |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
173 p -= element_size; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
174 ti.destroy(p); |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
175 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
176 |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
177 throw o; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
178 } |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
179 return pstart; |
d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff
changeset
|
180 } |