diff --git a/pkg/kernel/doc/semantics/kernel-semantics.tex b/pkg/kernel/doc/semantics/kernel-semantics.tex deleted file mode 100644 index 44e23c36026..00000000000 --- a/pkg/kernel/doc/semantics/kernel-semantics.tex +++ /dev/null @@ -1,3406 +0,0 @@ -% Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file -% for details. All rights reserved. Use of this source code is governed by a -% BSD-style license that can be found in the LICENSE file. - - -\documentclass[a4paper,oneside,fleqn]{article} - - -\usepackage[utf8]{inputenc} -\usepackage[fleqn]{amsmath} -\usepackage{a4wide} -\usepackage{url} -\usepackage{cite} -\usepackage{amssymb} -\usepackage{stmaryrd} -\usepackage{alltt} -\usepackage{xypic} -\usepackage{appendix} -\usepackage{color} -\usepackage{hyperref} -\usepackage{chngcntr} -\usepackage{ifthen} -\usepackage[fleqn]{mathtools} -\usepackage{geometry} -\usepackage{mdframed} -\usepackage[textsize=tiny]{todonotes} -\usepackage{mathrsfs} - -\definecolor{shade}{gray}{0.75} -\newcommand{\shadethis}[1]{\colorbox{shade}% - {\protect\rule[-0.95mm]{0mm}{3.95mm}\hspace{0.3mm}#1\hspace{0.3mm}}} - - -% Shorthard for ``Dart Kernel'' in small caps. -\newcommand{\kernel}{\textsc{Dart Kernel}} - -% Shorthand for ``Dart'' in small caps. -\newcommand{\dart}{\textsc{Dart}} - -% A bit nicer symbol: ∅ -\renewcommand{\emptyset}{\varnothing} - -% Some known sets. -\newcommand{\NN}{\mathbb{N}} % Natural numbers. - - -% Some auxiliary operators. -\DeclareMathOperator{\dom}{Dom} % Domain of a function. - - -% Meta-functions to be used in math mode. -\DeclareMathOperator{\extend}{extend} -\DeclareMathOperator{\update}{update} -\DeclareMathOperator{\extendMain}{extendMain} -\DeclareMathOperator{\concat}{concat} -\DeclareMathOperator{\getter}{implicitGetter} -\DeclareMathOperator{\setter}{implicitSetter} -\DeclareMathOperator{\lookup}{lookup} -\DeclareMathOperator{\methodLookup}{methodLookup} -\DeclareMathOperator{\contains}{contains} - -% Meta-functions for operations on list -\DeclareMathOperator{\head}{head} -\DeclareMathOperator{\tail}{tail} -\DeclareMathOperator{\append}{append} - -% Keywords and syntactic constructs of Dart Kernel to be used in math mode. -\newcommand{\synt}[1]{\ensuremath{\text{\textbf{\texttt{#1}}}}} -\DeclareMathOperator{\dowhile}{\synt{do~while}} -\DeclareMathOperator{\while}{\synt{while}} -\DeclareMathOperator{\forin}{\synt{for~in}} -\DeclareMathOperator{\for}{\synt{for}} -\DeclareMathOperator{\throw}{\synt{throw}} -\DeclareMathOperator{\rethrow}{\synt{rethrow}} -\DeclareMathOperator{\new}{\synt{new}} -\DeclareMathOperator{\nnull}{\synt{null}} -\DeclareMathOperator{\bbreak}{\synt{break}} -\DeclareMathOperator{\switch}{\synt{switch}} -\DeclareMathOperator{\continue}{\synt{continue}} -\DeclareMathOperator{\return}{\synt{return}} -\DeclareMathOperator{\case}{\synt{case}} -\DeclareMathOperator{\default}{\synt{default}} -\DeclareMathOperator{\try}{\synt{try}} -\DeclareMathOperator{\catch}{\synt{catch}} -\DeclareMathOperator{\finally}{\synt{finally}} - -% Functions for projection on components of class. -\DeclareMathOperator{\superclass}{\synt{superclass}} -\DeclareMathOperator{\members}{\synt{members}} -\DeclareMathOperator{\lookupMember}{\synt{lookupMember}} -\DeclareMathOperator{\class}{\synt{class}} -\DeclareMathOperator{\getfield}{\synt{field}} - - -% Oftenly used syntactic meta-literals. -\newcommand{\true}{\synt{true}} -\newcommand{\false}{\synt{false}} -\newcommand{\this}{\synt{this}} -\newcommand{\Rethrow}{\synt{rethrow}} -\newcommand{\Throw}[1]{\synt{throw}\,#1} - -% Syntactic Domains -\newcommand{\dexpr}{\mathbf{Expr}} -\newcommand{\dstmt}{\mathbf{Stmt}} -\newcommand{\dhandler}{\mathbf{Handler}} - -\newcommand{\decont}{\mathbf{ExprCont}} -\newcommand{\dscont}{\mathbf{StmtCont}} -\newcommand{\dacont}{\mathbf{ApplCont}} -\newcommand{\dbcont}{\mathbf{BreakCont}} -\newcommand{\dswitchcont}{\mathbf{SwitchCont}} -\newcommand{\dncont}{\mathbf{EventCont}} - -\newcommand{\dlbl}{\mathbf{Label}} -\newcommand{\dclbl}{\mathbf{SwitchLabel}} - -\newcommand{\denv}{\mathbf{Env}} -\newcommand{\dmenv}{\mathbf{MainEnv}} -\newcommand{\dfield}{\mathbf{Field}} - -\newcommand{\dval}{\mathbf{Value}} -\newcommand{\dlit}{\mathbf{Literal}} -\newcommand{\dvar}{\mathbf{Variable}} -\newcommand{\dvardecl}{\mathbf{VariableDeclaration}} -\newcommand{\dstring}{\mathbf{StringValue}} -\newcommand{\dfunval}{\mathbf{FunctionValue}} -\newcommand{\dlitval}{\mathbf{LiteralValue}} -\newcommand{\dobjval}{\mathbf{ObjectValue}} -\newcommand{\dvector}{\mathbf{Vector}} -\newcommand{\dmember}{\mathbf{Member}} -\newcommand{\dident}{\mathbf{Identifier}} -\newcommand{\idmeta}{\ensuremath{\mathit{X}}} -\newcommand{\dtype}{\mathbf{Type}} - -\newcommand{\typemeta}{\ensuremath{\mathit{t}}} -\newcommand{\dclass}{\mathbf{Class}} -\newcommand{\dformals}{\mathbf{Formals}} - -\newcommand{\ddom}{\mathbf{Dom}} % Unspecified domain to use in examples. - -% Known domains for Dart types. -\newcommand{\dsemint}{\mathbf{int}} -\newcommand{\dsembool}{\mathbf{bool}} -\newcommand{\dsemdouble}{\mathbf{double}} -\newcommand{\dsemlist}{\mathbf{List}} -\newcommand{\dsemmap}{\mathbf{Map}} -\newcommand{\dsemstring}{\mathbf{String}} -\newcommand{\dsemsymbol}{\mathbf{Symbol}} - - -%% -% Commands to typeset transitions of CESK machine. -% -% \cesktrans{FROM}{TO} -% \cesktransalign{FROM}{TO} -% \cesktranssplit{FROM}{TO} -% -% Typesets a transition from configuration FROM to configuration TO. Like this: -% -% FROM => TO -% -% "Align" variant has an embedded "&" inside, immediately before the transition -% sign "=>". It means that the command should be put into an environment that -% aligns its multi-line content using "&" signs, for example "align". -% -% "Split" variant has an embedded "\\" inside, immediately after the transition -% sign "=>". It is useful for putting long equations in an environment such as -% "split". -%% -\newcommand{\cesktrans}[2]{\ensuremath{{#1} \Rightarrow {#2}}} -\newcommand{\cesktransalign}[2]{\ensuremath{{#1} &\Rightarrow {#2}}} -\newcommand{\cesktranssplit}[2]{\ensuremath{{#1} \Rightarrow\\ {#2}}} - - -%% -% Commands to typeset transitions of CESK machine with clarifying clause. -% -% \cesktranswhere{FROM}{TO}{WHERE} -% \cesktranswherealign{FROM}{TO}{WHERE} -% \cesktranswherealign*{FROM}{TO}{WHERE} -% \cesktranswheresplit{FROM}{TO}{WHERE} -% \cesktranswheresplit*{FROM}{TO}{WHERE} -% -% Typesets a transition from configuration FROM to configuration TO. These -% commands have a clarifying clause that explains the meaning of some new -% symbols introduced by the transition. -% -% The "align" versions have an embedded "&" inside, immideately before the -% transition sign "=>". It means that the command sould be put into an -% environment that aligns its multi-line content using "&" signs, for example -% "align". The non-starred "align" variant puts the additional clause to the -% same line as the transition itself, separating it with a comma. The starred -% version puts the additional clause on the next line. -% -% Here is how non-starred version looks like: -% -% FROM => TO, WHERE -% -% Here is how starred version looks like: -% -% FROM => TO, -% WHERE -% -% "Split" variants has embedded "\\" inside. Non-starred "split" variant have one -% after the comma. Starred "split" variant have one additional "\\" after -% the transition sign "=>". It is useful for putting long equations in an -% environment such as "split", "gather", or "multline". Note that if an -% environment generates a new equation number for each line, it can be disabled -% by putting "\notag" inside the arguments where the number is undesirable. -%% -\newcommand{\cesktranswhere}[3]{\ensuremath{{#1} \Rightarrow {#2}, {#3}}} -\newcommand{\cesktranswherealignNoStar}[3]{\ensuremath{{#1} &\Rightarrow {#2}, {#3}}} -\newcommand{\cesktranswherealignStar}[3]{\ensuremath{{#1} &\Rightarrow \begin{aligned}[t]&{#2},\\&{#3}\end{aligned}}} -\makeatletter -\newcommand{\cesktranswherealign}{% - \@ifstar - \cesktranswherealignStar% - \cesktranswherealignNoStar% -} -\makeatother -\newcommand{\cesktranswheresplitNoStar}[3]{\ensuremath{{#1} \Rightarrow {#2},\\{#3}}} -\newcommand{\cesktranswheresplitStar}[3]{\ensuremath{{#1} \Rightarrow\\ {#2},\\{#3}}} -\makeatletter -\newcommand{\cesktranswheresplit}{% - \@ifstar - \cesktranswheresplitStar% - \cesktranswheresplitNoStar% -} -\makeatother - - -\setlength{\itemsep}{0pt} -\geometry{% - top=2cm,% - right=2cm,% - bottom=2cm,% - left=3cm,% -} - - -\newmdenv[linecolor=black,leftline=false,rightline=false]{eqfigure} - - -\begin{document} -\title{Operational Semantics of \kernel{}} -\author{\kernel{} Team \\ \href{mailto:dart-kernel@google.com}{dart-kernel@google.com}} - -\maketitle - -\begin{abstract} - -The \kernel{} is a simplified representation of the \dart{} programming language. -Similar to the \textsc{Core} of the Glasgow Haskell Compiler, \kernel{} is more amenable to formal specification and analysis than the \dart{} surface language and is the primary intermediate representation used in the \dart{} compilation toolchain. -This paper documents the syntax and operational semantics of \kernel{} to enable framework authors for \dart{} to write safe transformations on \kernel{}, to allow the creation of a reference interpreter for testing the backend implementations of \dart{} and to facilitate academic analysis of the safety properties of \dart{}. - -\end{abstract} - -\setcounter{tocdepth}{2} -\tableofcontents - -\section{Foreword} - -\subsection{Audience} -This paper is intended for compiler and framework authors and academics. -The reader should have a proficient understanding of basic concepts in programming language design and implementation, such as abstract syntax, intermediate representations and operational semantics. -Still, this paper aims to be as accessible as possible, so most concepts that are not familiar to an advanced \dart{} programmer will be explained in sufficient detail to understand the formalizations here. - -\subsection{Formalization Style} - -\subsubsection{Abstract Syntax} - -The abstract syntax of \kernel{} is slightly unusual in that it does not have a tree structure or relate to any concrete, textual syntax. -It is instead a description of the data structures used by the \dart{} compliation toolchain, which are represented as directed acyclic graph. -The semantics depends heavily on the use of ``pointer'' equality between nodes in the syntax graph, which is more fine-grained than structural equality. -For example, a single \kernel{} program may have several syntax nodes that each define and initialize a variable with the same name and value, even in the same scope. -A later assignment to the variable will disambiguate between these declarations by referring to the specific variable declaration node by pointer identity. -Presenting the abstract syntax in this manner not only models the \kernel{} implementation more accurately, but allows us to ignore complications with variable renaming, shadowing and $\alpha$-conversion. - -\subsubsection{Small-step Operational Semantics} - -The operational semantics of \kernel{} are given in ``small-step'' style, where each rule of the semantics corresponds to a simple transition from one state of an abstract machine to another. -The rules are not nested or recursive, and only specify one possible outgoing transition from any state. -Some states of the machine have no outgoing transitions specified, corresponding to undefined operations like out-of-bounds vector access. - -\subsubsection{CESK Machine} - -The abstract machine is presented in the style of a CESK machine. \todo{dmitryas: add citation for CESK machine} -The state space of the CESK machine is grouped into several configurations, most of which carry an environment, which maps variable declarations in the present scope to their current assignments, a store, which models the mutable object store in which all objects in a \dart{} program live, and a continuation, which captures the work to be done after the current operation is complete, roughly similar to a chain of call frames above the current function. -In this way states of the CESK machine mimic states of the \dart{} virtual machine at a very abstract level. - - -\section{Definitions} -\label{sec:definitions} - -This section contains definitions of syntactic and semantic domains, helper functions, and notations used in the rest of the document. - - -\subsection{Conventions} -\label{subsec:conventions} - -\begin{itemize} - \item The symbols ``:'' (is-of-type) and ``$\in$'' (element-of) are used interchangeably. - \item The names of variables are italicized. - \item The names of variables within a syntactic domain start with an upper case letter. - \item The names of domains (meta-types defined in this paper) are written in bold (e.g. ``$\dexpr$''). - \item The names of the different kinds of continuations are written in normal text (e.g. VarSetEK). - \item The names of meta-functions start with lower case letter (e.g. $\extend$). - \item ``$\mlist{\ddom}$'' denotes the domain of meta-lists of elements from domain ``$\ddom$''. - Note that the word ``List'' here is not in bold, so that it isn't confused with the domain $\dsemlist$ of \dart{} objects. - \todo{sjindel: Why is this a domain?} -\end{itemize} -\todo{dmitryas: Explain notation for Kernel syntactic constructs like "on T catch (e, s)".} - -\subsection{Notations} -\label{subsec:notations} - -\begin{align*} - \dom(f) &\text{ --- the domain of function \(f\)}.\\ - \pi_i(x) &\text{ --- the $i^{th}$ component of $x \in \ddom_1 \times \dots \times \ddom_n$}. -\end{align*} - -\subsubsection{Meta list} -\label{subsubsec:meta-list} - -Throughout the document we use meta lists which represent lists of elements from some domain. -We define a list $l \in \mlist{\ddom}$ and are constructed as follows: -\begin{align*} - [] &\text{ --- empty list}.\\ - x :: \textit{list} &\text{ --- a meta-list that is constructed by adding element $x \in \ddom$ to the head of the meta-list $list$}. -\end{align*} - -\todo{Define behaviour for operations on empty list.} -In addition of the usual $\head$ and $\tail$ operations on a list, we add $\append$ operator. -\begin{align*} - &\head \in \mlist{\ddom} \rightarrow \ddom\\ - &\head(x :: \textit{list}) = x \text{ where $x :: \text{list} \in \mlist{\ddom}$}\\ - &\tail \in \mlist{\ddom} \rightarrow \mlist{\ddom}\\ - &\tail(x :: \textit{list}) = list \text{ where $x :: \text{list} \in \mlist{\ddom}$}\\ - &\append \in \mlist{\ddom} \times \ddom \rightarrow \mlist{\ddom}\\ - &\append(\textit{list}, x) = \textit{list'} \text{ where $x \in \ddom$ is the last element of $\textit{list}' \in \mlist{\ddom}$}\\ -\end{align*} - - -\subsection{Domains} -\label{subsec:domains} - -% Variables -\newcommand{\dlocation}{\mathbf{Location}} -\newcommand{\loc}{\ensuremath{\alpha}} - -\newcommand{\expr}{\ensuremath{\mathit{E}}} -\newcommand{\expri}[1]{\expr_\ensuremath{\mathit{#1}}} -\newcommand{\exprs}{\expr\ensuremath{\mathit{s}}} -\newcommand{\membermeta}{\ensuremath{\mathit{M}}} - -\newcommand{\stmt}{\ensuremath{\mathit{S}}} -\newcommand{\stmti}[1]{\stmt_\ensuremath{#1}} -\newcommand{\stmts}{\stmt\ensuremath{\mathit{s}}} - -\newcommand{\handler}{\ensuremath{\mathit{H}}} -\newcommand{\strace}{\ensuremath{\textit{st}}} -\newcommand{\cstrace}{\ensuremath{\textit{cst}}} -\newcommand{\cex}{\ensuremath{\textit{cex}}} - -\newcommand{\scase}{\mathit{SC}} -\newcommand{\scases}{\scase\ensuremath{\mathit{s}}} -\newcommand{\ccase}{\mathit{CC}} -\newcommand{\ccases}{\scase\ensuremath{\mathit{s}}} - -\newcommand{\vals}{\ensuremath{vs}} -\newcommand{\vvec}{\ensuremath{\vec{v}}} - -\newcommand{\env}{\ensuremath{\rho}} -\newcommand{\mainenv}{\env_{M}} -\newcommand{\field}{\phi} - -\newcommand{\lit}{\ensuremath{\mathscr{L}}} -\newcommand{\classvar}{\ensuremath{c}} - -\newcommand{\lbl}{\ensuremath{\textit{lbl}}} -\newcommand{\lbls}{\ensuremath{\textit{lbls}}} -\newcommand{\clbl}{\ensuremath{\textit{clbl}}} -\newcommand{\clbls}{\ensuremath{\textit{clbls}}} - -\newcommand{\econt}{\cont_\ensuremath{E}} -\newcommand{\acont}{\cont_\ensuremath{A}} -\newcommand{\scont}{\cont_\ensuremath{S}} -\newcommand{\bcont}{\cont_\ensuremath{B}} -\newcommand{\switchcont}{\cont_{\ensuremath{\textit{switch}}}} - -\newcommand{\funval}[3]{\mathrm{FunctionValue}({#1},\,{#2},\,{#3})} -\newcommand{\objval}{\mathrm{ObjectValue}(class, fields)} -\newcommand{\obj}{\ensuremath{o}} - -\newcommand{\formal}{\ensuremath{A}} -\newcommand{\formali}[1]{\ensuremath{A_{#1}}} -\newcommand{\formals}{\ensuremath{As}} - -\newcommand{\ncont}{\cont_\ensuremath{N}} -\newcommand{\eventloop}{\ensuremath{G}} - -% Constructor Initializers -\newcommand{\Initializer}[1]{\synt{Initializer}(#1)} -\newcommand{\FieldInitializer}[1]{\synt{FieldInitializer}(\field, #1)} -\newcommand{\LocalInitializer}[1]{\synt{LocalInitializer}(\varmeta, #1)} -\newcommand{\SuperInitializer}[2]{\synt{SuperInitializer}(#1,\,#2)} -\newcommand{\RedirectingInitializer}[2]{\synt{RedirectingInitializer}(#1,\,#2)} - -\[ - \begin{array}{ccll} - \expr, \expri{i} - & : & \dexpr & \text{syntactic domain of expressions}\\ - \exprs - & : & \mlist{\dexpr}\\ - - \stmt, \stmti{i} - & : & \dstmt & \text{syntactic domain of statements}\\ - \stmts - & : & \mlist{\dstmt} & \text{}\\ - - \econt - & : & \decont & \text{semantic domain of expression continuations}\\ - \acont - & : & \dacont & \text{semantic domain of application continuations}\\ - \scont - & : & \dscont & \text{semantic domain of statement continuations}\\ - \bcont - & : & \dbcont & \text{semantic domain of break continuations}\\ - \switchcont - & : & \dswitchcont & \text{semantic domain of switch continuations}\\ - - \lbl & : & \dlbl & \text{semantic domain of labels}\\ - \lbls & : & \mlist{\dlbl} \\ - \clbl & : & \dclbl & \text{semantic domain of switch labels}\\ - \clbls & : & \mlist{\dclbl} \\ - - \handler - & : & \dhandler & \text{syntactic domain of exception handlers} \\ - \strace - & : & \mlist{\dexpr} & \text{semantic domain of stack traces}\\ - \cex - & : & \emptyset + \dval & \text{semantic domain of current exception values}\\ - \cstrace - & : & \emptyset + \mlist{\dexpr} & \text{semantic domain of current exception stack traces}\\ - \varmeta - & : & \dvar & \text{semantic domain of variables}\\ - \loc - & : & \dlocation & \text{semantic domain of store locations}\\ - \val - & : & \dval & \text{semantic domain of values}\\ - \vals & : & \mlist{\dval} \\ - \vvec & : & \dvector = \mlist{\dval}& \text{semantic domain of vectors}\\ - \env - & : & \denv & \text{semantic domain of environments}\\ - \mainenv - & : & \dmenv & \text{semantic domain of main environments}\\ - \obj - & : & \dobjval & \text{semantic domain of object values}\\ - \lit - & : & \dlit & \text{syntactic domain of literals}\\ - \classvar - & : & \dclass & \text{semantic domain of class definitions}\\ - \membermeta - & : & \dmember & \text{syntactic domain of class members}\\ - \idmeta - & : & \dident & \text{syntactic domain of identifiers}\\ - \typemeta & : & \dtype & \text{semantic domain of Dart types}\\ - \formal, \formali{i} & : & \dvardecl & \text{syntactic domain of variable declarations} \\ - \formals & : & \dformals = \mlist{\dvardecl} &\text{syntactic domain of formal parameters}\\ - \ncont & : & \dncont &\text{semantic domain of event loop continuations}\\ - \eventloop & : & \mlist{\dncont} &\text{semantic domain of event loops}\\ - \end{array} -\] - -% Metavariables -\newcommand{\expressionmeta}{\ensuremath{\mathit{E}}} -\newcommand{\expressionsmeta}{\expressionmeta{s}} -\newcommand{\variablemeta}{\ensuremath{\mathit{x}}} -\newcommand{\boolmeta}{\ensuremath{\mathit{B}}} -\newcommand{\integermeta}{\ensuremath{\mathit{I}}} -\newcommand{\doublemeta}{\ensuremath{\mathit{D}}} -\newcommand{\stringmeta}{\ensuremath{\mathit{S}}} -% Metavariables for statements -\newcommand{\statementmeta}{\ensuremath{\mathit{\stmt}}} - -\subsection{Store} -\label{subsec:store-definition} - -The store $s$ is a finite map from location $\loc$ to a value $\val$. -The store is a mutable map and should not be confused with a function. -A global store is assumed and locations reachable in the current scope are defined by the current environment function -\[ - s : \dlocation \rightarrow \dval. -\] - - -\subsubsection{Locations} - -The object store is indexed by elements $\loc$ from the domain $\dlocation$. -This domain is countably infinite, and we assume that we can generate fresh values from the domain within the abstract machine. -It could be represented by natural numbers, for example, but arithmetic on locations is not meaningful. - - -\subsubsection{Dereferencing} -\label{subsubsection:dereferecing} - -\newcommand{\deref}[1]{!#1} -The function ``$\deref{}$'' is used to access the value stored in the store at the given location. -The location is stored in the environment, or in the list of field locations for object values. -``$\deref{}$'' has an implicit argument which is the store of CESK machine. -\begin{align*} - &\deref{} \in \dlocation \rightarrow \dval,\\ - &\deref{\loc} = \val, \text{ with $\val$ the value in store at location } \loc. -\end{align*} - - -\subsubsection{Update} -\label{subsubsec:store-update} - -%\newcommand{\update}[2]{{#1} := {#2}} -The operator ``$\update(\loc,\, \val)$'' updates the store at location $\loc \in \dlocation$ with value $\val \in \dval$. -It has an implicit operand which is the store of the CESK machine. -Upon execution the operator returns a value from domain $\dval$, s.\,t. $\update(\loc,\,\val) = \val$, where $\val$ is the value in the store at location $\loc$. - - -\subsection{Environment} -\label{subsec:env-definition} - -The environment is a function that maps a variable to a location in the store. -\[ - \env \in \denv = \dvardecl \rightarrow \dlocation. -\] - -When an environment is needed to further execute the program, it is saved by the caller in the corresponding continuation. - - -\subsubsection{Extend} -\label{subsubsec:extend-env} - -Operator ``$\extend$'' creates a new environment by extending the provided environment with new bindings for the variable declarations to fresh locations for each of the provided values. -This operator has an implicit operand which is the store of the CESK machine. -\begin{align*} - &\extend \in \denv \times \mlist{\dvardecl} \times \mlist{\dval} \rightarrow \denv,\\ - &\ext{\env}{(\varmeta_{1}, \dots, \varmeta_{n})}{(\val_{1}, \dots, \val_{n})} = \env', -\end{align*} - -\noindent where -\begin{align*} - & n \in \NN,\\ - & (\varmeta_{1}, \dots, \varmeta_{n}) \in \mlist{\dvardecl},\\ - & (\val_{1}, \dots, \val_{n}) \in \mlist{\dval},\\ - & (\alpha_{1}, \dots, \alpha_{n}) \in \mlist{\dlocation} \text{ --- list of fresh locations in the store},\\ - & !\env'(\varmeta) =\begin{cases} - !\loc_i = \val_i, & \text{if }\varmeta = \varmeta_i,\\ - !\env(\varmeta), &\text{otherwise}. - \end{cases} -\end{align*} - -For simpler notation, we allow ``$\extend$'' to be called on single values: $\ext{\env}{\varmeta}{\val}$, which we consider equivalent to calling it on singleton lists: $\ext{\env}{\varmeta :: []}{\val :: []}$. - - -\subsubsection{Variable Lookup} -\label{subsubsec:variable-lookup} - -A variable lookup consists of looking up the location of a variable from the environment with $\loc = \env(\varmeta)$ and reading the stored value $v$ with $\deref{\loc} = \deref{\env(\varmeta)}$ from the store. - - -\subsection{Main Environment} -\label{subsec:main-env} - -\kernel{} supports static and library fields, which are initialized when first accessed and mutations of values stored in these fields are visible in all subsequent execution of statements or evaluation of expressions. -To support this feature, we introduce a main environment, denoted as $\mainenv$. - -\newcommand{\dmainenv}{\textbf{MainEnvironment}} - -\[\mainenv \in \dmainenv = \dmember \rightarrow \dlocation \] - -We define the following functions for manipulating $\mainenv$: - -\subsubsection{Contains} -We define the function $\contains$ as follows: -\begin{align*} - \contains &\in \dmainenv \times \dmember \rightarrow \dsembool\\ - \contains(\mainenv, x) &=\begin{cases} - \true &\text{ if }x \in \dom(\mainenv),\\ - \false &\text{ otherwise} - \end{cases} -\end{align*} -where $\dom(\mainenv)$ is the domain of the environment $\mainenv$, i.e. the set of members for which $\mainenv$ is defined. - -We will use `\contains` as a proposition in the transition steps below, since the value produced is not used alongside the values from the semantic domains. - -\subsubsection{Extend} -We define the function extend as follows: -\begin{align*} - &\extend \in \dmainenv \times \dmember \times \dval \rightarrow \denv\\ - &\extend(\mainenv, x, \val) = \mainenv',\\ - &\text{where }\\ - &\forall y \in \dom(\mainenv) \cup \{x\},\,\mainenv'(y) =\begin{cases} - \loc &\text{ if } y = x,\\ - \mainenv(y) &\text{ otherwise}\\ - \end{cases}\\ - &\text{and $\loc$ is a fresh location that stores the value $\val$.} -\end{align*} - -This environment is visible during the execution of a \kernel{} program, therefore it should be in the left and right-hand side of all the transition presented in the paper. -In order to simplify the transitions, we assume the main environment is implicit. - -For a rule $C_1 \Rightarrow C_2$ that defines the transition from configuration $C_1$ to configuration $C_2$, we explicitly mention when the main environment in the resulting configuration $C_2$ is not the same as the one in the previous configuration $C_1$. - -\subsubsection{Static and Library Field Lookup} -\label{subsubsec:static-field-lookup} - -A static and library field lookup for field $\field$ consists of looking up the location of the static field from the main environment with $\loc = \mainenv(\field)$ and reading the stored value $v$ with $\deref{\loc} = \deref{\mainenv(\field)}$ from the store. - - -\subsection{Values} -\label{sec:values} - -Values in \kernel{} fall into two categories: $\dvector$ values and $\dobjval$ values. -Values are irreducible terms, i.e, the result of the evaluation of expressions. -Only object values may be in the image of the store. - -\subsubsection{Vector Values} -\label{subsubsec:vector-values} - -\kernel{} has limited support for arrays without bounds checking via $\dvector$s. -The step function for the CESK machine is not defined for operations that access an element vector outside its bounds. -$\dvector$s cannot be introduced by any construct present in \dart{} itself, but rather are introduced only by \kernel{} transformations which can ensure they are only used in a safe manner. - -\subsubsection{Literals} - -Some objects from primitive types contain a literal value and a specific class corresponding to the literal's type. -The different types of literal values are: -\[\dlit = \dsemint + \dsembool + \dsemdouble + \dsemlist + \dsemmap + \dsemstring + \dsemsymbol + \dtype.\] - -Literal values are special values that store the specific payload and an associated class. -Each of the specific literal values contains predefined operators and methods, whose semantics are elided here. - -\subsubsection{Class} -\label{subsubsec:class} - -A $\dclass$ encodes a class definition in \kernel{}. - -\begin{align*} -\dclass &= (\emptyset + \dclass) \times \mlist{\dclass} \times (\dident \mapsto \dmember)\\ -\dmember &= \mathbf{Getter} + \mathbf{Setter} + \mathbf{Method} \\ -\mathbf{Getter} &= \NN + \dstmt \\ -\mathbf{Setter} &= \NN + \dformals \times \dstmt \\ -\mathbf{Method} &= \dformals \times \dstmt -\end{align*} - -A class definition contains a reference to the superclass (none only in the case of the ``Object'' class), a list of interface classes and a finite map from identifiers to members which provides dynamic dispatch. -The natural-indexed getters and setters correspond to the case where a field should be modified directly, and the number provides the index into an instance's list of locations. - -Although constructor definitions are included in the class definition, they are not presented here because the same syntax nodes are directly referenced by the expression form for constructor invocation. - -For accessing the superclass component of elements in the domain $\dclass$ we define: -\begin{align*} -\superclass &\in \dclass \rightarrow \dclass,\\ -\superclass(c_1) &= \pi_1(c_1) = c_2, \text{ where $c_2 \in \dclass$ is the first component of $c_1 \in \dclass$} -\end{align*} - -For accessing the members component of elements in the domain $\dclass$, we define: -\begin{align*} -\members &\in \dclass \rightarrow (\dident \mapsto \dmember),\\ -\members(c) &= \pi_3(c), \text{where $c \in \dclass$} -\end{align*} - -For looking up a member, given its identifier $\idmeta \in \dident$, we define: -\begin{align*} -\lookupMember &\in \dclass \times \dident \rightarrow \dmember,\\ -\lookupMember(c, \, \idmeta) &= \members(c)(\idmeta), \text{ where $c \in \dclass, \idmeta \in \dident$} -\end{align*} - -\subsubsection{Object Values} -\label{subsec:object-values} - -Object values are composed of a reference to a class definition, which is shared across all instances of that object, and a list of locations which identify the values of the fields for a specific instance. -\[ - \dobjval = \dclass \times \mlist{\dlocation} -\] - -We define the following function for accessing the class component of an element in $\dobjval$: -\begin{align*} -\class &\in \dobjval \rightarrow \dclass,\\ -\class(\val) &= \pi_1(\val) = c, \text{ where $c \in \dclass$ is the first component of $\val \in \dobjval$} -\end{align*} - - -We define the following function for accessing the location of a field at position $i \in \NN$ in $\dobjval$: -\begin{align*} -\getfield &\in \dobjval \times \NN \rightarrow \dlocation,\\ -\getfield(\val, i) &= \pi_2(\val)[i] = \loc, \text{ where $\pi_2(\val) \in \mlist{\dlocation}$ and $\pi_2(\val)[i]$ is the location at position $i \in \NN$} -\end{align*} - -\subsubsection{Function Values} -\label{subsec:function-values} -Function values capture the body, formals and the environment in which a function was created. -To support recursive functions, we add a location component to the function value and store the environment in it. -This allows us to modify the environment and add a binding to a location containing the function value for local functions. -\[ - \dfunval : \dformals \times \dstmt \times \denv -\] - - -\section{\kernel{} Syntax} -\label{sec:definitions} - - -\subsection{Expressions} -\label{sec:expr-syntax} - - -% Syntax -\newcommand{\VariableGet}[1]{#1} -\newcommand{\VariableSet}[2]{#1=#2} - -\todo{kmillikin: Names should not ignore the library.} -\newcommand{\PropertyGet}[2]{#1.#2} -\newcommand{\PropertySet}[3]{#1.#2=#3} - -\newcommand{\DirectPropertyGet}[2]{#1.\{#2\}} -\newcommand{\DirectPropertySet}[3]{#1.\{#2\}=#3} - -\newcommand{\SuperPropertyGet}[1]{\synt{super}.#1} -\newcommand{\SuperPropertySet}[2]{\synt{super}.#1=#2} - -\newcommand{\StaticGet}[1]{\{#1\}} -\newcommand{\StaticSet}[2]{\{#1\}=#2} - -%% MethodInvocation -\newcommand{\InstanceMethodInvocation}[3]{#1.#2(#3)} -%% DirectMethodInvocation -\newcommand{\DInstanceMethodInvocation}[3]{#1.\{#2\}(#3)} -%% SuperMethodInvocation -\newcommand{\SuperMethodInvocation}[2]{\synt{super}.#1(#2)} -%% StaticInvocation -\newcommand{\StaticInvocation}[2]{#1(#2)} -%% ConstructorInvocation -\newcommand{\New}[2]{\new\, #1\,(#2)} - -\newcommand{\Not}[1]{\synt{!}#1} -\newcommand{\AndExpression}[2]{#1\,\synt{\&\&}\,#2} -\newcommand{\OrExpression}[2]{#1\,\synt{||}\,#2} -\newcommand{\ConditionalExpression}[3]{#1\,\synt{?}\,#2\,\synt{:}\,#3} - -%% StringConcatenation -\newcommand{\StringConcatenation}[2]{#1\,\dots\,#2} - -\newcommand{\IsExpression}[2]{#1\,\synt{is}\,#2} -\newcommand{\AsExpression}[2]{#1\,\synt{as}\,#2} - -%% SymbolLiteral -%% TypeLiteral - - -%% ListLiteral -%% MapLiteral - -\newcommand{\AwaitExpression}[1]{\synt{await\,#1}} - -%% FunctionExpression - -\newcommand{\StringLiteral}[1]{#1} -\newcommand{\IntLiteral}[1]{#1} -\newcommand{\DoubleLiteral}[1]{#1} -\newcommand{\BoolLiteral}[1]{#1} -\newcommand{\NullLiteral}{\nnull} -\newcommand{\Let}[3]{\synt{let}\,#1\synt{=}#2\,\synt{in}\,#3} - -%% LoadLibrary -%% CheckLibraryIsLoaded -%% VectorCreation -%% VectorGet -%% VectorSet -%% VectorCopy -%% ClosureCreation -%% TypeInstantiation - -\[ -\begin{array}{rl} - \expressionmeta \in \dexpr ::= - & \VariableGet{\variablemeta} \\ - & \VariableSet{\variablemeta}{\expressionmeta} \\ - & \PropertyGet{\expressionmeta}{\idmeta} \\ - & \PropertySet{\expressionmeta_0}{\idmeta}{\expressionmeta_1} \\ - & \DirectPropertyGet{\expressionmeta}{\membermeta} \\ - & \DirectPropertySet{\expressionmeta_0}{\membermeta}{\expressionmeta_1} \\ - & \SuperPropertyGet{\idmeta} \\ - & \SuperPropertySet{\idmeta}{\expressionmeta} \\ - & \StaticGet{\membermeta} \\ - & \StaticSet{\membermeta}{\expressionmeta} \\ - & \Not{\expressionmeta} \\ - & \AndExpression{\expressionmeta_0}{\expressionmeta_1} \\ - & \OrExpression{\expressionmeta_0}{\expressionmeta_1} \\ - & \ConditionalExpression{\expressionmeta_0}{\expressionmeta_1}{\expressionmeta_2} \\ - & \New{\synt{Q}}{\expressionmeta*} \\ - & \IsExpression{\expressionmeta}{\typemeta} \\ - & \AsExpression{\expressionmeta}{\typemeta} \\ - & \this \\ - & \Rethrow \\ - & \Throw{\expressionmeta} \\ - & \AwaitExpression{\expressionmeta} \\ - & \lit \\ - & \NullLiteral \\ - & \Let{\variablemeta}{\expressionmeta_0}{\expressionmeta_1} \\ -\end{array} -\] - - -\subsection{Statements} -\label{subsec:stmt-syntax} - -% InvalidStatement -\newcommand{\ExpressionStatement}[1]{\{\, #1\, \}} -\newcommand{\Block}[1]{\{\, #1\, \}} -\newcommand{\EmptyStatement}{\{\}} - -% AssertStatement -\newcommand{\LabeledStatement}[2]{#1\synt{:}\, #2} -\newcommand{\BreakStatement}[1]{\synt{break}\, #1} -\newcommand{\WhileStatement}[2]{\synt{while}\, \synt{(}#1\synt{)}\, #2} -\newcommand{\DoStatement}[2]{\synt{do}\, #1\, \synt{while}\, \synt{(}#2\synt{)}} -\newcommand{\ForStatement}[4]{\synt{for}\, \synt{(}\,#1\synt{;}\, #2\synt{;}\, #3\,\synt{)}\, #4} -\newcommand{\ForInStatement}[3]{\synt{for}\,\synt{(}#1\,\synt{in}\,#2\synt{)}\,#3} - -\newcommand{\SwitchStatement}[2]{\synt{switch}\,\synt{(}#1\synt{)}\,#2} -\newcommand{\ContinueSwitchStatement}[1]{\synt{continue}\,#1} -\newcommand{\IfStatement}[3]{\synt{if}\,\synt{(}#1\synt{)}\,#2\,\synt{else}\,#3} -\newcommand{\ReturnStatement}[1]{\synt{return}\,#1} - -\newcommand{\TryCatch}[2]{\synt{try}\,#1\,\synt{catch}\,#2} -\newcommand{\TryFinally}[2]{\synt{try}\,#1\,\synt{finally}\,#2} - -\newcommand{\Yield}[1]{\synt{yield}\,#1} - -\newcommand{\VarDeclaration}[2]{\synt{var}\,#1\synt{=}#2} -\newcommand{\FunctionDeclaration}[5]{#1\,#2\synt{(}\,#3\,\synt{)}\,#4\,#5} - -\[ -\begin{array}{rl} - - \statementmeta \in \dstmt ::= - & \ExpressionStatement{\expressionmeta} \\ - & \Block{\statementmeta{s}} \\ - & \EmptyStatement \\ - & \LabeledStatement{\lbl}{\statementmeta} \\ - & \BreakStatement{\lbl} \\ - & \WhileStatement{\expressionmeta}{\statementmeta} \\ - & \DoStatement{\statementmeta}{\expressionmeta} \\ - & \ForStatement{\varmeta{s}}{\expressionmeta}{\expressionsmeta}{\statementmeta} \\ - & \ForInStatement{\varmeta}{\expressionmeta}{\statementmeta} \\ - & \SwitchStatement{\expressionmeta}{\tt{SCs}} \\ - & \ContinueSwitchStatement{\statementmeta} \\ - & \IfStatement{\expressionmeta}{\statementmeta_1}{\statementmeta_2} \\ - & \ReturnStatement{\expressionmeta} \\ - & \ReturnStatement{} \\ - & \TryCatch{\statementmeta}{\tt{CCs}} \\ - & \TryFinally{\statementmeta_1}{\statementmeta_2} \\ - & \Yield{\expressionmeta} \\ - & \VarDeclaration{\idmeta}{\expressionmeta} \\ - & \FunctionDeclaration{\typemeta}{\idmeta}{\formals}{}{\stmt} \\ - -\end{array} -\] - \todo{Add sync*/async/async* marker and type parameters} - -\section{CESK Machine States} -\subsection{Configurations} -\label{subsec:cesk-configs} - -The state space of the CESK machine contains various kinds of configurations. -Configurations contain different components and the transition step dispatches to the next configuration based on one of the components of the configuration. - -% Named Configuration for CESK transitions -\newcommand{\breakconf}[1]{\confsingle{#1}_{\mathrm{breakCont}}} -\newcommand{\switchconf}[1]{\confsingle{#1}_{\mathrm{switchCont}}} -\newcommand{\contconf}[2]{\confpair{#1}{#2}_{\mathrm{cont}}} -\newcommand{\scontconf}[2]{\confpair{#1}{#2}_{\mathrm{scont}}} -\newcommand{\acontconf}[2]{\confpair{#1}{#2}_{\mathrm{acont}}} -\newcommand{\throwconf}[3]{\conftriple{#1}{#2}{#3}_{\mathrm{throw}}} -\newcommand{\evallistconf}[6]{\langle{#1},\,{#2},\,{#3},\handler,\,{#4},\,{#5},\,{#6}\rangle_{\mathrm{evalList}}} -\newcommand{\evalconf}[6]{\langle{#1},\,{#2},\,{#3},\handler,\,{#4},\,{#5},\,{#6}\rangle_{\mathrm{eval}}} -\newcommand{\execconf}[9]{\langle{#1},\,{#2},\,{#3},\,{#4},\,{#5},\,{#6},\,{#7},\,{#8},\,{#9}\rangle_{\mathrm{exec}}} -\newcommand{\eventconf}[2]{\langle{#1},\,{#2}\rangle_{\mathrm{event}}} - -% Transition -\todo{dmitryas: Add G (event loop) to all configurations.} -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\evalconf{\expr}{\env}{st}{cex}{cst}{\econt} & :\quad & \text{EvalConfiguration} \label{config:eval}\\ - &\evallistconf{\exprs}{\env}{st}{cex}{cst}{\acont} & :\quad & \text{EvalListConfiguration} \label{config:evallist}\\ - &\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont} & :\quad & \text{ExecConfiguration} \label{config:exec}\\ - &\contconf{\econt}{\val} & :\quad & \text{ValuePassingConfiguration} \label{config:econt}\\ - &\acontconf{\acont}{\vals} & :\quad & \text{ApplicationConfiguration} \label{config:acont}\\ - &\scontconf{\scont}{\env} & :\quad & \text{ForwardConfiguration} \label{config:scont}\\ - &\throwconf{\handler}{\val}{\strace} & :\quad & \text{ThrowConfiguration} \label{config:throw}\\ - &\breakconf{\bcont} & :\quad & \text{BreakConfiguration} \label{config:bcont}\\ - &\switchconf{\switchcont} & :\quad & \text{SwitchConfiguration} \\ - &\eventconf{\ncont}{\eventloop} & :\quad & \text{EventLoopConfiguration} - \label{config:switchcont} - \end{align} - \caption{States for the CESK machine} - \end{eqfigure} -\end{figure} - - -\subsubsection{EvalConfiguration} -\label{subsubsec:evalconfig} - -The configuration EvalConfiguration is shown in \ref{config:eval}. -The transition step for this configuration dispatches on the expression component, $\expr$. -With one transition step of the CESK-transition function, from the EvalConfiguration the next configuration can be one of the following: - -\begin{itemize} - \item ValuePassingConfiguration, when the current expression evaluates to a value in one step. - \item ExecConfiguration, when the current expression results with an invocation, i.e. execution of statement body of a getter. - Note that for other invocations, we first evaluate the receiver for instance invocations, or the arguments for static or constructor invocations. - \item EvalListConfiguration, when the current expression implies evaluation of a list of expressions. - \item ThrowConfiguration, when the current expression throws, i.e. is a throw expression. - \item EvalConfiguration, otherwise. -\end{itemize} - - -\subsubsection{EvalListConfigruation} -\label{subsubsec:evallistconfig} - -The configuration EvalListConfiguration is shown in Figure~\ref{config:evallist}. -The transition step for this configuration dispatches on the expression list, $\exprs$. -With one step of the CESK-transition function, from EvalListConfifuration the next configuration is either EvalConfiguration, when $\exprs \neq []$, or ApplicationConfiguration, otherwise. - - -\subsubsection{ExecConfiguration} -\label{subsubsec:execconfig} - -The configuration ExecConfiguration is shown in Figure~\ref{config:exec}. -The transition step dispatches on the statement, $\stmt$. -The next configuration is either EvalConfiguration or ExecConfiguration. - - -\subsubsection{ValuePassingConfiguration} -\label{suubsubsec:valuepassingconfig} - -The configuration ValuePassingConfiguration is shown in Figure~\ref{config:econt}. -The transition step applies the expression continuation component to its value component. -The expression continuation produces the next configuration. - - -\subsubsection{ApplicationConfiguration} -\label{subsubsec:applicationconfig} - -The configuration ApplicationConfiguration is shown in Figure~\ref{config:acont}. -The transition step applies the application continuation component to its list of values component. -The application continuation produces the next configuration. - - -\subsubsection{ForwardConfiguration} -\label{subsubsec:forwardconfig} - -The configuration ForwardConfiguration is shown in Figure~\ref{config:scont}. -The transition step applies the statement continuation component to its environment component. -The statement continuation produces the next configuration. - - -\subsubsection{ThrowCongfiguration} -\label{subsubsec:throwconfig} - -The configuration ThrowConfiguration is shown in Figure~\ref{config:throw}. -The transition step applies the exception handler. -The next configuration is: - -\begin{itemize} - \item ThrowConfiguration, when the exception is not handled by the first catch clause of a catch handler. - \item ExecConfiguration, for the statement body of the matching catch or the finally statement, when no catch clauses are present. -\end{itemize} - - -\subsubsection{BreakConfiguration} -\label{subsubsec:breakconfig} - -The configuration BreakConfiguration is shown in Figure~\ref{config:bcont}. -The transition step applies the break continuation component. -The next configuration is ForwardConfiguration. - - -\subsubsection{SwitchConfiguration} -\label{subsubsec:switchconfig} - -The configuration SwitchConfiguration is shown in Figure~\ref{config:switchcont}. -The transition step applies the switch continuation component. -The next configuration is ExecConfiguration. - - -\subsection{Continuations} -\label{subsec:continuations-definition} - -Continuations represent the instructions for execution of statements or evaluation of expressions. -They capture the information needed to resume the execution of the program. -There are various types of continuations depending on the state for evaluation of an expression or execution of a statement. - - -\subsubsection{Expression Continuations} -\label{subsubsec:expression-continuations} - -Expression continuations, $\econt$, capture the steps after the evaluation of a given expression. -They accept a value and produce the next configuration. - -There are various kinds of configurations, but two more general types can be distinguished: - -\begin{itemize} - \item Continuations with holes, i.e. expressions to be evaluated\\ - Expression continuations with expressions will produce EvalConfiguration for evaluation of the next expression. - Note that some continuation will not evaluate the captured expression, when this is not necessary (e.g., \eqref{eval:and}). - - \item Continuations without holes\\ - Continuations without holes dispatch on the provided value and produce the next configuration, a ValuePassingConfiguration. - -\end{itemize} - -We suffix the names of expression continuations with ``$K$''. -The different expression continuations are shown in Figure~\ref{figure:econts}. - -\newcommand{\ExceptionHandlersRest}{\handler,\,\cstrace,\,\cex} -\newcommand{\ExceptionHandlers}{\strace,\,\handler,\,\cstrace,\,\cex} -% Continuations -\newcommand{\VarSetK}[4]{\mathrm{VarSetEK}({#1},\,{#2},\,{#3},\,{#4})} -\newcommand{\ExpressionsK}[3]{\mathrm{ExpressionsEK}({#1},\,{#2},\,\ExceptionHandlers,\,{#3})} - -\newcommand{\NotK}[1]{\mathrm{NotEK}({#1})} -\newcommand{\AndK}[3]{\mathrm{AndEK}({#1},\,{#2},\,\ExceptionHandlers,\,{#3})} -\newcommand{\OrK}[3]{\mathrm{OrEK}({#1},\,{#2},\,\ExceptionHandlers,\,{#3})} -\newcommand{\ConditionalK}[4]{\mathrm{ConditionalEK}({#1},\,{#2},\,{#3},\,\ExceptionHandlers,\,{#4})} - -\newcommand{\LetK}[4]{\mathrm{LetEK}({#1},\,{#2},\,{#3},\,\ExceptionHandlers,\,{#4})} - -\newcommand{\IsExpressionK}{\mathrm{IsExpressionEK}(\tt{T},\,\econt)} -\newcommand{\AsExpressionK}{\mathrm{AsExpressionEK}(\tt{T},\,\strace,\,\handler,\,\econt)} - -\newcommand{\StaticGetK}{\mathrm{StaticGetEK}(\membermeta,\,\econt)} -\newcommand{\StaticSetK}{\mathrm{StaticSetEK}(\membermeta,\,\econt)} -\newcommand{\PropertyGetK}{\mathrm{PropertyGetEK}(\idmeta,\,\ExceptionHandlers,\,\econt)} -\newcommand{\PropertySetK}{\mathrm{PropertySetEK}(\idmeta,\,\expressionmeta_1,\,\env,\,\ExceptionHandlers,\,\econt)} -\newcommand{\PropertySetVK}{\mathrm{PropertySetValueEK}(\val_0,\,\idmeta,\,\ExceptionHandlers,\,\econt)} -\newcommand{\DPropertyGetK}{\mathrm{DPropertyGetEK}(\membermeta,\,\ExceptionHandlers,\,\econt)} -\newcommand{\DirectPropertySetK}{\mathrm{DPropertySetEK}(\membermeta,\,\expressionmeta_1,\,\env,\,\ExceptionHandlers,\,\econt)} -\newcommand{\DPropertySetVK}{\mathrm{DPropertySetValueEK}(\val_0,\,\membermeta,\,\ExceptionHandlers,\,\econt)} -\newcommand{\SuperPropertySetK}{\mathrm{SuperPropertySetEK}(\idmeta,\,\env,\,\ExceptionHandlers,\,\econt)} - -\newcommand{\InstanceMethodK}[1]{\mathrm{InstanceMethodK(\expressionsmeta,\,\idmeta,\,\env,\,#1,\,\ExceptionHandlersRest,\,\econt)}} -\newcommand{\DInstanceMethodK}[1]{\mathrm{DInstanceMethodEK}(\expressionsmeta,\,\membermeta,\,\env,\,#1,\,\ExceptionHandlersRest,\,\econt)} -\newcommand{\VarDeclK}[3]{\mathrm{VarDeclarationEK}({#1},\,{#2},\,{#3})} -\newcommand{\IfCondK}[2]{\mathrm{IfConditionEK}({#1},\,{#2},\,\env,\,\lbls,\,\clbls,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} -\newcommand{\SwitchK}[2]{\mathrm{SwitchEK}({#1},\,\env,\,\lbls,\,{#2},\,\strace,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} - -\newcommand{\WhileCondK}{\mathrm{WhileCondEK}(\expr,\,\stmt,\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} -\newcommand{\InitializerK}[4]{\mathrm{InitializerEK}({#1},\,{#2},\,{#3},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#4})} -\newcommand{\InitK}[3]{\mathrm{InitEK}({#1},\,{#2},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#3})} -\newcommand{\InitializerListEK}[5]{\mathrm{InitializerListEK}({#1},\,{#2},\,{#3},\,{#4},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#5})} -\newcommand{\FinallyK}[1]{\mathrm{FinallyEK}({#1},\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\econt)} -\newcommand{\FinallyReturnK}[1]{\mathrm{FinallyReturnEK}({#1},\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\econt)} - -\newcommand{\ForCondK}{\mathrm{ForConditionEK}(\varmeta{s},\, \expressionmeta,\, \exprs,\, \statementmeta,\, \env,\, \env',\, \lbls,\, \clbls,\, \handler,\, \cstrace,\, \cex,\, \econt,\, \scont)} -\newcommand{\ExpressionK}[2]{\mathrm{ExpressionEK}({#1},\,{#2})} - -\newcommand{\AsyncReturnEK}[1]{\mathrm{AsyncReturnEK}({#1})} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\VarSetK{\idmeta}{\env}{\ExceptionHandlers}{\econt} \label{econt:varset}\\ - &\ExpressionsK{\exprs}{\env}{\acont} \label{econt:expressions}\\ - &\NotK{\econt} \label{econt:not}\\ - &\AndK{\expressionmeta}{\ExceptionHandlers}{\econt} \label{econt:and}\\ - &\OrK{\expressionmeta}{\ExceptionHandlers}{\econt} \label{econt:or}\\ - &\ConditionalK{\expressionmeta_1}{\expressionmeta_2}{\ExceptionHandlers}{\econt} \label{econt:cond}\\ - &\LetK{\varmeta}{\expressionmeta}{\ExceptionHandlers}{\econt} \label{econt:let}\\ - &\IsExpressionK \label{econt:is}\\ - &\AsExpressionK \label{econt:as}\\ - &\StaticGetK \label{econt:static-get}\\ - &\StaticSetK \label{econt:static-set}\\ - &\DPropertyGetK \label{econt:dproperty-get}\\ - &\PropertySetK \label{econt:property-set}\\ - &\PropertySetVK \label{econt:property-set}\\ - &\DPropertyGetK \label{econt:dproperty-set}\\ - &\DPropertySetVK \label{econt:dproperty-set-v}\\ - &\SuperPropertySetK \label{econt:super-property-set}\\ - &\InstanceMethodK{\strace} \label{econt:instance-method}\\ - &\DInstanceMethodK{\strace} \label{econt:dinstance-method}\\ - &\VarDeclK{\idmeta}{\env}{\scont} \label{econt:var-decl}\\ - &\IfCondK{\expressionmeta_1}{\expressionmeta_2} \label{econt:if-cond}\\ - &\ForCondK \label{econt:for-cond}\\ - &\ExpressionK{\scont}{\env} \label{econt:expression}\\ - &\InitializerListEK{Q}{i}{\loc}{\env}{\scont} \label{econt:initializer-list}\\ - &\AsyncReturnEK{\econt} - \end{align} - \caption{Expression Continuations} - \label{figure:econts} - \end{eqfigure} -\end{figure} - - -\subsubsection{Statement Continuations} -\label{subsubsec:statement-continuations} - -Statement continuations, $\scont$, capture the steps after execution of a statement. -They accept an environment and produce the next configuration. -Statements in a block expressions can extend the environment function and this is visible to the subsequent statements in the same block. -For other types of statement configuration, the environment is ignored. - -We suffix the names of statement continuations with ``$SK$''. -The different statement continuations are shown in Figure~\ref{figure:sconts}. - -\newcommand{\ExitSK}[1]{\mathrm{ExitSK}(\econt,\,#1)} -\newcommand{\BlockSK}[2]{\mathrm{BlockSK}({#1},\,{#2},\,\lbls,\,\clbls,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} -\newcommand{\WhileSK}{\mathrm{WhileSK}(\expr,\,\stmt,\,\env,\,\lbls,\,\clbls,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} -\newcommand{\BodySK}[3]{\mathrm{BodySK}({#1},\,{#2},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#3})} -\newcommand{\NewSK}[2]{\mathrm{NewSK}({#1},\,{#2})} -\newcommand{\FinallySK}[1]{\mathrm{FinallySK}({#1},\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\econt,\,\scont)} -\newcommand{\RethrowSK}[3]{\mathrm{RethrowSK}({#1},\,{#2},\,{#3})} -\newcommand{\ForSK}{\mathrm{ForSK}(\varmeta{s},\, \expressionmeta,\, \exprs,\, \statementmeta,\, \env,\, \env',\, \lbls,\, \clbls,\, \handler,\, \cstrace,\, \cex,\, \econt,\, \scont)} -\newcommand{\WhileCondSK}{\mathrm{WhileCondSK}(\expr,\,\stmt,\,\env,\,\lbls,\,\clbls,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\ExitSK{\val} \label{scont:exit}\\ - &\BlockSK{\stmts}{\env} \label{scont:block}\\ - &\WhileSK \label{scont:while}\\ - &\BodySK{\stmt}{\env}{\scont} \label{scont:body}\\ - &\NewSK{\econt}{\loc} \label{scont:new}\\ - &\FinallySK{\stmt} \label{scont:finally}\\ - &\RethrowSK{\val}{\strace}{\handler} \label{scont:rethrow}\\ - &\ForSK \label{scont:for}\\ - &\WhileCondSK \label{scont:while} - \end{align} - \caption{Statement Continuations} - \label{figure:sconts} - \end{eqfigure} -\end{figure} - - -\subsubsection{Application Continuation} -\label{subsubsec:application-continuation} - -Application continuations, $\acont$, capture the application of a list of values resulting from the evaluation of list of expressions. - -\newcommand{\ValueA}[2]{\mathrm{ValueA}({#1},\,{#2})} -\newcommand{\StringConcatenationA}{\mathrm{StringConcatenationA(\econt)}} -\newcommand{\SuperMethodA}[1]{\mathrm{SuperMethodA}(\idmeta,\,\env,\,#1,\,\ExceptionHandlersRest,\,\econt)} -\newcommand{\StaticInvA}[4]{\mathrm{StaticInvocationA}({#1},\,{#2},\,{#3},\,\ExceptionHandlersRest,\,{#4})} -\newcommand{\DInstanceMethodA}{\mathrm{DInstanceMethodA}(\membermeta,\,\val,\,\ExceptionHandlers,\,\econt)} -\newcommand{\FieldsA}[4]{\mathrm{InstanceFieldsA}({#1},\,{#2},\,{#3},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#4})} -\newcommand{\SuperA}[3]{\mathrm{SuperA}({#1},\,{#2},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#3})} -\newcommand{\ConstructorA}[3]{\mathrm{ConstructorA}({#1},\,{#2},\,\handler,\,\cstrace,\,\cex,\,{#3})} -\newcommand{\RedirectingA}[3]{\mathrm{RedirectingA}({#1},\,{#2},\,\strace,\,\handler,\,\cstrace,\,\cex,\,{#3})} -\newcommand{\ForInitA}[1]{\mathrm{ForInitA}(\varmeta{s},\, #1,\, \exprs,\, \statementmeta,\, \env,\, \lbls,\, \clbls,\, \handler,\, \cstrace,\, \cex,\, \econt,\, \scont)} -\newcommand{\ForUpdatesA}[2]{\mathrm{ForUpdatesA}(\varmeta{s},\, #1,\, \exprs,\, \statementmeta,\, \env,\, #2,\, \lbls,\, \clbls,\, \handler,\, \cstrace,\, \cex,\, \econt,\, \scont)} -\newcommand{\InstanceMethodA}{\mathrm{InstanceMethodA(\idmeta,\,\val,\,\strace,\,\handler,\,\cstrace,\,\cex,\,\econt)}} - -We use the application continuation $\ValueA{\acont}{\val}$, capturing a value and an application continuation, as application that adds a value to the list of values to eventually used by an application continuation that produces a configuration other than ApplicationConfiguration. -We suffix the names of application continuations with ``$A$''. -The different application continuations are shown in Figure~\ref{figure:acont}. - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\ValueA{\val}{\acont} \label{acont:value}\\ - &\StringConcatenationA \label{acont:stringconcat}\\ - &\ForInitA{\expressionmeta} \label{acont:forinit}\\ - &\ForUpdatesA{\expressionmeta}{\env'} \label{acont:forupdates}\\ - &\SuperMethodA{\strace} \label{acont:supermethod}\\ - &\DInstanceMethodA \label{acont:staticinv}\\ - &\FieldsA{Q}{\loc}{\env}{\scont} \label{acont:fields}\\ - &\ConstructorA{Q}{\strace}{\econt} \label{acont:constructor}\\ - &\SuperA{Q}{\loc}{\scont} \label{acont:super}\\ - &\RedirectingA{Q}{\loc}{\scont} \label{acont:redirecting} - \end{align} - \caption{Application Continuations} - \label{figure:acont} - \end{eqfigure} -\end{figure} - - -\subsubsection{Break Continuations} -\label{subsubsec:break-continuations} - -Break continuations, $\bcont$, capture the steps to be executed when a break to a given label is encountered. -The different break continuations are shown in Figure~\ref{figure:breakcont}. -\newcommand{\Break}[2]{\mathrm{Break}(#1,\,#2)} -\newcommand{\FinallyBreak}[2]{\mathrm{FinallyBreak}({#1},\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\cstrace,\,\cex,\,\econt,\,{#2})} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\Break{\env}{\scont} \label{breakcont:break} \\ - &\FinallyBreak{\stmt}{\scont} \label{breakcont:finallybreak} - \end{align} - \caption{Break Continuations} - \label{figure:breakcont} - \end{eqfigure} -\end{figure} - -The break continuation Break, \ref{breakcont:break}, captures a statement continuation and the environment corresponding to a target label or a break statement. -The break continuation FinallyBreak, \ref{breakcont:finallybreak}, captures the statement body and the components necessary for the execution of an enclosing Finally statement. -They are added when a try/finally statement is executed. - - -\subsubsection{Switch Continuations} -\label{subsubsec:switch-continuations} - -Switch continuations, $\switchcont$, capture the steps to be executed when a continue to a preceding switch case statement is executed. -They capture the components needed for the execution of the case body statement. -The different switch continuations are shown in Figure~\ref{figure:switchconts}. - -\newcommand{\ContinueK}{\mathrm{SwitchContinueK}(\stmt,\,\env,\,\lbls,\,\clbls,\,\handler,\,\cstrace,\,\cex,\,\econt,\,\scont)} -\newcommand{\FinallyContinue}[2]{\mathrm{FinallyContinue}({#1},\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\cstrace,\,\cex,\,\econt,\,{#2})} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\ContinueK \label{switchcont:continue} \\ - &\FinallyContinue{\stmt}{\scont} \label{switchcont:finallycontinue} - \end{align} - \caption{Switch Continuations} - \label{figure:switchconts} - \end{eqfigure} -\end{figure} - -The switch continuation SwitchContinue, \ref{switchcont:continue}, captures the statement body of a preceding switch case, targeted by some continue statement, and the components necessary for its execution. -The switch continuation FinallyContinue, \ref{switchcont:finallycontinue}, captures the statement body and the components necessary for the execution of an enclosing Finally statement. -They are added when a try/finally statement is executed. - - -\subsubsection{Exception Handlers} -\label{subsubsec:exception-handlers} - -The different exception handlers are shown in Figure~\ref{figure:handlers}. -\newcommand{\ThrowH}[2]{\mathrm{ThrowK}({#1},\,{#2})} -\newcommand{\CatchH}[1]{\mathrm{Catch}({#1},\,\env,\,\lbls,\,\clbls,\,\strace,\,\handler,\,\econt,\,\scont)} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\ThrowH{\val}{\strace} \label{handle:throw} \\ - &\CatchH{cs} \label{handle:catch} - \end{align} - \caption{Exception handlers} - \label{figure:handlers} - \end{eqfigure} -\end{figure} - - -\subsubsection{Event Loop Continuations} - -\newcommand{\StartNK}[3]{\mathrm{StartNK}({#1},\,{#2},\,{#3})} -\newcommand{\ResumeNK}[2]{\mathrm{ResumeNK}({#1},\,{#2})} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\StartNK{\stmt}{\env}{\econt}\\ - &\ResumeNK{\econt}{\val} - \end{align} - \caption{Event loop continuations} - \end{eqfigure} -\end{figure} - - -\section{CESK Machine Transitions} -\label{sec:semantics} - - -\subsection{Expression Evaluation} -\label{subsec:expr-evaluation} - - -Expressions are evaluated by dispatching according to the expression component, $\expressionmeta$, in EvalConfiguration, Section~\ref{subsubsec:evalconfig}, and the list of expression component, $\exprs$, in EvalListConfiguration, Section~\ref{subsubsec:evallistconfig}. - -The CESK-transition function for EvalListConfiguration is shown in Figure~\ref{figure:evallist}. -The value corresponding to the evaluated expression is captured by the application continuation ValueA and eventually added to the list of values corresponding to the expressions. - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit% - {\evallistconf{\expr :: \exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\text{where $\econt = \ExpressionsK{\exprs}{\env}{\acont}$}} - \end{multlined}\\ - &\cesktrans% - {\evallistconf{[]}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\acontconf{\acont}{[]}}\\ - &\cesktrans% - {\acontconf{\ValueA{\val}{\acont}}{\val s}}% - {\acontconf{\acont}{\val :: \val s}} - \end{align} - \caption{The CESK-transition function for EvalListConfiguration}\label{figure:evallist} - \label{subsec:eval-list-expressions} - \end{eqfigure} -\end{figure} - -%% -% Figure showing the CESK-transition function starting from EvalConfiguration for simple -% expressions. -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\cesktranswhere% - {\evalconf{\IntLiteral{\integermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\val}}% - {\text{where $\val = \mathrm{IntLiteral(\integermeta)} \in \dsemint$}} - \label{eval:int}\\ - &\cesktranswhere% - {\evalconf{\DoubleLiteral{\doublemeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\val}}% - {\text{where $\val = \mathrm{DoubleLiteral(\doublemeta)} \in \dsemdouble$}} - \label{eval:double}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\BoolLiteral{\true}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\val}}% - {\text{where $\val = \mathrm{BoolValue(\true)} = \true\in \dsembool$}} - \end{multlined} - \label{eval:true}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\BoolLiteral{\false}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\val}}% - {\text{where $\val = \mathrm{BoolValue(\false)} = \false\in \dsembool$}} - \end{multlined} - \label{eval:false}\\ - &\cesktranswhere% - {\evalconf{\StringLiteral{\stringmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\val}}% - {\text{where $\val = \mathrm{StringValue(\stringmeta)} \in \dsemstring$}} - \label{eval:string}\\ - &\cesktrans% - {\evalconf{\varmeta}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\deref{\env(\varmeta)}}} - \label{eval:varget}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\varmeta \synt{=} \expr}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}} - {\econt' = \VarSetK{\variablemeta}{\env}{\ExceptionHandlers}{\econt}} - \end{multlined} - \label{eval:varset}\\ - &\cesktrans% - {\evalconf{\Not{\expressionmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\NotK{\econt}}} - \label{eval:not}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\AndExpression{\expressionmeta_0}{\expressionmeta_1}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta_0}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \AndK{\expressionmeta_1}{\env}{\econt}$}}% - \end{multlined} - \label{eval:and}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\OrExpression{\expressionmeta_0}{\expressionmeta_1}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta_0}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \OrK{\expressionmeta_1}{\env}{\econt}$}}% - \end{multlined} - \label{eval:or}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\ConditionalExpression{\expr}{\expri{1}}{\expri{2}}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where }\econt' = \ConditionalK{\expri{1}}{\expri{2}}{\env}{\econt}} - \end{multlined} - \label{eval:cond}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\Let{\varmeta}{\expri{1}}{\expri{2}}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expri{1}}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where }\econt' = \LetK{\varmeta}{\expri{2}}{\env}{\econt}} - \end{multlined} - \label{eval:let}\\ - &\begin{multlined} - \cesktranssplit% - {\evalconf{\StringConcatenation{\expressionmeta_1}{\expressionmeta_N}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\StringConcatenationA}} - \end{multlined} - \label{eval:concat}\\ - &\cesktrans% - {\evalconf{\IsExpression{\expressionmeta}{\tt{T}}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\IsExpressionK}} - \label{eval:is}\\ - &\begin{multlined} - \cesktranssplit% - {\evalconf{\AsExpression{\expressionmeta}{\tt{T}}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\AsExpressionK}} - \end{multlined} - \label{eval:as}\\ - &\cesktrans% - {\evalconf{\this}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\deref{\env(\this)}}} - \label{eval:this}\\ - &\begin{multlined} - \cesktranssplit% - {\evalconf{\throw \expr}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\ThrowH{(\throw \expr) :: \strace}{\handler}}} - \end{multlined} - \label{eval:throw}\\ - &\cesktrans% - {\evalconf{\rethrow}{\env}{\strace}{\strace'}{\cex}{\econt}}% - {\throwconf{\handler}{\cex}{\strace'}} - \label{eval:rethrow}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{F}{\env}{st}{cex}{cst}{\econt}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where } \val &= \funval{\formals}{\stmt}{\loc}\\ - F &\text{ is a function expression with formal parameters $\formals$ and body $\stmt$}\\ - \deref{\loc} &= \env \text{ after transtion} - \end{aligned}} - \end{multlined} - \end{align} - \caption{The CESK-transition function for EvalConfiguration: simple expressions} - \label{figure:expressions-evalconfigs} - \end{eqfigure} -\end{figure} - -%% -% Figure showing the CESK-transition function starting from ValuePassingConfiguration -% for simple expressions -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranssplit% - {\contconf{\ExpressionsK{\exprs}{\env}{\acont}}{\val}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\ValueA{\val}{\acont}}} - \end{multlined} - \label{econtconf:exprs}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\VarSetK{\idmeta}{\env}{\ExceptionHandlers}{\econt}}{\val}}% - {\contconf{\econt}{\val}}% - {\text{where $\deref{\env(\idmeta)} = \val$ after transition}} - \end{multlined} - \label{econtconf:varset}\\ - &\cesktrans% - {\contconf{\NotK{\econt}}{\true}}% - {\contconf{\econt}{\false}} - \label{econtconf:not-true}\\ - &\cesktrans% - {\contconf{\NotK{\econt}}{\false}}% - {\contconf{\econt}{\true}} - \label{econtconf:not-false}\\ - &\cesktrans% - {\contconf{\AndK{\expressionmeta}{\env}{\econt}}{\true}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt}} - \label{econtconf:and-true}\\ - &\cesktrans% - {\contconf{\AndK{\expressionmeta}{\env}{\econt}}{\false}}% - {\contconf{\econt}{\false}} - \label{econtconf:and-false}\\ - &\cesktrans% - {\contconf{\OrK{\expressionmeta}{\env}{\econt}}{\false}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt}} - \label{econtconf:or-false}\\ - &\cesktrans% - {\contconf{\OrK{\expressionmeta}{\env}{\econt}}{\true}}% - {\contconf{\econt}{\true}} - \label{econtconf:or-true}\\ - &\begin{multlined} - \cesktranssplit% - {\contconf{\ConditionalK{\expri{1}}{\expri{2}}{\env}{\econt}}{\true}}% - {\evalconf{\expri{1}}{\env}{\strace}{\cstrace}{\cex}{\econt}} - \end{multlined} - \label{econtconf:cond-true}\\ - &\begin{multlined} - \cesktranssplit% - {\contconf{\ConditionalK{\expri{1}}{\expri{2}}{\env}{\econt}}{\false}}% - {\evalconf{\expri{2}}{\env}{\strace}{\cstrace}{\cex}{\econt}} - \end{multlined} - \label{econtconf:cond-false}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\LetK{\expri{2}}{\env}{\varmeta}{\econt}}{\val}}% - {\evalconf{\expri{2}}{\env'}{\strace}{\cstrace}{\cex}{\econt}}% - {\text{where $\env'=\ext{\env}{\varmeta}{\val}$}} - \end{multlined} - \label{econtconf:let}\\ - &\cesktranswhere% - {\contconf{\IsExpressionK}{\val}}% - {\contconf{\econt}{\true}}% - {\text{where $\val$ is $\tt{T}$}} - \label{econtconf:is-true}\\ - &\cesktranswhere% - {\contconf{\IsExpressionK}{\val}}% - {\contconf{\econt}{\false}}% - {\text{where $\val$ is not $\tt{T}$}} - \label{econtconf:is-false}\\ - &\cesktranswhere% - {\contconf{\AsExpressionK}{\val}}% - {\contconf{\econt}{\val}}% - {\text{where $\val$ is $\tt{T}$}} - \label{econtconf:as-true}\\ - &\cesktranswhere% - {\contconf{\AsExpressionK}{\val}}% - {\throwconf{\handler}{\AsExpression{\expressionmeta}{\tt{T}} :: \strace}{\synt{CastError}}}% - {\text{where $\val$ is not $\tt{T}$}} - \label{econtconf:as-false} - \end{align} - \caption{The CESK-transition function for ValuePassingConfiguration: simple expressions} - \label{figure:cont-config} - \end{eqfigure} -\end{figure} - - -\subsubsection{Basic Literal Evaluation} -\label{subsubsec:basic-literal-eval} - -\kernel{} literals are evaluated to a value $\val \in \dlitval$ in one step. -Transitions of the CESK machine for basic literals are presented in Figure~\ref{figure:expressions-evalconfigs}, rules \eqref{eval:int} - \eqref{eval:string}. - - -\subsubsection{Variable Assignment and Lookup} -\label{subsubsec:variable-assignment-and-lookup} - -A variable $\varmeta$ is accessed by reading the value stored at location $\env(\varmeta)$ in the store, \eqref{eval:varget}. -Assigning a value to a variable $\varmeta$ will modify the store, more specifically the value stored at location $\env(\varmeta)$. -The evaluation of this expression proceeds by evaluating the right-hand side expression, as shown in \eqref{eval:varset} and setting the location $\env(\varmeta)$ in the store to the value this expression evaluates to, as shown in \eqref{econtconf:varset}. - - -\subsubsection{Boolean Expressions} -\label{subsubsec:bool-expressions} - -The CESK-transition function for boolean expressions is show in Figure~\ref{figure:expressions-evalconfigs}, rules \eqref{eval:not} - \eqref{eval:cond}. - -\begin{itemize} - \item Not expression\\ - The target expression is evaluated, as shown in \eqref{eval:not} and proceed by dispatching on the value the expression evaluates to according to \eqref{econtconf:not-true} and \eqref{econtconf:not-false}. - - \item And expression\\ - The left-hand side expression is evaluated, according to \eqref{eval:and}. - We dispatch on the value the expression evaluates to. - If the expression evaluate to $\false$, according to \eqref{econtconf:and-false}, the value is immediately applied to the current expression continuation. - Otherwise, we proceed with the CESK-transition \eqref{econtconf:and-true}, by also evaluating the right-hand side. - - \item Or expression\\ - The left-hand side expression is evaluated, as shown in the CESK-transition \eqref{eval:or}. - We dispatch on the value the expression evaluates to. - If the expression evaluates to $\true$, according to \eqref{econtconf:or-true}, the value is immediately applied to the current expression continuation. - Otherwise, we proceed with the CESK-transition \eqref{econtconf:or-false}, by also evaluating the right-hand side. - - \item Conditional expression\\ - The condition expression is evaluated, as shown in the CESK-transition \eqref{eval:cond}. - We dispatch on the value the expression evaluates to. - If the expression evaluates to $\true$, the next configuration evaluates the first expression and is produced with the CESK-transition \eqref{econtconf:cond-true}. - Otherwise, the next configuration evaluates the second expression and is produced with the transition \eqref{econtconf:cond-false}. - -\end{itemize} - - -\subsubsection{Let} - -Let expressions in \kernel{} introduce a new variable, initialized to some value with an initializer expression, for the evaluation of the right-hand side let expression. -Let expressions are evaluated by first evaluating the initializer expression for the fresh variable as shown in the CESK-transition \eqref{eval:let}. -It proceeds by extending the environment for the evaluation of the right-hand side let expression and producing the next configuration for evaluation of the later with the CESK-transition \eqref{econtconf:let}. - - -\subsubsection{String Concatenation} -\label{subsubsec:string-concatenation} - -The function $\concat$ concatenates the strings from the given meta-list into a single value. -\begin{align*} - \concat : \mlist{\dsemstring} &\rightarrow \dsemstring\\ - \concat( s_1 :: \dots :: s_n :: []) &= s_1 \dots s_n -\end{align*} -The evaluation of concatenation expression proceeds by evaluating the target expressions in the specified order, as shown with the CESK-transition \eqref{eval:concat}. -Once all expressions have been evaluated the corresponding application is applied, as shown in \eqref{acontconf:concat}, which results with an expression continuation application to the resulting $\dsemstring$. - - -\subsubsection{This} - -For the evaluation of $\this$ expression we add a special variable declaration, $\this$. -In the body of instance methods or constructors, there is a binding in the corresponding environment from $\this$ variable declaration to a location that stores the corresponding value. -Evaluation of $\this$ expression resolves to that value in one step, as shown in \eqref{eval:this}. - - -\subsubsection{Type Test} -\label{subsubsec:type-test} - -Type test expressions evaluate to a boolean literal value, in more than one step. -The evaluation of this kind of expression proceeds by evaluating the target expression, as in CESK-transition \eqref{eval:is}. -When the target expression evaluates to a value $\val$ such that ``$\val $ is $\tt{T}$" holds, the value $true$ is applied to the expression continuation, $\econt$, as shown in \eqref{econtconf:is-true}, otherwise $\false$ is applied to $\econt$, as in \eqref{econtconf:is-false}. - - -\subsubsection{Type Cast} -\label{subsubsec:type-cast} - -Evaluation of type cast expression proceed to evaluation of the target expression to the corresponding value, as shown in \eqref{eval:as}. -When the target expression evaluates to a value $\val$ such that ``$\val $ is $\tt{T}$" holds, the value $\val$ is applied to the expression continuation as shown in \eqref{econtconf:as-true}. -Otherwise, the evaluation of the expression results with an error, as shown in \eqref{econtconf:as-false}. - - -\subsubsection{Function Expressions} -\label{subsubsec:function-expressions} - -\kernel{} supports encapsulating an executable unit of code with function expressions. -To support function expressions we introduce $fv = \funval{\formals}{\stmt_{body}}{\env} \in \dfunval$ as a value that has the function statement body, $\stmt_{body} \in \dstmt$, its list of formal parameters, $\formals \in \dformals$, and the environment, $\env \in \denv$ in scope of the function expression. -This ensures that there are no free variables in the body of $fv$. - -$fv \in \dfunval$ has only one property, $call$. - -%% -% Figure showing the CESK-transition function starting from ApplicationConfiguration. -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktrans% - {\acontconf{\StringConcatenationA}{\vals}}% - {\contconf{\econt}{\concat(\vals)}} - \end{multlined} - \label{acontconf:concat}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\StaticInvA{\formals}{\stmt}{\strace}{\econt}}{\val{s}}}% - {\execconf{\stmt}{\env'}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\parbox{10cm}{where $\scont = \ExitSK{\nnull}$, $\env' = \ext{\env_{empty}}{\formals}{\val{s}}$}} - \end{multlined} - \label{acontconf:staticinvoc} - \end{align} - \caption{The CESK-transition function for ApplicationConfiguration for static invocation} - \label{table:static-evalconfigs} - \end{eqfigure} -\end{figure} - - -\subsubsection{Function Invocation} -\label{subsubsec:function-invoc} - -Function invocation occurs when a function expression (\ref{subsubsec:function-expressions}), instance method (\ref{subsubsec:instance-method-invoc}, \ref{subsubsec:direct-instance-method-invoc}, \ref{subsubsec:super-method-invoc}), a getter(\ref{subsubsec:property-extraction}), a setter (\ref{subsubsec:property-assignment}) or a constructor is invoked with new or with super and redirecting initializer (\ref{subsubsec:new-instance}). - -Instance method, getter or setter invocation proceed by evaluation of the receiver expression and binding its value to $\this$. -For the other invocations, $\this$ is not bound. - -Execution of function invocation proceeds immediately when the target function is marked as "sync". -\todo{Add text for generator sync and async function, and async function invocation.} - -The evaluation of the invocation proceeds by evaluating the actual argument list and binding the values of the evaluated argument list to the formal parameters of the function. -\kernel{} supports positional, positional optional and named arguments. - -An invocation expression for a \kernel{} function contains a list of expressions that represent the actual arguments for the invocation. -We construct a list of actual argument expressions containing the provided positional arguments and the provided named arguments. -We also add the constant default expressions for the optional positional and named parameters. -This is an implementation detail that allows us to evaluate all arguments for the invocation ignoring the distinction between provided or missing positional, optional and named arguments. -Note that the default values for the optional positional and named parameters are constants, hence their evaluation does not have side effects and they evaluate to a value in one step. - -After the evaluation of the argument expressions, and before binding the actual arguments to the formal parameters necessary checks ensure the actual arguments are valid. - -Let $(\val_1, \dots, \val_n, \{a_{n+1} : \val_{n+1}, \dots, a_{n+l} : \val_{n+l}\})$ be the list of values that correspond to the actual arguments expressions for the function invocation with $a_i$ names of actual named arguments. -The actual arguments are valid if: -\begin{itemize} -\item The number of positional actual arguments corresponds to the number of formal arguments for the function. -\item The actual names of named arguments $a_i$ correspond to named formal parameters. -\end{itemize} - -If any of the above mentioned statements doesn't hold, a "NoSuchMethodError" is thrown. -\todo{Elaborate how this error is constructed and passed to the current handler.} -\todo{Add text for type checking the parameters.} - -Otherwise, the statement body is then executed with the appropriate bindings. -The specific CESK-transitions for the different invocations are described in the appropriate sections below. - -%% -% Figure showing the CESK-transition function starting from EvalConfgiration for -% static property extraction and assignment, and static invocation -%% -\todo{zhivkag: Modify static method and getter invocation w.r.t. async semantics} -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticGet{\membermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\deref{\mainenv(\membermeta)}}}% - {\text{where $\membermeta$ is a static field and $\contains(\mainenv, \membermeta)$}} - \end{multlined} - \label{eval:staticget-var}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticGet{\membermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\nnull}}% - {\begin{aligned} - \text{where } &\membermeta \text{ is a static field without an initializer expression},\\ - ¬ \contains(\mainenv, \membermeta),\\ - &\deref{(\mainenv(\membermeta))} = \NullLiteral \text{ after transition} - \end{aligned}} - \end{multlined} - \label{eval:staticget-varnew-null}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticGet{\membermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\begin{aligned} - \text{where } &\membermeta \text{ is a static field with initializer expression $\expressionmeta$},\\ - ¬ \contains(\mainenv, \membermeta),\\ - &\econt' = \StaticGetK - \end{aligned}} - \end{multlined} - \label{eval:staticget-varnew}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticGet{\membermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\execconf{\stmt}{\env_{empty}}{[]}{[]}{\StaticGet{\membermeta} ::\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \membermeta &\text{is a getter with body $\stmt$}\\ - \scont &= \ExitSK{\nnull} - \end{aligned}} - \end{multlined} - \label{eval:staticget-getter}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticGet{\membermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\funval{\formals}{\stmt}{\loc}}}% - {\begin{aligned} - \text{where } \deref{\loc} &= \env_{empty} \text{ after transition}\\ - \membermeta &\text{ is a method tear-off with formal parameters $\formals$ and body $\stmt$} - \end{aligned}} - \end{multlined} - \label{eval:staticget-tearoff}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticSet{\membermeta}{\expressionmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \StaticSetK$}} - \end{multlined} - \label{eval:staticset}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticInvocation{\{\membermeta\}}{\expressionsmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont'}}% - {\begin{aligned} - \text{where } \acont' &= \StaticInvA{\formals}{\stmt}{\strace'}{\econt},\\ - \strace' &= \StaticInvocation{\{\membermeta\}}{\expressionsmeta}::\strace,\\ - \membermeta &\text{ is a static method with formal parameters }\formals \text{ and body }\stmt - \end{aligned}} - \end{multlined} - \label{eval:staticinvoc} - \end{align} - \caption{The CESK-transition function for EvalConfiguration: static variable extraction and assignment, and sync static method invocation} - \label{table:static-evalconfigs} - \end{eqfigure} -\end{figure} - -%% -% Figure showing the CESK-transition function starting from ValuePassingConfiguration for -% static property extraction and assignment, and static invocation -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\StaticGetK}{\val}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where }&\\ - \mainenv^{\synt{R}} &= \extend( \mainenv^{\synt{L}},\,\membermeta,\,\val) - \text{ after transition}\\ - \mainenv^{\synt{L}} &\text{ is the main environment in the starting configuration}\\ - \mainenv^{\synt{R}} &\text{ is the main environment in the resulting configuration} - \end{aligned}} - \end{multlined} - \label{econtconf:staticget}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\StaticSetK}{\val}}% - {\contconf{\econt}{\val}} - {\begin{aligned} - \text{where } - &\contains(\mainenv, \membermeta),\\ - &\deref{(\mainenv(\membermeta))} = \val \text{ after transition} - \end{aligned}} - \end{multlined} - \label{econtconf:staticset-var}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\StaticSetK}{\val}}% - {\contconf{\econt}{\val}} - {\begin{aligned} - \text{where } - ¬ \contains(\mainenv, \membermeta)\\ - &\mainenv^{\synt{R}} = \extend( \mainenv^{\synt{L}},\,\membermeta,\,\val)\\ - &\mainenv^{\synt{L}} \text{ is the main environment in the starting configuration}\\ - &\mainenv^{\synt{R}} \text{ is the main environment in the resulting configuration} - \end{aligned}} - \end{multlined} - \label{econtconf:staticset-var-new}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\StaticSetK}{\val}}% - {\execconf{\stmt}{\env}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } &\membermeta \text{ is a static setter with formal parameter }\formal \text{ and body }\stmt\\ - &\scont = \ExitSK{\val},\\ - &\env = \ext{\env_{empty}}{\formal}{\val} - \end{aligned}} - \end{multlined} - \label{econtconf:staticset-setter} - \end{align} - \caption{The CESK-transition function for ValuePassingConfiguration: static variable extraction and assignment, and static method invocation} - \label{table:static-evalconfigs} - \end{eqfigure} -\end{figure} - - -\subsubsection{Static and Library Fields} -\label{subsubsec:static-and-library-fields} - -In order to remember initialization and assignment of library variables and static variables, we introduce a global environment $\mainenv$ described in Section~\ref{subsec:main-env}. -The environment $\mainenv$ stores bindings for static and library fields to locations for all static and library fields allocated before the execution of the program. -Static and library variables are accessed with $\StaticGet{\membermeta}$. -The member $\membermeta$ can be a static or library field, a getter or a method. -When $\membermeta$ is a method, the expression $\StaticGet{\membermeta}$ is a method tear-off. - -\begin{itemize} - \item $\membermeta$ is a static or library field\\ - Let $\expressionmeta_{\membermeta}$ be $\membermeta$'s initializer expression. - \begin{itemize} - \item If $\membermeta$ is accessed for the first time during the program's execution, the evaluation of $\StaticGet{\membermeta}$ proceeds with evaluation of the initializer expression $\expressionmeta_{\membermeta}$. - \item If $\expressionmeta$ is $\nnull$, the location for $\membermeta$ is updated to store a $\nnull$ value, as shown in \eqref{eval:staticget-varnew-null}. - \item If $\expressionmeta$ is an expression, this expression is evaluated as shown in \eqref{eval:staticget-varnew}. - The expression will evaluate to some value $\val$ that will be applied to the corresponding continuations, as shown in \eqref{econtconf:staticget}: the location for the field $\membermeta$ is updated to store the value $\val$ and the continuation $\econt$ is applied to the value $\val$. - \item If the location for the member $\membermeta$ in the global environment $\env_{M}$ has been previously accessed or initialized and does not store the empty value $\emptyset$, the continuation $\econt$ is applied to the stored value, as shown in \eqref{eval:staticget-var}. - \end{itemize} - - \item $\membermeta$ is a static getter\\ - If $\membermeta$ is a static getter, the body of the getter is executed, as shown in \eqref{eval:staticget-getter}. - - \item $\membermeta$ is a static method tear-off\\ - If $\membermeta$ is a method with formal parameters $\formals$ and body $\stmt$, a new $\funval{\formals}{\stmt}{\loc}, \deref{\loc} = \env_{empty}$ is created and bound to the member in the global environment $\mainenv$, as shown in \eqref{eval:staticget-tearoff}. - The continuation $\econt$ is applied to this value. - -\end{itemize} - -Static and library variables are set with $\StaticSet{\membermeta}{\expressionmeta}$. -The target member can either be a static or library field, or it can be a static setter. For both cases, the right-hand side expression is evaluated first, as shown in \eqref{eval:staticset}. - -\begin{itemize} - \item $\membermeta$ is a static or library field\\ - The evaluation proceeds by updating the value stored at the corresponding location in the environment $\mainenv$, as shown in \eqref{econtconf:staticset-var}. - - \item $\membermeta$ is a static setter\\ - The evaluation proceeds by executing the statement body of the setter. - A statement continuation $\ExitSK{\val}$ is added that applies the given expression continuation $\econt$ to the value of the right-hand side expression. - The statement body is executed in an environment that has only the binding from the formal parameter of the static setter to the value of the right-hand side expression, as shown in \eqref{econtconf:staticset-setter}. - - \item Otherwise, $\membermeta$ is a static or library setter with body $\stmt$ and formal parameter $\formal$. - -\end{itemize} - - -\subsubsection{Static Invocation} -\label{subsubsec:static-invoc} - -Static invocation is supported with $\StaticInvocation{\{\membermeta\}}{\expressionsmeta}$ where $\membermeta$ is a function with statement body $\stmt$ and formal parameters $\formals$. -The evaluation of a static invocation proceeds by evaluating the arguments of the call, as shown in \eqref{eval:staticinvoc}. -After the evaluation of the actual arguments for the invocation, the corresponding application is applied to the resulting list of values, as shown in \eqref{acontconf:staticinvoc}. -In \eqref{acontconf:staticinvoc}, we apply the application continuation by creating a new environment for the execution of the body of the method by binding its formal parameters to the locations of the values for the actual arguments. -A statement continuation, $\ExitSK{\nnull}$ is added as next statement continuation to ensure that the execution of the body of the method returns correctly, when a return statement is not executed after the execution of the last statement of the body. - -%% -% Figure showing the CESK-transition function starting from -% ValuePassingConfiguration for instance property extraction and assignment. -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\PropertyGet{\expressionmeta}{\idmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \PropertyGetK$}} - \end{multlined} - \label{eval:propertyget}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\DirectPropertyGet{\expressionmeta}{\membermeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \DPropertyGetK$}} - \end{multlined} - \label{eval:dpropertyget}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\PropertySet{\expressionmeta_0}{\idmeta}{\expressionmeta_1}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta_0}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \PropertySetK$}} - \end{multlined} - \label{eval:propertyset}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\DirectPropertySet{\expressionmeta_0}{\membermeta}{\expressionmeta_1}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta_0}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \DirectPropertySetK$}} - \end{multlined} - \label{eval:dpropertyset}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\SuperPropertyGet{\idmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where } \val &= \funval{\formals}{\stmt}{\loc}\\ - \deref{\loc} &= \env'\\ - \env' &= \ext{\env_{empty}}{\this}{\deref{(\env(\this))}},\\ - \membermeta &= \superclass(\deref{\env(\this)}).lookup(\idmeta),\\ - \membermeta &\text{ is a method tear-off with formal parameters $\formals$ and body $\stmt$} - \end{aligned}} - \end{multlined} - \label{eval:superpropertyget-tearoff}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\evalconf{\SuperPropertyGet{\idmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\execconf{\stmt}{\env'}{\lbls}{\clbls}{\SuperPropertyGet{\idmeta} :: \strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \membermeta &= \superclass(\deref{\env(\this)}).lookup(\idmeta),\\ - \membermeta &\text{ is a getter method with body }\stmt,\\ - \env' &= \ext{\env_{empty}}{\this}{\deref{(\env(\this))}},\\ - \scont &= \ExitSK{\nnull} - \end{aligned}} - \end{multlined} - \label{eval:superpropertyget-getter}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\SuperPropertyGet{\idmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\contconf{\econt}{M(\deref{(\env(\this))})}}% - {\text{where $\membermeta = \superclass(\deref{\env(\this)}).lookup(\idmeta)$, $\membermeta$ is a implicit field getter}} - \end{multlined} - \label{eval:superpropertyget-field}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\SuperPropertySet{\idmeta}{\expressionmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \SuperPropertySetK$}} - \end{multlined} - \label{eval:superpropertyset} - \end{align} - \caption{The CESK-transition function for EvalConfiguration: instance property extraction and assignment} - \label{figure:instance-property-evalconfigs} - \end{eqfigure} -\end{figure} - -%% -% Figure showing the CESK-transition function starting from ValuePassingConfiguration for instance property extraction. -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\PropertyGetK}{\val}}% - {\contconf{\econt}{\funval{\formals}{\stmt}{\loc}}} - {\begin{aligned} - \text{where } \membermeta &\text{ is a method with body $\stmt$ and formals $\formals$},\\ - \deref{\loc} &= \env \text{ after transition}\\ - \env &= \ext{\env_{empty}}{\this}{\val} - \end{aligned}} - \end{multlined} - \label{econtconf:propertyget-tearoff}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\PropertyGetK}{\val}}% - {\execconf{\stmt}{\env}{[]}{[]}{\PropertyGet{\val}{\idmeta} :: \strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \membermeta&\text{ is a getter with body $\stmt$},\\ - \env &= \ext{\env_{empty}}{\this}{\val},\\ - \scont &= \ExitSK{\nnull} - \end{aligned}} - \end{multlined} - \label{econtconf:propertyget-getter}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\PropertyGetK}{\val}}% - {\contconf{\econt}{\text{\membermeta}(\val)}}% - {\begin{aligned} - \text{where } \membermeta &\text{ is an implicit getter for field $\idmeta$},\\ - \env &= \ext{\env_{empty}}{\this}{\val},\\ - \scont &= \ExitSK{\nnull} - \end{aligned}} - \end{multlined} - \label{econtconf:propertyget-field}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\PropertyGetK}{\val}}% - {\throwconf{\handler}{(\throw\text{ NoSuchMethod($\PropertyGet{\val}{\idmeta}$)}) :: \strace}{\text{NoSuchMethod}}}% - {\parbox{10cm}{where lookup of name $\idmeta$ was unsuccessful in class of value $\val$}} - \end{multlined} - \label{econtconf:propertyget-nosuchmethod}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\DPropertyGetK}{\val}}% - {\contconf{\econt}{\funval{\formals}{\stmt}{\loc}}}% - {\begin{aligned} - \text{where } \deref{\loc} = \env \text{ after transition}\\ - \membermeta &\text{ is a method with body $\stmt$ and formals $\formals$},\\ - \env &= \ext{\env_{empty}}{\this}{\val} - \end{aligned}} - \end{multlined} - \label{econtconf:dpropertyget-tearoff}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\DPropertyGetK}{\val}}% - {\execconf{\stmt}{\env}{[]}{[]}{\DirectPropertyGet{\val}{\membermeta} :: \strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \membermeta &\text{ is getter with statement body $\stmt$},\\ - \env &= \ext{\env_{empty}}{\this}{\val},\\ - \scont &= \ExitSK{\nnull} - \end{aligned}} - \end{multlined} - \label{econtconf:dpropertyget-getter}\\ - &\begin{multlined} - \cesktranswhere% - {\contconf{\DPropertyGetK}{\val}}% - {\contconf{\econt}{\deref{\val[\membermeta]}}}% - {\text{where $\membermeta$ is a field }} - \end{multlined} - \label{econtconf:dpropertyget-field} - \end{align} - \caption{The CESK-transition function for ValuePassingConfiguration: instance property extraction} - \label{figure:econtconf:instance-property-extraction} - \end{eqfigure} -\end{figure} - - -\subsubsection{Property Extraction} -\label{subsubsec:property-extraction} - -\kernel{} allows access of a member as a property, which can be either getter access, which executes the getter, or method extraction, which converts a method into a closure, also known as tear-off. -Property extraction is supported with $\PropertyGet{\expr}{\idmeta}$. -The evaluation of this expression is shown in \eqref{eval:propertyget}. -After the evaluation of the receiver expression to a value $\val$, the property $\idmeta$ is looked up in methods, getters and implicit getters for the value $\val$. -Let $\membermeta$ be the instance member result of such successful lookup below and in \eqref{econtconf:propertyget-field}, \eqref{econtconf:propertyget-getter} and \eqref{econtconf:propertyget-tearoff}. -The evaluation of the expression proceeds as follow: - -\begin{itemize} - \item $\membermeta$ is a method tear-off\\ - When $\membermeta$ is a method tear-off, the evaluation of the property extraction expression proceeds as shown in \eqref{econtconf:propertyget-tearoff}. - The member is converted to a value $\val \in \dfunval$, capturing the method body, its formal parameters and an environment with a $\this$ binding to a location that stores the current instance value and the expression continuation $\econt$ is applied to it. - - \item $\membermeta$ is a getter\\ - When $\membermeta$ is a getter, the body of the getter is executed as shown in the CESK-transition function step \eqref{econtconf:propertyget-getter}. - The statement body is executed with an environment with a $\this$ binding to a location that stores the current instance value and no statement continuation. - A getter should always contain a reachable return statement. - - \item $\membermeta$ is an implicit getter for a field $\idmeta$\\ - When $\membermeta$ is an implicit getter for field $\idmeta$ it is immediately applied on the receiver expression. - Application of implicit getter on some instance value returns the value stored in the location this getter contains. - Afterwards the continuation expression is applied to the value, as shown in \eqref{econtconf:propertyget-field}. - -\end{itemize} - -If the lookup fails, a ``NoSuchMethod'' will be thrown, as shown in \eqref{econtconf:propertyget-nosuchmethod}. - - -\subsubsection{Direct Property Extraction} -\label{subsubsec:direct-property-extraction} - -In \kernel{} a property can be accessed without lookup, by direct reference to the member $\membermeta$. -This implies that the lookup step above is bypassed. -Similar to Section~\ref{subsubsec:property-extraction}, this expression can be either getter access, which executes the getter, or method extraction, which converts a method into a closure, also known as tear-off. -The evaluation proceeds as follows: - -\begin{itemize} - \item $\membermeta$ is an instance method\\ - When $\membermeta$ is an instance method the evaluation of the direct property extraction expression proceeds in the same way as in Section~\ref{subsubsec:property-extraction}. - The exact CESK-transition function for this case is shown in \eqref{econtconf:dpropertyget-tearoff}. - - \item $\membermeta$ is an instance getter\\ - When $\membermeta$ is an instance getter, the statement body of the getter is executed, as described in the previous section with the CESK-transition function shown in \eqref{econtconf:dpropertyget-getter}. - - \item $\membermeta$ is an instance field\\ - When $\membermeta$ is an instance field, the evaluation proceeds as shown in \eqref{econtconf:dpropertyget-field}. - -\end{itemize} - -%% -% Figure showing the CESK-transition function starting from -% ValuePassingConfiguration for instance property assignment. -%% -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\PropertySetK}{\val_0}}% - {\evalconf{\expressionmeta_1}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \PropertySetVK$}} - \end{multlined} - \label{econtconf:propertyset-val}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\PropertySetVK}{\val_1}}% - {\execconf{\stmt}{\env}{[]}{[]}{(\PropertySet{\val_0}{\idmeta}{\val_1}) :: \strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \lookupMember(\class(\val_0),\,\idmeta) &= \text{Setter}(A, S),\\ - \env &= \ext{\env_{empty}}{\this :: \formal :: []}{\val_0 :: \val_1 :: []},\\ - \scont &= \ExitSK{\val_1}\\ - \end{aligned}} - \end{multlined} - \label{econtconf:propertyset-setter}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\PropertySetVK}{\val}}% - {\contconf{\econt}{\val_1}}% - {\begin{aligned} - \text{where } \lookupMember(\class(\val_0),\,\idmeta) &= \text{Setter}(i \in \NN),\\ - \deref{(\getfield(\val_0,\, i))} &= \val \text{ after the transtion}\\ - \end{aligned}} - \end{multlined} - \label{econtconf:propertyset-field}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\DirectPropertySetK}{\val_0}}% - {\evalconf{\expressionmeta_1}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\parbox{10cm}{where $\econt' = \DPropertySetVK$}} - \end{multlined} - \label{econtconf:dpropertyset-val}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\DPropertySetVK}{\val_1}} - {\execconf{\stmt}{\env}{\lbls}{\clbls}{(\DirectPropertySet{\val_0}{\membermeta}{\val_1}) :: \strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}} - {\begin{aligned} - \text{where } \membermeta &= \text{Setter}(\formal, \stmt),\\ - \env &= \ext{\env_{empty}}{\this :: \formal :: []}{\val_0 :: \val_1 :: []}\\ - \scont &= \ExitSK{\val_1} - \end{aligned}} - \end{multlined} - \label{econtconf:dpropertyset-setter}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\DPropertySetVK}{\val}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where } \membermeta &= \text{Setter}(i \in \NN),\\ - \deref{(\getfield(\val_0,\, i))} &= \val \text{ after the transtion}\\ - \end{aligned}} - \end{multlined} - \label{econtconf:dpropertyset-field}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\SuperPropertySetK}{\val}} - {\execconf{\stmt}{\env'}{\lbls}{\clbls}{(\SuperPropertySet{\idmeta}{\val}) :: \strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}} - {\begin{aligned} - \text{where } c &= \superclass(\class(\deref{(\env(\this))}))\\ - \lookupMember(c,\,\idmeta) &= \text{Setter}(\formal, \stmt)\\ - \env' &= \ext{\env_{empty}}{\this :: \formal :: []}{\deref{(\env(\this))} :: \val :: []}\\ - \scont &= \ExitSK{\val} - \end{aligned}} - \end{multlined} - \label{econtconf:superpropertyset-setter}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\SuperPropertySetK}{\val}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where } c &= \superclass(\class(\deref{(\env(\this))}))\\ - \lookupMember(c,\,\idmeta) &= \text{Setter}(i \in \NN)\\ - \deref{(\getfield(\deref{(\env(\this))},\, i))} &= \val \text{ after the transtion}\\ - \end{aligned}} - \end{multlined} - \label{econtconf:superpropertyset-field} - \end{align} - \caption{The CESK-transition function for ValuePassingConfiguration: instance property assignment} - \label{figure:instance-property-assignment-evalconfigs} - \end{eqfigure} -\end{figure} - - -\subsubsection{Property Assignment} -\label{subsubsec:property-assignment} - -An assignment in \kernel{} results with the invocation of a setter. -The evaluation of a property assignment proceeds as follows. -First, the left-hand side expression, i.e. the receiver expression, is evaluated as shown in \eqref{eval:propertyset}. -Afterwards, the right-hand side expression is evaluated, as shown in \eqref{econtconf:propertyset-val}. -After the evaluation of the receiver expression to a value $\val_0$ and the argument to value $\val_1$, the property $\idmeta$ is looked up in the properties for the value $\val_0$. -and implicit setters for the value $\val_0$. -Let $\membermeta$ be the result of such lookup. -The evaluation proceeds as follows: - -\begin{itemize} - \item $\membermeta$ is a setter invocation\\ - When $\membermeta$ is an invocation of a setter with body $\stmt$ and formal parameter $\formal$, the evaluation proceeds by executing the body in the environment which binds $\this$ to a location that contains $\val_0$ and the formal parameter $\formal$ to a location that contains $\val_1$. - This is shown in the CESK-transition \eqref{econtconf:propertyset-setter}. - Note that we add the special statement continuation $\ExitSK{\val_1}$, that will apply the value $\val_1$ to the current expression continuation. - - \item $\membermeta$ is a field\\ - When the lookup results with a field, the implicit setter for the field is invoked with the receiver value and the field value as shown in \eqref{econtconf:propertyset-field}. - The $\{\membermeta\}(\val_0, \val_1)$ is the implicit setter for the field $\membermeta$ which is a function in the domain $\dval \times \dval \rightarrow \dval$. - The value returned by the implicit function is $\val_1$. - -\end{itemize} - - -\subsubsection{Direct Property Assignment} -\label{subsubsec:direct-property-assignment} - -In \kernel{} a property can be set without lookup, by direct reference to the member of the instance. -This implies that the lookup step described in \ref{subsubsec:property-assignment} above is bypassed. -The evaluation of direct property assignment proceeds by evaluating the right-hand side expression, i.e. the receiver expression as shown in \eqref{eval:dpropertyset}. -Afterwards, the evaluation continues with the left-hand side expression as shown in \eqref{econtconf:dpropertyset-val}. -After evaluating the receiver expression to $\val_0$ and the argument expression to $\val_1$, depending on $\membermeta$, the evaluation continues as follows: - -\begin{itemize} - \item $\membermeta$ is an instance setter\\ - When $\membermeta$ is an instance setter with body $\stmt$ and formal parameter $\formal$, the evaluation of the expression proceeds with execution of the body with an environment binding $\this$ to a location containing $\val_0$ and the formal parameter $\formal$ to a location storing $\val_1$. - - \item $\membermeta$ is a field\\ - When $\membermeta$ is a field the value stored at location $\val_0[\membermeta]$ is modified to store value the argument expression evaluates to, $\val_1$, as shown in \eqref{econtconf:dpropertyset-field}. - -\end{itemize} - - -\subsubsection{Super Property Get} -\label{subsubsec:super-property-get} - -\kernel{} allows access of a superclass member as a property, which can be either getter access, which executes the getter, or method extraction, which converts a method into a closure. -Accessing a superclass member is accessed with the expression $\SuperPropertyGet{\idmeta}$ evaluated with the corresponding components: $\env$, $\strace$, $\handler$, $\cstrace$, $\cex$, $\econt$. -Let $\val = \deref{(\env(\this))}$, $C = \superclass(\val)$ and $\membermeta$ the result of looking up $\idmeta$ in $C$. -The evaluation of a super property extraction proceeds as follows: - -\begin{itemize} - \item $\membermeta$ is a method tear-off\\ - When $\membermeta$ is a method tear-off, the evaluation of super property extraction expression proceeds as shown in \eqref{eval:superpropertyget-tearoff}. - The member with body $\stmt$ and formal parameters $\formals$ is converted to a value $\val \in \dfunval$. - The value $\val$ captures the method body, its formal parameters and an environment with a $\this$ binding to a location that stores the current instance value and the expression continuation $\econt$ is applied to it. - - \item $\membermeta$ is an instance getter\\ - When $\membermeta$ is an instance getter, the statement body of the getter is executed. - The CESK-transition is shown in \eqref{eval:superpropertyget-getter}. - - \item $\membermeta$ is an instance field\\ - When $\membermeta$ is an instance field, the evaluation proceeds as shown in \eqref{eval:superpropertyget-field}. - -\end{itemize} - - -\subsubsection{Super Property Assignment} -\label{subsubsec:super-property-assignemnt} - -\kernel{} supports assignment of a super member with the expression $\SuperPropertySet{\idmeta}{\expressionmeta}$. -Let $\val' = \deref{(\env(\this))}$, $C = \superclass(\val')$ and $M$ the result of looking up $\idmeta$ in $C$. -The evaluation proceeds with evaluation of the right-hand side expression as shown in \eqref{eval:superpropertyset}. -After the evaluation of the argument expression to a value $\val$, depending on $\membermeta$, the evaluation continues as follows: - -\todo{regroup all property extraction together since text is similar} -\begin{itemize} - \item $\membermeta$ is an instance setter\\ - When $\membermeta$ is an invocation of a setter with body $\stmt$ and formal parameter $\formal$, the evaluation proceeds by executing the body in the environment which binds $\this$ to a location that contains $\deref{(\env(\this))}$ and the formal parameter $\formal$ to a location that contains $\val$. - This is shown in the CESK-transition \eqref{econtconf:superpropertyset-setter}. - Note that we add the special statement continuation $\ExitSK{\val_1}$, that will apply the value $\val$ to the current expression continuation. - - \item $\membermeta$ is a field\\ - When the lookup results with a field, the implicit setter for the field is invoked with the receiver value $\deref{(\env(\this))}$ and the field value $\val$, as shown in \eqref{econtconf:superpropertyset-field}. - -\end{itemize} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\InstanceMethodInvocation{\expressionmeta}{\idmeta}{\expressionsmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\econt' = \InstanceMethodK{\InstanceMethodInvocation{\expressionmeta}{\idmeta}{\expressionsmeta} :: \strace}} - \end{multlined} - \label{eval:instancemethod}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\DInstanceMethodInvocation{\expressionmeta}{\membermeta}{\expressionsmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evalconf{\expressionmeta}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\econt' = \DInstanceMethodK{\DInstanceMethodInvocation{\expressionmeta}{\membermeta}{\expressionsmeta} :: \strace}} - \end{multlined} - \label{eval:dinstancemethod}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\SuperMethodInvocation{\idmeta}{\expressionsmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evallistconf{\expressionsmeta}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\acont = \SuperMethodA{\SuperMethodInvocation{\idmeta}{\expressionsmeta} :: \strace}} - \end{multlined} - \label{eval:superinstancemethod}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\new Q(\exprs)}{\env}{st}{cex}{cst}{\econt}}% - {\evallistconf{\exprs}{\env}{st}{cex}{cst}{\acont'}}% - {\acont' = \ConstructorA{Q}{\new Q(\exprs) :: \strace}{\econt}} - \end{multlined} - \label{eval:new} - \end{align} - \caption{The CESK-transition function for EvalConfiguration: instance method and constructor invocation} - \label{figure:instance-method-evalconfigs} - \end{eqfigure} -\end{figure} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\InstanceMethodK{\strace}}{\val}}% - {\evallistconf{\expressionsmeta}{\env}{\strace}{\cstrace}{\cex}{\acont'}}% - {\text{where $\acont' = \InstanceMethodA$}} - \end{multlined} - \label{econtconf:instancemethod}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\DInstanceMethodK{\strace}}{\val}}% - {\evallistconf{\expressionsmeta}{\env}{\strace}{\cstrace}{\cex}{\acont'}}% - {\text{where $\acont' = \DInstanceMethodA$}} - \end{multlined} - \label{econtconf:dinstancemethod} - \end{align} - \caption{The CESK-transition function for ValuePassingConfiguration: instance method and constructor invocation} - \label{figure:instance-method-evalconfigs} - \end{eqfigure} -\end{figure} - - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\InstanceMethodA}{\val{s}}}% - {\execconf{\stmt}{\env}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \membermeta &= class(\val).lookup(\idmeta)\text{ is an instance method with body $\stmt$ and formals $\formals$},\\ - \scont &= \ExitSK{\nnull},\\ - \env &= \ext{\env_{empty}}{\this :: \formals}{\val :: \val{s}} - \end{aligned}} - \end{multlined} - \label{acontconf:instancemethod}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\DInstanceMethodA}{\val{s}}}% - {\execconf{\stmt}{\env}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } \stmt &\text{ is the statement body and $\formals$ are the formal parameters of the instace method $\membermeta$},\\ - \scont &= \ExitSK{\nnull},\\ - \env &= \ext{\env_{empty}}{\this :: \formals}{\val :: \val{s}} - \end{aligned}} - \end{multlined} - \label{acontconf:dinstancemethod}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\SuperMethodA{\strace}}{\val{s}}}% - {\execconf{\stmt}{\env'}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\begin{aligned} - \text{where } c &= \superclass(\class(\val))\\ - \membermeta &= \lookupMember(c,\,\idmeta)\text{ is an instance method with body $\stmt$ and formals $\formals$},\\ - \scont &= \ExitSK{\nnull},\\ - \env' &= \ext{\env_{empty}}{\this :: \formals}{\deref{(\env(\this))} :: \val{s}} \end{aligned}} - \end{multlined} - \label{acontconf:superinstancemethod} - \end{align} - \caption{The CESK-transition function for ApplicationConfigurations} - \label{figure:instance-method-evalconfigs} - \end{eqfigure} -\end{figure} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - \cesktrans% - {\scontconf{\ExitSK{\val}}{\env}}% - {\contconf{\econt}{\val}} - \end{align} - \caption{The CESK-transition function for ForwardConfigurations} - \label{figure:instance-method-evalconfigs} - \end{eqfigure} -\end{figure} - - -\subsubsection{Instance Method Invocation} -\label{subsubsec:instance-method-invoc} - -Method invocation is supported with $\InstanceMethodInvocation{\expressionmeta}{\idmeta}{\expressionsmeta}$. - -The evaluation of instance method invocation proceeds with the evaluation of the left-hand side expression, i.e. the receiver expression as shown in \eqref{eval:instancemethod}. -As shown in the CESK-transition \eqref{econtconf:instancemethod}, the argument expressions evaluate to a list of values. -After the evaluation of the receiver expression to a value $\val$, we proceed with evaluation of the argument expressions. - -After the evaluation of the receiver expression to a value $\val$ and the argument expressions to $\vals$, the instance method $\idmeta$ is looked up in the instance methods for the value $\val$. -Let $\membermeta$ be the result of such lookup with statement body $\stmt$ and formal parameters $\formals$. - -The body $\stmt$ is then executed with an environment binding $\this$ to a location storing the instance value $\val$ and the formal parameters to fresh locations each storing the values in $\vals$. -The CESK-transition is shown in \eqref{acontconf:instancemethod}. - -We add $\ExitSK{\nnull}$ as next statement continuation. -When a $\return$ statement is missing in the statement body $\stmt$ of the instance method $\membermeta$, the statement continuation $\ExitSK{\val}$ ensures that the execution will proceed to the corresponding expression continuation, in this case with $\val = \nnull$. - - -\subsubsection{Direct Instance Method Invocation} -\label{subsubsec:direct-instance-method-invoc} - -Direct method invocation allows invocation of instance method by providing directly the member method to be invoked and bypass the lookup step described in Section~\ref{subsubsec:instance-method-invoc} above. -The evaluation of the direct instance method invocation proceeds with the evaluation of the left-hand side expression, i.e. the receiver expression as shown in \eqref{eval:dinstancemethod}. -After the evaluation of the receiver expression to a value $\val$, the evaluation proceeds with the evaluation of the argument expressions as shown in \eqref{acontconf:dinstancemethod}. -The argument expressions are evaluated to a list of values $\vals$. -The evaluation of the expression continues with the execution of the statement body in the environment that binds $\this$ to a location that stores the value $\val$ and the formal parameters $\formals$ to fresh locations storing values from $\vals$ accordingly. -The CESK-transition is shown in \eqref{acontconf:dinstancemethod}. -Similar to Section~\ref{subsubsec:instance-method-invoc}, $\ExitSK{\nnull}$ is added as next statement continuation. - - -\subsubsection{Super Method Invocation} -\label{subsubsec:super-method-invoc} - -Super method invocation is supported with $\SuperMethodInvocation{\idmeta}{\expressionsmeta}$. -We first evaluate the argument expressions, as shown in the CESK-transition \eqref{eval:superinstancemethod}. -After the evaluation of the argument expressions to list of values $\vals$ for the super method invocation, the evaluation continues with lookup for $\idmeta$ in the members of the value bound to $\this$ in the current environment. -Let $\val = \deref{(\env(\this))}$, $C = \superclass(\val)$ and $M$ the result of looking up $\idmeta$ in $C$. -Let $\stmt$ be the statement body and $\formals$ the formal parameters for $\membermeta$. -The statement $\stmt$ is executed in an environment binding $\formals$ to the locations containing the values in $\vals$ and $\this$ binding to location containing the same value bound to $\this$ in the current environment. -Similarly to Section~\ref{subsubsec:instance-method-invoc}, $\ExitSK{\val}$ is added as next statement continuation. - - -\subsubsection{New Instance Creation} -\label{subsubsec:new-instance} - -\kernel{} supports new instance creation with constructor invocation. -A constructor can be run with $\new$ expression or when it is a target of an initializer. -\kernel{} also supports redirecting constructors, which invoke a specified target constructor without modifying the newly allocated instance. - -A constructor has an associated class definition, an initializer list, $Izs$, with various kinds of initializers, formal parameters, $\formals$, and a statement body $\stmt$. - -We support the following kinds of initializers: - -\begin{itemize} - \item $\FieldInitializer{\expressionmeta}$ --- Field initializer for field $\field$ with expression $\expressionmeta$. - Field initializers modify the field of the newly allocated instance to store the value the expression evaluates to. - \item $\LocalInitializer{\expressionmeta}$ --- Local initializer for variable $\varmeta$ with expression $\expressionmeta$. - Local initializers extend the environment for the initializer list of the constructor with a binding of variable declaration $\varmeta$ to the value the expression evaluates to. - \item $\RedirectingInitializer{G}{\expressionsmeta}$ --- Redirecting initializer with target constructor $G$ and actual arguments for running the constructor $\expressionsmeta$. - Redirecting initializer appears last in the list of initializers of a constructor. - When the last initializer in the initializer list of a constructor is a redirecting initializer, we say the constructor is a redirecting constructor. - The redirecting constructor has an empty statement body. - When a redirecting constructor is run, only the initializer list of the constructor is executed. - Note that in other cases we first initialize instance fields in the immediately enclosing class that have initializer expressions before proceeding to execution of the initializer list. - Fields for the newly allocated instance from the immediately enclosing class are initialized only when a non-redirecting constructor is run. - This ensures that side effects from evaluating the actual arguments for the target constructor of the redirecting constructor occur before any side effects from initializing the fields in the immediately enclosing class. - \item $\SuperInitializer{G}{\expressionsmeta}$ --- Super initializer with target constructor $G$ and actual arguments for running the constructor $\expressionsmeta$. - - Super initializers appear last in the initializer list and all non-redirecting constructors other then the constructor for the object class, have a super initializer as the last in their initializer list. - Before invoking the target constructor of the super initializer, all non initialized fields in the immediately enclosing class are set to $\NullLiteral$ to ensure that all fields have been initialized before they are used. -\end{itemize} - - -A new object value is allocated only a constructor is run with $\new$, i.e. invoked, otherwise we say that the constructor is run to further initialize an already allocated object value. - -Let $\new(Q(\expressionsmeta))$ be an expression invokes a constructor $Q$ to produce a new instance. -The invocation of a constructor $Q$ proceeds by evaluating the actual argument expressions as shown in \eqref{eval:new}. -After the evaluation of the argument expressions for the invocation, a fresh instance is allocated by creating a value $\val \in \dobjval$ (see Section~\ref{subsec:object-values} for details on $\dobjval$). -The execution of the constructor proceeds as follows: - -\begin{align*} - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\ConstructorA{Q}{\strace}{\econt}}{\val{s}}}% - {\contconf{\InitK{Q}{\env'}{\scont}}{\val}}% - {\begin{aligned} - \val &= \objval \in \dobjval,\\ - class &\text{ is class component of the constructor }Q,\\ - fields &\in \mlist{\dlocation} \text{ is a list of fresh locations in the store},\\ - \env' &= \extend(\env_{empty}, \formals, \val{s}),\\ - \scont &= \NewSK{\econt}{\loc} \text{ with $\loc$ a new location such that $\deref{\loc}=\val$} - \end{aligned}} - \end{multlined} -\end{align*} - -We introduce a new statement continuation, $\NewSK{\econt}{\loc}$ which captures the expression continuation that will be eventually applied to the newly allocated value after the execution of the statement body of the constructor. -The CESK-transition from the corresponding ForwardConfiguration is shown below: -\begin{align*} - &\cesktrans{\scontconf{\NewSK{\econt}{\loc}}{\env}}{\contconf{\econt}{\deref{\loc}}} -\end{align*} - -Let $initializer$ be the last initializer in the list of initializers, $Izs$, of constructor $Q$. -When $initializer$ is a redirecting initializer to some target constructor $G$, then execution of constructor $Q$'s initializer list, $Izs$, proceeds immediately. -When the redirecting initializer is the only initializer in the list, the execution proceeds as follows: -\begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitK{Q}{\env}{\scont}}{\val}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } Izs &= \RedirectingInitializer{G}{\exprs} :: [],\\ - \acont &= \RedirectingA{G}{\loc}{\scont},\\ - \deref{\loc} &= \val - \end{aligned}} - \end{multlined} -\end{align*} -Otherwise, the redirecting constructor $Q$ has other initializers in the initializer list. -The redirecting constructor can have only local initializers in the list. -The rules for executing the initializer list of redirecting and non-redirecting constructors are the same. -The other initializers for redirecting constructor are introduced by transformations that only introduce local initializers. - -The CESK-transition starting form the corresponding ValuePassingConfiguration proceeds with the first initializer in the list, denoted as $fi$ below: -\begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitK{Q}{\env}{\scont}}{\val}}% - {\evalconf{\expr}{\env}{\strace}{\cex}{\cstrace}{\econt}}% - {\begin{aligned} - \text{where } fi &= \LocalInitializer{\expr} + \FieldInitializer{\expr},\\ - fi &\text{ is first initializer in }Izs,\\ - \econt &= \InitializerK{Izs}{\val}{\env}{\scont} - \end{aligned}} - \end{multlined} -\end{align*} - -Otherwise, $Q$ is a non-redirecting generative constructor, and execution of $Q$ proceeds with evaluation of field initializers in the immediately enclosing class. -Let $Q$ be a non-redirecting constructor below. - -\begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitK{Q}{\env}{\scont}}{\val}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } \env' &= \ext{\env}{\this}{\val},\\ - \exprs &= \text{initializer expressions for instance fields},\\ - \deref{\loc} &= \val,\text{ a fresh location that stores $\val$}\\ - \acont &= \FieldsA{Q}{\loc}{\env}{\scont'},\\ - \scont' &= \BodySK{\stmt_{body}}{\env'}{\scont}. - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\RedirectingA{G}{\loc}{\scont}}{\val{s}}}% - {\contconf{\InitK{\synt{G}}{\env'}{\scont}}{\val}}% - {\text{where $\deref{\loc} = \val$, $\env' = \extend(\env_{empty}, \formals, \val{s})$}}. - \end{multlined} -\end{align*} - - -To further initialize the new instance, the body of the constructor will be eventually executed, after the execution of the instance field initializers, the constructor initializer list and its super constructor. -To support this, we add a new statement continuation, BodySK, that captures the constructor body statement, the environment for the execution of the body, the error handlers and stack trace, and the next statement continuation. -We add the newly created statement continuation as next continuation for the execution of the instance field initializers, the constructor initializer list and the super constructor. -Note that the statement continuation for the body of the constructor is not added when the constructor is redirecting, since redirecting constructors do not have a body. -The CESK-transition for this statement continuation is shown below/ - -\begin{align*} - &\cesktrans% - {\scontconf{\BodySK{\stmt}{\env}{\scont}}{\_}}% - {\execconf{\stmt}{\env}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}. -\end{align*} - -The application continuation applied on the evaluated expressions for the instance field initializers updates the values stored in the locations for each field of the object value. -An update of field $\field_i$, stored at location $\loc' = (\deref{\loc})[i]$ with value $\val_i$ is expressed as $\update((\deref{\loc}[i],\, \val_{i})$, so the following holds $\deref{\loc'} = \deref{(\deref{(\loc)}[i])} = \val_{i}$ after the update. - -After the update of the values stored in the field locations of the object value, the application continuation will produce the next configuration. -The next configuration is produced depending on the initializer list of the constructor. -We consider multiple cases: -\begin{itemize} - \item The initializer list is empty, $Izs = []$. - Note that this can be true only for the superclass `object`. - All other constructors will have at least one initializer, $\SuperInitializer{G}{\expressionsmeta}$ that targets some constructor $G$. - The CESK-transition for the case when the initializer list is empty is shown below: - \begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\acontconf{\FieldsA{Q}{\loc}{\env}{\scont}}{\val{s}}}% - {\scontconf{\scont}{\env}}% - {\text{where $\deref{(\deref{(\loc)}[i])}= \val_{i}, \forall \field_i \in Fs, \forall \val_i \in \val{s}$}}. - \end{multlined} - \end{align*} - \item The initializer list contains at least one initializer with an expression to evaluate. - This initializer is a $\FieldInitializer{\expressionmeta}$ or a $\LocalInitializer{\expressionmeta}$. - If the initializer list contains at least two initializers, we can assume that the next initializer is as described above. - The CESK-transition function for this case is shown below: - \begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\acontconf{\FieldsA{Q}{\loc}{\env}{\scont}}{\val{s}}}% - {\evalconf{\expr}{\env}{st}{cex}{cst}{\econt'}} - {\begin{aligned} - \text{where } \deref{(\deref{\loc[i]})} &= \val_{i}, \forall \field_i \in Fs, \forall \field_i \in \val{s},\\ - \econt' &= \InitializerListEK{Q}{k}{\loc}{\env}{\scont},\\ - k &= 0 \text{ is the index of the initializer whose expression is evaluated in the next step},\\ - \expressionmeta &\text{ is the expression from $\FieldInitializer{\expressionmeta}$ or $\LocalInitializer{\expressionmeta}$} - \end{aligned}} - \end{multlined} - \end{align*} - - \item Otherwise, there is only one initializer in the initializer list and it is a $\SuperInitializer{G}{\expressionsmeta}$. - This is the case because the fields are initialized only when a non-redirecting constructor is run. - Otherwise, the initializer is a super initializer, $\SuperInitializer{G}{\exprs}$: - \begin{align*} - \cesktranswheresplit% - {\acontconf{\FieldsA{Q}{\loc}{\env}{\scont}}{\val{s}}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } \deref{\deref{\loc[\field_i]}} &= \val_{i}, \forall \field_i \in Fs, \forall \val_i \in \val{s},\\ - \acont &= \SuperA{G}{\loc}{\scont} - \end{aligned}} - \end{align*} -\end{itemize} - -The CESK-transition functions starting in an ValuePassingConfiguration, with an initializer list expression continuation are described below. - -When the current initializer being executed is a $\LocalInitializer{\expressionmeta}$, we have the following cases: -\begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitializerListEK{Q}{k}{\env}{\loc}{\scont}}{\val}}% - {\scontconf{\scont}{\env'}}% - {\begin{aligned} - \text{where } \env' &= \ext{\env}{\variablemeta}{\val},\\ - Izs &\text{ is the initializer list of the constructor $Q$},\\ - Izs[k] &= \LocalInitializer{\expressionmeta},\\ - k+1 &\geq length(Izs) - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\InitializerListEK{Q}{k}{\env}{\loc}{\scont}}{\val}}% - {\evallistconf{\exprs}{\env'}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } \env' &= \ext{\env}{\variablemeta}{\val},\\ - Izs &\text{ is the initializer list of the constructor $Q$},\\ - Izs[k] &= \LocalInitializer{\expressionmeta},\\ - \acont &= \SuperA{G}{\loc}{\scont},\\ - Izs[k+1] &= \SuperInitializer{G}{\exprs},\\ - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\InitializerListEK{Q}{k}{\env}{\loc}{\scont}}{\val}}% - {\evallistconf{\exprs}{\env'}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } \env' &= \ext{\env}{\variablemeta}{\val},\\ - Izs &\text{ is the initializer list of the constructor $Q$},\\ - Izs[k] &= \LocalInitializer{\expressionmeta},\\ - \acont &= \RedirectingA{G}{\loc}{\scont},\\ - Izs[k+1] &= \RedirectingInitializer{G}{\exprs} - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitializerListEK{Q}{k}{\env}{\loc}{\scont}}{\val}}% - {\evalconf{\expri{1}}{\env'}{st}{cex}{cst}{\econt'}}% - {\begin{aligned} - \text{where } \env' &= \ext{\env}{\variablemeta}{\val},\\ - Izs &\text{ is the initializer list of the constructor $Q$},\\ - Izs[k] &= \LocalInitializer{\expressionmeta},\\ - Izs[k+1] &= \LocalInitializer{\expressionmeta_1} \text{ or }\FieldInitializer{\expressionmeta_1},\\ - \econt' &= \InitializerListEK{Izs}{k+1}{\loc}{\env'}{\scont} - \end{aligned}} - \end{multlined} -\end{align*} - -Note that when a local initializer is last in the initializer list, the environment resulted after the transition is discarded. -However, the corresponding expression has to be executed, because of side effects. - - -When the current initalizer being executed is a $\FieldInitializer{\expressionmeta}$, we have the following cases: - -\begin{align*} - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitializerListEK{Q}{k}{\loc}{\env}{\scont}}{\val}}% - {\scontconf{\scont}{\env'}}% - {\begin{aligned} - \text{where } \deref{((\deref{\loc})[i]}) &= {\val}, i \in \NN \text{ s.t $i$ is the position of $\field$ in fields of $\deref{\loc}$} \\ - Izs[k] &= \FieldInitializer{\expressionmeta} - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\InitializerListEK{Q}{k}{\loc}{\env}{\scont}}{\val}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } \deref{((\deref{\loc})[i]}) &= {\val}, i \in \NN \text{ s.t $i$ is the position of $\field$ in fields of $\deref{\loc}$} \\ - Izs[k] &= \FieldInitializer{\expressionmeta}\\ - \acont &= \SuperA{G}{\loc}{\scont},\\ - Izs[k+1] &= \SuperInitializer{G}{\exprs} - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\InitializerListEK{Q}{k}{\loc}{\env}{\scont}}{\val}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } \deref{((\deref{\loc})[i]}) &= {\val}, i \in \NN \text{ s.t $i$ is the position of $\field$ in fields of $\deref{\loc}$} \\ - Izs[k] &= \FieldInitializer{\expressionmeta}\\ - \acont &= \RedirectingA{G}{\loc}{\scont},\\ - Izs[k+1] &= \RedirectingInitializer{G}{\exprs} - \end{aligned}} - \end{multlined}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\InitializerListEK{Q}{k}{\env}{\loc}{\scont}}{\val}}% - {\evalconf{\expri{1}}{\env}{st}{cex}{cst}{\econt}}% - {\begin{aligned} - \text{where } \deref{((\deref{\loc})[i]}) &= {\val}, i \in \NN \text{ s.t $i$ is the position of $\field$ in fields of $\deref{\loc}$} \\ - Izs[k] &= \FieldInitializer{\expressionmeta}\\ - Izs[k+1] &= \LocalInitializer{\expressionmeta_1} \text{ or }\FieldInitializer{\expressionmeta_1},\\ - \econt' &= \InitializerListEK{Izs}{k+1}{\env'}{\loc}{\scont} - \end{aligned}} - \end{multlined} -\end{align*} - - -\subsection{Statement Execution} -\label{subsec:stmt-exectution} - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\VarDeclaration{\varmeta}{\expr}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \VarDeclK{\env}{\varmeta}{\scont}$}} - \end{multlined} - \label{execconf:vardecl}\\ - &\cesktrans% - {\execconf{\EmptyStatement}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\scontconf{\scont}{\env}} - \label{execconf:empty}\\ - &\begin{multlined} - \cesktranswheresplit% - {\execconf{\ExpressionStatement{\expressionmeta}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \ExpressionK{\scont}{\env}$}} - \end{multlined} - \label{execconf:expresion}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\Block{\stmt_1 :: \stmt{s}}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\execconf{\stmt_1}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont'}}% - {\text{where $\scont' = \BlockSK{\stmt{s}}{\env}$}} - \end{multlined} - \label{execconf:block}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\IfStatement{\expr}{\stmti{1}}{\stmti{2}}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \IfCondK{\stmti{1}}{\stmti{2}}$}} - \end{multlined} - \label{execconf:if}\\ - &\cesktrans% - {\execconf{\ReturnStatement{\expr}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt}} - \label{execconf:return}\\ - &\cesktrans% - {\execconf{\ReturnStatement{}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\contconf{\econt}{\nnull}} - \label{execconf:return-empty}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\DoStatement{\statementmeta}{\expressionmeta}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\execconf{\statementmeta}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont'}}% - {\text{where $\scont' = \WhileCondK$}} - \end{multlined} - \label{execconf:do}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\WhileStatement{\expr}{\stmt}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt', \scont' = \WhileCondK$}} - \end{multlined} - \label{execconf:while}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\ForStatement{\varmeta{s}}{\expressionmeta}{\exprs}{\statementmeta}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evallistconf{\exprs'}{\env}{\strace}{\cex}{\cstrace}{\acont}}% - {\parbox{\textwidth-2cm}{where $\acont = \ForInitA{\expressionmeta}$,\\ - $\exprs' =$ initializer expressions for the list of variable declarations $\varmeta{s}$}} - \end{multlined} - \label{execconf:for}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\LabeledStatement{L}{\stmt_{L}}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\execconf{\stmt_{L}}{\env}{\lbl :: \lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\text{where $\lbl = \mathrm{Label}(L, \bcont)$, $\bcont = \mathrm{Break}(\env, \scont)$}} - \end{multlined} - \label{execconf:labeled}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\execconf{\SwitchStatement{\expr}{\scases}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \SwitchK{\scases}{\clbls}$}} - \end{multlined} - \label{execconf:switch}\\ - &\begin{multlined} - \cesktranswheresplit% - {\execconf{\BreakStatement{L}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\breakconf{\bcont}}% - {\text{where $\lbl = Label(L', \bcont) \in \lbls \text{ with } L' == \synt{L}$}} - \end{multlined} - \label{execconf:break}\\ - &\begin{multlined} - \cesktranswheresplit% - {\execconf{\ContinueSwitchStatement{\stmt}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\switchconf{\switchcont}}% - {\text{where $\clbl = \continuel{\stmt'}{\switchcont} \in \clbls \text{ with } \stmt' == \stmt$}} - \end{multlined} - \label{execconf:continue}\\ - &\begin{multlined} - \cesktranswheresplit% - {\execconf{\FunctionDeclaration{\typemeta}{\idmeta}{\formals}{}{\stmt}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cstrace,\,\cex}{\econt}{\scont}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where } \env' &= \ext{\env}{\varmeta}{\nnull}\\ - \val &= \funval{\stmt_{body}}{\formals}{\env'}\\ - \deref{\env'(\varmeta)} &=\val \text{ after transition}\\ - \varmeta &= \text{a variable declaration corresponding to identifier $\idmeta$} - \end{aligned}} - \end{multlined} - \label{execconf:function} - \end{align} - \caption{The CESK-transition function starting in ExecConfiguration} - \label{figure:exec} - \end{eqfigure} -\end{figure} - -\begin{figure} - \begin{eqfigure} - \begin{align} - &\cesktrans% - {\contconf{\VarDeclK{\env}{\varmeta}{\scont}}{\val}}% - {\scontconf{\scont}{\ext{\env}{\varmeta}{\val}}} - \label{econtconf:vardecl}\\ - &\begin{multlined} - \cesktranssplit% - {\contconf{\IfCondK{\stmti{1}}{\stmti{2}}}{\true}}% - {\execconf{\stmti{1}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cstrace,\,\cex}{\econt}{\scont}} - \end{multlined} - \label{econtconf:if-true}\\ - &\begin{multlined} - \cesktranssplit% - {\contconf{\IfCondK{\stmti{1}}{\stmti{2}}}{\false}}% - {\execconf{\stmti{2}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cstrace,\,\cex}{\econt}{\scont}} - \end{multlined} - \label{econtconf:if-false}\\ - &\begin{multlined} - \cesktrans% - {\contconf{\WhileCondK}{\false}}% - {\scontconf{\scont}{\env}} - \end{multlined} - \label{econtconf:while-false}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\WhileCondK}{\true}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cstrace,\,\cex}{\econt}{\scont'}} - {\text{where $\scont' = \WhileCondSK$}} - \end{multlined} - \label{econtconf:while-true}\\ - &\cesktrans% - {\contconf{\ForCondK}{\false}}% - {\scontconf{\scont}{\env}} - \label{econtconf:for-false}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\ForCondK}{\true}}% - {\execconf{\scont}{\env'}{\lbls}{\clbls}{\strace}{\handler}{\cstrace,\,\cex}{\econt}{\scont'}}% - {\text{where $\scont' = \ForSK$}} - \end{multlined} - \label{econtconf:for-true} - \end{align} - \caption{The CESK-transition function starting in ValuePassingConfiguration: statements} - \end{eqfigure} -\end{figure} - -\begin{figure} - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranssplit% - {\scontconf{\BlockSK{\stmt :: \stmts}{\env}}{\env'}} - {\execconf{\stmt}{\env'}{\lbls}{\clbls}{\strace}{\handler}{\cstrace,\,\cex}{\econt}{\scont'}} - \end{multlined} - \label{scontconf:block}\\ - &\cesktrans% - {\scontconf{\BlockSK{[]}{\env}}{ \_ }}% - {\scontconf{\scont}{\env}}, - \label{scontconf:block-empty}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\scontconf{\WhileCondSK}{\_}}% - {\evalconf{\expr}{\env}{\strace}{\cstrace}{\cex}{\econt'}} - {\text{where $\econt' = \WhileCondK$}} - \end{multlined} - \label{scontconf:while}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\scontconf{\ForSK}{\_}}% - {\evallistconf{\exprs}{\env_{new}}{st}{cex}{cst}{\acont}}% - {\parbox{\textwidth-2cm}{where $\acont = \ForUpdatesA{\expressionmeta}{\env_{new}}$,\\ - $\env_{new} = \extend(\env, \varmeta{s}, \vals)$, $\vals = \{\val_i \mid \deref(\env'(\varmeta_i))\}$}} - \end{multlined} - \label{scontconf:for} - \end{align} - \caption{The CESK-transition function starting in ForwardConfiguration: statements} - \end{eqfigure} -\end{figure} - - -\subsubsection{Variable Declaration} - -Execution of a variable declaration statement proceeds by evaluating the right-hand side expression as shown in \eqref{execconf:vardecl}. -After the evaluation of the initializer expression to a value $\val$, the corresponding environment is extended with a new binding to a location that stores the value $\val$, as shown in \eqref{econtconf:vardecl}. - - -\subsubsection{Empty Statement} -\label{subsubsec:emtpy-stmt} - -Execution of empty statement proceeds to the next ForwardConfiguration, as shown in \eqref{execconf:empty}. - - -\subsubsection{Expression Statement} -\label{expression-stmt} - -Execution of expression statement proceeds by evaluating the expression, as shown in \eqref{execconf:expresion}. - - -\subsubsection{Block Statements} - -Execution of block statements proceeds by executing each statement of the block with the environment function after the execution of the previous statement. -The CESK-transition function for block statements is shown in \eqref{execconf:block}, \eqref{scontconf:block} and \eqref{scontconf:block-empty}. - - -\subsubsection{If Statement} - -Execution of conditional statements proceeds by evaluating the condition to a value, as shown in \eqref{execconf:if}. -The expression continuation for the execution of the rest of the statement will dispatch on the value the condition expression evaluates to and produce a configuration for the execution of the next statement, as shown in \eqref{econtconf:if-true} and \eqref{econtconf:if-false}. - - -\subsubsection{Return Statement} - -\kernel{} supports return statements with or without an expression. -In the first case, the execution proceeds with evaluation of the return expression, as shown in \eqref{execconf:return}. -The expression continuation component in the ExecConfiguration is the return expression continuation. -This is the expression continuation that is applied to the value the return expression evaluates to. -When the return expression is empty, the value $\nnull$ is applied to the return expression continuation component in the ExecConfiguration as shown in \eqref{execconf:return-empty}. - -\begin{figure} - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\ForInitA{\nnull}}{\vals}}% - {\execconf{\stmt}{\env'}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont'}}% - {\parbox{\textwidth-2cm}{where $\env' = \extend(\env, \varmeta{s}, \vals)$,\\ - $\scont' = \ForSK$}} - \end{multlined} - \label{acontconf:forinit-nullcond}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\ForInitA{\expressionmeta}}{\vals}}% - {\evalconf{\expressionmeta}{\env'}{\strace}{\cstrace}{\cex}{\econt'}}% - {\parbox{\textwidth-2cm}{where $\env' = \extend(\env, \varmeta{s}, \vals)$,\\ - $\econt' = \ForCondK$}} - \end{multlined} - \label{acontconf:forinit}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\ForUpdatesA{\nnull}{\env'}}{\_}}% - {\evalconf{\expressionmeta}{\env'}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \ForCondK$}} - \end{multlined} - \label{acontconf:forupdate-nullcond}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\acontconf{\ForUpdatesA{\expressionmeta}{\env'}}{\_}}% - {\evalconf{\expressionmeta}{\env'}{\strace}{\cstrace}{\cex}{\econt'}}% - {\text{where $\econt' = \ForCondK$}} - \end{multlined} - \label{acontconf:forupdate} - \end{align} - \caption{The CESK-transition function starting in ApplicationConfiguration: statements} - \end{eqfigure} -\end{figure} - - -\subsubsection{Loops} - -In \kernel{} there are $\dowhile$, $\forin$, $\for$ and $\while$ loop statements. -The execution of the different loop statements is defined below: - -\begin{itemize} - \item $\while$\\ - The execution of $\while$ statement loops proceeds with evaluation of the condition expression as shown in \eqref{execconf:while}. - The expression continuation for the execution of the remainder of the statement dispatches on the value of the condition expression. - The body of the while loop is executed when this value is identical to $\true$, as shown in \eqref{econtconf:while-true}. - Otherwise, the execution proceeds with the next ForwardConfiguration as shown in \eqref{econtconf:while-false}. - \item $\dowhile$\\ - The execution of do while loop statement is similar to while loop statements. - First the statement body of the loop is executed as shown in \eqref{execconf:do}. - We add while statement continuation as next statement continuation that will evaluate the condition expression accordingly, as shown in \eqref{scontconf:while}. - \item $\forin$\\ - In \kernel{}, $\forin$ loops, will be desugared into while loops and their execution will proceed as the $\while$ loop rule shown in Figure~\ref{figure:exec}. - \item $\for$\\ - The execution of for loops starts with evaluation of the initializer expressions for the variable declarations in the for loop statement, as shown in \eqref{execconf:for}. - After the evaluation of the initializer, the application continuation is applied to extend the environment and evaluate a non null condition expression, as shown in \eqref{acontconf:forinit}. - When the condition expression is null, the execution of the statement proceeds to evaluation of the body of the loop, as shown in \eqref{acontconf:forinit-nullcond}. - After the execution of all the statements in the body of the loop, the execution proceeds to create a new environment with fresh locations for the variable declarations of the for loop. - That is the environment used to evaluate the update expressions, as shown in \eqref{scontconf:for}. - After the update step, the execution proceeds to evaluation of the condition, as in ~\eqref{acontconf:forupdate-nullcond} and \eqref{acontconf:forupdate}, depending whether there is a condition expression. -\end{itemize} - -Loops $\dowhile$, $\forin$, $\for$ can be desugared to while loops with transformations performed before interpreting the program. - - -\subsubsection{Labels} - -\kernel{} supports labelling statements, $\synt{L}: \stmt_{L}$, and breaking to L, $\bbreak \synt{L}$. -$\bbreak \synt{L}$ completes the execution of the labelled statement and proceeds to executing the rest of the program. -To support breaking to a label, we add a labels component, $\lbls$, to statement configurations. -$\lbls$ represents a list of pairs mapping a labelled statement, $\synt{L}: \stmt_L$, to a break statement continuation, $\bcont$. -Executing a labelled statement inserts a new break label, $\lbl$ in the list of labels $\lbls$. - - -\subsubsection{Switch} - -\kernel{} supports dispatching control among a number of cases with $\switch$ statements. -The target expression $\expr$ is evaluated and matched against the different case clauses of the switch statement. - -Case clauses can have multiple constant expressions and there is no implicit fall-through between cases. -\kernel{} supports continuing to execution of a preceding case clause with continue statements where the target of the continue statement is a preceding case clause, e.g, $\continue \synt{C}$ with $\synt{C}$ = case $\expri{1..i}$: $\stmt$. -To support continue, we add an optional $\clbls$ list, similar to the label list, which is set in a switch statement and unset otherwise. - -If there is a matching case clause, its statement is executed. -A new statement continuation is added as next statement continuation that will throw when reached. -The new statement continuation is necessary because implicit fall-through is not supported and an explicit break of the flow is required (with either of $\continue$, $\bbreak$, $\return$, $\throw$). - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\SwitchK{\scase :: \scases}{\clbls}}{\val}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\ExitSK{\nnull}}}% - {\begin{aligned} - \text{where } &\scase = \case \expri{1}, \dots, \expri{i} \synt{ : } \stmt,\\ - &\text{$\scase$ is a matching $\case$ clause} - \end{aligned}} - \end{multlined} - \label{econt:switch-matching}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\SwitchK{\scase :: \scases}{\clbls}}{\val}}% - {\contconf{\SwitchK{\scases}{\clbl :: \clbls}}{\val}}% - {\begin{aligned} - \text{where } &\text{$SC$ is a target of a $\mathrm{continue}$},\\ - &\clbl = \continuel{\scase}{\switchcont},\\ - &\switchcont = \ContinueK - \end{aligned}} - \end{multlined} - \label{econt:switch-continue}\\ - &\begin{multlined} - \cesktranswheresplit*% - {\contconf{\SwitchK{\scase :: \scases}{\clbls}}{\val}}% - {\contconf{\SwitchK{\scases}{\clbls}}{\val}}% - {\text{where $SC$ is not a target of a $\mathrm{continue}$}}, - \end{multlined} - \label{econt:switch-next}\\ - &\cesktrans% - {\contconf{\SwitchK{[]}{\clbls}}{\val}}% - {\scontconf{\scont}{\env}} - \end{align} - \end{eqfigure} - \caption{The CESK-transition function starting in ValuePassingConfiguration: switch statements} - \label{fig:econt-switch} -\end{figure} - -The execution of switch statements is shown in \eqref{execconf:switch}, where the target expression is evaluated to some value $\val$. - -In Figure~\ref{fig:econt-switch} we show how the SwitchEK is applied to the target value of the switch. -We consider three cases: if a switch case is a matching case clause, if it is a non-matching case clause target of a continue in a following switch case or a non-matching switch clause that is not the target of a continue. - -We add a CESK-transition that evaluates all the expressions in the associated switch cases. -These expressions being constant, their evaluation has no side effects. - -A case clause is matching if is $\default$ or there is at least one of the constant expressions in the case clause identical to the target value of the switch. -The CESK-transition function matching case is shown in \eqref{econt:switch-matching}. - -If a non-matching $\case$ clause, $\scase$, is the target of a continue statement, it installs a new continue label. -A new continue label is installed to support execution of its statement with the appropriate configuration when a continue to this clause is executed. -The CESK-transition is shown in \eqref{econt:switch-continue}. - -If the switch case is not target of a continue, the execution of the switch statement proceeds to the next switch case, as shown in \eqref{econt:switch-next}. - - -\subsubsection{Exceptions} - -\kernel{} supports structured exception handling with $\synt{try/catch}$ and $\synt{try/finally}$ statements. -Exceptions are thrown with $\throw$ and $\rethrow$ expressions. -To support throwing exceptions, we add a handler, $\handler$, and a stacktrace, $\strace$, component to expression configurations (and correspondingly, to statement configurations). -To support $\rethrow$, we add an optional current error, $\cex$, and current stack trace, $\cstrace$, which are set when inside a catch block and unset otherwise. - -\begin{align*} - &\cesktrans% - {\contconf{\ThrowH{\strace}{\handler}}{\val}}% - {\throwconf{\handler}{\val}{\strace}}. -\end{align*} - -$\synt{try/catch}$ handlers contain a list of on-catch handlers, environment, break labels, continue switch labels, exception handler, stacktrace, return continuation, and statement continuation. -The handlers are tried in order to see if they match against the type of the exception. -If none match, the exception is rethrown. - -\begin{align*} - \cesktranswherealign% - {\throwconf{\econt'}{\val}{\strace'}}% - {\execconf{\stmt}{\env'}{\lbls}{\clbls}{\handler}{inr(\val)}{inr(\strace')}{\econt}{\scont}}% - {\text{if $V$ is $T$}}\\ - \cesktranswherealign% - {\throwconf{\econt'}{\val}{\strace'}}% - {\throwconf{\CatchH{cs}}{\val}{\strace'}}% - {\text{otherwise}} -\end{align*} - -\noindent where $\econt' = \CatchH{(\synt{on T catch (e, s) }\stmt) :: cs}$ is a catch continuation containing a non-empty list of on-catch handlers, and $\env' = \extend(\env, e :: s :: [], \val :: \strace' :: [])$. - -When a catch handler with no on-catch handlers is reached, the exception is rethrown. - -\begin{align*} - &\cesktrans% - {\throwconf{\CatchH{[]}}{\val}{\strace'}}% - {\throwconf{\handler}{\val}{\strace'}} -\end{align*} - -$\synt{try/finally}$ handlers contain a statement, environment, break labels, continue switch labels, exception handler, stacktrace, and return continuation. -Note that they do not contain a statement continuation because when control falls off the end of the finally statement the exception is rethrown. -The statement is unconditionally executed: - -\begin{align*} - &\begin{multlined} - \cesktranssplit% - {\throwconf{\FinallyK{\stmt}}{\val}{\strace'}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\handler}{inl()}{inl()}{\econt}{\RethrowSK{\val}{\strace'}{\handler}}}, - \end{multlined}\\ - &\cesktrans% - {\scontconf{\RethrowSK{\val}{\strace}{\handler}}{\_}}% - {\throwconf{\handler}{\val}{\strace}}. -\end{align*} - -$\synt{try/catch}$ statements execute their body with a new handler. -\begin{align*} - \begin{multlined} - \cesktranswheresplit*% - {\execconf{\TryCatch{\stmt}{cs}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler'}{\cex,\,\cstrace}{\econt}{\scont}}% - {\text{where $\handler' = \CatchH{cs}$}} - \end{multlined} -\end{align*} - -$\synt{try/finally}$ statements execute their body with a new handler and additionally install new break and continue switch labels, a new return continuation, and a new statement continuation: - -\begin{align*} - &\begin{multlined} - \cesktranssplit - {\execconf{\TryFinally{\stmti{0}}{\stmti{1}}}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\execconf{\stmti{0}}{\env}{\lbls'}{\clbls'}{\handler'}{\cex}{\cstrace}{\econt'}{\scont'}} - \end{multlined} -\end{align*} - -\noindent where -\[ -\begin{aligned} - \handler' &= \FinallyK{\stmti{0}},\\ - \econt' &= \FinallyReturnK{\stmti{1}},\\ - \scont' &= \FinallySK{\stmti{1}},\\ - \lbls' &= \lbrace \mathrm{Label}(L, \bcont') \mid \mathrm{Label}(L, \bcont) \in \lbls\rbrace,\\ - \bcont' &= \FinallyBreak{\stmti{1}}{\bcont},\\ - \clbls' &= \lbrace \continuel{C}{\switchcont'} \mid \continuel{C}{\switchcont} \in \clbls\rbrace,\\ - \switchcont' &= \FinallyContinue{\stmti{1}}{\switchcont} -\end{aligned} -\] - - -\subsubsection{Break} - -$\bbreak \synt{L}$ statements break from an enclosing label $\synt{L}$ and execute the break continuation corresponding to the label in the list of labels $\lbls$. - -\begin{align*} - &\cesktrans% - {\breakconf{\Break{\env}{\scont}}}% - {\scontconf{\scont}{\env}},\\ - &\begin{multlined} - \cesktranssplit% - {\breakconf{\FinallyBreak{\stmt}{\bcont}}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\mathrm{BreakSK}(\bcont)}}, - \end{multlined}\\ - &\cesktrans% - {\scontconf{\mathrm{BreakSK}(\bcont)}{\env}}% - {\breakconf{\bcont}}, -\end{align*} - -\noindent where $\lbl = Label(L', \bcont) \in \lbls \text{ with } L' == \synt{L}$. - - -\subsubsection{Continue} - -$\continue \synt{L}$ statements continue to executing the statement of a preceding case clause, labelled with $\synt{L}$ and execute the continue continuation corresponding to the label in the list of labels $\clbls$. - -\begin{align*} - &\begin{multlined} - \cesktranssplit% - {\switchconf{\ContinueK}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}, - \end{multlined}\\ - &\begin{multlined} - \cesktranssplit% - {\switchconf{\FinallyContinue{\stmt}{\switchcont}}}% - {\execconf{\stmt}{\env}{\lbls}{\clbls}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\mathrm{SwitchContinueSK}(\switchcont)}}, - \end{multlined}\\ - &\cesktrans% - {\scontconf{\mathrm{SwitchContinueSK}(\switchcont)}{\env}}% - {\switchconf{\switchcont}}, -\end{align*} - -\noindent where $\clbl = \continuel{L'}{\switchcont} \in \clbls \text{ with } L' == \synt{L}$. - - -\subsubsection{Function Declaration} - -\kernel{} supports local function declaration, where a final variable stores a function value. -Let $F$ be a function with a body $\stmt_{body}$ and a list of formal parameters, $\formals$, and let $fun \in \dvardecl$ be the corresponding final variable declaration. - - -\subsection{Event Loop} -\label{subsec:eventloop} - -\dart{} supports asynchronous execution of code with async functions, await expressions, and asynchronous for-in loops. -We introduce an event loop component to represent Dart's event loop. -We denote the event loop with $\eventloop$. -$\eventloop$ is a list of event continuations, elements of $\dncont$. -\[ - \eventloop \in \mlist{\dncont} -\] - -The event loop is a list and it supports the operations defined in Section~\ref{subsubsec:semantic-list}. - -\subsubsection{Async} -\label{subsubsec:async} -% Move these macros next to the rest of the macros. -\renewcommand{\StartNK}[4]{\mathrm{StartNK}({#1},\,{#2},\,{#3},\,\ExceptionHandlersRest,\,{#4})} -\newcommand{\CompleteFutureEK}[1]{\mathrm{CompleteFutureEK}({#1})} -\newcommand{\AwaitReturnNK}[2]{\mathrm{AwaitReturnNK}({#1},\,{#2})} -\newcommand{\AwaitEK}{\mathrm{AwaitEK}(\econt)} -\newcommand{\AsyncStaticInvA}[4]{\mathrm{AsyncStaticInvA}({#1},\,{#2},\,{#3},\,\ExceptionHandlersRest,\,{#4})} -\newcommand{\FutureValue}[1]{\mathrm{FutureValue}(#1)} -\newcommand{\dfuture}{\mathbf{FutureValue}} - -Asynchronous execution in \dart{} is supported with async functions, await expressions, and asynchronous for-in loops. -In \kernel{} $\AwaitExpression{}$ is an expression and here we present the behaviour of invocation of asynchronous functions. -Asynchronous \synt{for in} loops occur as statements. -The semantics of the $\AwaitExpression{}$ expression in \kernel{} for expressions that do not evaluate to an element of $\dfuture$ does not modify the event loop. - -Otherwise, the await expression modifies the event loop and proceeds to a state that that applies an event continuation from the event loop, i.e. an event loop configuration. -Invocation of asynchronous functions without an await modifies the event loop, but continues with the next continuation. - -Notes here are for those who will rewrite the basic async specification into full async specification. -They should be changed in the final version. - -What to read: -\begin{itemize} - \item The Event Loop and Dart \url{https://webdev.dartlang.org/articles/performance/event-loop}. - - \item Dart Language Asynchrony Support: Phase 1 \url{https://www.dartlang.org/articles/language/await-async}. - - \item Spicing Up Dart with Side Effects \url{http://dl.acm.org/citation.cfm?id=2747873}. - -\end{itemize} - -Along other things, the following is not considered in the basic version: -\begin{itemize} - \item Event loop component needs to be added to all configurations. - \item Exception handlers should be updated with a handler that completes the future. - - \item Semantics for invocations of async functions other then static invocations should be added. - - \item Elements from $\dfuture$ should be specified. - -\end{itemize} - - -When an await continuation, $\AwaitEK$, is applied to a $\FutureValue{\loc}$, it needs to "complete" the future before returning. -Therefore, it adds an event continuation at the tail of the event loop that captures the return continuation and the location from the store corresponding to the returned future. -It then proceeds to the head event continuation of the event loop. - -When the body of async function is about to be executed, we create a $\StartNK{\stmt}{\env}{\strace}{\econt'}$ event continuation that captures the body, the environment, the exception components and an expression continuation that completes the corresponding $\FutureValue{\loc}$. -We append this event continuation to the event loop and the invocation evaluates to a future immediately. -The created future value captures the location where the completed value of the future will eventually be stored. -The future is completed eventually, when the above mentioned continuation from the event loop is applied. - -Additionally, we need to mention that the execution of the program completes when a final state is reached and the event loop is empty. -Note that this implies the introduction of an exit state, which will not proceed to application of continuations from the event loop. -Transition to this state will happen when a failure to handle an exception occurs. - - -\begin{figure}[Htp] - \begin{eqfigure} - \begin{align} - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\AwaitExpression{\expressionmeta}}{\env}{st}{cex}{cst}{\econt}}% - {\evalconf{\expressionmeta}{\env}{st}{cex}{cst}{\econt'}}% - {\text{where } \econt' = \AwaitEK} - \end{multlined}\label{async:await}\\ - &\begin{multlined} - \cesktranswheresplit% - {\evalconf{\StaticInvocation{\{\membermeta\}}{\expressionsmeta}}{\env}{\strace}{\cstrace}{\cex}{\econt}}% - {\evallistconf{\exprs}{\env}{\strace}{\cstrace}{\cex}{\acont}}% - {\begin{aligned} - \text{where } - \acont &= \AsyncStaticInvA{\formals}{\stmt}{\strace'}{\econt},\\ - \strace' &= \StaticInvocation{\{\membermeta\}}{\expressionsmeta}::\strace,\\ - \membermeta &\text{ is an async static method with formal parameters }\formals \text{ and body }\stmt - \end{aligned}} - \end{multlined}\label{async:static-invoc}\\ - &\begin{multlined} - \cesktranswheresplit% - {\acontconf{\AsyncStaticInvA{\formals}{\stmt}{\strace}{\econt}}{\val{s}}}% - {\contconf{\econt}{\val}}% - {\begin{aligned} - \text{where } - \val &= \FutureValue{\loc}\\ - \loc &= \text{fresh location in the store}\\ - \eventloop_{R} &= \append(\eventloop_{L},\ncont)\\ - \ncont &= \StartNK{\stmt}{\env}{\strace}{\econt'}\\ - \econt' &= \CompleteFutureEK{\loc}\\ - \env &= \ext{\env_{empty}}{\formals}{\val{s}} - \end{aligned}} - \end{multlined}\label{async:static-invoc-a}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\AwaitEK}{\val}}% - {\eventconf{\head(\eventloop')}{\tail(\eventloop')}}% - {\begin{aligned} - \text{where } - \val &= \FutureValue{\loc}\\ - \eventloop' &= \append(\eventloop, \AwaitReturnNK{\econt}{\loc}) - \end{aligned}} - \end{multlined}\label{async:econt-future}\\ - &\begin{multlined} - \cesktranswhere% - {\contconf{\AwaitEK}{\val}}% - {\contconf{\econt}{\val}}% - {\text{where }\val \notin \dfuture} - \end{multlined}\label{async:econt-value}\\ - &\begin{multlined} - \cesktranswheresplit% - {\eventconf{\StartNK{\stmt}{\env}{\strace}{\econt}}{\eventloop}}% - {\execconf{\stmt}{\env}{[]}{[]}{\strace}{\handler}{\cex,\,\cstrace}{\econt}{\scont}}% - {\text{where } \scont = \ExitSK{null}} - \end{multlined}\label{async:startnk}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\CompleteFutureEK{\loc}}{\val}}% - {\eventconf{\head(G)}{\tail(G)}}% - {\text{where } \deref{\loc} = \val \text{ after transition}} - \end{multlined}\label{async:complete-future}\\ - &\begin{multlined} - \cesktranswhere% - {\contconf{\AwaitReturnNK{\econt}{\loc}}{\eventloop}}% - {\contconf{\econt}{\deref{\loc}}}% - {\text{where } \deref{\loc} \neq \emptyset} - \end{multlined}\label{async:await-return}\\ - &\begin{multlined} - \cesktranswheresplit% - {\contconf{\AwaitReturnNK{\econt}{\loc}}{\eventloop}}% - {\eventconf{\head(\eventloop')}{\tail(\eventloop')}}% - {\text{where } \deref{\loc} = \emptyset,\,\eventloop' = \append(\eventloop,\, \AwaitReturnNK{\econt}{\loc})} - \end{multlined}\label{async:await-return-fail}\\ - \end{align} - \end{eqfigure} - \caption{The CESK-transition function for await expressions} - \label{fig:async} -\end{figure} - -\subsubsection{Sync*} -\label{subsubsec:syncstar} - - -\subsubsection{Async*} -\label{subsubsec:asyncstar} - - -\subsection{Yield} -\todo{dmitryas: Write this section after native yield behaviour is figured out, assuming that this section is about native "yield."} - -\kernel{} supports suspending the execution of the body of a function with native yield statements. -Functions containing yield statements in the body are marked with $SyncYielding$. - - -\subsubsection{Yield in SyncYielding} -\label{subsubsec:yield-in-syncyelding} - - -\end{document} - -% vim: tw=0