Chromium Code Reviews| Index: runtime/bin/builtin.dart | 
| diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart | 
| index 716ec71c3a0cff95b97e457f1104fe1d9057ca08..ba3a3fd7c807790c7952c2a8f18a4d7a4321dbfa 100644 | 
| --- a/runtime/bin/builtin.dart | 
| +++ b/runtime/bin/builtin.dart | 
| @@ -5,6 +5,28 @@ | 
| library builtin; | 
| import 'dart:io'; | 
| +// Corelib 'print' implementation. | 
| +void _print(arg) { | 
| + _Logger._printString(arg.toString()); | 
| +} | 
| + | 
| + | 
| +class _Logger { | 
| + static void _printString(String s) native "Logger_PrintString"; | 
| +} | 
| + | 
| + | 
| +_getPrintClosure() => _print; | 
| + | 
| + | 
| +void _logResolution(String msg) { | 
| + final enabled = false; | 
| + if (enabled) { | 
| + _Logger._printString(msg); | 
| + } | 
| +} | 
| + | 
| + | 
| int _httpRequestResponseCode = 0; | 
| String _httpRequestStatusString; | 
| var _httpRequestResponse; | 
| @@ -13,18 +35,20 @@ void _requestCompleted(HttpClientResponseBody body) { | 
| _httpRequestResponseCode = body.statusCode; | 
| _httpRequestStatusString = '${body.statusCode} ${body.reasonPhrase}'; | 
| _httpRequestResponse = null; | 
| - if (body.statusCode != 200 || body.type == "json") { | 
| + if (body.statusCode != 200 || body.type == 'json') { | 
| return; | 
| } | 
| _httpRequestResponse = body.body; | 
| } | 
| + | 
| void _requestFailed(error) { | 
| _httpRequestResponseCode = 0; | 
| _httpRequestStatusString = error.toString(); | 
| _httpRequestResponse = null; | 
| } | 
| + | 
| HttpClient _client = new HttpClient(); | 
| void _makeHttpRequest(String uri) { | 
| _httpRequestResponseCode = 0; | 
| @@ -41,76 +65,70 @@ void _makeHttpRequest(String uri) { | 
| }); | 
| } | 
| -// Corelib 'print' implementation. | 
| -void _print(arg) { | 
| - _Logger._printString(arg.toString()); | 
| -} | 
| +// Are we running on Windows? | 
| +bool _isWindows = false; | 
| 
 
Ivan Posva
2013/06/05 23:11:07
Please set this using a function.
 
Cutch
2013/06/12 19:34:26
Done.
 
 | 
| -class _Logger { | 
| - static void _printString(String s) native "Logger_PrintString"; | 
| +// The current working directory | 
| +String _workingDirectory; | 
| 
 
Ivan Posva
2013/06/05 23:11:07
Redundant data stored here.
 
Cutch
2013/06/12 19:34:26
Done.
 
 | 
| +Uri _workingDirectoryUri; | 
| + | 
| +void _setWorkingDirectory(cwd) { | 
| + if (_isWindows) { | 
| + // For Windows we need to massage the paths a bit according to | 
| + // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx | 
| + // | 
| + // Convert | 
| + // C:\one\two\three | 
| + // to | 
| + // /C:/one/two/three | 
| + cwd = "/${cwd.replaceAll('\\', '/')}"; | 
| + } | 
| + | 
| + // Ensure we have a trailing slash character. | 
| + if (cwd.endsWith('/')) { | 
| + _workingDirectory = cwd; | 
| + } else { | 
| + _workingDirectory = '$cwd/'; | 
| + } | 
| + _workingDirectoryUri = new Uri(scheme: 'file', path: _workingDirectory); | 
| + _logResolution('# Working Directory: $_workingDirectory'); | 
| } | 
| -_getPrintClosure() => _print; | 
| -// The URI that the entrypoint script was loaded from. Remembered so that | 
| +// The URI that the entry point script was loaded from. Remembered so that | 
| // package imports can be resolved relative to it. | 
| -var _entrypoint; | 
| - | 
| +Uri _entryPointScript; | 
| // The directory to look in to resolve "package:" scheme URIs. | 
| -var _packageRoot; | 
| +Uri _packageRoot; | 
| 
 
Ivan Posva
2013/06/05 23:11:07
Do you want to move all of the resolution variable
 
Cutch
2013/06/12 19:34:26
Done.
 
 | 
| -void _logResolution(String msg) { | 
| - final enabled = false; | 
| - if (enabled) { | 
| - _Logger._printString(msg); | 
| - } | 
| -} | 
| _setPackageRoot(String packageRoot) { | 
| - // TODO(mattsh) - refactor windows drive and path handling code | 
| - // so it can be used here if needed. | 
| - _packageRoot = packageRoot; | 
| + if (!packageRoot.endsWith('/')) { | 
| + // Ensure we have a trailing slash character. | 
| + packageRoot = '$packageRoot/'; | 
| + } | 
| + _packageRoot = Uri.parse(packageRoot); | 
| } | 
| -String _resolveScriptUri(String cwd, String scriptName, bool isWindows) { | 
| + | 
| +String _resolveScriptUri(String scriptName) { | 
| 
 
siva
2013/06/06 01:13:17
How do we ensure that working directory has been s
 
Cutch
2013/06/12 19:34:26
Done.
 
 | 
| var scriptUri = Uri.parse(scriptName); | 
| - if (scriptUri.scheme == 'http') { | 
| - _entrypoint = scriptUri; | 
| - _logResolution("# Resolved script to: $_entrypoint"); | 
| - return _entrypoint.toString(); | 
| - } | 
| - _logResolution("# Current working directory: $cwd"); | 
| - _logResolution("# ScriptName: $scriptName"); | 
| - if (isWindows) { | 
| - // For Windows we need to massage the paths a bit according to | 
| - // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx | 
| - // | 
| - // Convert | 
| - // C:\one\two\three | 
| - // to | 
| - // /C:/one/two/three | 
| - cwd = "/${cwd.replaceAll('\\', '/')}"; | 
| - _logResolution("## cwd: $cwd"); | 
| - if ((scriptName.length > 2) && (scriptName[1] == ":")) { | 
| - // This is an absolute path. | 
| - scriptName = "/${scriptName.replaceAll('\\', '/')}"; | 
| - } else { | 
| - scriptName = scriptName.replaceAll('\\', '/'); | 
| - } | 
| - _logResolution("## scriptName: $scriptName"); | 
| + if (scriptUri.scheme != '') { | 
| + // Script has a scheme, assume that it is fully formed. | 
| + _entryPointScript = scriptUri; | 
| + } else { | 
| + // Script does not have a scheme, assume that it is a path, | 
| + // resolve it against the working directory. | 
| + _entryPointScript = _workingDirectoryUri.resolve(scriptName); | 
| } | 
| - var base = | 
| - new Uri(scheme: "file", | 
| - path: cwd.endsWith("/") ? cwd : "$cwd/"); | 
| - _entrypoint = base.resolve(scriptName); | 
| - _logResolution("# Resolved script to: $_entrypoint"); | 
| - | 
| - return _entrypoint.toString(); | 
| + _logResolution('# Resolved entry point to: $_entryPointScript'); | 
| + return _entryPointScript.toString(); | 
| } | 
| + | 
| String _resolveUri(String base, String userString) { | 
| var baseUri = Uri.parse(base); | 
| - _logResolution("# Resolving: $userString from $base"); | 
| + _logResolution('# Resolving: $userString from $base'); | 
| var uri = Uri.parse(userString); | 
| var resolved; | 
| @@ -125,18 +143,18 @@ String _resolveUri(String base, String userString) { | 
| // package URI path part. | 
| path = _filePathFromPackageUri(resolved); | 
| } | 
| - resolved = new Uri(scheme: "dart-ext", path: path); | 
| + resolved = new Uri(scheme: 'dart-ext', path: path); | 
| } else { | 
| resolved = baseUri.resolve(userString); | 
| } | 
| - _logResolution("# Resolved to: $resolved"); | 
| + _logResolution('# Resolved to: $resolved'); | 
| return resolved.toString(); | 
| } | 
| -String _filePathFromUri(String userUri, bool isWindows) { | 
| +String _filePathFromUri(String userUri) { | 
| var uri = Uri.parse(userUri); | 
| - _logResolution("# Getting file path from: $uri"); | 
| + _logResolution('# Getting file path from: $uri'); | 
| var path; | 
| switch (uri.scheme) { | 
| @@ -154,40 +172,43 @@ String _filePathFromUri(String userUri, bool isWindows) { | 
| break; | 
| default: | 
| // Only handling file and package URIs in standalone binary. | 
| - _logResolution("# Unknown scheme (${uri.scheme}) in $uri."); | 
| - throw "Not a known scheme: $uri"; | 
| + _logResolution('# Unknown scheme (${uri.scheme}) in $uri.'); | 
| + throw 'Not a known scheme: $uri'; | 
| } | 
| - if (isWindows && path.startsWith("/")) { | 
| + if (_isWindows && path.startsWith('/')) { | 
| // For Windows we need to massage the paths a bit according to | 
| // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx | 
| // | 
| // Drop the leading / before the drive letter. | 
| path = path.substring(1); | 
| - _logResolution("# path: $path"); | 
| + _logResolution('# Path: Removed leading / -> $path'); | 
| } | 
| return path; | 
| } | 
| + | 
| String _filePathFromFileUri(Uri uri) { | 
| if (!uri.host.isEmpty) { | 
| throw "URIs using the 'file:' scheme may not contain a host."; | 
| } | 
| - _logResolution("# Path: ${uri.path}"); | 
| + _logResolution('# Path: $uri -> ${uri.path}'); | 
| return uri.path; | 
| } | 
| + | 
| String _filePathFromOtherUri(Uri uri) { | 
| if (!uri.host.isEmpty) { | 
| - throw "URIs whose paths are used as file paths may not contain a host."; | 
| + throw 'URIs whose paths are used as file paths may not contain a host.'; | 
| } | 
| - _logResolution("# Path: ${uri.path}"); | 
| + _logResolution('# Path: $uri -> ${uri.path}'); | 
| return uri.path; | 
| } | 
| + | 
| String _filePathFromPackageUri(Uri uri) { | 
| if (!uri.host.isEmpty) { | 
| var path = (uri.path != '') ? '${uri.host}${uri.path}' : uri.host; | 
| @@ -198,22 +219,27 @@ String _filePathFromPackageUri(Uri uri) { | 
| "'$right', not '$wrong'."; | 
| } | 
| + var packageUri; | 
| var path; | 
| if (_packageRoot != null) { | 
| - path = "${_packageRoot}${uri.path}"; | 
| + // Resolve against package root. | 
| + packageUri = _packageRoot.resolve(uri.path); | 
| } else { | 
| - if (_entrypoint.scheme == 'http') { | 
| - path = _entrypoint.resolve('packages/${uri.path}').toString(); | 
| - } else { | 
| - path = _entrypoint.resolve('packages/${uri.path}').path; | 
| - } | 
| + // Resolve against working directory. | 
| + packageUri = _entryPointScript.resolve('packages/${uri.path}'); | 
| } | 
| - _logResolution("# Package: $path"); | 
| + if (packageUri.scheme == 'file') { | 
| + path = packageUri.path; | 
| + } else { | 
| + path = packageUri.toString(); | 
| + } | 
| + _logResolution('# Package: $uri -> $path'); | 
| return path; | 
| } | 
| -String _filePathFromHttpUri(Uri uri) { | 
| - _logResolution('# Path: $uri'); | 
| + | 
| +String _filePathFromHttpUr(Uri uri) { | 
| + _logResolution('# Path: $uri -> $uri'); | 
| return uri.toString(); | 
| } |