Skip to content

Commit

Permalink
Revert "[dart2js] Migrate dart2js_tools to null safety"
Browse files Browse the repository at this point in the history
This reverts commit 4b1de45.

Reason for revert: Null safety error appears when test fail:
error: Null check operator used on a null value

Original change's description:
> [dart2js] Migrate dart2js_tools to null safety
>
> Change-Id: If93f66f4da2dafb50f58434eb112b1f8af6648c7
> Issue: #46617
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/208363
> Commit-Queue: Nicholas Shahan <nshahan@google.com>
> Reviewed-by: Stephen Adams <sra@google.com>

# Not skipping CQ checks because original CL landed > 1 day ago.

Issue: #46617
Change-Id: I7ef7d95a6715d667698e0dfcb38375fd79b4cc73
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210540
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Nicholas Shahan <nshahan@google.com>
  • Loading branch information
nshahan authored and commit-bot@chromium.org committed Aug 19, 2021
1 parent 37ea0f8 commit 9ae8713
Show file tree
Hide file tree
Showing 12 changed files with 101 additions and 102 deletions.
4 changes: 2 additions & 2 deletions .dart_tool/package_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@
"name": "dart2js_tools",
"rootUri": "../pkg/dart2js_tools",
"packageUri": "lib/",
"languageVersion": "2.12"
"languageVersion": "2.3"
},
{
"name": "dart2native",
Expand Down Expand Up @@ -812,4 +812,4 @@
"languageVersion": "2.12"
}
]
}
}
10 changes: 5 additions & 5 deletions pkg/dart2js_tools/bin/deobfuscate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,24 +47,24 @@ main(List<String> args) {
var sb = new StringBuffer();
try {
String obfuscatedTrace = new File(args[0]).readAsStringSync();
String? error = extractErrorMessage(obfuscatedTrace);
String error = extractErrorMessage(obfuscatedTrace);
var provider = new CachingFileProvider(logger: Logger());
StackDeobfuscationResult result =
deobfuscateStack(obfuscatedTrace, provider);
Frame firstFrame = result.original.frames.first;
String? translatedError =
String translatedError =
translate(error, provider.mappingFor(firstFrame.uri));
if (translatedError == null) translatedError = '<no error message found>';
printPadded(translatedError, error, sb);
int longest =
result.deobfuscated.frames.fold(0, (m, f) => max(f.member!.length, m));
result.deobfuscated.frames.fold(0, (m, f) => max(f.member.length, m));
for (var originalFrame in result.original.frames) {
var deobfuscatedFrames = result.frameMap[originalFrame];
if (deobfuscatedFrames == null) {
printPadded('no mapping', '${originalFrame.location}', sb);
} else {
for (var frame in deobfuscatedFrames) {
printPadded('${frame.member!.padRight(longest)} ${frame.location}',
printPadded('${frame.member.padRight(longest)} ${frame.location}',
'${originalFrame.location}', sb);
}
}
Expand All @@ -77,7 +77,7 @@ main(List<String> args) {
final green = stdout.hasTerminal ? '\x1b[32m' : '';
final none = stdout.hasTerminal ? '\x1b[0m' : '';

printPadded(String mapping, String? original, sb) {
printPadded(String mapping, String original, sb) {
var len = mapping.length;
var s = mapping.indexOf('\n');
if (s >= 0) len -= s + 1;
Expand Down
3 changes: 1 addition & 2 deletions pkg/dart2js_tools/bin/lookup_name.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'dart:io';
import 'dart:convert';
import 'package:source_maps/source_maps.dart';
import 'package:dart2js_tools/src/dart2js_mapping.dart';
import 'package:dart2js_tools/src/util.dart';

main(List<String> args) {
if (args.length < 2) {
Expand All @@ -17,7 +16,7 @@ main(List<String> args) {
exit(1);
}
var json = jsonDecode(sourcemapFile.readAsStringSync());
Dart2jsMapping mapping = Dart2jsMapping(parseSingleMapping(json), json);
Dart2jsMapping mapping = Dart2jsMapping(parseJson(json), json);
var global = mapping.globalNames[name];
if (global != null) print('$name => $global (a global name)');
var instance = mapping.instanceNames[name];
Expand Down
6 changes: 3 additions & 3 deletions pkg/dart2js_tools/bin/show_inline_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ main(List<String> args) {
var offsets = frames.keys.toList()..sort();
var sb = new StringBuffer();
int depth = 0;
int? lastFunctionStart = null;
int lastFunctionStart = null;
for (var offset in offsets) {
int functionStart = nextFunctionStart(starts, offset, lastFunctionStart);
if (lastFunctionStart == null || functionStart > lastFunctionStart) {
Expand All @@ -43,7 +43,7 @@ main(List<String> args) {
var pad = ' ' * offsetPrefix.length;
sb.write(offsetPrefix);
bool first = true;
for (var frame in frames[offset]!) {
for (var frame in frames[offset]) {
if (!first) sb.write('$pad');
sb.write(' $frame\n');
first = false;
Expand Down Expand Up @@ -75,7 +75,7 @@ List<int> functionStarts(String sources) {
return result;
}

int nextFunctionStart(List<int> starts, int offset, int? last) {
int nextFunctionStart(List<int> starts, int offset, int last) {
int j = last ?? 0;
for (; j < starts.length && starts[j] <= offset; j++);
return j - 1;
Expand Down
8 changes: 4 additions & 4 deletions pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import 'package:dart2js_tools/src/trace_decoder.dart';
/// `//# sourceMappingURL=` line at the end, and load the corresponding
/// source-map file.
String deobfuscateStackTrace(String obfuscatedTrace) {
String? error = extractErrorMessage(obfuscatedTrace);
String error = extractErrorMessage(obfuscatedTrace);
var provider = CachingFileProvider();
StackDeobfuscationResult result = deobfuscateStack(obfuscatedTrace, provider);
Frame firstFrame = result.original.frames.first;
Expand All @@ -38,13 +38,13 @@ String deobfuscateStackTrace(String obfuscatedTrace) {

var sb = StringBuffer();
sb.writeln(translatedError);
maxMemberLengthHelper(int m, Frame f) => max(f.member!.length, m);
maxMemberLengthHelper(int m, Frame f) => max(f.member.length, m);
int longest = result.deobfuscated.frames.fold(0, maxMemberLengthHelper);
longest = result.original.frames.fold(longest, maxMemberLengthHelper);
for (var originalFrame in result.original.frames) {
var deobfuscatedFrames = result.frameMap[originalFrame];
if (deobfuscatedFrames == null) {
var name = originalFrame.member!;
var name = originalFrame.member;
sb.writeln(' at ${name.padRight(longest)} ${originalFrame.location}');
} else {
for (var frame in deobfuscatedFrames) {
Expand All @@ -53,7 +53,7 @@ String deobfuscateStackTrace(String obfuscatedTrace) {
// client, we can start encoding the function name and remove this
// workaround.
if (name == '<unknown>') name = originalFrame.member;
sb.writeln(' at ${name!.padRight(longest)} ${frame.location}');
sb.writeln(' at ${name.padRight(longest)} ${frame.location}');
}
}
}
Expand Down
35 changes: 20 additions & 15 deletions pkg/dart2js_tools/lib/src/dart2js_mapping.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,15 @@ class Dart2jsMapping {
final Map<String, String> globalNames = {};
final Map<String, String> instanceNames = {};
final Map<int, List<FrameEntry>> frames = {};
late final List<int>? frameIndex = frames.keys.toList()..sort();
List<int> _frameIndex;
List<int> get frameIndex {
if (_frameIndex == null) {
_frameIndex = frames.keys.toList()..sort();
}
return _frameIndex;
}

Dart2jsMapping(this.sourceMap, Map json, {Logger? logger}) {
Dart2jsMapping(this.sourceMap, Map json, {Logger logger}) {
var extensions = json['x_org_dartlang_dart2js'];
if (extensions == null) return;
var minifiedNames = extensions['minified_names'];
Expand All @@ -35,20 +41,20 @@ class Dart2jsMapping {
_extractMinifedNames(
minifiedNames['instance'], sourceMap, instanceNames, logger);
}
String? jsonFrames = extensions['frames'];
String jsonFrames = extensions['frames'];
if (jsonFrames != null) {
new _FrameDecoder(jsonFrames).parseFrames(frames, sourceMap);
}
}

Dart2jsMapping.json(Map json) : this(parseSingleMapping(json), json);
Dart2jsMapping.json(Map json) : this(parseJson(json), json);
}

class FrameEntry {
final String? callUri;
final int? callLine;
final int? callColumn;
final String? inlinedMethodName;
final String callUri;
final int callLine;
final int callColumn;
final String inlinedMethodName;
final bool isEmpty;
FrameEntry.push(
this.callUri, this.callLine, this.callColumn, this.inlinedMethodName)
Expand All @@ -70,7 +76,7 @@ class FrameEntry {
}

const _marker = "\n//# sourceMappingURL=";
Dart2jsMapping? parseMappingFor(Uri uri, {Logger? logger}) {
Dart2jsMapping parseMappingFor(Uri uri, {Logger logger}) {
var file = new File.fromUri(uri);
if (!file.existsSync()) {
logger?.log('Error: no such file: $uri');
Expand All @@ -94,7 +100,7 @@ Dart2jsMapping? parseMappingFor(Uri uri, {Logger? logger}) {
return null;
}
var json = jsonDecode(sourcemapFile.readAsStringSync());
return new Dart2jsMapping(parseSingleMapping(json), json, logger: logger);
return new Dart2jsMapping(parseJson(json), json, logger: logger);
}

class _FrameDecoder implements Iterator<String> {
Expand All @@ -106,9 +112,8 @@ class _FrameDecoder implements Iterator<String> {
// Iterator API is used by decodeVlq to consume VLQ entries.
bool moveNext() => ++index < _length;

String get current => (index >= 0 && index < _length)
? _internal[index]
: throw StateError('No current value available.');
String get current =>
(index >= 0 && index < _length) ? _internal[index] : null;

bool get hasTokens => index < _length - 1 && _length > 0;

Expand Down Expand Up @@ -146,15 +151,15 @@ class _FrameDecoder implements Iterator<String> {
}

_extractMinifedNames(String encodedInput, SingleMapping sourceMap,
Map<String, String> minifiedNames, Logger? logger) {
Map<String, String> minifiedNames, Logger logger) {
if (encodedInput.isEmpty) return;
List<String> input = encodedInput.split(',');
if (input.length % 2 != 0) {
logger?.log("Error: expected an even number of entries");
}
for (int i = 0; i < input.length; i += 2) {
String minifiedName = input[i];
int id = int.tryParse(input[i + 1])!;
int id = int.tryParse(input[i + 1]);
minifiedNames[minifiedName] = sourceMap.names[id];
}
}
51 changes: 25 additions & 26 deletions pkg/dart2js_tools/lib/src/name_decoder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import 'package:source_maps/source_maps.dart';
import 'dart2js_mapping.dart';
import 'trace.dart';

String? translate(String? error, Dart2jsMapping mapping,
[StackTraceLine? line, TargetEntry? entry]) {
String translate(String error, Dart2jsMapping mapping,
[StackTraceLine line, TargetEntry entry]) {
for (var decoder in _errorMapDecoders) {
var result = decoder.decode(error, mapping, line, entry);
// More than one decoder might be applied on a single error message. This
Expand All @@ -30,10 +30,10 @@ abstract class ErrorMapDecoder {
/// Decode [error] that was reported in [line] and has a corresponding [entry]
/// in the source-map file. The provided [mapping] includes additional
/// minification data that may be used to decode the error message.
String? decode(String? error, Dart2jsMapping mapping, StackTraceLine? line,
TargetEntry? entry) {
String decode(String error, Dart2jsMapping mapping, StackTraceLine line,
TargetEntry entry) {
if (error == null) return null;
Match? lastMatch = null;
Match lastMatch = null;
var result = new StringBuffer();
for (var match in _matcher.allMatches(error)) {
var decodedMatch = _decodeInternal(match, mapping, line, entry);
Expand All @@ -49,8 +49,8 @@ abstract class ErrorMapDecoder {
return '$result';
}

String? _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine? line, TargetEntry? entry);
String _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine line, TargetEntry entry);
}

typedef String ErrorDecoder(Match match, Dart2jsMapping mapping,
Expand All @@ -59,28 +59,28 @@ typedef String ErrorDecoder(Match match, Dart2jsMapping mapping,
class MinifiedNameDecoder extends ErrorMapDecoder {
final RegExp _matcher = new RegExp("minified:([a-zA-Z0-9_\$]*)");

String? _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine? line, TargetEntry? entry) {
String _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine line, TargetEntry entry) {
var minifiedName = match.group(1);
return mapping.globalNames[minifiedName!];
return mapping.globalNames[minifiedName];
}
}

class CannotReadPropertyDecoder extends ErrorMapDecoder {
final RegExp _matcher = new RegExp("Cannot read property '([^']*)' of");

String? _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine? line, TargetEntry? entry) {
String _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine line, TargetEntry entry) {
var minifiedName = match.group(1);
var name = mapping.instanceNames[minifiedName!];
var name = mapping.instanceNames[minifiedName];
if (name == null) return null;
return "Cannot read property '$name' of";
}
}

abstract class NoSuchMethodDecoderBase extends ErrorMapDecoder {
String? _translateMinifiedName(Dart2jsMapping mapping, String? minifiedName) {
var name = mapping.instanceNames[minifiedName!];
String _translateMinifiedName(Dart2jsMapping mapping, String minifiedName) {
var name = mapping.instanceNames[minifiedName];
if (name != null) return "'$name'";
if (minifiedName.startsWith(new RegExp(r'(call)?\$[0-9]'))) {
int first$ = minifiedName.indexOf(r'$');
Expand All @@ -89,15 +89,15 @@ abstract class NoSuchMethodDecoderBase extends ErrorMapDecoder {
return null;
}

String? _expandCallSignature(String callSignature) {
String _expandCallSignature(String callSignature) {
// Minified names are one of these forms:
// $0 // positional arguments only
// $1$2 // type parameters and positional arguments
// $3$name // positional and named arguments
// $1$3$name // type parameters and positional and named args
var signature = callSignature.split(r'$');
int? typeArgs = null;
int? totalArgs = null;
var typeArgs = null;
var totalArgs = null;
var namedArgs = <String>[];
for (var arg in signature) {
if (arg == "") continue;
Expand All @@ -115,7 +115,6 @@ abstract class NoSuchMethodDecoderBase extends ErrorMapDecoder {
namedArgs.add(arg);
}
}
if (totalArgs == null) return null;
var sb = new StringBuffer();
sb.write("'call'");
sb.write(" (with ");
Expand All @@ -137,8 +136,8 @@ class NoSuchMethodDecoder1 extends NoSuchMethodDecoderBase {
final RegExp _matcher = new RegExp(
"NoSuchMethodError: method not found: '([^']*)'( on [^\\(]*)? \\(.*\\)");

String? _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine? line, TargetEntry? entry) {
String _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine line, TargetEntry entry) {
var minifiedName = match.group(1);
var suffix = match.group(2) ?? '';
var name = _translateMinifiedName(mapping, minifiedName);
Expand All @@ -151,8 +150,8 @@ class NoSuchMethodDecoder2 extends NoSuchMethodDecoderBase {
final RegExp _matcher =
new RegExp("NoSuchMethodError: method not found: '([^']*)'");

String? _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine? line, TargetEntry? entry) {
String _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine line, TargetEntry entry) {
var minifiedName = match.group(1);
var name = _translateMinifiedName(mapping, minifiedName);
if (name == null) return null;
Expand All @@ -163,10 +162,10 @@ class NoSuchMethodDecoder2 extends NoSuchMethodDecoderBase {
class UnhandledNotAFunctionError extends ErrorMapDecoder {
final RegExp _matcher = new RegExp("Error: ([^']*) is not a function");

String? _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine? line, TargetEntry? entry) {
String _decodeInternal(Match match, Dart2jsMapping mapping,
StackTraceLine line, TargetEntry entry) {
var minifiedName = match.group(1);
var name = mapping.instanceNames[minifiedName!];
var name = mapping.instanceNames[minifiedName];
if (name == null) return null;
return "Error: $name is not a function";
}
Expand Down
8 changes: 4 additions & 4 deletions pkg/dart2js_tools/lib/src/sourcemap_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import 'util.dart' show FileProvider;

/// Search backwards in [sources] for a function declaration that includes the
/// [start] offset.
TargetEntry? findEnclosingFunction(FileProvider provider, Uri uri, int start) {
TargetEntry findEnclosingFunction(FileProvider provider, Uri uri, int start) {
String sources = provider.sourcesFor(uri);
if (sources == null) return null;
SourceFile file = provider.fileFor(uri);
Expand All @@ -22,7 +22,7 @@ TargetEntry? findEnclosingFunction(FileProvider provider, Uri uri, int start) {
var line = file.getLine(index);
var lineEntry = findLine(mapping, line);
var column = file.getColumn(index);
TargetEntry? result = findColumn(line, column, lineEntry);
TargetEntry result = findColumn(line, column, lineEntry);
// If the name entry doesn't start exactly at the column corresponding to
// `index`, we must be in the middle of a string or code that uses the word
// "function", but that doesn't have a corresponding mapping. In those
Expand Down Expand Up @@ -61,7 +61,7 @@ int nextDeclarationCandidate(String sources, int start) {
/// number is lower or equal to [line].
///
/// Copied from [SingleMapping._findLine].
TargetLineEntry? findLine(SingleMapping sourceMap, int line) {
TargetLineEntry findLine(SingleMapping sourceMap, int line) {
int index = binarySearch(sourceMap.lines, (e) => e.line > line);
return (index <= 0) ? null : sourceMap.lines[index - 1];
}
Expand All @@ -73,7 +73,7 @@ TargetLineEntry? findLine(SingleMapping sourceMap, int line) {
/// the very last entry on that line.
///
/// Copied from [SingleMapping._findColumn].
TargetEntry? findColumn(int line, int column, TargetLineEntry? lineEntry) {
TargetEntry findColumn(int line, int column, TargetLineEntry lineEntry) {
if (lineEntry == null || lineEntry.entries.length == 0) return null;
if (lineEntry.line != line) return lineEntry.entries.last;
var entries = lineEntry.entries;
Expand Down
Loading

0 comments on commit 9ae8713

Please sign in to comment.