Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: sdk/lib/_internal/compiler/implementation/helpers/trace.dart

Issue 694353007: Move dart2js from sdk/lib/_internal/compiler to pkg/compiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/helpers/trace.dart
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
deleted file mode 100644
index a6bdcf67c2b307ef405b834893223cec8822ca6f..0000000000000000000000000000000000000000
--- a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
+++ /dev/null
@@ -1,333 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.helpers;
-
-/// Function signature for [trace].
-typedef void Trace(String message,
- {bool condition(String stackTrace),
- int limit,
- bool throwOnPrint});
-
-/**
- * Helper method for printing stack traces for debugging.
- *
- * [message] is printed as the header of the stack trace.
- *
- * If [condition] is provided, the stack trace is only printed if [condition]
- * returns [:true:] on the stack trace text. This can be used to filter the
- * printed stack traces based on their content. For instance only print stack
- * traces that contain specific paths.
- *
- * If [limit] is provided, the stack trace is limited to [limit] entries.
- *
- * If [throwOnPrint] is `true`, [message] will be thrown after the stack trace
- * has been printed. Together with [condition] this can be used to discover
- * unknown call-sites in tests by filtering known call-sites and throwning
- * otherwise.
- */
-Trace get trace {
- enableDebugMode();
- return _trace;
-}
-
-void _trace(String message, {bool condition(String stackTrace), int limit,
- bool throwOnPrint: false}) {
- try {
- throw '';
- } catch (e, s) {
- String stackTrace;
- try {
- stackTrace = prettifyStackTrace(
- s, rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix);
- } catch (e) {
- print(e);
- stackTrace = '$s';
- }
- if (condition != null) {
- if (!condition(stackTrace)) return;
- }
- print('$message\n$stackTrace');
- if (throwOnPrint) throw message;
- }
-}
-
-/// Function signature of [traceAndReport].
-typedef void TraceAndReport(Compiler compiler, Spannable node, String message,
- {bool condition(String stackTrace), int limit,
- bool throwOnPrint});
-
-/// Calls [reportHere] and [trace] with the same message.
-TraceAndReport get traceAndReport {
- enableDebugMode();
- return _traceAndReport;
-}
-
-/// Calls [reportHere] and [trace] with the same message.
-TraceAndReport get reportAndTrace => traceAndReport;
-
-/// Implementation of [traceAndReport].
-void _traceAndReport(Compiler compiler, Spannable node, String message,
- {bool condition(String stackTrace), int limit,
- bool throwOnPrint: false}) {
-
- trace(message, limit: limit, throwOnPrint: throwOnPrint,
- condition: (String stackTrace) {
- bool result = condition != null ? condition(stackTrace) : true;
- if (result) {
- reportHere(compiler, node, message);
- }
- return result;
- });
-}
-
-/// Returns the [StackTraceLines] for the current call stack.
-///
-/// Use [offset] to discard the first [offset] calls of the call stack. Defaults
-/// to `1`, that is, discard the call to [stackTrace] itself. Use [limit] to
-/// limit the length of the stack trace lines.
-StackTraceLines stackTrace({int offset: 1,
- int limit: null}) {
- int rangeStart = offset;
- int rangeEnd = limit == null ? null : rangeStart + limit;
- try {
- throw '';
- } catch (_, stackTrace) {
- return new StackTraceLines.fromTrace(stackTrace,
- rangeStart: offset, rangeEnd: rangeEnd,
- filePrefix: stackTraceFilePrefix);
- }
- return null;
-}
-
-/// A stack trace as a sequence of [StackTraceLine]s.
-class StackTraceLines {
- final List<StackTraceLine> lines;
- final int maxFileLength;
- final int maxLineNoLength;
- final int maxColumnNoLength;
-
- factory StackTraceLines.fromTrace(StackTrace s,
- {int rangeStart,
- int rangeEnd,
- String filePrefix,
- String lambda: r'?'}) {
- final RegExp indexPattern = new RegExp(r'#\d+\s*');
- int index = -1;
- int maxFileLength = 0;
- int maxLineNoLength = 0;
- int maxColumnNoLength = 0;
-
- String stackTrace = '$s';
- List<StackTraceLine> lines = <StackTraceLine>[];
- // Parse each line in the stack trace. The supported line formats from the
- // Dart VM are:
- // #n <method-name> (<uri>:<line-no>:<column-no>)
- // #n <method-name> (<uri>:<line-no>)
- // in which '<anonymous closure>' is the name used for an (unnamed) function
- // expression.
- for (String line in stackTrace.split('\n')) {
- try {
- index++;
- if (rangeStart != null && index < rangeStart) continue;
- if (rangeEnd != null && index > rangeEnd) break;
- if (line.isEmpty) continue;
-
- // Strip index.
- line = line.replaceFirst(indexPattern, '');
-
- int leftParenPos = line.indexOf('(');
- int rightParenPos = line.indexOf(')', leftParenPos);
- int lastColon = line.lastIndexOf(':', rightParenPos);
- int nextToLastColon = line.lastIndexOf(':', lastColon-1);
-
- String lineNo;
- String columnNo;
- if (nextToLastColon != -1) {
- lineNo = line.substring(nextToLastColon+1, lastColon);
- columnNo = line.substring(lastColon+1, rightParenPos);
- try {
- int.parse(lineNo);
- } on FormatException catch (e) {
- lineNo = columnNo;
- columnNo = '';
- nextToLastColon = lastColon;
- }
- } else {
- lineNo = line.substring(lastColon+1, rightParenPos);
- columnNo = '';
- nextToLastColon = lastColon;
- }
-
- if (lineNo.length > maxLineNoLength) {
- maxLineNoLength = lineNo.length;
- }
- if (columnNo.length > maxColumnNoLength) {
- maxColumnNoLength = columnNo.length;
- }
-
- String file = line.substring(leftParenPos+1, nextToLastColon);
- if (filePrefix != null && file.startsWith(filePrefix)) {
- file = file.substring(filePrefix.length);
- }
- if (file.length > maxFileLength) {
- maxFileLength = file.length;
- }
- String method = line.substring(0, leftParenPos-1);
- if (lambda != null) {
- method = method.replaceAll('<anonymous closure>', lambda);
- }
- lines.add(new StackTraceLine(index, file, lineNo, columnNo, method));
- } catch (e) {
- throw 'Error prettifying "$line": $e';
- }
- }
- return new StackTraceLines.fromLines(
- lines, maxFileLength, maxLineNoLength, maxColumnNoLength);
- }
-
- StackTraceLines.fromLines(this.lines,
- this.maxFileLength,
- this.maxLineNoLength,
- this.maxColumnNoLength);
-
- StackTraceLines subtrace(int offset) {
- return new StackTraceLines.fromLines(
- lines.sublist(offset),
- maxFileLength,
- maxLineNoLength,
- maxColumnNoLength);
- }
-
- String prettify({bool showColumnNo: false,
- bool showDots: true}) {
- StringBuffer sb = new StringBuffer();
- bool dots = true;
- for (StackTraceLine line in lines) {
- sb.write(' ');
- line.printOn(sb,
- fileLength: maxFileLength,
- padding: showDots && dots ? ' .' : ' ',
- lineNoLength: maxLineNoLength,
- showColumnNo: showColumnNo,
- columnNoLength: maxColumnNoLength);
-
- dots = !dots;
- }
- return sb.toString();
- }
-
- String toString() {
- return prettify();
- }
-}
-
-/// A parsed line from a stack trace.
-class StackTraceLine {
- final int index;
- final String file;
- final String lineNo;
- final String columnNo;
- final String method;
-
- StackTraceLine(this.index, this.file, this.lineNo,
- this.columnNo, this.method);
-
- void printOn(StringBuffer sb,
- {String padding: ' ',
- int fileLength,
- int lineNoLength,
- int columnNoLength,
- bool showColumnNo: false}) {
- String fileText = '${file} ';
- if (fileLength != null) {
- fileText = pad(fileText, fileLength, dots: padding);
- }
- String lineNoText = lineNo;
- if (lineNoLength != null) {
- lineNoText = pad(lineNoText, lineNoLength, padLeft: true);
- }
- String columnNoText = showColumnNo ? '': columnNo;
- if (columnNoLength != null) {
- columnNoText = ':${pad(columnNoText, columnNoLength)}';
- }
- sb.write('$fileText $lineNoText$columnNoText $method\n');
- }
-
- int get hashCode {
- return 13 * index +
- 17 * file.hashCode +
- 19 * lineNo.hashCode +
- 23 * columnNo.hashCode +
- 29 * method.hashCode;
- }
-
- bool operator ==(other) {
- if (identical(this, other)) return true;
- if (other is! StackTraceLine) return false;
- return index == other.index &&
- file == other.file &&
- lineNo == other.lineNo &&
- columnNo == other.columnNo &&
- method == other.method;
- }
-
- String toString() => "$method @ $file [$lineNo:$columnNo]";
-}
-
-// TODO(johnniwinther): Use this format for --throw-on-error.
-/**
- * Converts the normal VM stack trace into a more compact and readable format.
- *
- * The output format is [: <file> . . . <lineNo>:<columnNo> <method> :] where
- * [: <file> :] is file name, [: <lineNo> :] is the line number,
- * [: <columnNo> :] is the column number, and [: <method> :] is the method name.
- *
- * If [rangeStart] and/or [rangeEnd] are provided, only the lines within the
- * range are included.
- * If [showColumnNo] is [:false:], the [: :<columnNo> :] part is omitted.
- * If [showDots] is [:true:], the space between [: <file> :] and [: <lineNo> :]
- * is padded with dots on every other line.
- * If [filePrefix] is provided, then for every file name thats starts with
- * [filePrefix] only the remainder is printed.
- * If [lambda] is non-null, anonymous closures are printed as [lambda].
- */
-String prettifyStackTrace(StackTrace stackTrace,
- {int rangeStart,
- int rangeEnd,
- bool showColumnNo: false,
- bool showDots: true,
- String filePrefix,
- String lambda: r'?'}) {
- return new StackTraceLines.fromTrace(stackTrace,
- rangeStart: rangeStart, rangeEnd: rangeEnd,
- filePrefix: filePrefix, lambda: lambda)
- .prettify(showColumnNo: showColumnNo, showDots: showDots);
-}
-
-/**
- * Pads (or truncates) [text] to the [intendedLength].
- *
- * If [padLeft] is [:true:] the text is padding inserted to the left of [text].
- * A repetition of the [dots] text is used for padding.
- */
-String pad(String text, int intendedLength,
- {bool padLeft: false, String dots: ' '}) {
- if (text.length == intendedLength) return text;
- if (text.length > intendedLength) return text.substring(0, intendedLength);
- if (dots == null || dots.isEmpty) dots = ' ';
- int dotsLength = dots.length;
- StringBuffer sb = new StringBuffer();
- if (!padLeft) {
- sb.write(text);
- }
- for (int index = text.length ; index < intendedLength ; index ++) {
- int dotsIndex = index % dotsLength;
- sb.write(dots.substring(dotsIndex, dotsIndex + 1));
- }
- if (padLeft) {
- sb.write(text);
- }
- return sb.toString();
-}

Powered by Google App Engine
This is Rietveld 408576698