Skip to content

Commit

Permalink
Version 1.11.0-dev.5.3
Browse files Browse the repository at this point in the history
Cherry-pick 19bb19d to dev
Cherry-pick d5a34bd to dev
Cherry-pick bbdc57e to dev
Cherry-pick bd25e64 to dev
Cherry-pick 5cc8fca to dev
Cherry-pick ed72caa to dev
Cherry-pick 82535a6 to dev
Cherry-pick c05c8c6 to dev
Cherry-pick f9e8852 to dev
Cherry-pick 9a01a22 to dev
Cherry-pick 3c85970 to dev
  • Loading branch information
whesse committed Jun 15, 2015
2 parents 23736d3 + 7a01514 commit c0e90cb
Show file tree
Hide file tree
Showing 14 changed files with 100 additions and 51 deletions.
1 change: 1 addition & 0 deletions runtime/bin/io_natives.cc
Expand Up @@ -40,6 +40,7 @@ namespace bin {
V(Platform_PathSeparator, 0) \
V(Platform_LocalHostname, 0) \
V(Platform_ExecutableName, 0) \
V(Platform_ResolvedExecutableName, 0) \
V(Platform_Environment, 0) \
V(Platform_ExecutableArguments, 0) \
V(Platform_PackageRoot, 0) \
Expand Down
12 changes: 11 additions & 1 deletion runtime/bin/platform.cc
Expand Up @@ -13,7 +13,7 @@ namespace dart {
namespace bin {

const char* Platform::executable_name_ = NULL;
bool Platform::executable_name_resolved_ = false;
const char* Platform::resolved_executable_name_ = NULL;
const char* Platform::package_root_ = NULL;
int Platform::script_index_ = 1;
char** Platform::argv_ = NULL;
Expand Down Expand Up @@ -51,6 +51,16 @@ void FUNCTION_NAME(Platform_ExecutableName)(Dart_NativeArguments args) {
}


void FUNCTION_NAME(Platform_ResolvedExecutableName)(Dart_NativeArguments args) {
if (Platform::GetResolvedExecutableName() != NULL) {
Dart_SetReturnValue(
args, Dart_NewStringFromCString(Platform::GetResolvedExecutableName()));
} else {
Dart_SetReturnValue(args, Dart_Null());
}
}


void FUNCTION_NAME(Platform_ExecutableArguments)(Dart_NativeArguments args) {
int end = Platform::GetScriptIndex();
char** argv = Platform::GetArgv();
Expand Down
17 changes: 8 additions & 9 deletions runtime/bin/platform.h
Expand Up @@ -46,15 +46,14 @@ class Platform {
executable_name_ = executable_name;
}
static const char* GetExecutableName() {
if (!executable_name_resolved_) {
return executable_name_;
}
static const char* GetResolvedExecutableName() {
if (resolved_executable_name_ == NULL) {
// Try to resolve the executable path using platform specific APIs.
char* path = Platform::ResolveExecutablePath();
if (path != NULL) {
executable_name_ = path;
}
executable_name_resolved_ = true;
resolved_executable_name_ = Platform::ResolveExecutablePath();
}
return executable_name_;
return resolved_executable_name_;
}

// Stores and gets the package root.
Expand All @@ -80,8 +79,8 @@ class Platform {
private:
// The path to the executable.
static const char* executable_name_;
// State to indicate whether the executable name has been resolved.
static bool executable_name_resolved_;
// The path to the resolved executable.
static const char* resolved_executable_name_;

static const char* package_root_;
static int script_index_;
Expand Down
6 changes: 5 additions & 1 deletion runtime/bin/platform_macos.cc
Expand Up @@ -7,6 +7,7 @@

#include <mach-o/dyld.h>

#include "bin/file.h"
#include "bin/platform.h"

#include <crt_externs.h> // NOLINT
Expand Down Expand Up @@ -91,7 +92,10 @@ char* Platform::ResolveExecutablePath() {
free(path);
return NULL;
}
return path;
// Return the canonical path as the returned path might contain symlinks.
char* canon_path = File::GetCanonicalPath(path);
free(path);
return canon_path;
}

} // namespace bin
Expand Down
2 changes: 2 additions & 0 deletions runtime/bin/platform_patch.dart
Expand Up @@ -10,6 +10,8 @@ patch class _Platform {
native "Platform_OperatingSystem";
/* patch */ static _localHostname() native "Platform_LocalHostname";
/* patch */ static _executable() native "Platform_ExecutableName";
/* patch */ static _resolvedExecutable()
native "Platform_ResolvedExecutableName";
/* patch */ static _environment() native "Platform_Environment";
/* patch */ static List<String> _executableArguments()
native "Platform_ExecutableArguments";
Expand Down
6 changes: 5 additions & 1 deletion runtime/bin/platform_win.cc
Expand Up @@ -5,6 +5,7 @@
#include "platform/globals.h"
#if defined(TARGET_OS_WINDOWS)

#include "bin/file.h"
#include "bin/platform.h"
#include "bin/log.h"
#include "bin/socket.h"
Expand Down Expand Up @@ -97,7 +98,10 @@ char* Platform::ResolveExecutablePath() {
}
char* path = StringUtils::WideToUtf8(tmp_buffer);
free(tmp_buffer);
return path;
// Return the canonical path as the returned path might contain symlinks.
char* canon_path = File::GetCanonicalPath(path);
free(path);
return canon_path;
}

} // namespace bin
Expand Down
14 changes: 12 additions & 2 deletions runtime/vm/dart_api_impl.cc
Expand Up @@ -3182,10 +3182,20 @@ DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData(
Dart_Handle object) {
TRACE_API_CALL(CURRENT_FUNC);
intptr_t class_id = Api::ClassId(object);
if (RawObject::IsExternalTypedDataClassId(class_id) ||
RawObject::IsTypedDataViewClassId(class_id)) {
if (RawObject::IsExternalTypedDataClassId(class_id)) {
return GetType(class_id);
}
if (RawObject::IsTypedDataViewClassId(class_id)) {
// Check if data object of the view is external.
Isolate* isolate = Isolate::Current();
const Instance& view_obj = Api::UnwrapInstanceHandle(isolate, object);
ASSERT(!view_obj.IsNull());
const Instance& data_obj =
Instance::Handle(isolate, TypedDataView::Data(view_obj));
if (ExternalTypedData::IsExternalTypedData(data_obj)) {
return GetType(class_id);
}
}
return Dart_TypedData_kInvalid;
}

Expand Down
4 changes: 4 additions & 0 deletions sdk/lib/_internal/compiler/js_lib/io_patch.dart
Expand Up @@ -221,6 +221,10 @@ class _Platform {
throw new UnsupportedError("Platform._executable");
}
@patch
static _resolvedExecutable() {
throw new UnsupportedError("Platform._resolvedExecutable");
}
@patch
static List<String> _executableArguments() {
throw new UnsupportedError("Platform._executableArguments");
}
Expand Down
17 changes: 14 additions & 3 deletions sdk/lib/io/platform.dart
Expand Up @@ -131,13 +131,24 @@ class Platform {
* Returns the path of the executable used to run the script in this
* isolate.
*
* If supported by the platform the returned path will be absolute.
* The path returned is the literal path used to run the script. This
* path might be relative or just be a name from which the executable
* was found by searching the `PATH`.
*
* If the execution environment does not support [executable] an empty
* string is returned.
* To get the absolute path to the resolved executable use
* [resolvedExecutable].
*/
static String get executable => _Platform.executable;

/**
* Returns the path of the executable used to run the script in this
* isolate after it has been resolved by the OS.
*
* This is the absolute path, with all symlinks resolved, to the
* executable used to run the script.
*/
static String get resolvedExecutable => _Platform.resolvedExecutable;

/**
* Returns the absolute URI of the script being run in this
* isolate.
Expand Down
2 changes: 2 additions & 0 deletions sdk/lib/io/platform_impl.dart
Expand Up @@ -10,6 +10,7 @@ class _Platform {
external static String _operatingSystem();
external static _localHostname();
external static _executable();
external static _resolvedExecutable();
/**
* Retrieve the entries of the process environment.
*
Expand All @@ -31,6 +32,7 @@ class _Platform {
external static String _version();

static String executable = _executable();
static String resolvedExecutable = _resolvedExecutable();
static String packageRoot = _packageRoot();

// Cache the OS environemnt. This can be an OSError instance if
Expand Down
Expand Up @@ -35,7 +35,7 @@ void verify(String exePath, {String altPath}) {
}

var result = processResult.stdout.trim();
expectEquals(Platform.executable, result);
expectEquals(Platform.resolvedExecutable, result);
}

void testDartExecShouldNotBeInCurrentDir() {
Expand All @@ -60,23 +60,20 @@ void testShouldFailOutsidePath() {
}

void testShouldSucceedWithSourcePlatformExecutable() {
//print('*** Running normally');
verify(Platform.executable);
verify(Platform.resolvedExecutable);
}

void testExeSymLinked(Directory dir) {
var dirUri = new Uri.directory(dir.path);
var link = new Link.fromUri(dirUri.resolve('dart_exe_link'));
link.createSync(Platform.executable);
//print('*** Creating a sym-link to the executable');
link.createSync(Platform.resolvedExecutable);
verify(link.path);
}

void testPathToDirWithExeSymLinked(Directory dir) {
var dirUri = new Uri.directory(dir.path);
var link = new Link.fromUri(dirUri.resolve('dart_exe_link'));
link.createSync(Platform.executable);
//print('*** Path to a directory that contains a sym-link to dart bin');
link.createSync(Platform.resolvedExecutable);
verify('dart_exe_link', altPath: dir.path);
}

Expand All @@ -87,14 +84,13 @@ void testExeDirSymLinked(Directory dir) {
var linkDirUri = dirUri.resolve('dart_bin_dir_link');
var link = new Link.fromUri(linkDirUri);

var exeFile = new File(Platform.executable);
var exeFile = new File(Platform.resolvedExecutable);

link.createSync(exeFile.parent.path);

var linkedBin =
new Uri.directory(linkDirUri.toFilePath()).resolve(platformExeName);

//print('*** Running in a sym-linked directory');
verify(linkedBin.toFilePath());
}

Expand All @@ -104,19 +100,17 @@ void testPathPointsToSymLinkedSDKPath(Directory dir) {
var linkDirUri = dirUri.resolve('dart_bin_dir_link');
var link = new Link.fromUri(linkDirUri);

var exeFile = new File(Platform.executable);
var exeFile = new File(Platform.resolvedExecutable);

link.createSync(exeFile.parent.path);

//print('*** Path points to a sym-linked SDK dir');
verify(platformExeName, altPath: link.path);
}

void testPathToSDKDir() {
var exeFile = new File(Platform.executable);
var exeFile = new File(Platform.resolvedExecutable);
var binDirPath = exeFile.parent.path;

//print('*** Running with PATH env set to environment - fixed in 16994 - thanks!');
verify(platformExeName, altPath: binDirPath);
}

Expand All @@ -130,24 +124,34 @@ void withTempDir(void test(Directory dir)) {
}

String get platformExeName {
var raw = new Uri.file(Platform.executable);
var raw = new Uri.file(Platform.resolvedExecutable);
return raw.pathSegments.last;
}

String get scriptPath => Platform.script.toFilePath();

void main() {
// The same script is used for both running the tests and as for starting
// child verifying the value of Platform.resolvedExecutable. If the
// environment variable _SCRIPT_KEY is set this is a child process which
// should print the value of Platform.resolvedExecutable.
if (Platform.environment.containsKey(_SCRIPT_KEY)) {
print(Platform.executable);
print(Platform.resolvedExecutable);
return;
}

testDartExecShouldNotBeInCurrentDir();
testShouldSucceedWithSourcePlatformExecutable(); /// 00: ok
withTempDir(testExeSymLinked); /// 01: ok
// dart:io does not support linking to files in Windows.
if (!Platform.isWindows) {
withTempDir(testExeSymLinked); /// 01: ok
}
withTempDir(testExeDirSymLinked); /// 02: ok
testPathToSDKDir(); /// 03: ok
withTempDir(testPathPointsToSymLinkedSDKPath); /// 04: ok
withTempDir(testPathToDirWithExeSymLinked); /// 05: ok
// dart:io does not support linking to files in Windows.
if (!Platform.isWindows) {
withTempDir(testPathToDirWithExeSymLinked); /// 05: ok
}
testShouldFailOutsidePath(); /// 06: ok
}
12 changes: 9 additions & 3 deletions tests/standalone/io/platform_test.dart
Expand Up @@ -24,15 +24,21 @@ test() {
Expect.isTrue(hostname is String && hostname != "");
var environment = Platform.environment;
Expect.isTrue(environment is Map<String, String>);
Expect.isTrue(Platform.executable.contains('dart'));
if (!Platform.isWindows) {
Expect.isTrue(Platform.executable.startsWith('/'));
Expect.isTrue(Platform.executable.endsWith('dart'));
Expect.isTrue(Platform.resolvedExecutable.endsWith('dart'));
} else {
Expect.isTrue(Platform.executable.endsWith('dart.exe'));
Expect.isTrue(Platform.resolvedExecutable.endsWith('dart.exe'));
}
if (!Platform.isWindows) {
Expect.isTrue(Platform.resolvedExecutable.startsWith('/'));
} else {
// This assumes that tests (both locally and on the bots) are
// running off a location referred to by a drive letter. If a UNC
// location is used or long names ("\\?\" prefix) is used this
// needs to be fixed.
Expect.equals(Platform.executable.substring(1, 3), ':\\');
Expect.equals(Platform.resolvedExecutable.substring(1, 3), ':\\');
}
// Move directory to be sure script is correct.
var oldDir = Directory.current;
Expand Down
18 changes: 5 additions & 13 deletions tests/standalone/standalone.status
Expand Up @@ -17,15 +17,6 @@ javascript_compatibility_errors_test/none: Fail, OK # Not possible to exclude o
package/package_isolate_test: Fail # Issue 12474
io/observatory_test: Fail

[ $runtime == vm && ($system == macos || $system == windows) ]
io/platform_executable_test/01: RuntimeError # Issue 16994
io/platform_executable_test/02: RuntimeError # Issue 16994
io/platform_executable_test/04: RuntimeError # Issue 16994
io/platform_executable_test/05: RuntimeError # Issue 16994

[ $runtime == vm && $system == windows ]
io/platform_executable_test/06: RuntimeError # NEEDS TRIAGE (kevmoo)

[ $runtime == vm && $checked ]
# These tests have type errors on purpose.
io/process_invalid_arguments_test: Fail, OK
Expand Down Expand Up @@ -167,6 +158,7 @@ package/package_test: CompileTimeError
[ $system == windows ]
io/skipping_dart2js_compilations_test: Fail # Issue 19551.
verbose_gc_to_bmu_test: Skip
io/platform_resolved_executable_test/06: RuntimeError # Issue 23641

[ $arch != ia32 && $arch != x64 && $arch != simarm && $arch != simarmv5te && $mode == debug ]
verified_mem_test: Skip # Not yet implemented.
Expand Down Expand Up @@ -219,10 +211,10 @@ io/issue_22637_test: Crash # cannot handle async/sync*/async* functions
io/link_test: Crash # Instance of 'TypeOperator': type check unimplemented for _Nullary.
io/link_uri_test: Crash # Instance of 'TypeOperator': type check unimplemented for _Nullary.
io/observatory_test: Crash # Instance of 'TypeOperator': type check unimplemented for _Nullary.
io/platform_executable_test/01: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_executable_test/02: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_executable_test/04: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_executable_test/05: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_resolved_executable_test/01: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_resolved_executable_test/02: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_resolved_executable_test/04: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_resolved_executable_test/05: Crash # (try {test(tempDir);}finally {tempDir.deleteSync(recursive:true);}): try/finally
io/platform_test: Crash # Instance of 'TypeOperator': type check unimplemented for _Nullary.
io/process_invalid_arguments_test: Crash # Instance of 'TypeOperator': type check unimplemented for _Nullary.
io/raw_datagram_socket_test: Crash # Unhandled node
Expand Down
2 changes: 1 addition & 1 deletion tools/VERSION
Expand Up @@ -28,4 +28,4 @@ MAJOR 1
MINOR 11
PATCH 0
PRERELEASE 5
PRERELEASE_PATCH 2
PRERELEASE_PATCH 3

0 comments on commit c0e90cb

Please sign in to comment.