Mercurial > projects > ldc
annotate lphobos/internal/arrays.d @ 715:30b42a283c8e
Removed TypeOpaque from DMD.
Changed runtime functions taking opaque[] to void[].
Implemented proper type painting, to avoid "resizing" array casts in runtime calls that previously took opaque[].
Implemented dynamic arrays as first class types, this implements proper ABI for these types on x86.
Added dwarf region end after call to assert function, fixes some problems with llvm not allowing this to be missing.
Reverted change to WithStatement from rev [704] it breaks MiniD, mini/with2.d needs to be fixed some other way...
Fixed tango bug 1339 in runtime, problem with _adReverseChar on invalid UTF-8.
Disabled .bc generation in the compiler runtime part, genobj.d triggers some llvm bug when using debug info. the .o seems to work fine.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:55:33 +0200 |
parents | 5ab8e92611f9 |
children |
rev | line source |
---|---|
1 | 1 module internal.arrays; |
2 | |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
3 private import llvm.intrinsic; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
4 |
1 | 5 extern(C): |
6 | |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
7 int memcmp(void*,void*,size_t); |
91 | 8 size_t strlen(char*); |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
9 |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
10 version(LLVM64) |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
11 alias llvm_memcpy_i64 llvm_memcpy; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
12 else |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
13 alias llvm_memcpy_i32 llvm_memcpy; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
14 |
40 | 15 // per-element array init routines |
16 | |
1 | 17 void _d_array_init_i1(bool* a, size_t n, bool v) |
18 { | |
19 auto p = a; | |
20 auto end = a+n; | |
21 while (p !is end) | |
22 *p++ = v; | |
23 } | |
24 | |
25 void _d_array_init_i8(ubyte* a, size_t n, ubyte v) | |
26 { | |
27 auto p = a; | |
28 auto end = a+n; | |
29 while (p !is end) | |
30 *p++ = v; | |
31 } | |
32 | |
33 void _d_array_init_i16(ushort* a, size_t n, ushort v) | |
34 { | |
35 auto p = a; | |
36 auto end = a+n; | |
37 while (p !is end) | |
38 *p++ = v; | |
39 } | |
40 | |
41 void _d_array_init_i32(uint* a, size_t n, uint v) | |
42 { | |
43 auto p = a; | |
44 auto end = a+n; | |
45 while (p !is end) | |
46 *p++ = v; | |
47 } | |
48 | |
49 void _d_array_init_i64(ulong* a, size_t n, ulong v) | |
50 { | |
51 auto p = a; | |
52 auto end = a+n; | |
53 while (p !is end) | |
54 *p++ = v; | |
55 } | |
56 | |
57 void _d_array_init_float(float* a, size_t n, float v) | |
58 { | |
59 auto p = a; | |
60 auto end = a+n; | |
61 while (p !is end) | |
62 *p++ = v; | |
63 } | |
64 | |
65 void _d_array_init_double(double* a, size_t n, double v) | |
66 { | |
67 auto p = a; | |
68 auto end = a+n; | |
69 while (p !is end) | |
70 *p++ = v; | |
71 } | |
72 | |
73 void _d_array_init_pointer(void** a, size_t n, void* v) | |
74 { | |
75 auto p = a; | |
76 auto end = a+n; | |
77 while (p !is end) | |
78 *p++ = v; | |
79 } | |
40 | 80 |
109
5ab8e92611f9
[svn r113] Added initial support for associative arrays (AAs).
lindquist
parents:
100
diff
changeset
|
81 void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
82 { |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
83 auto p = a; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
84 auto end = a + na*nv; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
85 while (p !is end) { |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
86 llvm_memcpy(p,v,nv,0); |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
87 p += nv; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
88 } |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
89 } |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
90 |
52 | 91 // for array cast |
92 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) | |
93 { | |
94 if (newelemsz == 1) { | |
95 return len*elemsz; | |
96 } | |
97 else if (len % newelemsz) { | |
98 throw new Exception("Bad array cast"); | |
99 } | |
100 return (len*elemsz)/newelemsz; | |
101 } | |
91 | 102 |
103 // creating args for main | |
104 void _d_main_args(uint n, char** args, ref char[][] res) | |
105 { | |
106 assert(res.length == n); | |
107 foreach(i,v; args[0..n]) | |
108 { | |
109 res[i] = v[0 .. strlen(v)]; | |
110 } | |
111 } |