annotate lphobos/typeinfo2/ti_Ashort.d @ 1605:1d5721f9ae18

[WIP] Merge DMD r251: bugzilla 111 (appending a dchar to a char[]) This patch needs some work in the code generation, because of the runtime changes (functions "_d_arrayappendcd" and "_d_arrayappendwd" are added). This doesn't affect existing code though, it just makes with patch a little useless, because something like this: char [] s; s ~= '\u6211'; That failed to compile with a nice error message previously to this change, now fails with and ugly error message (a failed assertion). Apparently there is a regression introduced by this patch too, when compiling Dil I get this assertion message: ldc: /home/luca/tesis/ldc/gen/statements.cpp:132: virtual void ReturnStatement::toIR(IRState*): Assertion `p->topfunc()->getReturnType() == llvm::Type::getVoidTy(gIR->context())' failed. 0 ldc 0x08a91628 Thank god we have bisecting capabilities in VCSs now ;) --- dmd/expression.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 41 insertions(+), 6 deletions(-)
author Leandro Lucarella <llucax@gmail.com>
date Wed, 06 Jan 2010 15:18:19 -0300
parents 362825278842
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
1 module typeinfo2.ti_Ashort;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
2
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
3 extern(C) int memcmp(void*,void*,size_t);
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
4
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
5 // short[]
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
6
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
7 class TypeInfo_As : TypeInfo
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
8 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
9 char[] toString() { return "short[]"; }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
10
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
11 hash_t getHash(void *p)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
12 { short[] s = *cast(short[]*)p;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
13 size_t len = s.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
14 short *str = s.ptr;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
15 hash_t hash = 0;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
16
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
17 while (1)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
18 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
19 switch (len)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
20 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
21 case 0:
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
22 return hash;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
23
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
24 case 1:
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
25 hash *= 9;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
26 hash += *cast(ushort *)str;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
27 return hash;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
28
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
29 default:
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
30 hash *= 9;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
31 hash += *cast(uint *)str;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
32 str += 2;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
33 len -= 2;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
34 break;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
35 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
36 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
37
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
38 return hash;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
39 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
40
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
41 int equals(void *p1, void *p2)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
42 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
43 short[] s1 = *cast(short[]*)p1;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
44 short[] s2 = *cast(short[]*)p2;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
45
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
46 return s1.length == s2.length &&
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
47 memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
48 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
49
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
50 int compare(void *p1, void *p2)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
51 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
52 short[] s1 = *cast(short[]*)p1;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
53 short[] s2 = *cast(short[]*)p2;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
54 size_t len = s1.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
55
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
56 if (s2.length < len)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
57 len = s2.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
58 for (size_t u = 0; u < len; u++)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
59 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
60 int result = s1[u] - s2[u];
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
61 if (result)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
62 return result;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
63 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
64 return cast(int)s1.length - cast(int)s2.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
65 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
66
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
67 size_t tsize()
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
68 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
69 return (short[]).sizeof;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
70 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
71
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
72 uint flags()
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
73 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
74 return 1;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
75 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
76
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
77 TypeInfo next()
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
78 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
79 return typeid(short);
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
80 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
81 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
82
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
83
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
84 // ushort[]
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
85
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
86 class TypeInfo_At : TypeInfo_As
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
87 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
88 char[] toString() { return "ushort[]"; }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
89
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
90 int compare(void *p1, void *p2)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
91 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
92 ushort[] s1 = *cast(ushort[]*)p1;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
93 ushort[] s2 = *cast(ushort[]*)p2;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
94 size_t len = s1.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
95
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
96 if (s2.length < len)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
97 len = s2.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
98 for (size_t u = 0; u < len; u++)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
99 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
100 int result = s1[u] - s2[u];
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
101 if (result)
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
102 return result;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
103 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
104 return cast(int)s1.length - cast(int)s2.length;
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
105 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
106
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
107 TypeInfo next()
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
108 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
109 return typeid(ushort);
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
110 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
111 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
112
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
113 // wchar[]
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
114
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
115 class TypeInfo_Au : TypeInfo_At
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
116 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
117 char[] toString() { return "wchar[]"; }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
118
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
119 TypeInfo next()
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
120 {
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
121 return typeid(wchar);
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
122 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
123 }
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
124
362825278842 [svn r63] Forgot lphobos/typeinfo2
lindquist
parents:
diff changeset
125