annotate src/expression/expression.apd @ 5:496dfd8f7342 default tip

added: -repeat option for "in", "ov" -run until a line option -run until a function option -break on a function start -n is an alias for ov
author marton@basel.hu
date Sun, 17 Apr 2011 11:05:31 +0200
parents 4a9dcbd9e54f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1 /* Ddbg - Win32 Debugger for the D programming language
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
2 * Copyright (c) 2007 Jascha Wetzel
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
3 * All rights reserved. See LICENSE.TXT for details.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
4 */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
5
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
6 APDProperties
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
7 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 parser_type = lr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
9 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
10
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11 APDDeclaration
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 module expression.expression_apd;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15 import codeview.decl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
16 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
17 import expression.evaluationcontext;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
18 import expression.datahandler;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
19 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
20
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
21 //import internal.aaA;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
22
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
23 struct aaA
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
24 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
25 aaA *left;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
26 aaA *right;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
27 hash_t hash;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
28 /* key */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
29 /* value */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
30 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
31
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32 struct BB
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
33 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
34 aaA*[] b;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35 size_t nodes; // total number of aaA nodes
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
36 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
37
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 import std.demangle;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39 import std.stdio;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
40
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
41 import win32.winnt;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
42
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
43 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
44
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
45 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
46 bool castArrayIndex(ubyte[] data, string type, out size_t index)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
47 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
48 assert(type.length>0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
49 switch ( type[0] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
50 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
51 case 'a':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 if ( *cast(char*)data.ptr < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 throw new EvaluationException("Cannot access array with negative index");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 case 'h':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
55 index = *cast(ubyte*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
56 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
57 case 's':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
58 if ( *cast(short*)data.ptr < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59 throw new EvaluationException("Cannot access array with negative index");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
60 case 't':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
61 index = *cast(ushort*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 case 'i':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64 if ( *cast(int*)data.ptr < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
65 throw new EvaluationException("Cannot access array with negative index");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
66 case 'k':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67 index = *cast(uint*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 case 'l':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70 if ( *cast(long*)data.ptr < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71 throw new EvaluationException("Cannot access array with negative index");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 case 'm':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73 index = cast(size_t)*cast(ulong*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
77 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
78 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
79
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
80 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
81
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
82 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
83 // debug = parser;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 unittest
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
86 bool test(string expr)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
87 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
88 SyntaxTree* root;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
89 bool success;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
90 try success = parse(expr, root);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 catch ( ParserException e ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92 debug(parser) writefln("%s", e.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
94 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
95 return success;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
96 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
97
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
98 assert(test("a.bc"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 assert(test("bc[def..ghij]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100 assert(!test("\"a\\\"\\\u2f85qwe '\""));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 assert(test("a.bc[def..ghij].klmno.pqrstu[0..'a'][\"a\\\"\\u2f85qwe '\"]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102 assert(!test("a.bc.[def..ghij]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
103 assert(!test("[def..ghij]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
104 assert(!test("a."));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
105 assert(test("asdf[0][i].qwer"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
106 assert(test("cast(uint)asdf"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
107 assert(test("(cast(mystruct)asdf).qwer"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
108 assert(test("(cast(string[])asdf)[0][2..13]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
109 assert(test("(cast(char[string])asdf)[\"qwer\"]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
110 assert(!test("(cast(mystruct)asdf).(cast(char[][])qwer)[0]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
111 assert(test("cast(float)asdf.qwer"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
112 assert(!test("cast.qwer"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
113 assert(!test("cast(uint).qwer"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
114 assert(!test("cast(asdf.qwer).qwer"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
115 assert(test("(cast(string)mystruct.tzui)[0..4]"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116 assert(test("cast(Vec!(float,3))mystruct"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117 assert(test("cast(Vec!(float,3,\"asdf\",Vec!(float)))mystruct"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
118 assert(test("vertices[inds[10193]].y"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
119 assert(test("*cast(uint*)#eax"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
120 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
121
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
122 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
123
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
124 Whitespace
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
125 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
126 regexp("[\\t\\n\\r ]+");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
128
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
129
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
130 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
131 Expressions
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
132 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
133 Expr(EvaluationContext ctx, out SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 Deref Cast DotChain
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 DotChain(ctx, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138 Cast(ctx, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139 Deref(ctx, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
141 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
142
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
143 Deref(EvaluationContext ctx, ref SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
145 "*" Deref
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
146 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
147 if ( symdata is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 throw new EvaluationException("Invalid data for dereferencing");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
149 if ( symdata.type[0] != 'P' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
150 throw new EvaluationException("Cannot dereference non-pointer of type "~demangleType(symdata.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152 assert(symdata.type.length>0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 if ( data.length != size_t.sizeof ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155 throw new EvaluationException("Invalid pointer data size = "~.toString(data.length));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157 symdata.ptr = (cast(size_t[])data)[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158 symdata.len = ctx.codeView.sizeofMangled(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 symdata.defered_load = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
160
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
161 Deref(ctx, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
163
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
164 epsilon;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
165 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
166
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
167 DotChain(EvaluationContext ctx, out SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
168 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
169 Register
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
170 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
171 Register(ctx, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
172 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
173
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
174 "(" !("(%d) Expression expected after (")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
175 Expr !("(%d) ) expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
176 ")"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
177 RefExpr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179 Expr(ctx, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 RefExpr(ctx, null, null, "", symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
181 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
182
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
183 Ident
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 RefExpr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
186 string id;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
187 Ident(id);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
188
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
189 NamedSymbol[] symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
190 NamedSymbol symbol = ctx.findSymbol(id, symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 if ( symbol !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192 symdata = ctx.loadSymbolData(symbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
194 debug DbgIO.println("symbol %s not found", id);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
195 RefExpr(ctx, symbol, symbols, id, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
196 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
197
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
198 Lit
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
199 { Lit(symdata); }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
200 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
201
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
202 RefExpr(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
203 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
204 //-------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
205 // . Operator
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
206 //-------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
207 "." Ident RefExpr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
208 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
209 string id;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
210 Ident(id);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
211 prefix ~= "."~id;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
212
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
213 if ( symdata is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
214 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
215 symbol = ctx.findSymbol(prefix, symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216 if ( symbol !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 symdata = ctx.loadSymbolData(symbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
218 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
219 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
221 switch ( symdata.type[0] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
222 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
223 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
224 // primitive types
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
225 case 'v': case 'b': case 'x': case 'g': case 'h': case 's': case 't': case 'i': case 'k': case 'l': case 'm': case 'f':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
226 case 'd': case 'e': case 'o': case 'p': case 'j': case 'q': case 'r': case 'c': case 'a': case 'u': case 'w':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
227 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
228 "Type mismatch - unexpected . operator in expression of type "~demangleType(symdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
229 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
230 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
231 // array properties
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
232 case 'G':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
233 switch ( id )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
234 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
235 case "length":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
236 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
237 size_t len = parseNumber(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
238 symdata.type = "k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
239 symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
240 symdata.defered_load = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
241 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
242 case "ptr":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
243 // TODO: can this always be guaranteed?
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
244 assert(symdata.defered_load);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
245 size_t ptr = symdata.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
246 symdata.data = (cast(ubyte*)&ptr)[0..size_t.sizeof];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
247 symdata.defered_load = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
248 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
249 parseNumber(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
250 symdata.type = "P"~symdata.type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
251 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
252 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
253 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
254 "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
255 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
256 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
257 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
258 case 'A':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
259 switch ( id )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
260 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
261 case "length":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
262 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
263 symdata.type = "k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
264 size_t len = (cast(size_t[])data)[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
265 symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
266 symdata.defered_load = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
267 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
268 case "ptr":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
269 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
270 symdata.type = "k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
271 size_t len = (cast(size_t[])data)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
272 symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
273 symdata.defered_load = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
274 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
275 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
276 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
277 "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
278 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
279 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
280 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
281 case 'H':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
282 switch ( id )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
283 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
284 case "length":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
285 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
286 symdata.ptr = *cast(size_t*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
287 symdata.len = BB.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
288 symdata.defered_load = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
289 data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
290 BB* bb = cast(BB*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
291
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
292 symdata.type = "k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
293 symdata.data = (cast(ubyte*)&bb.nodes)[0..size_t.sizeof].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
294 symdata.defered_load = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
295 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
296 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
297 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
298 "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
299 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
300 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
301 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
302 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
303 // references to structs/classes
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
304 case 'P':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
305 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
306 if ( symdata.type[0] != 'C' && symdata.type[0] != 'S' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
307 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
308 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
309 "Type mismatch - unexpected . operator after expression of type "~demangleType("P"~symdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
310 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
311 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
312
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
313 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
314 if ( symdata.data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
315 throw new EvaluationException("Subexpression evaluated to empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
316 symdata.ptr = (cast(uint[])data)[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
317 symdata.len = ctx.codeView.sizeofMangled(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
318 symdata.defered_load = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
319
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
320 if ( symdata.ptr == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
321 throw new EvaluationException("pointer is null");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
322 // fall through to struct handling
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
323
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
324 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
325 // classes/structs
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
326 case 'C':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
327 case 'S':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
328 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
329 string scu_name = demangleNameSkip(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
330 assert ( symdata.type.length <= 0 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
331 if ( (scu_name in ctx.codeView.UDTsByName) is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
332 throw new EvaluationException("unknown type \""~scu_name~"\"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
333
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
334 LeafClassStruc lcs = cast(LeafClassStruc)ctx.codeView.UDTsByName[scu_name];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
335 LeafUnion lu;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
336 LeafFieldList lfl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
337 uint type_length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
338
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
339 if ( lcs !is null && lcs.field-0x1000 < ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
340 Leaf[] fields = ctx.codeView.type_strings[lcs.field-0x1000];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
341 lfl = cast(LeafFieldList)fields[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
342 type_length = lcs.length.getUint();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
343 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
344 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
345 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
346 lu = cast(LeafUnion)ctx.codeView.UDTsByName[scu_name];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
347 if ( lu !is null && lu.field-0x1000 < ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
348 Leaf[] fields = ctx.codeView.type_strings[lu.field-0x1000];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
349 lfl = cast(LeafFieldList)fields[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
350 type_length = lu.length.getUint();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
351 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
352 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
353 if ( lfl is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
354 throw new EvaluationException("invalid struct/class debug symbols");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
355
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
356 size_t size,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
357 offset;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
358 if ( !ctx.findMember(id, lfl, size, offset, symdata.type) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
359 throw new EvaluationException("struct \""~scu_name~"\" has no element \""~id~"\"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
360 assert ( symdata.type.length > 0 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
361 debug(eval) DbgIO.println("member: type=%s size=%d offset=%d", symdata.type, size, offset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
362
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
363 if ( !symdata.loadByteSlice(offset, offset+size) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
364 throw new EvaluationException("invalid offset into struct for member \""~id~"\"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
365 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
366 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
367 // unsupported
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
368 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
369 throw new EvaluationException("yet unsupported type "~demangleType(symdata.type)~" in expression");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
370 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
371 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
372
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
373 RefExpr(ctx, symbol, symbols, prefix, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
374 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
375
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
376 //-------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
377 // [] Operator
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
378 //-------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
379 "[" !("(%d) Arguments expected after [")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
380 Args !("(%d) ] expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
381 "]"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
382 RefExpr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
383 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
384 if ( symdata is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
385 throw new EvaluationException("Unknown symbol "~prefix);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
386
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
387 SymbolData argdata;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
388 size_t start, end;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
389 Args(ctx, argdata, start, end);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
390
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
391 bool isIndex = argdata is null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
392 if ( !isIndex && castArrayIndex(argdata.getData(ctx), argdata.type, start) ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
393 isIndex = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
394 end = start+1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
395 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
396
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
397 switch ( symdata.type[0] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
398 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
399 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
400 // primitive types
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
401 case 'v': case 'b': case 'x': case 'g': case 'h': case 's': case 't': case 'i': case 'k': case 'l': case 'm': case 'f':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
402 case 'd': case 'e': case 'o': case 'p': case 'j': case 'q': case 'r': case 'c': case 'a': case 'u': case 'w':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
403 // pointers, classes/structs
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
404 case 'P': case 'C': case 'S':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
405 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
406 "Type mismatch - unexpected [] operator after expression of type "~demangleType(symdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
407 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
408 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
409 // static arrays
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
410 case 'G':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
411 if ( !isIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
412 throw new EvaluationException("Cannot access static array with index type "~demangleType(argdata.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
413
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
414 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
415 size_t count = parseNumber(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
416 assert(symdata.type.length>0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
417
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
418 if ( end-start > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
419 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
420 if ( end > count )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
421 throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(count)~")");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
422 size_t size = ctx.codeView.sizeofMangled(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
423 if ( symdata.defered_load ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
424 symdata.ptr += start * size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
425 symdata.len = (end-start) * size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
426 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
427 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
428 symdata.data = symdata.data[start*size .. end*size];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
429 symdata.type = "G"~.toString(end-start)~symdata.type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
430 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
431 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
432 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
433 if ( !symdata.loadElementSlice(start, end, ctx.codeView) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
434 throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(count)~")");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
435 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
436 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
437 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
438 // dynamic arrays
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
439 case 'A':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
440 if ( !isIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
441 throw new EvaluationException("Cannot access dynamic array with index type "~demangleType(argdata.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
442
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
443 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
444 if ( data.length < 8 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
445 throw new EvaluationException("Subexpression evaluated to empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
446
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
447 if ( end-start > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
448 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
449 if ( end > (cast(size_t[])data)[0] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
450 throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(symdata.len)~")");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
451 size_t size = ctx.codeView.sizeofMangled(symdata.type[1..$]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
452 (cast(size_t[])data)[1] += start * size,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
453 (cast(size_t[])data)[0] = end-start;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
454 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
455 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
456 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
457 symdata.type = symdata.type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
458 assert(symdata.type.length>0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
459 symdata.ptr = (cast(size_t[])data)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
460 symdata.len = (cast(size_t[])data)[0] * ctx.codeView.sizeofMangled(symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
461 symdata.defered_load = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
462
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
463 if ( !symdata.loadElementSlice(start, end, ctx.codeView) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
464 throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(symdata.len)~")");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
465 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
466 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
467 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
468 // associative arrays
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
469 case 'H':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
470 int i;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
471 for ( i = 1; i < symdata.type.length && std.string.find(lowercase, symdata.type[i]) < 0; ++i ) {}
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
472 string key_type = symdata.type[1..i+1],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
473 val_type = symdata.type[i+1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
474 size_t val_tsize = ctx.codeView.sizeofMangled(val_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
475 TypeInfo key_ti = TypeInfoFromMangled(key_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
476
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
477 aaA* loadaaA(void* ptr)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
478 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
479 if ( ptr is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
480 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
481 ubyte[] data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
482 data.length = aaA.sizeof+key_ti.tsize+val_tsize;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
483 if ( data.length != ctx.process.readProcessMemory(cast(uint)ptr, data.ptr, data.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
484 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
485 aaA* a = cast(aaA*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
486 if ( std.string.find(lowercase, key_type[0]) < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
487 switch ( key_type[0] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
488 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
489 case 'A':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
490 ubyte[] tmp = *cast(ubyte[]*)(a+1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
491 if ( tmp.length > ctx.process.MEMCHECK_MIN && ctx.process.isInvalidMem(cast(size_t)tmp.ptr, tmp.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
492 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
493 data = new ubyte[tmp.length];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
494 if ( data.length != ctx.process.readProcessMemory(cast(size_t)tmp.ptr, data.ptr, data.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
495 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
496 *cast(ubyte[]*)(a+1) = data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
497 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
498 case 'P':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
499 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
500 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
501 throw new EvaluationException("only basic, pointer and array key types are supported, yet");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
502 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
503 return a;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
504 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
505
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
506 ubyte[] findKey(size_t ptr, hash_t hash, ubyte[] key_data)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
507 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
508 ubyte[] data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
509 data.length = BB.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
510 if ( data.length != ctx.process.readProcessMemory(ptr, data.ptr, data.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
511 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
512 BB* bb = cast(BB*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
513 size_t blen = bb.b.length*size_t.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
514 debug(eval) DbgIO.println("%d nodes, bb.b.length=%d", bb.nodes, bb.b.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
515
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
516 if ( blen > ctx.process.MEMCHECK_MIN && ctx.process.isInvalidMem(cast(size_t)bb.b.ptr, blen) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
517 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
518 data = new ubyte[blen];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
519 if ( data.length != ctx.process.readProcessMemory(cast(uint)bb.b.ptr, data.ptr, data.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
520 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
521 bb.b = cast(aaA*[])data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
522
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
523 uint i = hash % bb.b.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
524 debug(eval) DbgIO.println("start index=%d", i);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
525 aaA* a = loadaaA(bb.b[i]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
526 while ( a !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
527 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
528 if ( hash == a.hash )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
529 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
530 debug(eval) DbgIO.println("equal 0x%x", a.hash);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
531 auto cmp = key_ti.compare(key_data.ptr, a+1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
532 debug(eval) DbgIO.println("%s: %d == %d -> %d", key_ti, *cast(uint*)key_data.ptr, *cast(uint*)(a+1), cmp);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
533 if ( cmp == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
534 return ((cast(ubyte*)(a+1))+key_ti.tsize)[0 .. val_tsize];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
535 a = cmp < 0 ? loadaaA(a.left) : loadaaA(a.right);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
536 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
537 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
538 debug(eval) DbgIO.println("not equal 0x%x", a.hash);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
539 a = hash < a.hash ? loadaaA(a.left) : loadaaA(a.right);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
540 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
541 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
542 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
543 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
544
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
545 if ( key_type != argdata.type )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
546 throw new EvaluationException("Invalid key type for associative array. Expected "~demangleType(key_type)~" found "~demangleType(argdata.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
547 TypeInfo ti = TypeInfoFromMangled(argdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
548 hash_t index_hash = ti.getHash(argdata.data.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
549
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
550 debug(eval) DbgIO.println("searching, hash=0x%x", index_hash);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
551 ubyte[] data = symdata.getData(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
552 symdata.data = findKey((cast(size_t[])data)[0], index_hash, argdata.getData(ctx));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
553 symdata.type = val_type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
554 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
555 //---------------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
556 // unsupported
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
557 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
558 throw new EvaluationException("yet unsupported type "~demangleType(symdata.type)~" in expression");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
559 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
560
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
561 RefExpr(ctx, symbol, null, null, symdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
562 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
563
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
564 //-------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
565 // end of refexpr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
566 //-------------------------------------------------------------------------
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
567 epsilon
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
568 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
569 if ( symdata is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
570 throw new EvaluationException("Unknown symbol "~prefix);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
571 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
572 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
573
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
574 Args(EvaluationContext ctx, out SymbolData argdata, out size_t start, out size_t end)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
575 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
576 Expr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
577 ".." !("(%d) Second slice argument expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
578 Expr=Expr2
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
579 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
580 SymbolData arg1, arg2;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
581 Expr(ctx, arg1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
582 Expr2(ctx, arg2);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
583
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
584 bool isIndex = castArrayIndex(arg1.getData(ctx), arg1.type, start);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
585 isIndex = isIndex && castArrayIndex(arg2.getData(ctx), arg2.type, end);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
586 if ( !isIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
587 throw new EvaluationException("Slices may only have integer indeces, not "~demangleType(arg1.type)~".."~demangleType(arg2.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
588 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
589
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
590 Expr
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
591 { Expr(ctx, argdata); }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
592 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
593
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
594
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
595 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
596 Registers
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
597 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
598 Register(EvaluationContext ctx, out SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
599 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
600 RegName
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
601 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
602 string name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
603 ubyte width;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
604 RegName(name, width);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
605
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
606 CONTEXT threadCtx;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
607 uint context_flags;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
608 context_flags |= CONTEXT_FULL;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
609 context_flags |= CONTEXT_FLOATING_POINT;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
610 context_flags |= CONTEXT_EXTENDED_REGISTERS;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
611 if ( !ctx.getContext(threadCtx, context_flags) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
612 throw new EvaluationException("Couldn't get main thread's context");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
613
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
614 ubyte* ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
615 switch ( name[1..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
616 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
617 case "ax":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
618 case "eax":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
619 case "al": ptr = cast(ubyte*)&threadCtx.Eax; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
620 case "ah": ptr = (cast(ubyte*)&threadCtx.Eax)+1; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
621 case "bx":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
622 case "ebx":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
623 case "bl": ptr = cast(ubyte*)&threadCtx.Ebx; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
624 case "bh": ptr = (cast(ubyte*)&threadCtx.Ebx)+1; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
625 case "cx":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
626 case "ecx":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
627 case "cl": ptr = cast(ubyte*)&threadCtx.Ecx; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
628 case "ch": ptr = (cast(ubyte*)&threadCtx.Ecx)+1; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
629 case "dx":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
630 case "edx":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
631 case "dl": ptr = cast(ubyte*)&threadCtx.Edx; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
632 case "dh": ptr = (cast(ubyte*)&threadCtx.Edx)+1; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
633 case "edi":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
634 case "di": ptr = cast(ubyte*)&threadCtx.Edi; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
635 case "esi":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
636 case "si": ptr = cast(ubyte*)&threadCtx.Esi; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
637 case "ebp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
638 case "bp": ptr = cast(ubyte*)&threadCtx.Ebp; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
639 case "esp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
640 case "sp": ptr = cast(ubyte*)&threadCtx.Esp; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
641 case "eip": ptr = cast(ubyte*)&threadCtx.Eip; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
642 case "efl": ptr = cast(ubyte*)&threadCtx.EFlags; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
643 case "cs": ptr = cast(ubyte*)&threadCtx.SegCs; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
644 case "ds": ptr = cast(ubyte*)&threadCtx.SegDs; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
645 case "es": ptr = cast(ubyte*)&threadCtx.SegEs; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
646 case "fs": ptr = cast(ubyte*)&threadCtx.SegFs; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
647 case "gs": ptr = cast(ubyte*)&threadCtx.SegGs; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
648 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
649 int i = name[$-1]-'0';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
650 if ( name[0..2] == "st" )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
651 ptr = cast(ubyte*)&((cast(real[])threadCtx.FloatSave.RegisterArea)[i]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
652 else if ( name[0..2] == "mm" )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
653 ptr = cast(ubyte*)&((cast(long[])threadCtx.ExtendedRegisters)[4+i*2]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
654 else if ( name[0..3] == "xmm" )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
655 ptr = cast(ubyte*)&((cast(long[])threadCtx.ExtendedRegisters)[20+i*2]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
656 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
657 assert(0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
658 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
659
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
660 symdata = new SymbolData;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
661 switch ( width )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
662 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
663 case 8:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
664 symdata.type = "h";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
665 symdata.data = ptr[0..1].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
666 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
667 case 16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
668 symdata.type = "t";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
669 symdata.data = ptr[0..2].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
670 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
671 case 32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
672 symdata.type = "k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
673 symdata.data = ptr[0..4].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
674 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
675 case 64:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
676 symdata.type = "m";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
677 symdata.data = ptr[0..8].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
678 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
679 case 80:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
680 symdata.type = "e";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
681 symdata.data = ptr[0..10].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
682 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
683 case 128:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
684 symdata.type = "G4k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
685 symdata.data = ptr[0..16].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
686 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
687 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
688 assert(0, "unhandled register width "~.toString(width));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
689 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
690 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
691 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
692
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
693 RegName(out string name, out ubyte width)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
694 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
695 regexp("#(e[abcd]x|e[ds]i|e[bs]p|eip|efl)")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
696 { name = _ST_match; width = 32; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
697
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
698 regexp("#([abcd]x|[ds]i|[bs]p|(cdefgs)s)")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
699 { name = _ST_match; width = 16; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
700
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
701 regexp("#[abcd][hl]")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
702 { name = _ST_match; width = 8; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
703
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
704 regexp("#st[0-7]")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
705 { name = _ST_match; width = 8*real.sizeof; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
706
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
707 regexp("#mm[0-7]")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
708 { name = _ST_match; width = 64; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
709
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
710 regexp("#xmm[0-7]")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
711 { name = _ST_match; width = 128; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
712 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
713
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
714
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
715 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
716 Casts
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
717 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
718 Cast(EvaluationContext ctx, ref SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
719 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
720 "cast" !("(%d) ( expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
721 "(" !("(%d) Type expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
722 Type !("(%d) ) expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
723 ")"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
724 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
725 symdata.type = "";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
726 Type(ctx, symdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
727 if ( symdata.type.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
728 throw new EvaluationException("Unknown type in cast");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
729 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
730
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
731 epsilon;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
732 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
733
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
734 Type(EvaluationContext ctx, ref string mangled)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
735 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
736 BaseType QuantList
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
737 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
738 string unmangled;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
739 BaseType(ctx, unmangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
740
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
741 switch ( unmangled )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
742 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
743 case "void": mangled = "v"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
744 case "bool": mangled = "b"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
745 case "byte": mangled = "g"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
746 case "ubyte": mangled = "h"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
747 case "char": mangled = "a"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
748 case "wchar": mangled = "u"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
749 case "dchar": mangled = "w"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
750 case "short": mangled = "s"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
751 case "ushort": mangled = "t"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
752 case "int": mangled = "i"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
753 case "uint": mangled = "k"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
754 case "long": mangled = "l"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
755 case "ulong": mangled = "m"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
756 case "float": mangled = "f"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
757 case "double": mangled = "d"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
758 case "real": mangled = "e"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
759 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
760 Leaf lf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
761 if ( (unmangled in ctx.codeView.UDTsByName) is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
762 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
763 foreach ( un, l; ctx.codeView.UDTsByName )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
764 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
765 if ( std.string.find(un, "."~unmangled) > 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
766 lf = l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
767 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
768 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
769 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
770 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
771 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
772 lf = ctx.codeView.UDTsByName[unmangled];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
773
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
774 if ( lf !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
775 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
776 string fqn;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
777 switch ( lf.leaf_index )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
778 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
779 case LF_CLASS_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
780 mangled = "C";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
781 fqn = (cast(LeafClassStruc)lf).name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
782 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
783 case LF_STRUCTURE_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
784 mangled = "S";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
785 fqn = (cast(LeafClassStruc)lf).name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
786 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
787 case LF_ENUM_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
788 mangled = "E";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
789 fqn = (cast(LeafEnum)lf).name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
790 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
791 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
792 assert(0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
793 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
794 string[] parts = std.string.split(fqn, ".");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
795 foreach ( p; parts ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
796 mangled ~= .toString(p.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
797 mangled ~= p;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
798 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
799 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
800 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
801 throw new EvaluationException("Unknown BaseType "~unmangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
802 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
803 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
804
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
805 QuantList(ctx, mangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
806 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
807 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
808
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
809 BaseType(EvaluationContext ctx, out string type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
810 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
811 FQNIdent TplParams
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
812 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
813 FQNIdent(type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
814 string str;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
815 TplParams(ctx, str);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
816 type ~= str;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
817 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
818 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
819
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
820 QuantList(EvaluationContext ctx, ref string mangled)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
821 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
822 Quantifier QuantList
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
823 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
824 Quantifier(ctx, mangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
825 QuantList(ctx, mangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
826 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
827
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
828 epsilon;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
829 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
830
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
831 Quantifier(EvaluationContext ctx, ref string mangled)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
832 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
833 "*"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
834 { mangled = "P"~mangled; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
835
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
836 "[" "]"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
837 { mangled = "A"~mangled; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
838
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
839 "["
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
840 Integer !("(%d) ] expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
841 "]"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
842 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
843 ulong len;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
844 Integer(len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
845 mangled = "G"~.toString(len)~mangled;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
846 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
847
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
848 "[" !("(%d) ], type or size expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
849 Type !("(%d) ] expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
850 "]"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
851 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
852 string index_mangled;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
853 Type(ctx, index_mangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
854 mangled = "H"~index_mangled~mangled;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
855 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
856 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
857
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
858 TplParams(EvaluationContext ctx, out string str)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
859 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
860 "!" !("(%d) ( expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
861 "(" !("(%d) Template parameters expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
862 TplParam
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
863 TplParams2 !("(%d) ) expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
864 ")"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
865 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
866 string tmp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
867 TplParam(ctx, tmp);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
868 str = "!("~tmp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
869 TplParams2(ctx, tmp);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
870 str ~= tmp~")";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
871 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
872
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
873 epsilon;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
874 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
875
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
876 TplParams2(EvaluationContext ctx, out string str)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
877 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
878 "," !("(%d) Template parameter expected")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
879 TplParam
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
880 TplParams2
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
881 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
882 TplParam(ctx, str);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
883 string tmp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
884 TplParams2(ctx, tmp);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
885 str ~= tmp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
886 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
887
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
888 epsilon;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
889 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
890
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
891 TplParam(EvaluationContext ctx, out string str)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
892 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
893 Type { Type(ctx, str); }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
894 StrLit { StrLit(str); }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
895 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
896
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
897
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
898 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
899 Terminals
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
900 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
901 Lit(out SymbolData litdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
902 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
903 Sign Integer IntegerSuffix
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
904 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
905 litdata = new SymbolData;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
906 IntegerSuffix(litdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
907 ulong val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
908 Integer(val);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
909
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
910 if ( val > 0x7fffffffffffffff )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
911 litdata.type = "m";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
912 else if ( val > 0xffffffff )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
913 litdata.type = litdata.type[0]=='i'||litdata.type[0]=='l'?"l":"m";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
914 else if ( val > 0x7fffffff && litdata.type[0] == 'i' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
915 litdata.type = "k";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
916
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
917 litdata.data = (cast(ubyte*)&val)[0 .. (litdata.type[0] == 'k' || litdata.type[0] == 'i')?uint.sizeof:ulong.sizeof].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
918 Sign(litdata);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
919 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
920
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
921 // String
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
922 regexp("\"(([^\"\\\\]*(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))?)*)\"")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
923 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
924 litdata = new SymbolData;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
925 litdata.type = "Aa";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
926 litdata.data = cast(ubyte[])_ST_match;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
927 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
928
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
929 // Char
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
930 regexp("'(([^'\\\\]|(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))))'")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
931 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
932 litdata = new SymbolData;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
933 litdata.type = "a";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
934 litdata.data = cast(ubyte[])_ST_match[0..1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
935 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
936 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
937
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
938 StrLit(out string str)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
939 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
940 // Integer
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
941 Integer
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
942 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
943 ulong val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
944 Integer(val);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
945 str = .toString(val);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
946 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
947
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
948 // String
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
949 regexp("\"(([^\"\\\\]*(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))?)*)\"")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
950 { str = _ST_match; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
951
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
952 // Char
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
953 regexp("'(([^'\\\\]|(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))))'")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
954 { str = _ST_match; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
955 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
956
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
957 Ident(out string id)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
958 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
959 regexp("[a-zA-Z_][_a-zA-Z0-9]*")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
960 { id = _ST_match; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
961 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
962
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
963 FQNIdent(out string id)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
964 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
965 Ident
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
966 { Ident(id); }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
967
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
968 FQNIdent "." Ident
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
969 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
970 FQNIdent(id);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
971 string tmp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
972 Ident(tmp);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
973 id ~= "."~tmp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
974 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
975 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
976
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
977 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
978 Integers
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
979 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
980 Integer(out ulong val)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
981 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
982 // hex
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
983 regexp("0[xX][0-9a-fA-F_]+")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
984 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
985 foreach ( b; _ST_match[2..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
986 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
987 val <<= 4;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
988 if ( b > 'F' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
989 val |= b-'W';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
990 else if ( b > '9' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
991 val |= b-'7';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
992 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
993 val |= b-'0';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
994 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
995 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
996
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
997 // binary
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
998 regexp("0[bB][01_]+")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
999 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1000 foreach ( b; _ST_match[2..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1001 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1002 val <<= 1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1003 if ( b == '1' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1004 val |= 1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1005 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1006 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1007
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1008 // octal
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1009 regexp("0[0-7_]+")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1010 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1011 foreach ( b; _ST_match[1..$] ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1012 val <<= 3;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1013 val |= b-'0';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1014 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1015 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1016
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1017 // decimal
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1018 regexp("0|([1-9][0-9_]*)")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1019 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1020 foreach ( b; _ST_match ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1021 val *= 10;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1022 val += b-'0';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1023 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1024 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1025 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1026
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1027 IntegerSuffix(out string type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1028 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1029 "L" "u"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1030 { type = "m"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1031
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1032 "L" "U"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1033 { type = "m"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1034
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1035 "u" "L"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1036 { type = "m"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1037
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1038 "U" "L"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1039 { type = "m"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1040
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1041 "L"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1042 { type = "l"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1043
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1044 regexp("[uU]")
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1045 { type = "k"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1046
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1047 epsilon
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1048 { type = "i"; }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1049 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1050
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1051 Sign(ref SymbolData symdata)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1052 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1053 "-"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1054 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1055 switch ( symdata.type[0] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1056 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1057 case 'i':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1058 *cast(int*)symdata.data.ptr = 0-*cast(int*)symdata.data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1059 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1060 case 'k':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1061 *cast(uint*)symdata.data.ptr = 0-*cast(uint*)symdata.data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1062 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1063 case 'l':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1064 *cast(long*)symdata.data.ptr = 0-*cast(long*)symdata.data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1065 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1066 case 'm':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1067 *cast(ulong*)symdata.data.ptr = 0-*cast(ulong*)symdata.data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1068 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1069 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1070 assert(0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1071 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1072 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1073
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1074 epsilon;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1075 }