| Index: runtime/bin/process.dart | 
| diff --git a/runtime/bin/process.dart b/runtime/bin/process.dart | 
| index 351465847f6efada58150c04bd14f73ae7b73d22..ac96ef98a4a405ba8a4292fbba0e8b74010ab6fc 100644 | 
| --- a/runtime/bin/process.dart | 
| +++ b/runtime/bin/process.dart | 
| @@ -3,47 +3,52 @@ | 
| // BSD-style license that can be found in the LICENSE file. | 
|  | 
| /** | 
| - * [Process] objects are used to start new processes and interact with | 
| - * them. | 
| + * [Process] is used to start new processes. | 
| */ | 
| -interface Process default _Process { | 
| +class Process { | 
| /** | 
| -   * Creates a new process object and starts a process running the | 
| -   * [executable] with the specified [arguments]. When the process has | 
| -   * been successfully started [onStart] is called. If the process | 
| -   * fails to start [onError] is called. | 
| +   * Starts a process running the [executable] with the specified | 
| +   * [arguments]. Returns an [InteractiveProcess] object that can be | 
| +   * used to interact with the process. | 
| * | 
| * An optional [ProcessOptions] object can be passed to specify | 
| * options other than the executable and the arguments. | 
| -   * | 
| -   * No data can be written to the process stdin and the process | 
| -   * cannot be closed nor killed before [onStart] has been invoked. | 
| */ | 
| -  Process.start(String executable, | 
| -                List<String> arguments, | 
| -                [ProcessOptions options]); | 
| +  static InteractiveProcess start(String executable, | 
| +                                  List<String> arguments, | 
| +                                  [ProcessOptions options]) { | 
| +    return _Process.start(executable, arguments, options); | 
| +  } | 
|  | 
| /** | 
| -   * Creates a new process object, starts a process and runs it | 
| -   * non-interactively to completion. The process run is [executable] | 
| -   * with the specified [arguments]. When the process has been | 
| -   * successfully started [onStart] is called. If the process fails to | 
| -   * start [onError] is called. | 
| +   * Starts a process and runs it non-interactively to completion. The | 
| +   * process run is [executable] with the specified [arguments]. | 
| * | 
| -   * Options other than the executable and the arguments are specified | 
| -   * using a [ProcessOptions] object. If no options are required, | 
| -   * [null] can be passed as the options. | 
| +   * An optional [ProcessOptions] object can be passed to specify | 
| +   * options other than the executable and the arguments. | 
| * | 
| -   * No communication via [stdin], [stdout] or [stderr] can take place | 
| -   * with a non-interactive process. Instead, the process is run to | 
| -   * completion at which point the exit code and stdout and stderr are | 
| -   * supplied to the [callback] parameter. | 
| -   */ | 
| -  Process.run(String executable, | 
| -              List<String> arguments, | 
| -              ProcessOptions options, | 
| -              void callback(int exitCode, String stdout, String stderr)); | 
| +   * Returns a [:Future<ProcessResult>:] that completes with the | 
| +   * result of running the process, i.e., exit code, standard out and | 
| +   * standard in. | 
| +   */ | 
| +  static Future<ProcessResult> run(String executable, | 
| +                                   List<String> arguments, | 
| +                                   [ProcessOptions options]) { | 
| +    return _Process.run(executable, arguments, options); | 
| +  } | 
| +} | 
|  | 
| +/** | 
| + * [InteractiveProcess] represents a process which users can | 
| + * communicate with using streams. | 
| + * | 
| + * When the process has been successfully started [onStart] is | 
| + * called. If the process fails to start [onError] is called. | 
| + * | 
| + * No data can be written to the process stdin and the process | 
| + * cannot be closed nor killed before [onStart] has been invoked. | 
| + */ | 
| +interface InteractiveProcess { | 
| /** | 
| * Returns an input stream of the process stdout. | 
| * | 
| @@ -108,6 +113,28 @@ interface Process default _Process { | 
|  | 
|  | 
| /** | 
| + * [ProcessResult] represents the result of running a non-interactive | 
| + * process started with [:Process.run:]. | 
| + */ | 
| +interface ProcessResult { | 
| +  /** | 
| +   * Exit code for the process. | 
| +   */ | 
| +  int get exitCode(); | 
| + | 
| +  /** | 
| +   * Standard output from the process as a string. | 
| +   */ | 
| +  String get stdout(); | 
| + | 
| +  /** | 
| +   * Standard error from the process as a string. | 
| +   */ | 
| +  String get stderr(); | 
| +} | 
| + | 
| + | 
| +/** | 
| * [ProcessOptions] represents the options that can be supplied when | 
| * starting a process. | 
| */ | 
| @@ -156,7 +183,7 @@ class ProcessOptions { | 
|  | 
| class ProcessException implements Exception { | 
| const ProcessException([String this.message, int this.errorCode = 0]); | 
| -  String toString() => "ProcessException: $message"; | 
| +  String toString() => "ProcessException: $message ($errorCode)"; | 
|  | 
| /** | 
| * Contains the system message for the process exception if any. | 
|  |