Index: docs/language/dartLangSpec.tex |
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex |
index 50683dbe0475f0e394787c26f66aef951846e71d..52430cf936d07a5a6540c5a32c32ad3c6fa8874b 100644 |
--- a/docs/language/dartLangSpec.tex |
+++ b/docs/language/dartLangSpec.tex |
@@ -7187,36 +7187,47 @@ It's a compile-time error if the same library contains two part directives with |
\LMLabel{scripts} |
\LMHash{} |
-A {\em script} is a library whose exported namespace (\ref{exports}) includes a top-level member named \code{main}. It is a static warning if the static type of \code{main} is not assignable to a function type or is a function type with more than two required parameters. |
+A {\em script} is a library whose exported namespace (\ref{exports}) includes |
+a top-level function declaration named \code{main} |
+that has either zero, one or two required arguments. |
-A script $S$ may be executed as follows: |
+A script $S$ is executed as follows: |
\LMHash{} |
-First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main} that is in the exported namespace of $S$ is invoked. If \code{main} has no positional parameters, it is invoked with no arguments. Otherwise if \code{main} has exactly one positional parameter, it is invoked with a single actual argument whose runtime type implements \code{List<String>}. Otherwise \code{main} is invoked with the following two actual arguments: |
+First, $S$ is compiled as a library as specified above. |
+Then, the top-level function defined by \code{main} |
+in the exported namespace of $S$ is invoked (\ref{functionInvocation}) |
+as follows: |
+If \code{main} can be be called with with two positional arguments, |
+it is invoked with the following two actual arguments: |
\begin{enumerate} |
\item An object whose runtime type implements \code{List<String>}. |
-\item The initial message of the current isolate $i$ as determined by the invocation of \code{Isolate.spawnUri} that spawned $i$. |
+\item An object specified when the current isolate $i$ was created, |
+for example through the invocation of \code{Isolate.spawnUri} that spawned $i$, |
+or \NULL{} if no such object was supplied. |
\end{enumerate} |
+If \code{main} cannot be called with two positional arguments, |
+but it can be called with one positional argument, |
+it is invoked with an object whose runtime type implements \code{List<String>} |
+as the only argument. |
+If \code{main} cannot be called with one or two positional arguments, |
+it is invoked with no arguments. |
-\LMHash{} |
-It is a run time error if $S$ does not declare or export either: |
-\begin{itemize} |
-\item A top-level function named \code{main}, or |
-\item A top-level getter named \code{main} that returns a function. |
-\end{itemize} |
- |
-\commentary { |
-Note that if \code{main} requires more than two arguments, a run time error will occur. |
-} |
- |
-\rationale{ |
-The names of scripts are optional, in the interests of interactive, informal use. However, any script of long term value should be given a name as a matter of good practice. |
+\commentary{ |
+Note that if \code{main} requires more than two positional arguments, |
+the library is not considered a script. |
} |
-\commentary { |
+\commentary{ |
A Dart program will typically be executed by executing a script. |
} |
+\LMHASH{} |
+If a non-script library is provided where a script is expected, |
+it precludes execution. |
+As such, it should be reported as a compile-time error, |
+even if that library compiles successfully as a non-script library. |
+ |
\subsection{URIs} |
\LMLabel{uris} |