annotate src/expression/evaluationcontext.d @ 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 module expression.evaluationcontext;
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 container;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 import codeview.decl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
9 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
10 import minidump;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11 import dbgprocess;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12 import dbgthread;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 import callstack;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15 import expression.datahandler;
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 std.string;
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 import win32.winnt;
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 class EvaluationException : Exception
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 this(string m) { super(m); }
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
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 class SymbolData
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 string type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32 bool defered_load;
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 union
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
36 ubyte[] data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
37 struct {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 size_t len,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39 ptr;
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 }
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 ubyte[] getData(EvaluationContext ctx)
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 if ( defered_load )
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 debug(eval) DbgIO.println("defered load: ptr=%x len=%d", ptr, len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
51 defered_load = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 data = ctx.readMemory(ptr, len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 return data;
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
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
60 bool loadElementSlice(size_t start, size_t end, CodeView cv)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
61 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62 assert(end>=start);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 size_t size = cv.sizeofMangled(type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64 start *= size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
65 end *= size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
66 if ( defered_load )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 if ( end > len )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70 ptr += start;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71 len = end-start;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 if ( end > data.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
77 data = data[start..end];
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 return true;
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85 bool loadByteSlice(size_t start, size_t end)
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 assert(end>=start);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
88 if ( defered_load )
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 ( end > len )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92 ptr += start;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 len = end-start;
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 else
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 if ( end > data.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
98 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 data = data[start..end];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102 }
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
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 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
108 class EvaluationContext
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 CodeView codeView;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
111 MiniDump miniDump;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
112 DbgProcess process;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
113 DbgThread thread;
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 uint frameLevel;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116 CallStack stack;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117 ScopeSymbol scopeSym;
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 NamedSymbol[] scopeSymbols;
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 this(CodeView _cv,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
125 uint _current_address,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
126 MiniDump _miniDump,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127 DbgProcess _process,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
128 DbgThread _thread,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
129 CallStack _stack,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
130 uint _frame_level=0
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
131 )
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 miniDump = _miniDump;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 thread = _thread;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 codeView = _cv;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136 process = _process;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 stack = _stack;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138 frameLevel = _frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140 uint segment;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
141 scopeSym = codeView.findProcedureSymbol(_current_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
142 for ( ; scopeSym !is null; scopeSym = scopeSym.parent_scope )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
143 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 scopeSymbols ~= scopeSym.symbols.named_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
145 ProcedureSymbol psym = cast(ProcedureSymbol)scopeSym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
146 if ( psym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
147 scopeSymbols ~= psym.arguments.named_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 }
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151 bool getContext(out CONTEXT ctx, uint context_flags)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 if ( process !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 return thread.getContext(ctx, context_flags);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155 else if ( miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 CONTEXT* ptr = miniDump.getContext;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157 if ( ptr !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158 ctx = *ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 return 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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 return false;
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
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 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
168 NamedSymbol findSymbol(string name, inout NamedSymbol[] symbols)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
169 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
170 if ( symbols is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
171 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
172 StringWrap sw = new StringWrap(name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
173 AVLNode!(NamedSymbol) res;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
174 if ( codeView.globalNamedSymbols.find(sw, res) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
175 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
176 NamedSymbol ns = res.value;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
177 ScopeSymbol scopesym = cast(ScopeSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 if ( scopesym is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179 return ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 symbols = scopesym.symbols.named_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
181 return null;
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 foreach ( ns; scopeSymbols )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185 if ( name == ns.name_notype )
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 debug(findSymbol) DbgIO.println("%s == %s", name, ns.name_notype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
188 ScopeSymbol scopesym = cast(ScopeSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
189 if ( scopesym is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
190 return ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 symbols = scopesym.symbols.named_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 }
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 else
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 foreach ( ns; symbols )
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 if ( name == ns.name_notype )
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 debug(findSymbol) DbgIO.println("%s == %s", name, ns.name_notype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
203 ScopeSymbol scopesym = cast(ScopeSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
204 if ( scopesym is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
205 return ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
206 symbols = scopesym.symbols.named_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
207 return null;
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
210 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
211 return null;
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
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 SymbolData loadSymbolData(NamedSymbol 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 StackSymbol stacksym = cast(StackSymbol)symbol;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 SymbolData symdata = new SymbolData;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
221 if ( stacksym !is null )
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 if ( stacksym.size == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
224 stacksym.size = codeView.sizeofCV(stacksym.cvdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
225 debug(eval) DbgIO.println("reading stack symbol size=%d cv type 0x%x", stacksym.size, stacksym.cvdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
226 if ( !stack.loadSymbolData(stacksym, symdata, frameLevel) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
227 throw new EvaluationException("Couldn't load stack symbol "~symbol.name_notype);
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 else
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 DataSymbol datasym = cast(DataSymbol)symbol;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
232 if ( datasym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
233 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
234 if ( datasym.size == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
235 datasym.size = codeView.sizeofCV(datasym.cvdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
236 debug(eval) DbgIO.println("reading global symbol size=%d cv type 0x%x", datasym.size, datasym.cvdata.type);
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 symdata.ptr = codeView.image.getSectionBase(datasym.cvdata.segment)+datasym.cvdata.offset;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
239 symdata.len = datasym.size;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
240 symdata.defered_load = true;
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 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
243 throw new EvaluationException("Can only evaluate Data and Stack Data Symbols, yet");
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 symdata.type = codeView.mangleType(symbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
247 if ( symdata.type is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
248 throw new EvaluationException("Symbol "~symbol.name_notype~" has unknown CV type");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
249 return symdata;
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
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
254 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
255 bool findMember(string ident, LeafFieldList lfl, inout size_t size, inout size_t offset, inout string type)
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 if ( lfl is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
258 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
259 foreach ( l; lfl.fields )
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 if ( l.leaf_index == LF_BCLASS_16t )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
262 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
263 LeafBaseClass lbc = cast(LeafBaseClass)l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
264 assert ( lbc !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
265 if ( lbc.type-0x1000 >= codeView.type_strings.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
266 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
267 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
268 "unknown base class "~format("0x%04x", lbc.type)~" in type information for expression"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
269 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
270 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
271 LeafClassStruc lcs = cast(LeafClassStruc)codeView.type_strings[lbc.type-0x1000][0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
272 assert ( lcs !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
273 if ( lcs.field == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
274 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
275 if ( lcs.field-0x1000 >= codeView.type_strings.length )
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 throw new EvaluationException(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
278 "unknown field list "~format("0x%04x", lcs.field)~" in type information for expression"
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
281 Leaf[] fields = codeView.type_strings[lcs.field-0x1000];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
282 if ( findMember(ident, cast(LeafFieldList)fields[0], size, offset, type) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
283 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
284 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
285 else if ( l.leaf_index == LF_MEMBER_16t )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
286 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
287 LeafMember lm = cast(LeafMember)l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
288 assert ( lm !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
289 if ( lm.name != ident )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
290 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
291 type = codeView.mangleCVtype(lm.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
292 size = codeView.sizeofCV(lm.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
293 offset = lm.offset.getUint;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
294 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
295 }
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 return false;
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 /**********************************************************************************************
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[] readMemory(size_t ptr, size_t len)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
305 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
306 if ( miniDump !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
307 return miniDump.readMemory(ptr, len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
308
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
309 if ( process is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
310 return null;
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 if ( len > process.MEMCHECK_MIN && process.isInvalidMem(ptr, len) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
313 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
314 ubyte data[] = new ubyte[len];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
315 if ( len != process.readProcessMemory(ptr, data.ptr, data.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
316 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
317 return data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
318 }
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