annotate src/expression/datahandler.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
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 module expression.datahandler;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
6
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
7 import std.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 import std.utf;
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 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11 import codeview.decl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12 import dbgprocess;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14 import minidump;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15 import expression.evaluationcontext;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
16
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
17 import internal.aaA;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
18
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
19 T min(T)(T a, T b)
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 return a<b?a:b;
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
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
26 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
27 class SymbolValue
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
28 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
29 string name,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
30 value;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
31 SymbolValue[] children;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
33 this() {}
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
34
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35 this(string v)
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 value = v;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
40 this(string n, string v)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
41 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
42 name = n;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
43 value = v;
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
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 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
49
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 class DataHandler
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 static DataHandler[string] s_dataHandlerRegistry;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 static uint max_elem_count = 32;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
55
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
56 static this()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
57 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
58 s_dataHandlerRegistry["b"] = new DataHandler_bool;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59 s_dataHandlerRegistry["a"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
60 s_dataHandlerRegistry["w"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
61 s_dataHandlerRegistry["u"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62 s_dataHandlerRegistry["g"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 s_dataHandlerRegistry["h"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64 s_dataHandlerRegistry["i"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
65 s_dataHandlerRegistry["l"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
66 s_dataHandlerRegistry["k"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67 s_dataHandlerRegistry["m"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 s_dataHandlerRegistry["s"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 s_dataHandlerRegistry["t"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70 s_dataHandlerRegistry["v"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71 s_dataHandlerRegistry["f"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 s_dataHandlerRegistry["d"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73 s_dataHandlerRegistry["e"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 s_dataHandlerRegistry["x"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 s_dataHandlerRegistry["Aa"] = new DataHandler_string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 s_dataHandlerRegistry["Au"] = new DataHandler_string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
77 s_dataHandlerRegistry["Aw"] = new DataHandler_string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
78 s_dataHandlerRegistry["P*"] = new DataHandler_num;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
79 s_dataHandlerRegistry["A*"] = new DataHandler_A;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
80 s_dataHandlerRegistry["G*"] = new DataHandler_G;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
81 s_dataHandlerRegistry["S*"] = new DataHandler_SCU;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
82 s_dataHandlerRegistry["C*"] = new DataHandler_SCU;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
83 s_dataHandlerRegistry["PC*"] = new DataHandler_SCU;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 s_dataHandlerRegistry["E*"] = new DataHandler_E;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85 s_dataHandlerRegistry["H*"] = new DataHandler_H;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
86 }
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 static SymbolValue handle(EvaluationContext ctx, string type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
89 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
90 if ( type.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 DataHandler* handler = type in s_dataHandlerRegistry;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
94 if ( type.length > 1 && handler is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
95 handler = type[0..2]~"*" in s_dataHandlerRegistry;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
96 if ( handler is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
97 handler = type[0]~"*" in s_dataHandlerRegistry;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
98
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 SymbolValue val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100 if ( handler !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 debug(datahandler) DbgIO.println("%s is handling data", handler.classinfo.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102 val = handler.toString(ctx, type, data, depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
103 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
104 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
105 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
106
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
107 abstract SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
108 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
109
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
110 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
111
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
112 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
113 class DataHandler_H : DataHandler
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
114 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
115 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
118
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
119 size_t ptr = (cast(size_t[])data)[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
120 if ( ptr == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
121 val.value = "null";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
122 return val;
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
125 if ( depth == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
126 val.value = "...";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127 return val;
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 int i;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
131 pragma(msg, TODO(__FILE__,__LINE__,"allow named types (C,S,D,F, etc.)"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
132 for ( i = 1; i < mangled_type.length && find(lowercase, mangled_type[i]) < 0; ++i ) {}
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
133
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 string key_type = mangled_type[1..i+1],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 val_type = mangled_type[i+1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136 size_t val_tsize = ctx.codeView.sizeofMangled(val_type),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 key_tsize = ctx.codeView.sizeofMangled(key_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139 if ( key_type.length == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140 val.value = "invalid key type "~key_type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
141 return val;
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 if ( val_type.length == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 val.value = "invalid val type "~val_type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
145 return val;
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 bool evalaaA(void* ptr)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
149 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
150 if ( ptr is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152 ubyte[] data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 size_t len = aaA.sizeof+key_tsize+val_tsize;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 data = ctx.readMemory(cast(size_t)ptr, len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155 if ( data is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158 uint i=aaA.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 SymbolValue k = handle(ctx, key_type, data[i..i+key_tsize], depth>0?depth-1:depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
160 i += key_tsize;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
161 SymbolValue v = handle(ctx, val_type, data[i..i+val_tsize], depth>0?depth-1:depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 v.name = k.value;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
163 val.children ~= v;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
164 return true;
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 bool evalBB(uint ptr)
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 ubyte[] data = ctx.readMemory(cast(size_t)ptr, BB.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
170 if ( data is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
171 return false;
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 BB* bb = cast(BB*)data.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
174 size_t blen = bb.b.length*size_t.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
175 debug 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
176
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
177 data = ctx.readMemory(cast(size_t)bb.b.ptr, blen);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 if ( data is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 bb.b = cast(aaA*[])data;
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 foreach ( a; bb.b )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
183 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 if ( !evalaaA(a) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
186 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
187 return true;
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
190 if ( !evalBB(ptr) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 val.value = format("invalid AA pointer 0x%x", ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
194 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
195 }
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
199 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
200 class DataHandler_E : DataHandler
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 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
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 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
205 string mangled = mangled_type[1..$].dup,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
206 name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
207 name = demangleNameSkip(mangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
208 if ( (name in ctx.codeView.UDTsByName) !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
209 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
210 LeafEnum lf = cast(LeafEnum)ctx.codeView.UDTsByName[name];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
211 if ( lf is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
212 val.value = "invalid codeview information for enum type "~name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
213 return val;
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 uint index = lf.field-0x1000;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216 if ( index >= ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 val.value = "invalid codeview information for enum type "~name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
218 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
219 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 LeafFieldList fields = cast(LeafFieldList)ctx.codeView.type_strings[lf.field-0x1000][0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
221 if ( fields is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
222 val.value = "invalid codeview information for enum type "~name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
223 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
224 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
225 assert(data.length >= 4);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
226 uint value = (cast(uint[])data)[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
227 foreach ( f; fields.fields )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
228 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
229 LeafEnumNameValue ef = cast(LeafEnumNameValue)f;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
230 assert(ef !is null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
231 if ( ef.value.getUint == value ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
232 val.value = ef.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
233 return val;
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
236 val.value = "invalid enum value";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
237 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
238 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
239 val.value = "unknown enum type "~name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
240 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
241 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
242 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
243
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
244 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
245
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
246 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
247 class DataHandler_SCU : DataHandler
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
248 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
249 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
250 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
251 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
252
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
253 string scu_name_mangled,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
254 scu_name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
255 if ( mangled_type[0] == 'P' )
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 assert(data.length==size_t.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
258 if ( *cast(size_t*)data.ptr == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
259 val.value = "null";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
260 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
261 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
262 scu_name_mangled = mangled_type[2..$].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
263 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
264 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
265 scu_name_mangled = mangled_type[1..$].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
266 scu_name = demangleNameSkip(scu_name_mangled);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
267
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
268 if ( depth == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
269 val.value = "...";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
270 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
271 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
272
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
273 if ( (scu_name in ctx.codeView.UDTsByName) is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
274 val.value = format("unknown type %s", scu_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
275 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
276 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
277
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
278 LeafClassStruc lcs;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
279 LeafUnion lu;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
280
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
281 LeafFieldList lfl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
282 uint type_length;
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 lcs = cast(LeafClassStruc)ctx.codeView.UDTsByName[scu_name];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
285 debug DbgIO.println("%s %x", scu_name, lcs.field);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
286 if ( lcs !is null && lcs.field-0x1000 < ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
287 lfl = cast(LeafFieldList)ctx.codeView.type_strings[lcs.field-0x1000][0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
288 type_length = lcs.length.getUint();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
289 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
290 else
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 lu = cast(LeafUnion)ctx.codeView.UDTsByName[scu_name];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
293 if ( lu !is null && lu.field-0x1000 < ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
294 lfl = cast(LeafFieldList)ctx.codeView.type_strings[lu.field-0x1000][0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
295 type_length = lu.length.getUint();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
296 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
297 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
298
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
299 if ( lfl is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
300 val.value = "{no debug symbols available}";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
301 return val;
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
304 ubyte[] tmpdata;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
305 if ( mangled_type[0] == 'P' || mangled_type[0] == 'C' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
306 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
307 assert(data.length==size_t.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
308 debug(datahandler) DbgIO.println("dereferencing class/struct reference at 0x%x", *cast(size_t*)data.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
309 tmpdata = ctx.readMemory(*cast(size_t*)data.ptr, type_length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
310 if ( tmpdata is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
311 val.value = format("invalid class pointer 0x%08x", *cast(size_t*)data.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
312 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
313 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
314 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
315 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
316 tmpdata = data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
317
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
318 void listMembers(LeafFieldList lfl, SymbolValue root)
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 foreach ( l; lfl.fields )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
321 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
322 if ( l.leaf_index == LF_BCLASS_16t )
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 LeafBaseClass lbc = cast(LeafBaseClass)l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
325 assert ( lbc !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
326 if ( lbc.type-0x1000 >= ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
327 root.children ~= new SymbolValue("unknown base class "~format("0x%04x", lbc.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
328 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
329 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
330 LeafClassStruc lcs = cast(LeafClassStruc)ctx.codeView.type_strings[lbc.type-0x1000][0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
331 assert ( lcs !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
332 if ( lcs.field == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
333 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
334 if ( lcs.field-0x1000 >= ctx.codeView.type_strings.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
335 root.children ~= new SymbolValue("unknown field list "~format("0x%04x", lcs.field));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
336 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
337 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
338 Leaf[] fields = ctx.codeView.type_strings[lcs.field-0x1000];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
339 debug(datahandler) DbgIO.println("processing base class ", lcs.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
340
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
341 SymbolValue v = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
342 v.name = lcs.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
343 listMembers(cast(LeafFieldList)fields[0], v);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
344 root.children ~= v;
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 else if ( l.leaf_index == LF_MEMBER_16t )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
347 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
348 LeafMember lm = cast(LeafMember)l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
349 assert ( lm !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
350 uint size = ctx.codeView.sizeofCV(lm.type),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
351 offset = lm.offset.getUint;
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 LeafPointer lp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
354 bool seen_type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
355 if ( lm.type >= 0x1000 && lm.type-0x1000 < ctx.codeView.type_strings.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
356 lp = cast(LeafPointer)ctx.codeView.type_strings[lm.type-0x1000][0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
357 if ( depth > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
358 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
359 debug(datahandler) DbgIO.println("processing member %s cvtype 0x%x mangled %s", lm.name, lm.type, ctx.codeView.mangleCVtype(lm.type));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
360 if ( offset+size > tmpdata.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
361 root.children ~= new SymbolValue(lm.name, format("invalid: offset=0x%x size=%d", offset, size));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
362 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
363 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
364 SymbolValue v = handle(ctx, ctx.codeView.mangleCVtype(lm.type), tmpdata[offset..offset+size], depth>0?depth-1:depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
365 if ( v !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
366 v.name = lm.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
367 root.children ~= v;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
368 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
369 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
370 root.children ~= new SymbolValue(lm.name, "null");
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 }
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 listMembers(lfl, val);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
378 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
379 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
380 }
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 /**************************************************************************************************
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 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
385 class DataHandler_A : DataHandler
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 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
388 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
389 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
390 size_t[] idata = cast(size_t[])data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
391
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
392 if ( idata[1] == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
393 val.value = "null";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
394 return val;
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 if ( depth == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
398 val.value = "...";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
399 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
400 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
401
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
402 mangled_type = mangled_type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
403 uint elm_size = ctx.codeView.sizeofMangled(mangled_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
404 size_t alen = min(idata[0],max_elem_count)*elm_size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
405
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
406 ubyte[] tmpdata = ctx.readMemory(idata[1], alen);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
407 if ( tmpdata is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
408 val.value = format("invalid array: ptr=0x%08x $=%d", idata[1], idata[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
409 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
410 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
411 uint off_end = tmpdata.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
412 for ( uint i = 0, off=0; off < off_end; ++i, off+=elm_size ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
413 SymbolValue v = handle(ctx, mangled_type, tmpdata[off..off+elm_size], depth>0?depth-1:depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
414 if ( v is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
415 val.children ~= new SymbolValue("["~.toString(i)~"]", "null");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
416 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
417 v.name = "["~.toString(i)~"]";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
418 val.children ~= v;
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
421 if ( idata[0] > max_elem_count )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
422 val.children ~= new SymbolValue("... $", format("%d", idata[0]));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
423 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
424 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
425 }
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
428 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
429
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 class DataHandler_G : DataHandler
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 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
434 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
435 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
436
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
437 if ( depth == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
438 val.value = "...";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
439 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
440 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
441
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
442 mangled_type = mangled_type[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
443 uint count = parseNumber(mangled_type),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
444 elm_size = ctx.codeView.sizeofMangled(mangled_type),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
445 off_end = min(count,max_elem_count)*elm_size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
446 if ( count*elm_size != data.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
447 throw new EvaluationException("unexpected data length: have "~.toString(data.length)~" should be "~.toString(count*elm_size));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
448 for ( uint i = 0, off=0; off < off_end; ++i, off+=elm_size ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
449 SymbolValue v = handle(ctx, mangled_type, data[off..off+elm_size], depth>0?depth-1:depth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
450 if ( v is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
451 val.children ~= new SymbolValue("["~.toString(i)~"]", "null");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
452 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
453 v.name = "["~.toString(i)~"]";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
454 val.children ~= v;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
455 }
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 if ( count > max_elem_count )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
458 val.children ~= new SymbolValue("... $", format("%d", count));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
459 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
460 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
461 }
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 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
464
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 class DataHandler_string : DataHandler
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 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
469 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
470 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
471
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
472 string str;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
473 uint[] idata = cast(uint[])data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
474 if ( idata[1] == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
475 val.value = "null";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
476 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
477 }
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 assert(mangled_type[0] == 'A');
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
480
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
481 switch ( mangled_type[1] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
482 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
483 case 'a':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
484 str = cast(string)ctx.readMemory(idata[1], idata[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
485 if ( str is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
486 val.value = format("invalid string: ptr=0x%08x $=%d", idata[1], idata[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
487 return val;
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 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
490 case 'u':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
491 wstring wstr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
492 size_t len = idata[0]*wchar.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
493
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
494 wstr = cast(wstring)ctx.readMemory(idata[1], len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
495 if ( wstr is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
496 val.value = format("invalid string: ptr=0x%08x $=%d", idata[1], idata[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
497 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
498 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
499 str = toUTF8(wstr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
500 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
501 case 'w':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
502 dstring dstr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
503 size_t len = idata[0]*dchar.sizeof;
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 dstr = cast(dstring)ctx.readMemory(idata[1], len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
506 if ( dstr is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
507 val.value = format("invalid string: ptr=0x%08x $=%d", idata[1], idata[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
508 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
509 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
510 str = toUTF8(dstr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
511 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
512 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
513 assert(0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
514 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
515 val.value = "\""~replace(replace(str, "\\", "\\\\"), "\"", "\\\"")~"\"";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
516 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
517 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
518 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
519
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
520 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
521
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 class DataHandler_num : DataHandler
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
524 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
525 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
526 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
527 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
528 switch ( mangled_type[0] )
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 case 'a':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
531 val.value = (cast(char[])data)[0..1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
532 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
533 //~ case 'u':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
534 //~ val.value = toUTF8((cast(wchar[])data)[0..1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
535 //~ break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
536 case 'w':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
537 val.value = toUTF8((cast(dchar[])data)[0..1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
538 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
539 case 'g':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
540 val.value = format("%d", (cast(byte[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
541 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
542 case 'h':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
543 val.value = format("%d", (cast(ubyte[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
544 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
545 case 's':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
546 val.value = format("%d", (cast(short[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
547 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
548 case 't':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
549 case 'u':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
550 val.value = format("%d", (cast(ushort[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
551 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
552 case 'i':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
553 val.value = format("%d", (cast(int[])data)[0]);
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 case 'P':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
556 case 'v':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
557 case 'k':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
558 val.value = format("0x%08x", (cast(uint[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
559 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
560 case 'l':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
561 val.value = format("%d", (cast(long[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
562 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
563 case 'm':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
564 val.value = format("%d", (cast(ulong[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
565 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
566 case 'f':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
567 val.value = format("% .6g", (cast(float[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
568 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
569 case 'd':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
570 val.value = format("% .12g", (cast(double[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
571 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
572 case 'e':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
573 val.value = format("% .16g", (cast(real[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
574 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
575 case 'x':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
576 case 'b':
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
577 val.value = format("%s", (cast(bool[])data)[0]?"true":"false");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
578 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
579 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
580 assert(0, mangled_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
581 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
582 return val;
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
585
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
586
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
587 /**************************************************************************************************
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 class DataHandler_bool : DataHandler
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
591 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
592 SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
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 SymbolValue val = new SymbolValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
595 assert(mangled_type[0]=='b');
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
596 val.value = format("%s", (cast(bool[])data)[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
597 return val;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
598 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
599 }