OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 package com.google.dart.runner; | 5 package com.google.dart.runner; |
6 | 6 |
7 import com.google.common.collect.Lists; | 7 import com.google.common.collect.Lists; |
8 import com.google.debugging.sourcemap.SourceMapping; | |
9 import com.google.debugging.sourcemap.proto.Mapping.OriginalMapping; | |
10 | 8 |
11 import java.io.BufferedReader; | 9 import java.io.BufferedReader; |
12 import java.io.File; | 10 import java.io.File; |
13 import java.io.FileWriter; | 11 import java.io.FileWriter; |
14 import java.io.IOException; | 12 import java.io.IOException; |
15 import java.io.InputStream; | 13 import java.io.InputStream; |
16 import java.io.InputStreamReader; | 14 import java.io.InputStreamReader; |
17 import java.io.PrintStream; | 15 import java.io.PrintStream; |
18 import java.io.PrintWriter; | 16 import java.io.PrintWriter; |
19 import java.io.StringWriter; | 17 import java.io.StringWriter; |
(...skipping 28 matching lines...) Expand all Loading... |
48 out.println(str); | 46 out.println(str); |
49 } | 47 } |
50 } catch (IOException e) { | 48 } catch (IOException e) { |
51 throw new AssertionError(e); | 49 throw new AssertionError(e); |
52 } | 50 } |
53 } | 51 } |
54 } | 52 } |
55 | 53 |
56 private static final String D8_ENVIRONMENT_VARIABLE = "D8_EXEC"; | 54 private static final String D8_ENVIRONMENT_VARIABLE = "D8_EXEC"; |
57 | 55 |
58 private final SourceMapping appSourceMap; | |
59 | |
60 private static final String EOL = System.getProperty("line.separator"); | 56 private static final String EOL = System.getProperty("line.separator"); |
61 | 57 |
62 /** | 58 public V8Launcher() { |
63 * | |
64 */ | |
65 public V8Launcher(SourceMapping appSourceMap) { | |
66 this.appSourceMap = appSourceMap; | |
67 } | 59 } |
68 | 60 |
69 @Override | 61 @Override |
70 public void execute(String jsScript, String sourceName, String[] args, RunnerO
ptions options, | 62 public void execute(String jsScript, String sourceName, String[] args, RunnerO
ptions options, |
71 PrintStream stdout, PrintStream stderr) | 63 PrintStream stdout, PrintStream stderr) |
72 throws RunnerError { | 64 throws RunnerError { |
73 if (!isConfigured()) { | 65 if (!isConfigured()) { |
74 throw new RunnerError("Please set the " + D8_ENVIRONMENT_VARIABLE + " envi
ronment variable."); | 66 throw new RunnerError("Please set the " + D8_ENVIRONMENT_VARIABLE + " envi
ronment variable."); |
75 } | 67 } |
76 File sourceFile; | 68 File sourceFile; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 p.destroy(); | 120 p.destroy(); |
129 } | 121 } |
130 if (exitValue != 0) { | 122 if (exitValue != 0) { |
131 StringWriter stringWriter = new StringWriter(); | 123 StringWriter stringWriter = new StringWriter(); |
132 PrintWriter out = new PrintWriter(stringWriter); | 124 PrintWriter out = new PrintWriter(stringWriter); |
133 if (options.verbose()) { | 125 if (options.verbose()) { |
134 out.println(jsScript); | 126 out.println(jsScript); |
135 } | 127 } |
136 out.println("Execution failed."); | 128 out.println("Execution failed."); |
137 | 129 |
138 String str = mapStackEntry(decodeStackTraceFromString(stdOutLines), appS
ourceMap); | |
139 if (str != null) { | |
140 out.println("Mapped stack trace:"); | |
141 out.println(str); | |
142 out.println(""); | |
143 } | |
144 out.println("V8 execution returned non-zero exit-code: " + p.exitValue()
); | 130 out.println("V8 execution returned non-zero exit-code: " + p.exitValue()
); |
145 out.flush(); | 131 out.flush(); |
146 throw new RunnerError(stringWriter.toString()); | 132 throw new RunnerError(stringWriter.toString()); |
147 } | 133 } |
148 } finally { | 134 } finally { |
149 sourceFile.delete(); | 135 sourceFile.delete(); |
150 } | 136 } |
151 } | 137 } |
152 | 138 |
153 private String mapStackEntry(List<StackEntry> entries, SourceMapping map) { | |
154 if (entries != null) { | |
155 StringBuilder sb = new StringBuilder(); | |
156 for (StackEntry entry : entries) { | |
157 SourceMapping sm = getSourceMapForFile(entry.file, map); | |
158 // TODO(johnlenz): Try to translate the method name. | |
159 String method = (entry.method.isEmpty()) ? "" : " (" + entry.method + ")
"; | |
160 if (sm != null) { | |
161 OriginalMapping mapping = sm.getMappingForLine(entry.line, entry.colum
n); | |
162 if (mapping != null) { | |
163 String file = mapping.getOriginalFile(); | |
164 int line = mapping.getLineNumber(); | |
165 int column = mapping.getColumnPosition(); | |
166 sb.append(" at MAPPED : " + file + ":" + line + ":" + column + m
ethod + EOL); | |
167 continue; | |
168 } | |
169 } | |
170 sb.append(" at UNMAPPED: " | |
171 + entry.file + ":" + entry.line + ":" + entry.column + method + EOL)
; | |
172 } | |
173 | |
174 return sb.toString(); | |
175 } | |
176 return null; | |
177 } | |
178 | |
179 SourceMapping getSourceMapForFile(String file, SourceMapping map) { | |
180 return map; | |
181 } | |
182 | |
183 static class StackEntry { | |
184 String method; | |
185 String file; | |
186 int line; | |
187 int column; | |
188 } | |
189 | |
190 private List<StackEntry> decodeStackTraceFromString(List<String> lines) { | |
191 List<StackEntry> entries = Lists.newArrayList(); | |
192 | |
193 boolean seenFirst = false; | |
194 for (String str : lines) { | |
195 StackEntry entry = decodeStackEntry(str); | |
196 if (entry == null) { | |
197 if (seenFirst) { | |
198 break; | |
199 } else { | |
200 continue; | |
201 } | |
202 } else { | |
203 seenFirst = true; | |
204 } | |
205 entries.add(entry); | |
206 } | |
207 | |
208 return entries.isEmpty() ? null : entries; | |
209 } | |
210 | |
211 private StackEntry decodeStackEntry(String str) { | |
212 final String PREFIX = " at "; | |
213 if (str.startsWith(PREFIX)) { | |
214 StackEntry entry = new StackEntry(); | |
215 int start = str.indexOf("("); | |
216 int end = str.indexOf(")"); | |
217 entry.method = ""; | |
218 String location; | |
219 if (start == -1) { | |
220 location = str.substring(PREFIX.length()); | |
221 } else { | |
222 entry.method = str.substring(7, start-1); | |
223 location = str.substring(start+1, end); | |
224 } | |
225 return decodeLocation(entry, location); | |
226 } | |
227 return null; | |
228 } | |
229 | |
230 private StackEntry decodeLocation(StackEntry entry, String location) { | |
231 String[] parts = location.split(":"); | |
232 if (parts.length >= 3) { | |
233 String file = parts[0]; | |
234 for (int i = 1; i <= parts.length-3; i++) { | |
235 file += ":" + parts[i]; | |
236 } | |
237 entry.file = file; | |
238 entry.line = Integer.valueOf(parts[parts.length - 2]); | |
239 entry.column = Integer.valueOf(parts[parts.length - 1]); | |
240 return entry; | |
241 } | |
242 return null; | |
243 } | |
244 | |
245 private File writeTempFile(String name, String content) throws IOException { | 139 private File writeTempFile(String name, String content) throws IOException { |
246 // The first argument to createTempFile must be at least three characters lo
ng, and be a | 140 // The first argument to createTempFile must be at least three characters lo
ng, and be a |
247 // valid file-name. | 141 // valid file-name. |
248 name = name.replace('/', '_'); | 142 name = name.replace('/', '_'); |
249 File file = File.createTempFile("dart_" + name, ".js"); | 143 File file = File.createTempFile("dart_" + name, ".js"); |
250 FileWriter writer = new FileWriter(file); | 144 FileWriter writer = new FileWriter(file); |
251 try { | 145 try { |
252 writer.write(content); | 146 writer.write(content); |
253 } finally { | 147 } finally { |
254 writer.close(); | 148 writer.close(); |
(...skipping 20 matching lines...) Expand all Loading... |
275 * @return true if the D8_EXEC environment variable is correctly set up. | 169 * @return true if the D8_EXEC environment variable is correctly set up. |
276 */ | 170 */ |
277 public static boolean isConfigured() { | 171 public static boolean isConfigured() { |
278 File file = v8Executable(); | 172 File file = v8Executable(); |
279 if (file == null) { | 173 if (file == null) { |
280 return false; | 174 return false; |
281 } | 175 } |
282 return file.canExecute(); | 176 return file.canExecute(); |
283 } | 177 } |
284 } | 178 } |
OLD | NEW |