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

Side by Side Diff: sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart

Issue 323263002: Load parallel transformers in the same isolate. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 library pub.load_transformers; 5 library pub.load_transformers;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:isolate'; 9 import 'dart:isolate';
10 10
11 import '../../../asset/dart/serialize.dart'; 11 import '../../../asset/dart/serialize.dart';
12 import '../barback.dart'; 12 import '../barback.dart';
13 import '../dart.dart' as dart; 13 import '../dart.dart' as dart;
14 import '../log.dart' as log; 14 import '../log.dart' as log;
15 import '../utils.dart'; 15 import '../utils.dart';
16 import 'asset_environment.dart'; 16 import 'asset_environment.dart';
17 import 'foreign_transformer.dart'; 17 import 'foreign_transformer.dart';
18 import 'barback_server.dart'; 18 import 'barback_server.dart';
19 19
20 /// Load and return all transformers and groups from the library identified by 20 /// Load and return all transformers and groups from the libraries identified by
21 /// [id]. 21 /// [ids].
Bob Nystrom 2014/06/11 20:33:36 Document the return value.
nweiz 2014/06/12 20:11:17 Done.
22 Future<Set> loadTransformers(AssetEnvironment environment, 22 Future<Map<TransformerId, Set>> loadTransformers(AssetEnvironment environment,
23 BarbackServer transformerServer, TransformerId id) { 23 BarbackServer transformerServer, List<TransformerId> ids) {
24 return id.getAssetId(environment.barback).then((assetId) { 24 return listToMapAsync(ids, (id) => id, (id) {
Bob Nystrom 2014/06/11 20:33:35 I think this would be easier to read if these were
nweiz 2014/06/12 20:11:17 Will do in a separate CL.
25 var path = assetId.path.replaceFirst('lib/', ''); 25 return id.getAssetId(environment.barback);
Bob Nystrom 2014/06/11 20:33:35 =>
nweiz 2014/06/12 20:11:17 I had it as that originally, but that followed by
26 // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed. 26 }).then((idsToAssetIds) {
27 var baseUrl = transformerServer.url;
28 var idsToUrls = mapMap(idsToAssetIds, (id, _) => id, (id, assetId) {
29 var path = assetId.path.replaceFirst('lib/', '');
30 // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
31 return baseUrl.resolve('packages/${id.package}/$path');
32 });
27 33
28 var baseUrl = transformerServer.url; 34 var code = new StringBuffer();
29 var uri = baseUrl.resolve('packages/${id.package}/$path'); 35 code.writeln("import 'dart:isolate';");
30 var code = """
31 import 'dart:isolate';
32 36
33 import '$uri'; 37 for (var url in idsToUrls.values) {
38 code.writeln("import '$url';");
39 }
34 40
35 import r'$baseUrl/packages/\$pub/transformer_isolate.dart'; 41 code.writeln("import r'$baseUrl/packages/\$pub/transformer_isolate.dart';");
42 code.writeln(
43 "void main(_, SendPort replyTo) => loadTransformers(replyTo);");
36 44
37 void main(_, SendPort replyTo) => loadTransformers(replyTo); 45 log.fine("Loading transformers from $ids");
38 """;
39 log.fine("Loading transformers from $assetId");
40 46
41 var port = new ReceivePort(); 47 var port = new ReceivePort();
42 return dart.runInIsolate(code, port.sendPort) 48 return dart.runInIsolate(code.toString(), port.sendPort)
43 .then((_) => port.first) 49 .then((_) => port.first)
44 .then((sendPort) { 50 .then((sendPort) {
45 return call(sendPort, { 51 return mapMapAsync(idsToAssetIds, (id, _) => id, (id, assetId) {
46 'library': uri.toString(), 52 return call(sendPort, {
47 'mode': environment.mode.name, 53 'library': idsToUrls[id].toString(),
48 // TODO(nweiz): support non-JSON-encodable configuration maps. 54 'mode': environment.mode.name,
49 'configuration': JSON.encode(id.configuration) 55 // TODO(nweiz): support non-JSON-encodable configuration maps.
50 }).then((transformers) { 56 'configuration': JSON.encode(id.configuration)
51 transformers = transformers.map( 57 }).then((transformers) {
52 (transformer) => deserializeTransformerLike(transformer, id)) 58 transformers = transformers.map(
53 .toSet(); 59 (transformer) => deserializeTransformerLike(transformer, id))
54 log.fine("Transformers from $assetId: $transformers"); 60 .toSet();
55 return transformers; 61 log.fine("Transformers from $assetId: $transformers");
62 return transformers;
63 });
56 }); 64 });
57 }).catchError((error, stackTrace) { 65 }).catchError((error, stackTrace) {
58 if (error is! CrossIsolateException) throw error; 66 if (error is! CrossIsolateException) throw error;
59 if (error.type != 'IsolateSpawnException') throw error; 67 if (error.type != 'IsolateSpawnException') throw error;
68
60 // TODO(nweiz): don't parse this as a string once issues 12617 and 12689 69 // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
61 // are fixed. 70 // are fixed.
62 if (!error.message.split('\n')[1].startsWith("Failure getting $uri:")) { 71 var firstErrorLine = error.message.split('\n')[1];
63 throw error; 72 var missingTransformers = idsToUrls.keys.where((id) =>
64 } 73 firstErrorLine.startsWith("Failure getting ${idsToUrls[id]}:"));
Bob Nystrom 2014/06/11 20:33:36 Will this ever match more than one transformer?
nweiz 2014/06/12 20:11:17 I guess not. Changed.
74 if (missingTransformers.isEmpty) throw error;
75
76 var packageUris = toSentence(missingTransformers.map((id) =>
77 '"${idToPackageUri(idsToAssetIds[id])}"'));
78 var libraries = pluralize('library', missingTransformers.length,
79 plural: 'libraries');
65 80
66 // If there was an IsolateSpawnException and the import that actually 81 // If there was an IsolateSpawnException and the import that actually
67 // failed was the one we were loading transformers from, throw an 82 // failed was the one we were loading transformers from, throw an
68 // application exception with a more user-friendly message. 83 // application exception with a more user-friendly message.
69 fail('Transformer library "package:${id.package}/$path" not found.', 84 fail('Transformer $libraries $packageUris not found.',
70 error, stackTrace); 85 error, stackTrace);
71 }); 86 });
72 }); 87 });
73 } 88 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698