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

Side by Side Diff: runtime/bin/builtin.dart

Issue 1264413002: - Implement resource loading via the Resource class. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Simplify Stream creation. Created 5 years, 4 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
« no previous file with comments | « no previous file | runtime/lib/core_patch.dart » ('j') | runtime/lib/resource_patch.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 builtin; 5 library builtin;
6 // NOTE: Do not import 'dart:io' in builtin. 6 // NOTE: Do not import 'dart:io' in builtin.
7 import 'dart:async';
7 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:_internal';
8 import 'dart:isolate'; 10 import 'dart:isolate';
9 import 'dart:typed_data'; 11 import 'dart:typed_data';
10 12
13
14 // Before handling an embedder entrypoint we finalize the setup of the
15 // dart:_builtin library.
16 bool _setupCompleted = false;
17
18
11 // The root library (aka the script) is imported into this library. The 19 // The root library (aka the script) is imported into this library. The
12 // standalone embedder uses this to lookup the main entrypoint in the 20 // standalone embedder uses this to lookup the main entrypoint in the
13 // root library's namespace. 21 // root library's namespace.
14 Function _getMainClosure() => main; 22 Function _getMainClosure() => main;
15 23
16 24
17 // 'print' implementation. 25 // 'print' implementation.
18 // The standalone embedder registers the closurized _print function with the 26 // The standalone embedder registers the closurized _print function with the
19 // dart:core library. 27 // dart:core library.
20 void _printString(String s) native "Builtin_PrintString"; 28 void _printString(String s) native "Builtin_PrintString";
(...skipping 21 matching lines...) Expand all
42 } 50 }
43 51
44 52
45 _getUriBaseClosure() => _uriBase; 53 _getUriBaseClosure() => _uriBase;
46 54
47 55
48 // Asynchronous loading of resources. 56 // Asynchronous loading of resources.
49 // The embedder forwards most loading requests to this library. 57 // The embedder forwards most loading requests to this library.
50 58
51 // See Dart_LibraryTag in dart_api.h 59 // See Dart_LibraryTag in dart_api.h
52 const Dart_kScriptTag = null; 60 const _Dart_kScriptTag = null;
53 const Dart_kImportTag = 0; 61 const _Dart_kImportTag = 0;
54 const Dart_kSourceTag = 1; 62 const _Dart_kSourceTag = 1;
55 const Dart_kCanonicalizeUrl = 2; 63 const _Dart_kCanonicalizeUrl = 2;
64 const _Dart_kResourceLoad = 3;
56 65
57 // Embedder sets this to true if the --trace-loading flag was passed on the 66 // Embedder sets this to true if the --trace-loading flag was passed on the
58 // command line. 67 // command line.
59 bool _traceLoading = false; 68 bool _traceLoading = false;
60 69
61 // A port for communicating with the service isolate for I/O. 70 // A port for communicating with the service isolate for I/O.
62 SendPort _loadPort; 71 SendPort _loadPort;
63 // The receive port for a load request. Multiple sources can be fetched in 72 // The receive port for a load request. Multiple sources can be fetched in
64 // a single load request. 73 // a single load request.
65 RawReceivePort _receivePort; 74 RawReceivePort _receivePort;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 _LoadError(this.uri, this.message); 121 _LoadError(this.uri, this.message);
113 122
114 String toString() => 'Load Error for "$uri": $message'; 123 String toString() => 'Load Error for "$uri": $message';
115 } 124 }
116 125
117 // Class collecting all of the information about a particular load request. 126 // Class collecting all of the information about a particular load request.
118 class _LoadRequest { 127 class _LoadRequest {
119 final int _id; 128 final int _id;
120 final int _tag; 129 final int _tag;
121 final String _uri; 130 final String _uri;
122 final String _libraryUri;
123 final Uri _resourceUri; 131 final Uri _resourceUri;
132 final _context;
124 133
125 _LoadRequest(this._id, 134 _LoadRequest(this._id,
126 this._tag, 135 this._tag,
127 this._uri, 136 this._uri,
128 this._libraryUri, 137 this._resourceUri,
129 this._resourceUri); 138 this._context);
130 139
131 toString() => "LoadRequest($_id, $_tag, $_uri, $_libraryUri, $_resourceUri)"; 140 toString() => "LoadRequest($_id, $_tag, $_uri, $_resourceUri, $_context)";
132 } 141 }
133 142
134 143
135 // Native calls provided by the embedder. 144 // Native calls provided by the embedder.
136 void _signalDoneLoading() native "Builtin_DoneLoading"; 145 void _signalDoneLoading() native "Builtin_DoneLoading";
137 void _loadScriptCallback(int tag, String uri, String libraryUri, Uint8List data) 146 void _loadScriptCallback(int tag, String uri, String libraryUri, Uint8List data)
138 native "Builtin_LoadSource"; 147 native "Builtin_LoadSource";
139 void _asyncLoadErrorCallback(uri, libraryUri, error) 148 void _asyncLoadErrorCallback(uri, libraryUri, error)
140 native "Builtin_AsyncLoadError"; 149 native "Builtin_AsyncLoadError";
141 150
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 if (!uri.endsWith('/')) { 197 if (!uri.endsWith('/')) {
189 return '$uri/'; 198 return '$uri/';
190 } 199 }
191 return uri; 200 return uri;
192 } 201 }
193 202
194 203
195 // Embedder Entrypoint: 204 // Embedder Entrypoint:
196 // The embedder calls this method with the current working directory. 205 // The embedder calls this method with the current working directory.
197 void _setWorkingDirectory(cwd) { 206 void _setWorkingDirectory(cwd) {
207 if (!_setupCompleted) {
208 _setupHooks();
209 }
198 if (_traceLoading) { 210 if (_traceLoading) {
199 _log('Setting working directory: $cwd'); 211 _log('Setting working directory: $cwd');
200 } 212 }
201 _workingDirectory = new Uri.directory(cwd); 213 _workingDirectory = new Uri.directory(cwd);
202 if (_traceLoading) { 214 if (_traceLoading) {
203 _log('Working directory URI: $_workingDirectory'); 215 _log('Working directory URI: $_workingDirectory');
204 } 216 }
205 } 217 }
206 218
207 219
208 // Embedder Entrypoint: 220 // Embedder Entrypoint:
209 // The embedder calls this method with a custom package root. 221 // The embedder calls this method with a custom package root.
210 _setPackageRoot(String packageRoot) { 222 _setPackageRoot(String packageRoot) {
223 if (!_setupCompleted) {
224 _setupHooks();
225 }
211 if (_traceLoading) { 226 if (_traceLoading) {
212 _log('Setting package root: $packageRoot'); 227 _log('Setting package root: $packageRoot');
213 } 228 }
214 packageRoot = _enforceTrailingSlash(packageRoot); 229 packageRoot = _enforceTrailingSlash(packageRoot);
215 if (packageRoot.startsWith('file:') || 230 if (packageRoot.startsWith('file:') ||
216 packageRoot.startsWith('http:') || 231 packageRoot.startsWith('http:') ||
217 packageRoot.startsWith('https:')) { 232 packageRoot.startsWith('https:')) {
218 _packageRoot = _workingDirectory.resolve(packageRoot); 233 _packageRoot = _workingDirectory.resolve(packageRoot);
219 } else { 234 } else {
220 packageRoot = _sanitizeWindowsPath(packageRoot); 235 packageRoot = _sanitizeWindowsPath(packageRoot);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 } 331 }
317 332
318 333
319 void _handleLoaderReply(msg) { 334 void _handleLoaderReply(msg) {
320 int id = msg[0]; 335 int id = msg[0];
321 var dataOrError = msg[1]; 336 var dataOrError = msg[1];
322 assert((id >= 0) && (id < _reqId)); 337 assert((id >= 0) && (id < _reqId));
323 var req = _reqMap[id]; 338 var req = _reqMap[id];
324 try { 339 try {
325 if (dataOrError is Uint8List) { 340 if (dataOrError is Uint8List) {
326 _loadScript(req, dataOrError); 341 // Successfully loaded the data.
342 if (req._tag == _Dart_kResourceLoad) {
343 Completer c = req._context;
344 c.complete(dataOrError);
345 } else {
346 // TODO: Currently a compilation error while loading the script is
347 // fatal for the isolate. _loadScriptCallback() does not return and
348 // the number of requests remains out of sync.
349 _loadScriptCallback(req._tag, req._uri, req._context, dataOrError);
350 }
351 _finishLoadRequest(req);
327 } else { 352 } else {
328 assert(dataOrError is String); 353 assert(dataOrError is String);
329 var error = new _LoadError(req._uri, dataOrError.toString()); 354 var error = new _LoadError(req._uri, dataOrError.toString());
330 _asyncLoadError(req, error); 355 _asyncLoadError(req, error);
331 } 356 }
332 } catch(e, s) { 357 } catch(e, s) {
333 // Wrap inside a _LoadError unless we are already propagating a 358 // Wrap inside a _LoadError unless we are already propagating a
334 // previous _LoadError. 359 // previous _LoadError.
335 var error = (e is _LoadError) ? e : new _LoadError(req._uri, e.toString()); 360 var error = (e is _LoadError) ? e : new _LoadError(req._uri, e.toString());
336 assert(req != null); 361 assert(req != null);
337 _asyncLoadError(req, error); 362 _asyncLoadError(req, error);
338 } 363 }
339 } 364 }
340 365
341 366
342 void _startLoadRequest(int tag, 367 void _startLoadRequest(int tag, String uri, Uri resourceUri, context) {
343 String uri,
344 String libraryUri,
345 Uri resourceUri) {
346 if (_receivePort == null) { 368 if (_receivePort == null) {
347 if (_traceLoading) { 369 if (_traceLoading) {
348 _log("Initializing load port."); 370 _log("Initializing load port.");
349 } 371 }
350 assert(_receivePort == null); 372 assert(_receivePort == null);
351 assert(_sendPort == null); 373 assert(_sendPort == null);
352 _receivePort = new RawReceivePort(_handleLoaderReply); 374 _receivePort = new RawReceivePort(_handleLoaderReply);
353 _sendPort = _receivePort.sendPort; 375 _sendPort = _receivePort.sendPort;
354 } 376 }
355 // Register the load request and send it to the VM service isolate. 377 // Register the load request and send it to the VM service isolate.
356 var curId = _reqId++; 378 var curId = _reqId++;
357 379
358 assert(_reqMap[curId] == null); 380 assert(_reqMap[curId] == null);
359 _reqMap[curId] = new _LoadRequest(curId, tag, uri, libraryUri, resourceUri); 381 _reqMap[curId] = new _LoadRequest(curId, tag, uri, resourceUri, context);
360 382
361 assert(_receivePort != null); 383 assert(_receivePort != null);
362 assert(_sendPort != null); 384 assert(_sendPort != null);
363 385
364 var msg = new List(4); 386 var msg = new List(4);
365 msg[0] = _sendPort; 387 msg[0] = _sendPort;
366 msg[1] = _traceLoading; 388 msg[1] = _traceLoading;
367 msg[2] = curId; 389 msg[2] = curId;
368 msg[3] = resourceUri.toString(); 390 msg[3] = resourceUri.toString();
369 _loadPort.send(msg); 391 _loadPort.send(msg);
370 392
371 if (_traceLoading) { 393 if (_traceLoading) {
372 _log("Loading of $resourceUri for $uri started with id: $curId, " 394 _log("Loading of $resourceUri for $uri started with id: $curId. "
373 "${_reqMap.length} requests outstanding"); 395 "${_reqMap.length} requests remaining, "
396 "${_pendingPackageLoads.length} packages pending.");
374 } 397 }
375 } 398 }
376 399
377 400
378 RawReceivePort _packagesPort; 401 RawReceivePort _packagesPort;
379 402
380 void _handlePackagesReply(msg) { 403 void _handlePackagesReply(msg) {
381 // Make sure to close the _packagePort before any other action. 404 // Make sure to close the _packagePort before any other action.
382 _packagesPort.close(); 405 _packagesPort.close();
383 406
(...skipping 17 matching lines...) Expand all
401 for (var i = 0; i < msg.length; i+=2) { 424 for (var i = 0; i < msg.length; i+=2) {
402 // TODO(iposva): Complain about duplicate entries. 425 // TODO(iposva): Complain about duplicate entries.
403 _packageMap[msg[i]] = Uri.parse(msg[i+1]); 426 _packageMap[msg[i]] = Uri.parse(msg[i+1]);
404 } 427 }
405 if (_traceLoading) { 428 if (_traceLoading) {
406 _log("Setup package map: $_packageMap"); 429 _log("Setup package map: $_packageMap");
407 } 430 }
408 } 431 }
409 432
410 // Resolve all pending package loads now that we know how to resolve them. 433 // Resolve all pending package loads now that we know how to resolve them.
411 for (var i = 0; i < _pendingPackageLoads.length; i++) { 434 while (_pendingPackageLoads.length > 0) {
412 var req = _pendingPackageLoads[i]; 435 var req = _pendingPackageLoads.removeLast();
413 if (req != null) { 436 if (req != null) {
414 if (_traceLoading) { 437 if (_traceLoading) {
415 _log("Handling deferred load request: $req"); 438 _log("Handling deferred load request: $req");
416 } 439 }
417 _loadPackage(req._tag, req._uri, req._libraryUri, req._resourceUri); 440 _loadPackage(req._tag, req._uri, req._resourceUri, req._context);
441 } else {
442 if (_traceLoading) {
443 _log("Skipping dummy deferred request.");
444 }
418 } 445 }
419 } 446 }
420 // Reset the pending package loads to empty. So that we eventually can 447 // Reset the pending package loads to empty. So that we eventually can
421 // finish loading. 448 // finish loading.
422 _pendingPackageLoads = []; 449 _pendingPackageLoads = [];
423 } 450 }
424 451
425 452
426 void _requestPackagesMap() { 453 void _requestPackagesMap() {
427 assert(_packagesPort == null); 454 assert(_packagesPort == null);
(...skipping 11 matching lines...) Expand all
439 466
440 if (_traceLoading) { 467 if (_traceLoading) {
441 _log("Requested packages map for '$_rootScript'."); 468 _log("Requested packages map for '$_rootScript'.");
442 } 469 }
443 } 470 }
444 471
445 472
446 // Embedder Entrypoint: 473 // Embedder Entrypoint:
447 // Request the load of a particular packages map. 474 // Request the load of a particular packages map.
448 void _loadPackagesMap(String packagesParam) { 475 void _loadPackagesMap(String packagesParam) {
476 if (!_setupCompleted) {
477 _setupHooks();
478 }
449 // First convert the packages parameter from the command line to a URI which 479 // First convert the packages parameter from the command line to a URI which
450 // can be handled by the loader code. 480 // can be handled by the loader code.
451 // TODO(iposva): Consider refactoring the common code below which is almost 481 // TODO(iposva): Consider refactoring the common code below which is almost
452 // shared with resolution of the root script. 482 // shared with resolution of the root script.
453 if (_traceLoading) { 483 if (_traceLoading) {
454 _log("Resolving packages map: $packagesParam"); 484 _log("Resolving packages map: $packagesParam");
455 } 485 }
456 if (_workingDirectory == null) { 486 if (_workingDirectory == null) {
457 throw 'No current working directory set.'; 487 throw 'No current working directory set.';
458 } 488 }
(...skipping 24 matching lines...) Expand all
483 // Signal that the resolution of the packages map has started. But in this 513 // Signal that the resolution of the packages map has started. But in this
484 // case it is not tied to a particular request. 514 // case it is not tied to a particular request.
485 _pendingPackageLoads.add(null); 515 _pendingPackageLoads.add(null);
486 516
487 if (_traceLoading) { 517 if (_traceLoading) {
488 _log("Requested packages map at '$packagesUri'."); 518 _log("Requested packages map at '$packagesUri'.");
489 } 519 }
490 } 520 }
491 521
492 522
493 void _loadScript(_LoadRequest req, Uint8List data) {
494 // TODO: Currently a compilation error while loading the script is
495 // fatal for the isolate. _loadScriptCallback() does not return and
496 // the number of requests remains out of sync.
497 _loadScriptCallback(req._tag, req._uri, req._libraryUri, data);
498 _finishLoadRequest(req);
499 }
500
501
502 void _asyncLoadError(_LoadRequest req, _LoadError error) { 523 void _asyncLoadError(_LoadRequest req, _LoadError error) {
503 if (_traceLoading) { 524 if (_traceLoading) {
504 _log("_asyncLoadError(${req._uri}), error: $error"); 525 _log("_asyncLoadError(${req._uri}), error: $error");
505 } 526 }
506 var libraryUri = req._libraryUri; 527 var libraryUri = req._context;
507 if (req._tag == Dart_kImportTag) { 528 if (req._tag == _Dart_kImportTag) {
508 // When importing a library, the libraryUri is the imported 529 // When importing a library, the libraryUri is the imported
509 // uri. 530 // uri.
510 libraryUri = req._uri; 531 libraryUri = req._uri;
511 } 532 }
512 _asyncLoadErrorCallback(req._uri, libraryUri, error); 533 _asyncLoadErrorCallback(req._uri, libraryUri, error);
513 _finishLoadRequest(req); 534 _finishLoadRequest(req);
514 } 535 }
515 536
516 537
517 _loadDataFromLoadPort(int tag, 538 _loadDataFromLoadPort(int tag, String uri, Uri resourceUri, context) {
518 String uri,
519 String libraryUri,
520 Uri resourceUri) {
521 try { 539 try {
522 _startLoadRequest(tag, uri, libraryUri, resourceUri); 540 _startLoadRequest(tag, uri, resourceUri, context);
523 } catch (e) { 541 } catch (e, s) {
542 // For resource loads we need to complete with an error.
543 if (tag == _Dart_kResourceLoad) {
544 assert(context is Completer);
545 context.completeError(e, s);
546 }
547
524 if (_traceLoading) { 548 if (_traceLoading) {
525 _log("Exception when communicating with service isolate: $e"); 549 _log("Exception when communicating with service isolate: $e");
526 } 550 }
527 // Wrap inside a _LoadError unless we are already propagating a previously 551 // Wrap inside a _LoadError unless we are already propagating a previously
528 // seen _LoadError. 552 // seen _LoadError.
529 var error = (e is _LoadError) ? e : new _LoadError(e.toString()); 553 var error = (e is _LoadError) ? e : new _LoadError(e.toString());
530 _asyncLoadError(tag, uri, libraryUri, error); 554 _asyncLoadError(tag, uri, context, error);
531 } 555 }
532 } 556 }
533 557
534 558
535 // Loading a package URI needs to first map the package name to a loadable 559 // Loading a package URI needs to first map the package name to a loadable
536 // URI. 560 // URI.
537 _loadPackage(int tag, String uri, String libraryUri, Uri resourceUri) { 561 _loadPackage(int tag, String uri, Uri resourceUri, context) {
538 if (_packagesReady()) { 562 if (_packagesReady()) {
539 _loadData(tag, uri, libraryUri, _resolvePackageUri(resourceUri)); 563 _loadData(tag, uri, _resolvePackageUri(resourceUri), context);
540 } else { 564 } else {
541 if (_pendingPackageLoads.isEmpty) { 565 if (_pendingPackageLoads.isEmpty) {
542 // Package resolution has not been setup yet, and this is the first 566 // Package resolution has not been setup yet, and this is the first
543 // request for package resolution & loading. 567 // request for package resolution & loading.
544 _requestPackagesMap(); 568 _requestPackagesMap();
545 } 569 }
546 var req = new _LoadRequest(-1, tag, uri, libraryUri, resourceUri); 570 var req = new _LoadRequest(-1, tag, uri, resourceUri, context);
547 _pendingPackageLoads.add(req); 571 _pendingPackageLoads.add(req);
548 if (_traceLoading) { 572 if (_traceLoading) {
549 _log("Pending package load of '$uri': " 573 _log("Pending package load of '$uri': "
550 "${_pendingPackageLoads.length} pending"); 574 "${_pendingPackageLoads.length} pending");
551 } 575 }
552 } 576 }
553 } 577 }
554 578
555 579
556 // Load the data associated with the resourceUri. 580 // Load the data associated with the resourceUri.
557 _loadData(int tag, String uri, String libraryUri, Uri resourceUri) { 581 _loadData(int tag, String uri, Uri resourceUri, context) {
558 if (resourceUri.scheme == 'package') { 582 if (resourceUri.scheme == 'package') {
559 // package based uris need to be resolved to the correct loadable location. 583 // package based uris need to be resolved to the correct loadable location.
560 // The logic of which is handled seperately, and then _loadData is called 584 // The logic of which is handled seperately, and then _loadData is called
561 // recursively. 585 // recursively.
562 _loadPackage(tag, uri, libraryUri, resourceUri); 586 _loadPackage(tag, uri, resourceUri, context);
563 } else { 587 } else {
564 _loadDataFromLoadPort(tag, uri, libraryUri, resourceUri); 588 _loadDataFromLoadPort(tag, uri, resourceUri, context);
565 } 589 }
566 } 590 }
567 591
568 592
569 // Embedder Entrypoint: 593 // Embedder Entrypoint:
570 // Asynchronously loads script data through a http[s] or file uri. 594 // Asynchronously loads script data through a http[s] or file uri.
571 _loadDataAsync(int tag, String uri, String libraryUri) { 595 _loadDataAsync(int tag, String uri, String libraryUri) {
596 if (!_setupCompleted) {
597 _setupHooks();
598 }
572 var resourceUri; 599 var resourceUri;
573 if (tag == Dart_kScriptTag) { 600 if (tag == _Dart_kScriptTag) {
574 resourceUri = _resolveScriptUri(uri); 601 resourceUri = _resolveScriptUri(uri);
575 uri = resourceUri.toString(); 602 uri = resourceUri.toString();
576 } else { 603 } else {
577 resourceUri = Uri.parse(uri); 604 resourceUri = Uri.parse(uri);
578 } 605 }
579 _loadData(tag, uri, libraryUri, resourceUri); 606 _loadData(tag, uri, resourceUri, libraryUri);
580 } 607 }
581 608
582 609
583 // Embedder Entrypoint: 610 // Embedder Entrypoint:
584 // Function called by standalone embedder to resolve uris when the VM requests 611 // Function called by standalone embedder to resolve uris when the VM requests
585 // Dart_kCanonicalizeUrl from the tag handler. 612 // Dart_kCanonicalizeUrl from the tag handler.
586 String _resolveUri(String base, String userString) { 613 String _resolveUri(String base, String userString) {
614 if (!_setupCompleted) {
615 _setupHooks();
616 }
587 if (_traceLoading) { 617 if (_traceLoading) {
588 _log('Resolving: $userString from $base'); 618 _log('Resolving: $userString from $base');
589 } 619 }
590 var baseUri = Uri.parse(base); 620 var baseUri = Uri.parse(base);
591 var result; 621 var result;
592 if (userString.startsWith(_DART_EXT)) { 622 if (userString.startsWith(_DART_EXT)) {
593 var uri = userString.substring(_DART_EXT.length); 623 var uri = userString.substring(_DART_EXT.length);
594 result = '$_DART_EXT${baseUri.resolve(uri)}'; 624 result = '$_DART_EXT${baseUri.resolve(uri)}';
595 } else { 625 } else {
596 result = baseUri.resolve(userString).toString(); 626 result = baseUri.resolve(userString).toString();
597 } 627 }
598 if (_traceLoading) { 628 if (_traceLoading) {
599 _log('Resolved $userString in $base to $result'); 629 _log('Resolved $userString in $base to $result');
600 } 630 }
601 return result; 631 return result;
602 } 632 }
603 633
604 634
635 // Handling of Resource class by dispatching to the load port.
636 Future<List<int>> _resourceReadAsBytes(Uri uri) {
637 var completer = new Completer<List<int>>();
638 // Request the load of the resource associating the completer as the context
639 // for the load.
640 _loadData(_Dart_kResourceLoad, uri.toString(), uri, completer);
641 // Return the future that will be triggered once the resource has been loaded.
642 return completer.future;
643 }
644
645
605 // Embedder Entrypoint (gen_snapshot): 646 // Embedder Entrypoint (gen_snapshot):
606 // Resolve relative paths relative to working directory. 647 // Resolve relative paths relative to working directory.
607 String _resolveInWorkingDirectory(String fileName) { 648 String _resolveInWorkingDirectory(String fileName) {
649 if (!_setupCompleted) {
650 _setupHooks();
651 }
608 if (_workingDirectory == null) { 652 if (_workingDirectory == null) {
609 throw 'No current working directory set.'; 653 throw 'No current working directory set.';
610 } 654 }
611 var name = _sanitizeWindowsPath(fileName); 655 var name = _sanitizeWindowsPath(fileName);
612 656
613 var uri = Uri.parse(name); 657 var uri = Uri.parse(name);
614 if (uri.scheme != '') { 658 if (uri.scheme != '') {
615 throw 'Schemes are not supported when resolving filenames.'; 659 throw 'Schemes are not supported when resolving filenames.';
616 } 660 }
617 uri = _workingDirectory.resolveUri(uri); 661 uri = _workingDirectory.resolveUri(uri);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 716
673 // Embedder Entrypoint: 717 // Embedder Entrypoint:
674 // When loading an extension the embedder calls this method to get the 718 // When loading an extension the embedder calls this method to get the
675 // different components. 719 // different components.
676 // Returns the directory part, the filename part, and the name 720 // Returns the directory part, the filename part, and the name
677 // of a native extension URL as a list [directory, filename, name]. 721 // of a native extension URL as a list [directory, filename, name].
678 // The directory part is either a file system path or an HTTP(S) URL. 722 // The directory part is either a file system path or an HTTP(S) URL.
679 // The filename part is the extension name, with the platform-dependent 723 // The filename part is the extension name, with the platform-dependent
680 // prefixes and extensions added. 724 // prefixes and extensions added.
681 _extensionPathFromUri(String userUri) { 725 _extensionPathFromUri(String userUri) {
726 if (!_setupCompleted) {
727 _setupHooks();
728 }
682 if (!userUri.startsWith(_DART_EXT)) { 729 if (!userUri.startsWith(_DART_EXT)) {
683 throw 'Unexpected internal error: Extension URI $userUri missing dart-ext:'; 730 throw 'Unexpected internal error: Extension URI $userUri missing dart-ext:';
684 } 731 }
685 userUri = userUri.substring(_DART_EXT.length); 732 userUri = userUri.substring(_DART_EXT.length);
686 733
687 if (userUri.contains('\\')) { 734 if (userUri.contains('\\')) {
688 throw 'Unexpected internal error: Extension URI $userUri contains \\'; 735 throw 'Unexpected internal error: Extension URI $userUri contains \\';
689 } 736 }
690 737
691 String name; 738 String name;
692 String path; // Will end in '/'. 739 String path; // Will end in '/'.
693 int index = userUri.lastIndexOf('/'); 740 int index = userUri.lastIndexOf('/');
694 if (index == -1) { 741 if (index == -1) {
695 name = userUri; 742 name = userUri;
696 path = './'; 743 path = './';
697 } else if (index == userUri.length - 1) { 744 } else if (index == userUri.length - 1) {
698 throw 'Extension name missing in $extensionUri'; 745 throw 'Extension name missing in $extensionUri';
699 } else { 746 } else {
700 name = userUri.substring(index + 1); 747 name = userUri.substring(index + 1);
701 path = userUri.substring(0, index + 1); 748 path = userUri.substring(0, index + 1);
702 } 749 }
703 750
704 path = _filePathFromUri(path); 751 path = _filePathFromUri(path);
705 var filename = _platformExtensionFileName(name); 752 var filename = _platformExtensionFileName(name);
706 753
707 return [path, filename, name]; 754 return [path, filename, name];
708 } 755 }
756
757
758 //
siva 2015/08/04 21:48:23 Dangling comment start ?
759 _setupHooks() {
760 _setupCompleted = true;
761 VMLibraryHooks.resourceReadAsBytes = _resourceReadAsBytes;
762 }
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/core_patch.dart » ('j') | runtime/lib/resource_patch.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698