ECMAScript 4 Netscape Proposal
Formal Description
Syntactic Semantics
|
![previous](http://www.mozilla.org/js/language/arrows/left.gif) ![up](http://www.mozilla.org/js/language/arrows/up.gif) ![next](http://www.mozilla.org/js/language/arrows/right.gif) |
Monday, June 30, 2003
The syntactic semantics describe the actions the parser takes to evaluate an ECMAScript 4 program. For convenience, the syntactic
grammar is repeated here. The starting nonterminal is Program. See also the
description of the semantic notation.
The semantics are under construction. Many execution paths resulting in ???? represent semantics yet to be implemented.
This document is also available as a Word RTF file.
Terminals
General tokens: Identifier NegatedMinLong
Number RegularExpression String
VirtualSemicolon
Punctuation tokens: !
!=
!==
%
%=
&
&&
&&=
&=
(
)
*
*=
+
++
+=
,
-
--
-=
.
...
/
/=
:
::
;
<
<<
<<=
<=
=
==
===
>
>=
>>
>>=
>>>
>>>=
?
[
]
^
^=
^^
^^=
{
|
|=
||
||=
}
~
Reserved words: as
break
case
catch
class
const
continue
default
delete
do
else
extends
false
finally
for
function
if
import
in
instanceof
is
namespace
new
null
package
private
public
return
super
switch
this
throw
true
try
typeof
use
var
void
while
with
Future reserved words: abstract
debugger
enum
export
goto
implements
interface
native
protected
synchronized
throws
transient
volatile
Non-reserved words: get
set
Data Model
Semantic Exceptions
Extended integers and rationals
Objects
Undefined
Null
Strings
Namespaces
Qualified Names
The notation
ns::
id is a shorthand for
QualifiedNamenamespace:
ns,
id:
id.
Attributes
Classes
Simple Instances
Slots
Uninstantiated Functions
record UninstantiatedFunction
end record;
Method Closures
Dates
Regular Expressions
Packages
Objects with Limits
References
Modes of expression evaluation
Contexts
Labels
Function Support
Environments
Properties
Miscellaneous
Data Operations
Numeric Utilities
proc unsignedWrap32(
i:
Integer): {0 ... 2
32 – 1}
end proc;
proc signedWrap32(
i:
Integer): {–2
31 ... 2
31 – 1}
if j 231 then j j – 232 end if;
return j
end proc;
proc unsignedWrap64(
i:
Integer): {0 ... 2
64 – 1}
end proc;
proc signedWrap64(
i:
Integer): {–2
63 ... 2
63 – 1}
if j 263 then j j – 264 end if;
return j
end proc;
case x of
{NaNf32, NaNf64, +f32, +f64, –f32, –f64} do return 0;
end case
end proc;
case i of
if j > limit then j limit end if;
if negativeFromEnd and j < 0 then j j + limit end if;
if j < 0 then j 0 end if;
note 0 j limit;
return j
end case
end proc;
case x of
{
NaNf32,
NaNf64,
+f32,
+f64,
–f32,
–f64}
do return none;
{+zerof32, +zerof64, –zerof32, –zerof64} do return 0;
end case
end proc;
if –263 i 263 – 1 then return ilong
elsif 263 i 264 – 1 then return iulong
else return if64
end if
end proc;
if 0 i 264 – 1 then return iulong
elsif –263 i –1 then return ilong
else return if64
end if
end proc;
elsif |q| 253 then return qf64
elsif q < –263 – 1/2 or q 264 – 1/2 then return qf64
else
Let i be the integer closest to q. If q is halfway between
two integers, pick i so that it is even.
note –263 i 264 – 1;
if i < 263 then return ilong else return iulong end if
end if
end proc;
elsif |q| 253 then return qf64
elsif q < –263 – 1/2 or q 264 – 1/2 then return qf64
else
Let i be the integer closest to q. If q is halfway between
two integers, pick i so that it is even.
note –263 i 264 – 1;
if i 0 then return iulong else return ilong end if
end if
end proc;
case q of
{
+zero}
do return +zerof32;
{
–zero}
do return –zerof32;
end case
end proc;
case q of
{
+zero}
do return +zerof64;
{
–zero}
do return –zerof64;
end case
end proc;
case x of
{+zerof32, +zerof64, –zerof32, –zerof64} do return 0;
end case
end proc;
case x of
{–f64} do return –f32;
{–zerof64} do return –zerof32;
{+zerof64} do return +zerof32;
{+f64} do return +f32;
{NaNf64} do return NaNf32;
end case
end proc;
if x {
NaNf32,
NaNf64}
or y {
NaNf32,
NaNf64}
then return unordered
elsif x {
+f32,
+f64}
and y {
+f32,
+f64}
then return equal
elsif x {
–f32,
–f64}
and y {
–f32,
–f64}
then return equal
elsif x {
+f32,
+f64}
or y {
–f32,
–f64}
then return greater
elsif x {
–f32,
–f64}
or y {
+f32,
+f64}
then return less
else
if xr <
yr then return less
end if
end if
end proc;
Character Utilities
proc integerToUTF16(
i: {0 ... 0x10FFFF}):
String
else
j: {0 ... 0xFFFFF} i – 0x10000;
return [high, low]
end if
end proc;
while i |s| do
if s[i] {‘«uD800»
’ ... ‘«uDBFF»
’} and
i + 1 |s| and
s[i + 1] {‘«uDC00»
’ ... ‘«uDFFF»
’} then
else ch s[i]; i i + 1
end if;
result result [ch]
end while;
return result
end proc;
return ch converted to a lower case character
using the Unicode full, locale-independent case mapping. A single character may be converted to multiple
characters. If
ch has no lower case equivalent, then the result is the string
char21ToUTF16(
ch).
end proc;
return ch converted to a lower case character
using the Unicode full case mapping in the host environment’s current locale. A single character may be
converted to multiple characters. If
ch has no lower case equivalent, then the result is the string
char21ToUTF16(
ch).
end proc;
return ch converted to a upper case character
using the Unicode full, locale-independent case mapping. A single character may be converted to multiple
characters. If
ch has no upper case equivalent, then the result is the string
char21ToUTF16(
ch).
end proc;
return ch converted to a upper case character
using the Unicode full case mapping in the host environment’s current locale. A single character may be
converted to multiple characters. If
ch has no upper case equivalent, then the result is the string
char21ToUTF16(
ch).
end proc;
Object Utilities
Object Class Inquiries
if c = d then return true
else
if s =
none then return false end if;
end if
end proc;
Object to Boolean Conversion
case o of
Float32 do return o {
+zerof32,
–zerof32,
NaNf32};
Float64 do return o {
+zerof64,
–zerof64,
NaNf64};
end case
end proc;
Object to Primitive Conversion
case h of
if toStringMethod none then
end if;
if valueOfMethod none then
end if;
if valueOfMethod none then
end if;
if toStringMethod none then
end if
end case;
throw a
TypeError exception
— cannot convert this object to a primitive
end proc;
Object to Number Conversions
case a of
Null {
false}
do return +zerof64;
{true} do return 1f64;
end case
end proc;
case a of
Null {
false}
do return +zerof32;
{true} do return 1f32;
end case
end proc;
case a of
Null {
false}
do return 0;
{true} do return 1;
{
+f32,
+f64}
do return +;
{
–f32,
–f64}
do return –;
{+zerof32, +zerof64, –zerof32, –zerof64} do return 0;
throw a
RangeError exception
— the value
a is not an integer
end if;
return r;
end case
end proc;
Apply the lexer grammar with the start symbol
StringNumericLiteral to the string
s.
throw a
TypeError exception
— the string
s does not contain a number
else
end if
end proc;
Object to String Conversions
case a of
{false} do return “false
”;
{true} do return “true
”;
end case
end proc;
if |digits| = 1 then mantissa digits
else mantissa [digits[0]] “.
” digits[1 ...]
end if;
end proc;
case x of
{NaNf32} do return “NaN
”;
{+zerof32, –zerof32} do return “0
”;
{+f32} do return “Infinity
”;
{–f32} do return “-Infinity
”;
else
Let e, k, and s be integers such that k
1, 10k–1
s
10k,
(s10e+1–k)f32
= x, and k is as small as possible.
note k is the number of digits in
the decimal representation of s, s is not divisible by 10, and the least significant
digit of s is not necessarily uniquely determined by the above criteria.
When there are multiple possibilities for s according to the rules above,
implementations are encouraged but not required to select the one according to the following rule: Select
the value of s for which
s10e+1–k
is closest in value to r; if there are two such possible values of s, choose the one
that is even.
if k – 1
e 20
then return digits repeat(‘
0
’,
e + 1 –
k)
elsif 0 e 20 then return digits[0 ... e] “.
” digits[e + 1 ...]
elsif –6
e < 0
then return “
0.
”
repeat(‘
0
’, –(
e + 1))
digits
end if
end if
end case
end proc;
case x of
{NaNf64} do return “NaN
”;
{+zerof64, –zerof64} do return “0
”;
{+f64} do return “Infinity
”;
{–f64} do return “-Infinity
”;
else
Let e, k, and s be integers such that k
1, 10k–1
s
10k,
(s10e+1–k)f64
= x, and k is as small as possible.
note k is the number of digits in
the decimal representation of s, s is not divisible by 10, and the least significant
digit of s is not necessarily uniquely determined by the above criteria.
When there are multiple possibilities for s according to the rules above,
implementations are encouraged but not required to select the one according to the following rule: Select
the value of s for which
s10e+1–k
is closest in value to r; if there are two such possible values of s, choose the one
that is even.
if k – 1
e 20
then return digits repeat(‘
0
’,
e + 1 –
k)
elsif 0 e 20 then return digits[0 ... e] “.
” digits[e + 1 ...]
elsif –6
e < 0
then return “
0.
”
repeat(‘
0
’, –(
e + 1))
digits
end if
end if
end case
end proc;
Object to Qualified Name Conversion
Object to Class Conversion
Object to Attribute Conversion
else
note If o is not an attribute, try to
call it with no arguments.
end if
end proc;
Implicit Coercions
if result none then return result
else throw a
TypeError exception
— coercion failed
end if
end proc;
if result none then return result
else throw a
TypeError exception
— coercion failed
end if
end proc;
if result {
none,
null}
then return result
else throw a
TypeError exception
— coercion failed
end if
end proc;
if o =
null or is(
o,
c)
then return o else return none end if
end proc;
Attributes
if b = false then return false
elsif a {
none,
true}
then return b
elsif b = true then return a
if a = b then return a
return CompoundAttributenamespaces: {
a,
b},
explicit:
false,
enumerable:
false,
dynamic:
false,
category:
none,
overrideMod:
none,
prototype:
false,
unused:
false
end if
else
note At this point both a and
b are compound attributes.
throw an
AttributeError exception
— attributes
a and
b have conflicting contents
else
end if
end if
end proc;
case a of
return CompoundAttributenamespaces: {},
explicit:
false,
enumerable:
false,
dynamic:
false,
category:
none,
overrideMod:
none,
prototype:
false,
unused:
false;
return CompoundAttributenamespaces: {
a},
explicit:
false,
enumerable:
false,
dynamic:
false,
category:
none,
overrideMod:
none,
prototype:
false,
unused:
false;
end case
end proc;
Access Utilities
if a =
none then return {}
end if;
end proc;
matchingSlots:
Slot{} {
s |
s o.
slots such that s.
id =
id};
return the one element of matchingSlots
end proc;
case setup of
throw a
ConstantError exception
— a constant’s type or initialiser cannot depend on the value of that constant
end case
end proc;
throw a
ReferenceError exception
— cannot initialise a
const
variable twice
end if;
return coercedValue
end proc;
Environmental Utilities
if some c env satisfies c Class then
Let
c be the first element of
env that is a
Class.
return c
end if;
end proc;
for each frame env do
end for each;
end proc;
end if;
return env[0 ... i]
end proc;
return regionalEnv[|regionalEnv| – 1]
end proc;
while env[
i]
Package do i i + 1
end while;
note Every environment ends with a
Package frame, so one will always be found.
return env[i]
end proc;
Property Lookup
note If the same property was found via several
different bindings b, then it will appear only once in the set matchingProperties.
if matchingProperties = {}
then return none
elsif |matchingProperties| = 1 then return the one element of matchingProperties
else
throw a
ReferenceError exception
— this access is ambiguous because the bindings it found belong to several different local
properties
end if
end proc;
if matches = {}
then return none
elsif |matches| = 1 then return the one element of matches
else
throw a
ReferenceError exception
— this access is ambiguous because it found several different instance properties in the same class
end if
end proc;
case o of
end case;
if m none then return m end if;
if flat then return none end if;
end proc;
note Start from the root class (Object
)
and proceed through more specific classes that are ancestors of c.
if m none then return m end if
end for each;
end proc;
throw a
ReferenceError exception
— can’t access instance properties outside an instance method without supplying an instance
object
end if;
throw a
ReferenceError exception
— can’t access instance properties inside a non-instance method without supplying an instance
object
end if;
throw a
ReferenceError exception
— can’t access instance properties inside a non-instance method without supplying an instance
object
end if;
throw an
UninitializedError exception
— can’t access instance properties from within a constructor before the superconstructor has been
called
end if;
return this
end proc;
return findBaseInstanceProperty(
c, {
qname},
read)
none or
findBaseInstanceProperty(
c, {
qname},
write)
none or
findArchetypeProperty(
o, {
qname},
read,
flat)
none or
findArchetypeProperty(
o, {
qname},
write,
flat)
none
end proc;
Reading
case r of
end case;
if result none then return result
else
throw a
ReferenceError exception
— property not found, and no default value is available
end if
end proc;
throw a
ReferenceError exception
— property not found, and no default value is available
end if;
return result
end proc;
end if;
if length =
none then throw a
RangeError exception
— length not an integer
else throw a
RangeError exception
— length out of range
end if
end proc;
At the implementation’s discretion either do nothing, set
result to
none, or
throw a
ReferenceError.
end if;
return result
end proc;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
return limit.
read(
o,
limit, {
qname},
none,
undefinedIfMissing,
phase)
end proc;
while i < |env| do
case frame of
result limit.
read(
frame,
limit,
multiname,
env,
false,
phase);
case phase of
throw a
ConstantError exception
— cannot read a
with
statement’s frame from a constant expression;
throw an
UninitializedError exception
— cannot read a
with
statement’s frame before that statement’s
expression has been evaluated
end case
end if;
result limit.
read(
value,
limit,
multiname,
env,
false,
phase)
end case;
if result none then return result end if;
i i + 1
end while;
throw a
ReferenceError exception
— no property found with the name
multiname
end proc;
case m of
case phase of
throw a
ConstantError exception
— a constant expression cannot read dynamic properties;
end case
end if;
throw a
ReferenceError exception
— cannot read an instance property without supplying an instance
end if;
end case
end proc;
note readInstanceProperty
is only called in cases where the instance property is known to exist, so
mBase cannot be
none here.
end proc;
case m of
throw a
ConstantError exception
— a constant expression cannot read mutable variables
end if;
case phase of
throw a
ConstantError exception
— cannot read uninitalised
const
variables from a constant expression;
throw an
UninitializedError exception
— cannot read a
const
instance variable before it is initialised
end case
end if;
return v;
m cannot be an
InstanceSetter
because these are only represented as write-only properties.
end case
end proc;
case m of
throw a
ReferenceError exception
— cannot access a property defined in a scope outside the current region if any block inside the current
region shadows it;
throw a
ConstantError exception
— a constant expression cannot read mutable variables
end if;
return value;
throw a
ConstantError exception
— a constant expression cannot read mutable variables
end if;
case value of
note Try to run a const
variable’s initialiser if there is one.
case phase of
throw a
ConstantError exception
— a constant expression cannot access a constant with a missing or recursive
initialiser;
end case
end if;
try
note If initialisation failed, restore
m.
initializer to its original value so it can be
tried later.
throw x
end try;
return coercedValue;
note An uninstantiated function can only be
found when
phase =
compile.
throw a
ConstantError exception
— an uninstantiated function is not a constant expression
end case;
note An uninstantiated getter can only be found
when
phase =
compile.
throw a
ConstantError exception
— an uninstantiated getter is not a constant expression
end if;
return m.
call(
env,
phase);
m cannot be a
Setter because these are
only represented as write-only properties.
end case
end proc;
Writing
case r of
throw a
ReferenceError exception
— a non-reference is not a valid target of an assignment;
end case;
throw a
ReferenceError exception
— property not found and could not be created
end if
end proc;
result: {
none,
ok}
limit.
write(
o,
limit,
multiname,
none,
newValue,
true,
phase);
throw a
ReferenceError exception
— property not found and could not be created
end if
end proc;
throw a
RangeError exception
— length out of range
end if;
Evaluate
dotWrite(
o, {
public::“
length
”},
lengthf64,
phase) and ignore its result
end proc;
end if;
if deleteResult = false then
end if
else
if writeResult =
none then
throw a
ReferenceError exception
— element not found and could not be created
end if
end if
end proc;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
return limit.
write(
o,
limit, {
qname},
none,
newValue,
createIfMissing,
phase)
end proc;
while i < |env| do
case frame of
result
limit.
write(
frame,
limit,
multiname,
env,
newValue,
false,
phase);
throw an
UninitializedError exception
— cannot read a
with
statement’s frame before that statement’s expression
has been evaluated
end if;
result limit.
write(
value,
limit,
multiname,
env,
newValue,
false,
phase)
end case;
if result =
ok then return end if;
i i + 1
end while;
if createIfMissing then
note Try to write the variable into pkg
again, this time allowing new dynamic bindings to be created dynamically.
result: {
none,
ok}
limit.
write(
pkg,
limit,
multiname,
env,
newValue,
true,
phase);
if result =
ok then return end if
end if;
throw a
ReferenceError exception
— no existing property found with the name
multiname and one could not be created
end proc;
end if;
case m of
note Before trying to create a new dynamic
property named qname, check that there is no read-only fixed property with the same name.
end if
end if;
throw a
ReferenceError exception
— cannot write an instance property without supplying an instance
end if;
end case
end proc;
o.
localBindings
o.
localBindings
{
LocalBindingqname:
qname,
accesses:
readWrite,
explicit:
false,
enumerable:
enumerable,
content:
dv}
end proc;
case m of
throw a
ReferenceError exception
— cannot initialise a
const
instance variable twice
end if;
throw a
ReferenceError exception
— cannot write to an instance method;
m cannot be an
InstanceGetter
because these are only represented as read-only properties.
end case
end proc;
case m of
throw a
ReferenceError exception
— cannot access a property defined in a scope outside the current region if any block inside the current
region shadows it;
m cannot be a
Getter because these are
only represented as read-only properties.
note All instances are resolved for the
run phase, so
env none.
Evaluate
m.
call(
newValue,
env,
phase) and ignore its result
end case
end proc;
Deleting
case r of
if strict then
throw a
ReferenceError exception
— a non-reference is not a valid target for
delete
in strict mode
else result true
end if;
end case;
if result none then return result else return true end if
end proc;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
return limit.
delete(
o,
limit, {
qname},
none,
phase)
end proc;
while i < |env| do
case frame of
result limit.
delete(
frame,
limit,
multiname,
env,
phase);
throw an
UninitializedError exception
— cannot read a
with
statement’s frame before that statement’s expression
has been evaluated
end if;
result limit.
delete(
value,
limit,
multiname,
env,
phase)
end case;
if result none then return result end if;
i i + 1
end while;
return true
end proc;
case m of
throw a
ReferenceError exception
— cannot access a property defined in a scope outside the current region if any block inside the current
region shadows it;
if o Class or env =
none then return false end if;
return false
end case
end proc;
Enumerating
end for each;
if super =
none then return e
end if
end proc;
end for each;
end if;
return e
end proc;
Calling Instances
case a of
Class do return a.
call(
this,
a,
args,
phase);
return f(this, a, args, phase);
end case
end proc;
note This function can be used in a constant
expression.
throw a
ConstantError exception
— cannot call a class before its definition has been compiled
end if;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
end proc;
Creating Instances
throw a
ConstantError exception
— cannot construct an instance of a class before its definition has been compiled
end if;
throw a
ConstantError exception
— a class constructor call is not a constant expression because it evaluates to a new object each time it
is evaluated
end if;
Evaluate
callInit(
this,
c,
args,
phase) and ignore its result;
return this
end proc;
end for each;
return new SimpleInstancelocalBindings: {},
archetype:
archetype,
sealed:
not c.
dynamic,
type:
c,
slots:
slots,
call:
call,
construct:
construct,
env:
env
end proc;
if init none then Evaluate
init(
this,
args,
phase) and ignore its result
else
if args [] then
throw an
ArgumentError exception
— the default constructor does not take any arguments
end if
end if
end proc;
Adding Local Definitions
throw an
AttributeError exception
— a local definition cannot have the
override
attribute
end if;
if explicit and innerFrame Package then
throw an
AttributeError exception
— the
explicit
attribute can only be used at the top level of a package
end if;
if namespaces2 = {}
then namespaces2 {
public}
end if;
multiname:
Multiname {
ns::
id |
ns namespaces2};
end if;
if innerFrame Class and id =
innerFrame.
name then
throw a
DefinitionError exception
— a
static
property of a class cannot have the same name as the class, regardless of the
namespace
end if;
for each frame regionalEnv[1 ...] do
throw a
DefinitionError exception
— this definition would shadow a property defined in an outer scope within the same region
end if
end for each;
newBindings:
LocalBinding{}
{
LocalBindingqname:
qname,
accesses:
accesses,
explicit:
explicit,
enumerable:
true,
content:
m |
qname multiname};
note Mark the bindings of
multiname as
forbidden in all non-innermost frames in the current region if they
haven’t been marked as such already.
for each frame regionalEnv[1 ...] do
end for each;
return multiname
end proc;
regionalFrame:
Frame regionalEnv[|
regionalEnv| – 1];
note env is either a
Package or a
ParameterFrame because hoisting only occurs into package or
function scope.
existingBindings:
LocalBinding{}
{
b |
b regionalFrame.
localBindings such that b.
qname =
qname};
regionalFrame regionalEnv[|regionalEnv| – 2];
end if;
if existingBindings = {} then
regionalFrame.
localBindings
regionalFrame.
localBindings
{
LocalBindingqname:
qname,
accesses:
readWrite,
explicit:
false,
enumerable:
true,
content:
v};
return v
elsif |existingBindings| 1 then
throw a
DefinitionError exception
— a hoisted definition conflicts with a non-hoisted one
else
throw a
DefinitionError exception
— a hoisted definition conflicts with a non-hoisted one
end if;
note At this point a hoisted binding of the same
var
already exists, so there is no need to create another one. Overwrite its initial value if the
new definition is a function
definition.
regionalFrame.localBindings regionalFrame.localBindings – {b};
regionalFrame.
localBindings
regionalFrame.
localBindings
{
LocalBindingenumerable:
true, other fields from
b};
return m
end if
end proc;
Adding Instance Definitions
for each qname multiname do
if mBase =
none then mBase m
elsif m none and m mBase then
throw a
DefinitionError exception
— cannot override two separate superclass methods at the same time
end if
end for each
end if;
return mBase
end proc;
if explicit then
throw an
AttributeError exception
— the
explicit
attribute can only be used at the top level of a package
end if;
requestedMultiname:
Multiname {
ns::
id |
ns namespaces};
if requestedMultiname = {} then
definedMultiname {
public::
id};
searchedMultiname openMultiname;
note definedMultiname searchedMultiname
because the public
namespace is always open.
else definedMultiname requestedMultiname; searchedMultiname requestedMultiname
end if;
if not (requestedMultiname definedMultiname) then
throw a
DefinitionError exception
— cannot extend the set of a property’s namespaces when overriding it
end if;
case m of
end case;
if not goodKind then
throw a
DefinitionError exception
— a method can override only another method, a variable can override only another variable, a getter can
override only a getter or a variable, and a setter can override only a setter or a variable
end if;
if mOverridden.
final then
end if
end if;
end if;
case overrideMod of
throw a
DefinitionError exception
— a definition that overrides a superclass’s property must be marked with the
override
attribute
end if;
throw a
DefinitionError exception
— this definition is hidden by one in a superclass when accessed without a namespace qualifier; in the
rare cases where this is intentional, use the
override(false)
attribute
end if;
{false} do
throw a
DefinitionError exception
— this definition is marked with
override(false)
but it overrides a superclass’s
property
end if;
{true} do
throw a
DefinitionError exception
— this definition is marked with
override
or
override(true)
but it
doesn’t override a superclass’s property
end if;
end case;
return mOverridden
end proc;
Instantiation
end if;
if instantiations {} then
Suppose that
instantiateFunction
were to choose at its discretion some element
i2 of
instantiations, assign
i2.
env env,
and return
i. If the behaviour of doing that assignment were observationally indistinguishable by the
rest of the program from the behaviour of returning
i without modifying
i2.
env, then the implementation may, but does not
have to,
return i2 now, discarding (or not even bothering to
create) the value of
i.
note The above rule allows an implementation to
avoid creating a fresh closure each time a local function is instantiated if it can show that the closures would
behave identically. This optimisation is not transparent to the programmer because the instantiations will be
===
to each other and share one set of properties (including the prototype
property,
if applicable) rather than each having its own. ECMAScript programs should not rely on this distinction.
end if;
return i
end proc;
case m of
note m.
setup =
none
because
Setup must have been called on a frame before that frame can be
instantiated.
end if;
end case
end proc;
tuple PropertyTranslation
end tuple;
end proc;
return instantiatedFrame
end proc;
note properties will contain the set of
all
SingletonProperty records found in the
frame.
note If any of the parameters (including the rest
parameter) are anonymous, their bindings will not be present in
frame.
localBindings. In this situation, the following
steps add their
SingletonProperty records to
properties.
for each p frame.
parameters do properties properties {
p.
var}
end for each;
if rest none then properties properties {
rest}
end if;
end proc;
else instantiatedFrame.
rest translateProperty(
rest)
end if;
return instantiatedFrame
end proc;
Sealing
proc sealAllLocalProperties(
o:
Object)
end proc;
for each m matchingProperties do
end for each
end if
end proc;
Standard Class Utilities
if n |args| then return default end if;
if arg =
undefined then return default else return arg end if
end proc;
return LocalBindingqname:
qname,
accesses:
readWrite,
explicit:
false,
enumerable:
false,
content:
new Variabletype:
type,
value:
value,
immutable:
false,
setup:
none,
initializer:
none
end proc;
return the one element of matchingBindings
end proc;
Expressions
Syntax
{allowIn, noIn}
Terminal Actions
Body[
RegularExpression]:
String;
Flags[
RegularExpression]:
String;
Identifiers
Syntax
Semantics
Qualified Identifiers
Syntax
SimpleQualifiedIdentifier
Validation
Setup
Evaluation
throw a
TypeError exception
— the qualifier must be a namespace
end if;
end proc;
Primary Expressions
Syntax
null
| true
| false
| Number
| String
| this
| RegularExpression
Validation
throw a
SyntaxError exception
—
this
can be used outside a function only in non-strict mode
end if
throw a
SyntaxError exception
— this function does not define
this
end if;
Evaluate
Validate[
ArrayLiteral](
cxt,
env) and ignore its result;
Evaluate
Validate[
ObjectLiteral](
cxt,
env) and ignore its result;
end proc;
throw a
SyntaxError exception
—
private
is meaningful only inside a class
end if
end proc;
Setup
Evaluation
note If
Validate
passed,
this can be uninitialised only when
phase =
compile.
throw a
ConstantError exception
— a constant expression cannot read an uninitialised
this parameter
end if;
throw an
UninitializedError exception
— can’t access
this
from within a constructor before the superconstructor has been
called
end if;
return this;
return Body[RegularExpression] “#
” Flags[RegularExpression];
end proc;
note Validate
already ensured that
c none.
end proc;
Function Expressions
Syntax
Validation
Setup
Evaluation
throw a
ConstantError exception
— a
function
expression is not a constant expression because it can evaluate to different
values
end if;
throw a
ConstantError exception
— a
function
expression is not a constant expression because it can evaluate to different
values
end if;
return f
end proc;
Object Literals
Syntax
Validation
Setup
Setup[
FieldList]
() propagates the call to
Setup to nonterminals in the expansion of
FieldList.
Setup[
FieldName]
() propagates the call to
Setup to nonterminals in the expansion of
FieldName.
Evaluation
throw a
ConstantError exception
— an object literal is not a constant expression because it evaluates to a new object each time it is
evaluated
end if;
Evaluate
Eval[
FieldList](
env,
o,
phase) and ignore its result;
return o
end proc;
Evaluate
dotWrite(
o,
multiname,
value,
phase) and ignore its result
end proc;
Array Literals
Syntax
Validation
Setup
Evaluation
throw a
ConstantError exception
— an array literal is not a constant expression because it evaluates to a new object each time it is
evaluated
end if;
return o
end proc;
Evaluate
Eval[
LiteralElement](
env,
length,
o,
phase) and ignore its result;
return length + 1;
Evaluate
Eval[
LiteralElement](
env,
length,
o,
phase) and ignore its result;
end proc;
Evaluate
indexWrite(
o,
length,
value,
phase) and ignore its result
end proc;
Super Expressions
Syntax
Validation
throw a
SyntaxError exception
— a
super
expression is meaningful only inside a class
end if;
throw a
SyntaxError exception
— a
super
expression without an argument is meaningful only inside an instance method or a
constructor
end if;
throw a
SyntaxError exception
— a
super
expression is meaningful only if the enclosing class has a superclass
end if;
throw a
SyntaxError exception
— a
super
expression is meaningful only inside a class
end if;
throw a
SyntaxError exception
— a
super
expression is meaningful only if the enclosing class has a superclass
end if;
end proc;
Setup
Evaluation
note If
Validate
passed,
this can be uninitialised only when
phase =
compile.
throw a
ConstantError exception
— a constant expression cannot read an uninitialised
this parameter
end if;
throw an
UninitializedError exception
— can’t access
super
from within a constructor before the superconstructor has been
called
end if;
end proc;
note Validate ensured
that
limit cannot be
none at this point.
if coerced =
null then return null end if;
end proc;
Postfix Expressions
Syntax
Validation
Setup
Evaluation
case r of
end case;
return call(
base,
f,
args,
phase)
end proc;
case r of
end case;
return call(
base,
f,
args,
phase);
throw a
ConstantError exception
—
++
cannot be used in a constant expression
end if;
return b;
throw a
ConstantError exception
—
--
cannot be used in a constant expression
end if;
return b
end proc;
Property Operators
Syntax
Validation
Setup
Setup[
Brackets] ()
propagates the call to
Setup to nonterminals in the expansion of
Brackets.
Setup[
Arguments]
() propagates the call to
Setup to nonterminals in the expansion of
Arguments.
Evaluation
while i length do
An implementation may, at its discretion, either
throw
a
ReferenceError or treat the hole as a missing
argument, substituting the called function’s default parameter value if there is one,
undefined if the called function is unchecked, or
throwing an
ArgumentError exception otherwise. An implementation must
not replace such a hole with
undefined except when the called
function is unchecked or happens to have
undefined as its default
parameter value.
end if;
args args [arg];
i i + 1
end while;
return args
end proc;
Unary Operators
Syntax
Validation
Setup
Evaluation
throw a
ConstantError exception
—
delete
cannot be used in a constant expression
end if;
throw a
ConstantError exception
—
++
cannot be used in a constant expression
end if;
return c;
throw a
ConstantError exception
—
--
cannot be used in a constant expression
end if;
return c;
end proc;
case x of
i: {0 ... 2
64 – 1}
x.
value;
end case
end proc;
Multiplicative Operators
Syntax
Validation
Setup
Evaluation
Additive Operators
Syntax
Validation
Setup
Evaluation
Bitwise Shift Operators
Syntax
Validation
Setup
Evaluation
Relational Operators
Syntax
RelationalExpressionallowIn
Validation
Setup
Evaluation
Equality Operators
Syntax
Validation
Setup
Evaluation
Binary Bitwise Operators
Syntax
Validation
Setup
Evaluation
return bitOr(
a,
b,
phase)
end proc;
Binary Logical Operators
Syntax
Validation
Setup
Evaluation
Conditional Operator
Syntax
Validation
Setup
Evaluation
Assignment Operators
Syntax
*=
| /=
| %=
| +=
| -=
| <<=
| >>=
| >>>=
| &=
| ^=
| |=
Semantics
Validation
Setup
Evaluation
throw a
ConstantError exception
— assignment cannot be used in a constant expression
end if;
return b;
throw a
ConstantError exception
— assignment cannot be used in a constant expression
end if;
return result;
throw a
ConstantError exception
— assignment cannot be used in a constant expression
end if;
end case;
return result
end proc;
Comma Expressions
Syntax
Validation
Setup
Evaluation
Type Expressions
Syntax
Validation
Setup and Evaluation
Statements
Syntax
{abbrev, noShortIf, full}
;
| VirtualSemicolon
| «empty»
SemicolonnoShortIf
;
| VirtualSemicolon
| «empty»
Semicolonfull
;
| VirtualSemicolon
Validation
Evaluate
Validate[
Block](
cxt,
env,
jt,
preinst) and ignore its result;
Evaluate
Validate[
IfStatement](
cxt,
env,
jt) and ignore its result;
Evaluate
Validate[
DoStatement](
cxt,
env,
sl,
jt) and ignore its result;
Evaluate
Validate[
WhileStatement](
cxt,
env,
sl,
jt) and ignore its result;
Evaluate
Validate[
ForStatement](
cxt,
env,
sl,
jt) and ignore its result;
Evaluate
Validate[
WithStatement](
cxt,
env,
jt) and ignore its result;
Evaluate
Validate[
TryStatement](
cxt,
env,
jt) and ignore its result
end proc;
Evaluate
Validate[
Statement](
cxt,
env,
sl,
jt,
false) and ignore its result;
Evaluate
Validate[
Attributes](
cxt,
env) and ignore its result;
Evaluate
Setup[
Attributes]() and ignore its result;
throw a
TypeError exception
— attributes other than
true
and
false
may be used in a statement but not a
substatement
end if;
if attr then Evaluate
Validate[
Substatements](
cxt,
env,
jt) and ignore its result
end if
end proc;
Evaluate
Validate[
Substatementabbrev](
cxt,
env, {},
jt) and ignore its result
end proc;
Evaluate
Validate[
Substatementfull](
cxt,
env, {},
jt) and ignore its result
end proc;
Setup
Setup[
Statement]
() propagates the call to
Setup to nonterminals in the expansion of
Statement.
Evaluation
Empty Statement
Syntax
Expression Statement
Syntax
Validation
Setup
Evaluation
Super Statement
Syntax
Validation
throw a
SyntaxError exception
— a
super
statement is meaningful only inside a constructor
end if;
Evaluate
Validate[
Arguments](
cxt,
env) and ignore its result;
end proc;
Setup
Evaluation
throw a
ReferenceError exception
— the superconstructor cannot be called twice
end if;
return this
end proc;
Block Statement
Syntax
Validation
Evaluate
Validate[
Directives](
localCxt,
[frame] env,
jt,
preinst,
none)
and ignore its result
end proc;
CompileFrame[
Block]
compileFrame;
Preinstantiate[
Block]
preinst;
Evaluate
ValidateUsingFrame[
Block](
cxt,
env,
jt,
preinst,
compileFrame)
and ignore its result
end proc;
Setup
Setup[
Block] () propagates the call to
Setup to nonterminals in the expansion of
Block.
Evaluation
if Preinstantiate[
Block]
then runtimeFrame compileFrame
end if;
end proc;
Labeled Statements
Syntax
Validation
throw a
SyntaxError exception
— nesting labeled statements with the same label is not permitted
end if;
Evaluate
Validate[
Substatement](
cxt,
env,
sl {
name},
jt2) and ignore its result
end proc;
Setup
Evaluation
If Statement
Syntax
Validation
Evaluate
Validate[
Substatementabbrev](
cxt,
env, {},
jt) and ignore its result;
Evaluate
Validate[
Substatementfull](
cxt,
env, {},
jt) and ignore its result;
Evaluate
Validate[
SubstatementnoShortIf1](
cxt,
env, {},
jt) and ignore its result;
Evaluate
Validate[
Substatement2](
cxt,
env, {},
jt) and ignore its result
end proc;
Setup
Evaluation
Switch Statement
Semantics
Syntax
Validation
throw a
SyntaxError exception
— a
case
statement may have at most one default clause
end if;
Evaluate
Validate[
CaseElements](
localCxt,
[compileFrame] env,
jt2)
and ignore its result
end proc;
Evaluate
Validate[
Directive](
cxt,
env,
jt,
false,
none) and ignore its result;
Evaluate
Validate[
CaseLabel](
cxt,
env,
jt) and ignore its result
end proc;
Evaluate
Validate[
ListExpressionallowIn](
cxt,
env) and ignore its result;
end proc;
Setup
Setup[
CaseLabel]
() propagates the call to
Setup to nonterminals in the expansion of
CaseLabel.
Evaluation
if result Object then return result end if;
if result Object then return result end if;
return d
end proc;
Do-While Statement
Syntax
Validation
Evaluate
Validate[
Substatementabbrev](
cxt,
env, {},
jt2) and ignore its result;
end proc;
Setup
Evaluation
While Statement
Syntax
Validation
Evaluate
Validate[
Substatement](
cxt,
env, {},
jt2) and ignore its result
end proc;
Setup
Evaluation
For Statements
Syntax
Validation
Evaluate
Validate[
ForInitializer](
cxt,
compileEnv) and ignore its result;
Evaluate
Validate[
Substatement](
cxt,
compileEnv, {},
jt2) and ignore its result;
Evaluate
Validate[
ListExpressionallowIn](
cxt,
env) and ignore its result;
Evaluate
Validate[
ForInBinding](
cxt,
compileEnv) and ignore its result;
Evaluate
Validate[
Substatement](
cxt,
compileEnv, {},
jt2) and ignore its result
end proc;
Evaluate
Validate[
ListExpressionnoIn](
cxt,
env) and ignore its result;
Evaluate
Validate[
Attributes](
cxt,
env) and ignore its result;
Evaluate
Setup[
Attributes]() and ignore its result;
if attr false then
end if
end proc;
Evaluate
Validate[
Attributes](
cxt,
env) and ignore its result;
Evaluate
Setup[
Attributes]() and ignore its result;
if attr = false then
throw an
AttributeError exception
— the
false
attribute canot be applied to a
for
-
in
variable
definition
end if;
end proc;
Setup
Evaluation
try
remainingIndices:
Object{}
oldIndices;
while remainingIndices {} do
index:
Object any element of
remainingIndices;
remainingIndices remainingIndices – {index};
Evaluate
WriteBinding[
ForInBinding](
runtimeEnv,
index)
and ignore its result;
end try;
if newIndices oldIndices then
The implementation may, at its discretion, add none, some, or all of the objects in the
set difference newIndices – oldIndices to remainingIndices;
The implementation may, at its discretion, remove none, some, or all of the objects in
the set difference oldIndices – newIndices from
remainingIndices;
end if;
oldIndices newIndices
end while;
return d1
end try
end proc;
Evaluate
WriteBinding[
VariableBindingnoIn](
env,
newValue) and ignore its result;
Evaluate
WriteBinding[
VariableBindingnoIn](
env,
newValue) and ignore its result
end proc;
With Statement
Syntax
Validation
compileEnv:
Environment [compileLocalFrame] [compileWithFrame] env;
Evaluate
Validate[
Substatement](
cxt,
compileEnv, {},
jt) and ignore its result
end proc;
Setup
Evaluation
runtimeEnv:
Environment [runtimeLocalFrame] [runtimeWithFrame] env;
end proc;
Continue and Break Statements
Syntax
Validation
throw a
SyntaxError exception
— there is no enclosing statement to which to continue
end if;
throw a
SyntaxError exception
— there is no enclosing labeled statement to which to continue
end if
end proc;
throw a
SyntaxError exception
— there is no enclosing statement to which to break
end if;
throw a
SyntaxError exception
— there is no enclosing labeled statement to which to break
end if
end proc;
Setup
Evaluation
Return Statement
Syntax
Validation
throw a
SyntaxError exception
— a
return
statement must be located inside a function
end if;
throw a
SyntaxError exception
— a
return
statement must be located inside a function
end if;
throw a
SyntaxError exception
— a
return
statement inside a setter or constructor cannot return a value
end if;
Evaluate
Validate[
ListExpressionallowIn](
cxt,
env) and ignore its result
end proc;
Setup
Evaluation
Throw Statement
Syntax
Validation
Setup
Evaluation
Try Statement
Syntax
Validation
Evaluate
Validate[
Block](
cxt,
env,
jt,
false) and ignore its result;
Evaluate
Validate[
CatchClauses](
cxt,
env,
jt) and ignore its result;
Evaluate
Validate[
Block1](
cxt,
env,
jt,
false) and ignore its result;
Evaluate
Validate[
Block2](
cxt,
env,
jt,
false) and ignore its result
end proc;
Evaluate
Validate[
Parameter](
cxt,
compileEnv,
compileFrame) and ignore its result;
Evaluate
Validate[
Block](
cxt,
compileEnv,
jt,
false) and ignore its result
end proc;
Setup
Evaluate
Setup[
Block]() and ignore its result
end proc;
Evaluation
try return Eval[
Block](
env,
d)
else
if r reject then return r else throw x end if
end if
end try;
try result Eval[
Block1](
env,
d)
end try;
note At this point exactly one of
result
and
exception has a non-
none value.
try
note The exception has been handled, so clear
it.
result r;
end if
note The
catch
clause threw
another exception or
ControlTransfer x, so
replace the original exception with
x.
exception x
end try
end if;
note The
finally
clause is executed
even if the original block exited due to a
ControlTransfer
(
break
,
continue
, or
return
).
note The
finally
clause is not inside
a
try-
catch semantic statement, so if it
throws another exception or
ControlTransfer, then the
original exception or
ControlTransfer exception is
dropped.
note At this point exactly one of
result
and
exception has a non-
none value.
if exception none then throw exception else return result end if
end proc;
note Validate created
one local variable with the name in
qname, so
v Variable.
end if
end proc;
Directives
Syntax
Validation
if attr {
none,
true}
then
throw an
AttributeError exception
— an ordinary statement only permits the attributes
true
and
false
end if;
Evaluate
Validate[
Statement](
cxt,
env, {},
jt,
preinst) and ignore its result;
Evaluate
Validate[
Attributes](
cxt,
env) and ignore its result;
Evaluate
Setup[
Attributes]() and ignore its result;
if attr3 =
false then Enabled[
Directive]
false
else
end if;
Evaluate
Validate[
Attributes](
cxt,
env) and ignore its result;
Evaluate
Setup[
Attributes]() and ignore its result;
if attr3 =
false then Enabled[
Directive]
false
else
Evaluate
Validate[
Directives](
localCxt,
env,
jt,
preinst,
attr3)
and ignore its result
end if;
if attr {
none,
true}
then Evaluate
Validate[
Pragma](
cxt) and ignore its result
else
throw an
AttributeError exception
— a
pragma
directive only permits the attributes
true
and
false
end if
end proc;
Evaluate
Validate[
ClassDefinition](
cxt,
env,
preinst,
attr) and ignore its result;
Evaluate
Validate[
ImportDirective](
cxt,
env,
preinst,
attr) and ignore its result;
if attr {
none,
true}
then
Evaluate
Validate[
UseDirective](
cxt,
env) and ignore its result
else
throw an
AttributeError exception
— a
use
directive only permits the attributes
true
and
false
end if
end proc;
Setup
Evaluation
Attributes
Syntax
Validation
Setup
Setup[
Attribute]
() propagates the call to
Setup to nonterminals in the expansion of
Attribute.
Evaluation
if a = false then return false end if;
end proc;
Use Directive
Syntax
Validation
for each v values do
namespaces namespaces {v}
end for each;
end proc;
Import Directive
Syntax
Validation
if not preinst then
throw a
SyntaxError exception
— a package may be imported only in a preinstantiated scope
end if;
throw a
SyntaxError exception
— a package may be imported only into a package scope
end if;
if attr {
none,
true}
then
throw an
AttributeError exception
— an unnamed
import
directive only permits the attributes
true
and
false
end if;
if not preinst then
throw a
SyntaxError exception
— a package may be imported only in a preinstantiated scope
end if;
throw a
SyntaxError exception
— a package may be imported only into a package scope
end if;
throw an
AttributeError exception
— a package definition cannot have the
dynamic
attribute
end if;
throw an
AttributeError exception
— a package definition cannot have the
prototype
attribute
end if;
end proc;
Look for a package bound to
name in the implementation’s list of available
packages. If one is found, let
pkg:
Package be that
package; otherwise, throw an implementation-defined error.
case initialize of
() () do
Evaluate initialize() and ignore its result;
end case;
return pkg
end proc;
Pragma
Syntax
true
| false
| Number
| -
Number
| -
NegatedMinLong
| String
Validation
Validate[
Pragma]
(
cxt:
Context) propagates the call to
Validate to nonterminals in the expansion of
Pragma.
Evaluate
Validate[
PragmaExpr](
cxt,
false) and ignore its result;
Evaluate
Validate[
PragmaExpr](
cxt,
true) and ignore its result
end proc;
if name = “strict
” then
if value =
false then cxt.
strict false;
return end if
end if;
if name = “ecmascript
” then
if value {
undefined, 4
f64}
then return end if;
if value {1f64, 2f64, 3f64} then
An implementation may optionally modify cxt to disable features not available in
ECMAScript Edition value other than subsequent pragmas.
return
end if
end if;
if not optional then throw a
SyntaxError exception
end if
end proc;
Definitions
Variable Definition
Syntax
Validation
else
throw an
AttributeError exception
— a variable definition cannot have the
dynamic
attribute
end if;
throw an
AttributeError exception
— a variable definition cannot have the
prototype
attribute
end if;
else
throw an
AttributeError exception
— non-class variables cannot have a
static
,
virtual
, or
final
attribute
end if
end if;
case category of
if noInitializer and initializer none then
throw a
SyntaxError exception
— a
for
-
in
statement’s variable definition must not have an
initialiser
end if;
end proc;
v:
Variable
new Variablevalue:
none,
immutable:
immutable,
setup:
variableSetup,
initializer:
initializer,
initializerEnv:
env;
note not noInitializer;
end if;
end case
end if
end proc;
Setup
case v of
if defaultValue =
none then
end if;
end if;
if overriddenVar none then t overriddenVar.
type
end if
end if;
if initializer none then defaultValue initializer(
env,
compile)
if defaultValue =
none then
throw an
UninitializedError exception
— Cannot declare a mutable instance variable of type
Never
end if
end if;
end case
end proc;
Evaluation
note The
properties set consists of
exactly one
Variable element because
innerFrame was
constructed with that
Variable inside
Validate.
v:
Variable the one element of
properties;
case initializer of
end case;
end case
end proc;
note The
properties set consists of
exactly one
Variable element because
innerFrame was
constructed with that
Variable inside
Validate.
v:
Variable the one element of
properties;
Evaluate
writeVariable(
v,
newValue,
false) and ignore its result;
end case
end proc;
Simple Variable Definition
Syntax
A SimpleVariableDefinition represents the subset of
VariableDefinition expansions that may be used when the variable
definition is used as a
Substatement
instead of a
Directive
in non-strict mode. In strict mode variable definitions may not be used as substatements.
UntypedVariableBindingList
Validation
throw a
SyntaxError exception
— a variable may not be defined in a substatement except inside a non-strict function or non-strict
top-level code; to fix this error, place the definition inside a block
end if;
end proc;
Setup
Evaluation
Evaluate
lexicalWrite(
env, {
qname},
value,
false,
run) and ignore its result
end if
end proc;
Function Definition
Syntax
Validation
case handling of
throw an
AttributeError exception
— a getter or setter cannot have the
prototype
attribute
end if;
note not (unchecked or hoisted);
if preinst then boundEnv env end if;
case handling of
end case
end case;
end proc;
throw an
AttributeError exception
— an instance method cannot have the
prototype
attribute
end if;
case handling of
end case;
if mOverridden none and mOverridden.
enumerable then enumerable true end if;
end proc;
throw an
AttributeError exception
— a class constructor cannot have the
prototype
attribute
end if;
throw a
SyntaxError exception
— a class constructor cannot be a getter or a setter
end if;
end if;
end proc;
throw an
AttributeError exception
— a function cannot have the
dynamic
attribute
end if;
note preinst;
Evaluate
ValidateStatic[
FunctionDefinition](
cxt,
env,
preinst,
a,
false,
false)
and ignore its result;
Evaluate
ValidateConstructor[
FunctionDefinition](
cxt,
env,
frame,
a)
and ignore its result
else
Evaluate
ValidateInstance[
FunctionDefinition](
cxt,
env,
frame,
a,
false)
and ignore its result
end if;
Evaluate
ValidateInstance[
FunctionDefinition](
cxt,
env,
frame,
a,
false)
and ignore its result;
Evaluate
ValidateInstance[
FunctionDefinition](
cxt,
env,
frame,
a,
true)
and ignore its result
end case
else
throw an
AttributeError exception
— non-class functions cannot have a
static
,
virtual
, or
final
attribute
end if;
Evaluate
ValidateStatic[
FunctionDefinition](
cxt,
env,
preinst,
a,
unchecked,
hoisted)
and ignore its result
end if
end proc;
compileFrame:
ParameterFrame
new ParameterFramelocalBindings: {},
kind:
kind,
handling:
handling,
callsSuperconstructor:
false,
superconstructorCalled:
superconstructorCalled,
this:
none,
parameters:
[],
rest:
none;
end if;
Evaluate
Validate[
Parameters](
localCxt,
compileEnv,
compileFrame)
and ignore its result;
Evaluate
Validate[
Result](
localCxt,
compileEnv) and ignore its result;
Evaluate
Validate[
Block](
localCxt,
compileEnv,
JumpTargetsbreakTargets: {},
continueTargets: {}
,
false) and ignore its result
end proc;
Setup
case overriddenProperty of
Evaluate
SetupOverride[
FunctionCommon](
overriddenProperty.
signature)
and ignore its result;
This cannot happen because ValidateInstance already
ensured that a function cannot override an instance variable.
overriddenSignature
new ParameterFramelocalBindings: {},
kind:
instanceFunction,
handling:
get,
callsSuperconstructor:
false,
superconstructorCalled:
false,
this:
none,
parameters:
[],
rest:
none,
returnType:
overriddenProperty.
type;
end case;
Evaluate
SetupOverride[
FunctionCommon](
overriddenSignature)
and ignore its result
end case
end proc;
Evaluate
Setup[
Parameters](
compileEnv,
compileFrame) and ignore its result;
Evaluate
Setup[
Result](
compileEnv,
compileFrame) and ignore its result;
Evaluate
Setup[
Block]() and ignore its result
end proc;
Evaluate
SetupOverride[
Parameters](
compileEnv,
compileFrame,
overriddenSignature)
and ignore its result;
Evaluate
SetupOverride[
Result](
compileEnv,
compileFrame,
overriddenSignature)
and ignore its result;
Evaluate
Setup[
Block]() and ignore its result
end proc;
Evaluation
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call user-defined functions
end if;
else runtimeThis this
end if
end if;
Evaluate
assignArguments(
runtimeFrame,
f,
args,
phase) and ignore its result;
try
Evaluate
Eval[
Block](
[runtimeFrame] runtimeEnv,
undefined)
and ignore its result;
end try;
end proc;
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call user-defined getters
end if;
try
Evaluate
Eval[
Block](
[runtimeFrame] runtimeEnv,
undefined)
and ignore its result;
throw a
SyntaxError exception
— a getter must return a value and may not return by falling off the end of its code
end try;
end proc;
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call setters
end if;
try
Evaluate
Eval[
Block](
[runtimeFrame] runtimeEnv,
undefined)
and ignore its result
end try
end proc;
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call user-defined functions
end if;
note Class frames are always preinstantiated, so the
run environment is the same as compile environment.
try
Evaluate
Eval[
Block](
[runtimeFrame] env,
undefined) and ignore its result;
end try;
end proc;
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call user-defined getters
end if;
note Class frames are always preinstantiated, so the
run environment is the same as compile environment.
try
Evaluate
Eval[
Block](
[runtimeFrame] env,
undefined) and ignore its result;
throw a
SyntaxError exception
— a getter must return a value and may not return by falling off the end of its code
end try;
end proc;
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call setters
end if;
note Class frames are always preinstantiated, so the
run environment is the same as compile environment.
try Evaluate
Eval[
Block](
[runtimeFrame] env,
undefined) and ignore its result
end try
end proc;
note Class frames are always preinstantiated, so the
run environment is the same as compile environment.
end if;
try Evaluate
Eval[
Block](
[runtimeFrame] env,
undefined) and ignore its result
end try;
throw an
UninitializedError exception
— the superconstructor must be called before returning normally from a constructor
end if
end proc;
note The check that
phase
compile also
ensures that
Setup has been called.
throw a
ConstantError exception
— a constant expression cannot call user-defined prototype constructors
end if;
throw a
TypeError exception
— bad
prototype
value
end if;
Evaluate
assignArguments(
runtimeFrame,
f,
args,
phase) and ignore its result;
try
Evaluate
Eval[
Block](
[runtimeFrame] runtimeEnv,
undefined)
and ignore its result;
end try;
if coercedResult PrimitiveObject then return o else return coercedResult end if
end proc;
if parameters [] or rest none then
throw a
SyntaxError exception
— a getter cannot take any parameters
end if;
if |
parameters| 1
or rest none then
throw a
SyntaxError exception
— a setter must take exactly one parameter
end if;
throw a
SyntaxError exception
— a setter’s parameter cannot be optional
end if
end case
end proc;
This procedure performs a number of checks on the arguments, including checking their count,
names, and values. Although this procedure performs these checks in a specific order for expository purposes, an
implementation may perform these checks in a different order, which could have the effect of reporting a different
error if there are multiple errors. For example, if a function only allows between 2 and 4 arguments, the first of
which must be a Number
and is passed five arguments the first of which is a String
, then
the implementation may throw an exception either about the argument count mismatch or about the type coercion
error in the first argument.
end if;
for each arg args do
if i < |parameters| then
if argOrDefault =
undefined and default none then argOrDefault default
end if;
if argumentsObject none then
note Create an alias of v as the
ith entry of the arguments
object.
end if
elsif restObject none then
Evaluate
indexWrite(
restObject,
j,
arg,
phase) and ignore its result;
note argumentsObject =
none
because a function can't have both a rest parameter and an
arguments
object.
j j + 1
elsif argumentsObject none then
Evaluate
indexWrite(
argumentsObject,
i,
arg,
phase) and ignore its result
else
throw an
ArgumentError exception
— more arguments than parameters were supplied, and the called function does not have a
...
parameter and is not unchecked.
end if;
i i + 1
end for each;
while i < |parameters| do
else
throw an
ArgumentError exception
— fewer arguments than parameters were supplied, and the called function does not supply default
values for the missing parameters and is not unchecked.
end if
end if;
i i + 1
end while
end proc;
Syntax
Validation
Evaluate
Validate[
Parameter](
cxt,
env,
compileFrame) and ignore its result;
Evaluate
Validate[
Parameter](
cxt,
env,
compileFrame) and ignore its result;
end proc;
Setup
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
Evaluate
SetupOverride[
NonemptyParameters](
compileEnv,
compileFrame,
overriddenSignature,
overriddenSignature.
parameters) and ignore its
result
end proc;
Evaluate
Setup[
ParameterInit](
compileEnv,
compileFrame) and ignore its result;
Evaluate
Setup[
ParameterInit](
compileEnv,
compileFrame) and ignore its result;
end proc;
if overriddenParameters = [] then
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
Evaluate
SetupOverride[
ParameterInit](
compileEnv,
compileFrame,
overriddenParameters[0])
and ignore its result;
if |
overriddenParameters| 1
or overriddenSignature.
rest none then
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
if overriddenParameters = [] then
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
Evaluate
SetupOverride[
ParameterInit](
compileEnv,
compileFrame,
overriddenParameters[0])
and ignore its result;
Evaluate
SetupOverride[
NonemptyParameters1](
compileEnv,
compileFrame,
overriddenSignature,
overriddenParameters[1 ...]) and ignore
its result;
if overriddenParameters [] then
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if
end proc;
throw a
SyntaxError exception
— a required parameter cannot follow an optional one
end if;
case v of
end case;
end if
end proc;
if newDefault =
none then newDefault overriddenParameter.
default end if;
throw a
SyntaxError exception
— a required parameter cannot follow an optional one
end if;
if type overriddenParameter.
var.
type then
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
end proc;
Evaluate
Setup[
Parameter](
compileEnv,
compileFrame,
none) and ignore its result;
Evaluate
Setup[
Parameter](
compileEnv,
compileFrame,
default) and ignore its result
end proc;
Evaluate
SetupOverride[
Parameter](
compileEnv,
compileFrame,
none,
overriddenParameter)
and ignore its result;
Evaluate
SetupOverride[
Parameter](
compileEnv,
compileFrame,
default,
overriddenParameter)
and ignore its result
end proc;
throw a
SyntaxError exception
— a setter or constructor cannot define a return type
end if;
end proc;
throw a
DefinitionError exception
— mismatch with the overridden method’s signature
end if;
end proc;
Class Definition
Syntax
Validation
if not preinst then
throw a
SyntaxError exception
— a class may be defined only in a preinstantiated scope
end if;
throw a
ConstantError exception
— cannot override a class before its definition has been compiled
end if;
end if;
throw an
AttributeError exception
— a class definition cannot have the
prototype
attribute
end if;
throw an
AttributeError exception
— non-class property definitions cannot have a
static
attribute
end if;
final false;
throw an
AttributeError exception
— a class definition cannot have the
virtual
attribute
end case;
c:
Class
new ClasslocalBindings: {},
instanceProperties: {},
super:
super,
prototype:
super.
prototype,
complete:
false,
name:
Name[
Identifier],
typeofString: “
object
”,
privateNamespace:
privateNamespace,
dynamic:
dynamic,
final:
final,
defaultValue:
null,
defaultHint:
hintNumber,
hasProperty:
super.
hasProperty,
bracketRead:
super.
bracketRead,
bracketWrite:
super.
bracketWrite,
bracketDelete:
super.
bracketDelete,
read:
super.
read,
write:
super.
write,
delete:
super.
delete,
enumerate:
super.
enumerate,
call:
ordinaryCall,
construct:
ordinaryConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
Evaluate
ValidateUsingFrame[
Block](
innerCxt,
env,
JumpTargetsbreakTargets: {},
continueTargets: {}
,
preinst,
c) and ignore its result;
end proc;
Evaluate
Validate[
TypeExpressionallowIn](
cxt,
env) and ignore its result;
end proc;
Setup
Evaluate
Setup[
Block]() and ignore its result
end proc;
Evaluation
return EvalUsingFrame[
Block](
env,
c,
d)
end proc;
Namespace Definition
Syntax
Validation
if not preinst then
throw a
SyntaxError exception
— a namespace may be defined only in a preinstantiated scope
end if;
throw an
AttributeError exception
— a namespace definition cannot have the
dynamic
attribute
end if;
throw an
AttributeError exception
— a namespace definition cannot have the
prototype
attribute
end if;
throw an
AttributeError exception
— non-class property definitions cannot have a
static
attribute
end if;
throw an
AttributeError exception
— a namespace definition cannot have the
virtual
or
final
attribute
end case;
end proc;
Programs
Syntax
Processing
begin
Evaluate
Validate[
Directives](
cxt,
initialEnvironment,
JumpTargetsbreakTargets: {},
continueTargets: {}
,
true,
none) and ignore its result;
Evaluate
Setup[
Directives]() and ignore its result;
end;
Package Definition
Syntax
Processing
begin
Evaluate
Validate[
Block](
cxt,
initialEnvironment,
JumpTargetsbreakTargets: {},
continueTargets: {}
,
true) and ignore its result;
Evaluate
Setup[
Block]() and ignore its result;
proc evalPackage()
Evaluate
Eval[
Block](
initialEnvironment,
undefined) and ignore its result;
end proc;
Bind name to package pkg in the system’s list of packages in an
implementation-defined manner.
end;
Name[
PackageName String]
=
Value[
String] processed in an
implementation-defined manner;
Predefined Identifiers
return new PackagelocalBindings:
{
stdExplicitConstBinding(
internal::“
internal
”,
Namespace,
internal),
stdConstBinding(
public::“
explicit
”,
Attribute,
global_explicit),
stdConstBinding(
public::“
enumerable
”,
Attribute,
global_enumerable),
stdConstBinding(
public::“
dynamic
”,
Attribute,
global_dynamic),
stdConstBinding(
public::“
static
”,
Attribute,
global_static),
stdConstBinding(
public::“
virtual
”,
Attribute,
global_virtual),
stdConstBinding(
public::“
final
”,
Attribute,
global_final),
stdConstBinding(
public::“
prototype
”,
Attribute,
global_prototype),
stdConstBinding(
public::“
unused
”,
Attribute,
global_unused),
stdFunction(
public::“
override
”,
global_override, 1),
stdConstBinding(
public::“
NaN
”,
Number,
NaNf64),
stdConstBinding(
public::“
Infinity
”,
Number,
+f64),
stdConstBinding(
public::“
fNaN
”,
float,
NaNf32),
stdConstBinding(
public::“
fInfinity
”,
float,
+f32),
stdConstBinding(
public::“
undefined
”,
Void,
undefined),
stdFunction(
public::“
eval
”,
global_eval, 1),
stdFunction(
public::“
parseInt
”,
global_parseint, 2),
stdFunction(
public::“
parseLong
”,
global_parselong, 2),
stdFunction(
public::“
parseFloat
”,
global_parsefloat, 1),
stdFunction(
public::“
isNaN
”,
global_isnan, 1),
stdFunction(
public::“
isFinite
”,
global_isfinite, 1),
stdFunction(
public::“
decodeURI
”,
global_decodeuri, 1),
stdFunction(
public::“
decodeURIComponent
”,
global_decodeuricomponent, 1),
stdFunction(
public::“
encodeURI
”,
global_encodeuri, 1),
stdFunction(
public::“
encodeURIComponent
”,
global_encodeuricomponent, 1),
stdConstBinding(
public::“
Object
”,
Class,
Object),
stdConstBinding(
public::“
Never
”,
Class,
Never),
stdConstBinding(
public::“
Void
”,
Class,
Void),
stdConstBinding(
public::“
Null
”,
Class,
Null),
stdConstBinding(
public::“
Boolean
”,
Class,
Boolean),
stdConstBinding(
public::“
GeneralNumber
”,
Class,
GeneralNumber),
stdConstBinding(
public::“
long
”,
Class,
long),
stdConstBinding(
public::“
ulong
”,
Class,
ulong),
stdConstBinding(
public::“
float
”,
Class,
float),
stdConstBinding(
public::“
Number
”,
Class,
Number),
stdConstBinding(
public::“
sbyte
”,
Class,
sbyte),
stdConstBinding(
public::“
byte
”,
Class,
byte),
stdConstBinding(
public::“
short
”,
Class,
short),
stdConstBinding(
public::“
ushort
”,
Class,
ushort),
stdConstBinding(
public::“
int
”,
Class,
int),
stdConstBinding(
public::“
uint
”,
Class,
uint),
stdConstBinding(
public::“
char
”,
Class,
char),
stdConstBinding(
public::“
String
”,
Class,
String),
stdConstBinding(
public::“
Array
”,
Class,
Array),
stdConstBinding(
public::“
Namespace
”,
Class,
Namespace),
stdConstBinding(
public::“
Attribute
”,
Class,
Attribute),
stdConstBinding(
public::“
Date
”,
Class,
Date),
stdConstBinding(
public::“
RegExp
”,
Class,
RegExp),
stdConstBinding(
public::“
Class
”,
Class,
Class),
stdConstBinding(
public::“
Function
”,
Class,
Function),
stdConstBinding(
public::“
PrototypeFunction
”,
Class,
PrototypeFunction),
stdConstBinding(
public::“
Package
”,
Class,
Package),
stdConstBinding(
public::“
Error
”,
Class,
Error),
stdConstBinding(
public::“
ArgumentError
”,
Class,
ArgumentError),
stdConstBinding(
public::“
AttributeError
”,
Class,
AttributeError),
stdConstBinding(
public::“
ConstantError
”,
Class,
ConstantError),
stdConstBinding(
public::“
DefinitionError
”,
Class,
DefinitionError),
stdConstBinding(
public::“
EvalError
”,
Class,
EvalError),
stdConstBinding(
public::“
RangeError
”,
Class,
RangeError),
stdConstBinding(
public::“
ReferenceError
”,
Class,
ReferenceError),
stdConstBinding(
public::“
SyntaxError
”,
Class,
SyntaxError),
stdConstBinding(
public::“
TypeError
”,
Class,
TypeError),
stdConstBinding(
public::“
UninitializedError
”,
Class,
UninitializedError),
stdConstBinding(
public::“
URIError
”,
Class,
URIError)},
archetype:
ObjectPrototype,
name: “”,
initialize:
none,
sealed:
false,
internalNamespace:
internal
end proc;
Built-in Namespaces
Built-in Attributes
note This function does not check phase
and therefore can be used in a constant expression.
if args = [] then overrideMod true
elsif |args| = 1 then
else throw an
ArgumentError exception
— too many arguments supplied
end if;
return CompoundAttributenamespaces: {},
explicit:
false,
enumerable:
false,
dynamic:
false,
category:
none,
overrideMod:
overrideMod,
prototype:
false,
unused:
false
end proc;
Built-in Functions
Evaluate ???? and ignore its result
end proc;
note This function can be used in a constant
expression if the arguments can be converted to primitives in constant expressions.
if |args| {1, 2} then
throw an
ArgumentError exception
— at least one and at most two arguments must be supplied
end if;
end proc;
if r {0, 2 ... 36}
then throw a
RangeError exception
— radix out of
range
end if;
end while;
sign: {–1, 1} 1;
if i < |s| then
if s[i] = ‘+
’ then i i + 1 elsif s[i] = ‘-
’ then sign –1; i i + 1 end if
end if;
if r {0, 16} and i + 2 |s| and s[i ... i + 1] {“0x
”, “0X
”} then
end if;
if r = 0 then r 10 end if;
while i < |
s|
and digit none do
elsif ch {‘A
’ ... ‘Z
’} then
elsif ch {‘a
’ ... ‘z
’} then
end if;
if digit none and digit r then digit none end if;
if digit none then n nr +
digit;
i i + 1
end if
end while;
if i =
start then return NaN end if;
if n 0 then return nsign
elsif sign > 0
then return +zero
end if
end proc;
note This function can be used in a constant
expression if the arguments can be converted to primitives in constant expressions.
if |args| {1, 2} then
throw an
ArgumentError exception
— at least one and at most two arguments must be supplied
end if;
case i of
end case
end proc;
note This function can be used in a constant
expression if its argument can be converted to a primitive in a constant expression.
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
Apply the lexer grammar with the start symbol
StringDecimalLiteral to the string
s. If the grammar can interpret neither
s nor any prefix of
s as an expansion of
StringDecimalLiteral, then
return NaNf64. Otherwise, let
p be the longest prefix of
s (possibly
s itself) such that
p is an
expansion of
StringDecimalLiteral.
q:
ExtendedRational
the value of the action
Lex applied to
p’s expansion of the nonterminal
StringDecimalLiteral;
end proc;
note This function can be used in a constant
expression if its argument can be converted to a primitive in a constant expression.
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
return x {NaNf32, NaNf64}
end proc;
note This function can be used in a constant
expression if its argument can be converted to a primitive in a constant expression.
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
return x {NaNf32, NaNf64, +f32, +f64, –f32, –f64}
end proc;
Evaluate ???? and ignore its result
end proc;
Evaluate ???? and ignore its result
end proc;
Evaluate ???? and ignore its result
end proc;
Evaluate ???? and ignore its result
end proc;
Built-in Classes
Evaluate ???? and ignore its result
end proc;
Evaluate ???? and ignore its result
end proc;
Object
Object:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
none,
prototype:
ObjectPrototype,
complete:
true,
name: “
Object
”,
typeofString: “
object
”,
dynamic:
true,
final:
false,
defaultValue:
undefined,
defaultHint:
hintNumber,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
callObject,
construct:
constructObject,
init:
none,
is:
ordinaryIs,
coerce:
coerceObject;
note This function does not check phase
and therefore can be used in a constant expression.
elsif |args| = 1 then return args[0]
else throw an
ArgumentError exception
— at most one argument can be supplied
end if
end proc;
note This function does not check phase
and therefore can be used in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
else return o
end if
end proc;
ObjectPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
Object),
stdFunction(
public::“
toString
”,
Object_toString, 0),
stdFunction(
public::“
toLocaleString
”,
Object_toLocaleString, 0),
stdFunction(
public::“
valueOf
”,
Object_valueOf, 0),
stdFunction(
public::“
hasOwnProperty
”,
Object_hasOwnProperty, 1),
stdFunction(
public::“
isPrototypeOf
”,
Object_isPrototypeOf, 1),
stdFunction(
public::“
propertyIsEnumerable
”,
Object_propertyIsEnumerable, 1),
stdFunction(
public::“
sealProperty
”,
Object_sealProperty, 1)},
archetype:
none,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function does not check phase
and therefore can be used in a constant expression.
note This function ignores any arguments passed to it
in args.
return “
[object
”
c.
name “
]
”
end proc;
throw a
ConstantError exception
—
toLocaleString
cannot be called from a constant expression
end if;
return call(
this,
toStringMethod,
args,
phase)
end proc;
note This function does not check phase
and therefore can be used in a constant expression.
note This function ignores any arguments passed to it
in args.
return this
end proc;
throw a
ConstantError exception
—
hasOwnProperty
cannot be called from a constant expression
end if;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
end proc;
throw a
ConstantError exception
—
isPrototypeOf
cannot be called from a constant expression
end if;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
end proc;
throw a
ConstantError exception
—
propertyIsEnumerable
cannot be called from a constant expression
end if;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
end if;
end if;
end proc;
throw a
ConstantError exception
—
sealProperty
cannot be called from a constant expression
end if;
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
if arg =
false then Evaluate
sealObject(
this) and ignore its result
elsif arg = true then
end if;
end proc;
Never
Never:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
none,
complete:
true,
name: “
Never
”,
typeofString: “”,
dynamic:
false,
final:
true,
defaultValue:
none,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructNever,
init:
none,
is:
ordinaryIs,
coerce:
coerceNever;
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
throw a
TypeError exception
— no coercions to
Never
are possible
end proc;
Void
Void:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
none,
complete:
true,
name: “
Void
”,
typeofString: “
undefined
”,
dynamic:
false,
final:
true,
defaultValue:
undefined,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
callVoid,
construct:
constructVoid,
init:
none,
is:
ordinaryIs,
coerce:
coerceVoid;
note This function does not check phase
and therefore can be used in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end proc;
note This function does not check phase
and therefore can be used in a constant expression.
if |
args| 0
then throw an
ArgumentError exception
— no arguments can be supplied
end if;
end proc;
Null
Null:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
none,
complete:
true,
name: “
Null
”,
typeofString: “
object
”,
dynamic:
false,
final:
true,
defaultValue:
null,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
callNull,
construct:
constructNull,
init:
none,
is:
ordinaryIs,
coerce:
coerceNull;
note This function does not check phase
and therefore can be used in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end proc;
note This function does not check phase
and therefore can be used in a constant expression.
if |
args| 0
then throw an
ArgumentError exception
— no arguments can be supplied
end if;
end proc;
if o =
null then return o else return none end if
end proc;
Boolean
Boolean:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
BooleanPrototype,
complete:
true,
name: “
Boolean
”,
typeofString: “
boolean
”,
dynamic:
false,
final:
true,
defaultValue:
false,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructBoolean,
init:
none,
is:
ordinaryIs,
coerce:
coerceBoolean;
note This function does not check phase
and therefore can be used in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end proc;
BooleanPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
Boolean),
stdFunction(
public::“
toString
”,
Boolean_toString, 0),
stdReserve(
public::“
valueOf
”,
ObjectPrototype)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function can be used in a constant
expression.
note This function ignores any arguments passed to it
in args.
end proc;
GeneralNumber
GeneralNumber:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
GeneralNumberPrototype,
complete:
true,
name: “
GeneralNumber
”,
typeofString: “
object
”,
dynamic:
false,
final:
true,
defaultValue:
NaNf64,
defaultHint:
hintNumber,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructGeneralNumber,
init:
none,
is:
ordinaryIs,
coerce:
coerceGeneralNumber;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| = 0 then return +zerof64
else throw an
ArgumentError exception
— at most one argument can be supplied
end if
end proc;
GeneralNumberPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
GeneralNumber),
stdFunction(
public::“
toString
”,
GeneralNumber_toString, 1),
stdReserve(
public::“
valueOf
”,
ObjectPrototype),
stdFunction(
public::“
toFixed
”,
GeneralNumber_toFixed, 1),
stdFunction(
public::“
toExponential
”,
GeneralNumber_toExponential, 1),
stdFunction(
public::“
toPrecision
”,
GeneralNumber_toPrecision, 1)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a general number.
if radix < 2
or radix > 36
then throw a
RangeError exception
— bad radix
end if;
else
return x converted to a string containing a
base-radix number in an implementation-defined manner
end if
end proc;
precisionLimit:
Integer = an
implementation-defined integer not less than 20;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a general number.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end if;
if r < 0 then sign “-
”; r –r end if;
n:
Integer r10
fractionDigits + 1/2;
if fractionDigits = 0 then return sign digits
else
if |digits| fractionDigits then
digits repeat(‘
0
’,
fractionDigits + 1 – |
digits|)
digits
end if;
k:
Integer |
digits| –
fractionDigits;
return sign digits[0 ... k – 1] “.
” digits[k ...]
end if
end proc;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a general number.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
if fractionDigits {
+,
–}
or
(
fractionDigits NaN and (
fractionDigits < 0
or fractionDigits >
precisionLimit))
then
end if;
if r < 0 then sign “-
”; r –r end if;
if fractionDigits NaN then
if r = 0
then digits repeat(‘
0
’,
fractionDigits + 1);
e 0
else
e log10(r);
n:
Integer r10
fractionDigits–e + 1/2;
note At this point
10fractionDigits n 10fractionDigits+1
if n = 10fractionDigits+1 then n n/10; e e + 1 end if;
end if;
note At this point the string digits has
exactly fractionDigits + 1 digits
elsif r = 0 then digits “0
”; e 0
e |digits| – 1;
while digits[|digits| – 1] = ‘0
’ do digits digits[0 ... |digits| – 2] end while
else
case x of
Let e, k, and s be integers such that k
1, 10k–1
s
10k,
(s10e+1–k)f32
= x, and k is as small as possible.
Let e, k, and s be integers such that k
1, 10k–1
s
10k,
(s10e+1–k)f64
= x, and k is as small as possible.
end case;
note k is the number of digits in the
decimal representation of s, s is not divisible by 10, and the least significant digit of
s is not necessarily uniquely determined by the above criteria.
When there are multiple possibilities for s according to the rules above,
implementations are encouraged but not required to select the one according to the following rules: Select the
value of s for which
s10e+1–k
is closest in value to r; if there are two such possible values of s, choose the one that
is even.
end if;
end proc;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a general number.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end if;
if r < 0 then sign “-
”; r –r end if;
if r = 0
then digits repeat(‘
0
’,
precision);
e 0
else
e log10(r);
note At this point
10precision–1 n 10precision
if n = 10precision then n n/10; e e + 1 end if;
end if;
note At this point the string digits has
exactly precision digits
elsif e = precision – 1 then return sign digits
elsif e 0 then return sign digits[0 ... e] “.
” digits[e + 1 ...]
else return sign “
0.
”
repeat(‘
0
’, –(
e + 1))
digits
end if
end proc;
long
long:
Class
=
new ClasslocalBindings:
{
stdConstBinding(
public::“
MAX_VALUE
”,
ulong, (2
63 – 1)
long),
stdConstBinding(
public::“
MIN_VALUE
”,
ulong, (–2
63)
long)},
instanceProperties: {},
super:
GeneralNumber,
prototype:
longPrototype,
complete:
true,
name: “
long
”,
typeofString: “
long
”,
dynamic:
false,
final:
true,
defaultValue: 0
long,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructLong,
init:
none,
is:
ordinaryIs,
coerce:
coerceLong;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
if –263 i 263 – 1 then return ilong
end if
end proc;
if i none and –2
63 i 2
63 – 1
then return ilong
end if
end proc;
longPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
long),
stdReserve(
public::“
toString
”,
GeneralNumberPrototype),
stdReserve(
public::“
valueOf
”,
GeneralNumberPrototype)},
archetype:
GeneralNumberPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
ulong
ulong:
Class
=
new ClasslocalBindings:
{
stdConstBinding(
public::“
MAX_VALUE
”,
ulong, (2
64 – 1)
ulong),
stdConstBinding(
public::“
MIN_VALUE
”,
ulong, 0
ulong)},
instanceProperties: {},
super:
GeneralNumber,
prototype:
ulongPrototype,
complete:
true,
name: “
ulong
”,
typeofString: “
ulong
”,
dynamic:
false,
final:
true,
defaultValue: 0
ulong,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructULong,
init:
none,
is:
ordinaryIs,
coerce:
coerceULong;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
if 0 i 264 – 1 then return iulong
end if
end proc;
if i none and 0
i 2
64 – 1
then return iulong
end if
end proc;
ulongPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
ulong),
stdReserve(
public::“
toString
”,
GeneralNumberPrototype),
stdReserve(
public::“
valueOf
”,
GeneralNumberPrototype)},
archetype:
GeneralNumberPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
float
float:
Class
=
new ClasslocalBindings:
{
stdConstBinding(
public::“
MAX_VALUE
”,
float, (3.402823510
38)
f32),
stdConstBinding(
public::“
MIN_VALUE
”,
float, (10
–45)
f32),
stdConstBinding(
public::“
NaN
”,
float,
NaNf32),
stdConstBinding(
public::“
NEGATIVE_INFINITY
”,
float,
–f32),
stdConstBinding(
public::“
POSITIVE_INFINITY
”,
float,
+f32)},
instanceProperties: {},
super:
GeneralNumber,
prototype:
floatPrototype,
complete:
true,
name: “
float
”,
typeofString: “
float
”,
dynamic:
false,
final:
true,
defaultValue:
NaNf32,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructFloat,
init:
none,
is:
ordinaryIs,
coerce:
coerceFloat;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| = 0 then return +zerof32
else throw an
ArgumentError exception
— at most one argument can be supplied
end if
end proc;
floatPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
float),
stdReserve(
public::“
toString
”,
GeneralNumberPrototype),
stdReserve(
public::“
valueOf
”,
GeneralNumberPrototype)},
archetype:
GeneralNumberPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
Number
Number:
Class
=
new ClasslocalBindings:
{
stdConstBinding(
public::“
MAX_VALUE
”,
Number, (1.797693134862315710
308)
f64),
stdConstBinding(
public::“
MIN_VALUE
”,
Number, (510
–324)
f64),
stdConstBinding(
public::“
NaN
”,
Number,
NaNf64),
stdConstBinding(
public::“
NEGATIVE_INFINITY
”,
Number,
–f64),
stdConstBinding(
public::“
POSITIVE_INFINITY
”,
Number,
+f64)},
instanceProperties: {},
super:
GeneralNumber,
prototype:
NumberPrototype,
complete:
true,
name: “
Number
”,
typeofString: “
number
”,
dynamic:
false,
final:
true,
defaultValue:
NaNf64,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructNumber,
init:
none,
is:
ordinaryIs,
coerce:
coerceNumber;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| = 0 then return +zerof64
else throw an
ArgumentError exception
— at most one argument can be supplied
end if
end proc;
NumberPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
Number),
stdReserve(
public::“
toString
”,
GeneralNumberPrototype),
stdReserve(
public::“
valueOf
”,
GeneralNumberPrototype)},
archetype:
GeneralNumberPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
if i none and low i high then
note –zerof64
is coerced to +zerof64.
return if64
end if;
end proc;
if o Float64 then return false end if;
return i none and low i high
end proc;
if i none and low i high then
note –zerof32,
+zerof32, and –zerof64 are
all coerced to +zerof64.
return if64
end if;
end proc;
return new ClasslocalBindings:
{
stdConstBinding(
public::“
MAX_VALUE
”,
Number,
highf64),
stdConstBinding(
public::“
MIN_VALUE
”,
Number,
lowf64)},
instanceProperties: {},
super:
Number,
prototype:
Number.
prototype,
complete:
true,
name:
name,
typeofString: “
number
”,
dynamic:
false,
final:
true,
defaultValue:
+zerof64,
hasProperty:
Number.
hasProperty,
bracketRead:
Number.
bracketRead,
bracketWrite:
Number.
bracketWrite,
bracketDelete:
Number.
bracketDelete,
read:
Number.
read,
write:
Number.
write,
delete:
Number.
delete,
enumerate:
Number.
enumerate,
call:
sameAsConstruct,
construct:
construct,
init:
none,
is:
is,
coerce:
coerce
end proc;
char
char:
Class
=
new ClasslocalBindings: {
stdFunction(
public::“
fromCharCode
”,
char_fromCharCode, 1)},
instanceProperties: {},
super:
Object,
prototype:
charPrototype,
complete:
true,
name: “
char
”,
typeofString: “
char
”,
dynamic:
false,
final:
true,
defaultValue: ‘
«NUL»
’,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructChar,
init:
none,
is:
ordinaryIs,
coerce:
coerceChar;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
if |
s| 1
then throw a
RangeError exception
— only one character may be
given
end if;
return s[0]
end proc;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
elsif arg Char16 then return arg
else
if |
s| 1
then throw a
RangeError exception
— only one character may be given
end if;
return s[0]
end if
end proc;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
else throw a
RangeError exception
— character code out of range
end if
end proc;
charPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
char),
stdReserve(
public::“
toString
”,
StringPrototype),
stdReserve(
public::“
valueOf
”,
StringPrototype)},
archetype:
StringPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
String
String:
Class
=
new ClasslocalBindings: {
stdFunction(
public::“
fromCharCode
”,
String_fromCharCode, 1)},
instanceProperties: {
new InstanceGettermultiname: {
public::“
length
”},
final:
true,
enumerable:
false,
call:
String_length},
super:
Object,
prototype:
StringPrototype,
complete:
true,
name: “
String
”,
typeofString: “
string
”,
dynamic:
false,
final:
true,
defaultValue:
null,
hasProperty:
stringHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
readString,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
constructString,
init:
none,
is:
ordinaryIs,
coerce:
coerceString;
if i none then return i < |
o|
else
return findBaseInstanceProperty(
c, {
qname},
read)
none or
findBaseInstanceProperty(
c, {
qname},
write)
none or
findArchetypeProperty(
o, {
qname},
read,
flat)
none or
findArchetypeProperty(
o, {
qname},
write,
flat)
none
end if
end proc;
if i < |o| then return o[i]
elsif undefinedIfMissing then return undefined
end if
end if
end if;
return ordinaryRead(
o,
limit,
multiname,
env,
undefinedIfMissing,
phase)
end proc;
note This function can be used in a constant
expression if the argument can be converted to a primitive in a constant expression.
if |args| = 0 then return “”
else throw an
ArgumentError exception
— at most one argument can be supplied
end if
end proc;
elsif o Char16 then return [o]
end if
end proc;
note this String
because this getter cannot be extracted from the
String
class.
return lengthf64
end proc;
note This function can be used in a constant
expression if the arguments can be converted to primitives in constant expressions.
for each arg args do
else throw a
RangeError exception
— character code out of range
end if
end for each;
return s
end proc;
StringPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
String),
stdFunction(
public::“
toString
”,
String_toString, 0),
stdReserve(
public::“
valueOf
”,
ObjectPrototype),
stdFunction(
public::“
charAt
”,
String_charAt, 1),
stdFunction(
public::“
charCodeAt
”,
String_charCodeAt, 1),
stdFunction(
public::“
concat
”,
String_concat, 1),
stdFunction(
public::“
indexOf
”,
String_indexOf, 1),
stdFunction(
public::“
lastIndexOf
”,
String_lastIndexOf, 1),
stdFunction(
public::“
localeCompare
”,
String_localeCompare, 1),
stdFunction(
public::“
match
”,
String_match, 1),
stdFunction(
public::“
replace
”,
String_replace, 1),
stdFunction(
public::“
search
”,
String_search, 1),
stdFunction(
public::“
slice
”,
String_slice, 2),
stdFunction(
public::“
split
”,
String_split, 2),
stdFunction(
public::“
substring
”,
String_substring, 2),
stdFunction(
public::“
toLowerCase
”,
String_toLowerCase, 0),
stdFunction(
public::“
toLocaleLowerCase
”,
String_toLocaleLowerCase, 0),
stdFunction(
public::“
toUpperCase
”,
String_toUpperCase, 0),
stdFunction(
public::“
toLocaleUpperCase
”,
String_toLocaleUpperCase, 0)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function can be used in a constant
expression if this can be converted to a primitive in a constant expression.
note This function is generic and can be applied even
if this is not a string.
note This function ignores any arguments passed to it
in args.
end proc;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
elsif position {
+,
–}
and 0
position < |
s|
then return [s[
position]
]
else return “”
end if
end proc;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
elsif position {
+,
–}
and 0
position < |
s|
then
else return NaNf64
end if
end proc;
note This function can be used in a constant
expression if this and the argument can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
return s
end proc;
note This function can be used in a constant
expression if this and the arguments can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
if |args| {1, 2} then
throw an
ArgumentError exception
— at least one and at most two arguments must be supplied
end if;
while position + |pattern| |s| do
if s[position ... position + |pattern| – 1] = pattern then return positionf64
end if;
position position + 1
end while;
return (–1)f64
end proc;
note This function can be used in a constant
expression if this and the arguments can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
if |args| {1, 2} then
throw an
ArgumentError exception
— at least one and at most two arguments must be supplied
end if;
if position + |pattern| > |s| then position |s| – |pattern| end if;
while position 0 do
if s[position ... position + |pattern| – 1] = pattern then return positionf64
end if;
position position – 1
end while;
return (–1)f64
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
localeCompare
cannot be called from a constant expression
end if;
if |args| < 1 then
throw an
ArgumentError exception
— at least one argument must be supplied
end if;
Let
result:
Object be a value of type
Number that is the result of a locale-sensitive string comparison of
s1 and
s2. The two strings are compared in an implementation-defined fashion. The result is
intended to order strings in the sort order specified by the system default locale, and will be negative, zero, or
positive, depending on whether
s1 comes before
s2 in the sort order, they are equal, or
s1 comes after
s2 in the sort order, respectively. The result shall not be
NaNf64. The comparison shall be a consistent comparison function on the set
of all strings.
return result
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
match
cannot be called from a constant expression
end if;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
Evaluate ???? and ignore its result
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
replace
cannot be called from a constant expression
end if;
if |args| 2 then
throw an
ArgumentError exception
— exactly two arguments must be supplied
end if;
Evaluate ???? and ignore its result
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
search
cannot be called from a constant expression
end if;
if |args| 1 then
throw an
ArgumentError exception
— exactly one argument must be supplied
end if;
Evaluate ???? and ignore its result
end proc;
note This function can be used in a constant
expression if this and the arguments can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
if |args| > 2 then
throw an
ArgumentError exception
— at most two arguments can be supplied
end if;
if start < end then return s[start ... end – 1] else return “” end if
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
split
cannot be called from a constant expression
end if;
if |args| > 2 then
throw an
ArgumentError exception
— at most two arguments can be supplied
end if;
Evaluate ???? and ignore its result
end proc;
note This function can be used in a constant
expression if this and the arguments can be converted to primitives in constant expressions.
note This function is generic and can be applied even
if this is not a string.
if |args| > 2 then
throw an
ArgumentError exception
— at most two arguments can be supplied
end if;
if start end then return s[start ... end – 1]
else return s[end ... start – 1]
end if
end proc;
note This function can be used in a constant
expression if this can be converted to a primitive in a constant expression.
note This function is generic and can be applied even
if this is not a string.
return r
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
toLocaleLowerCase
cannot be called from a constant expression
end if;
return r
end proc;
note This function can be used in a constant
expression if this can be converted to a primitive in a constant expression.
note This function is generic and can be applied even
if this is not a string.
return r
end proc;
note This function is generic and can be applied even
if this is not a string.
throw a
ConstantError exception
—
toLocaleUpperCase
cannot be called from a constant expression
end if;
return r
end proc;
Array
Array:
Class
=
new ClasslocalBindings: {},
instanceProperties: {
new InstanceVariablemultiname: {
arrayPrivate::“
length
”},
final:
true,
enumerable:
false,
type:
Number,
defaultValue:
+zerof64,
immutable:
false,
new InstanceGettermultiname: {
public::“
length
”},
final:
true,
enumerable:
false,
call:
Array_getLength,
new InstanceSettermultiname: {
public::“
length
”},
final:
true,
enumerable:
false,
call:
Array_setLength},
super:
Object,
prototype:
ArrayPrototype,
complete:
true,
name: “
Array
”,
typeofString: “
object
”,
privateNamespace:
arrayPrivate,
dynamic:
true,
final:
true,
defaultValue:
null,
defaultHint:
hintNumber,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
writeArray,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
sameAsConstruct,
construct:
ordinaryConstruct,
init:
initArray,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
arrayLimit:
Integer
= an implementation-defined integer value between 2
32 – 1 and 2
53 inclusive;
throw a
RangeError exception
— array index out of range
end if;
if i length then
end if
end if
end if;
return result
end proc;
note length {NaNf64, +f64, –f64};
return n
end proc;
throw a
RangeError exception
— array length out of range
end if;
end proc;
if |
multiname| 1
then return none end if;
if name [] then
if name = “0
” then return 0
elsif name[0] ‘0
’ and (every ch name satisfies ch {‘0
’ ... ‘9
’}) then
end if
end if;
end proc;
if |args| = 1 then
throw a
RangeError exception
— array length must be an integer
end if;
return
end if
end if;
for each arg args do
Evaluate
indexWrite(
this,
i,
arg,
phase) and ignore its result;
i i + 1
end for each;
note The call to
indexWrite above also set the array’s length to
i.
end proc;
note is(
this,
Array)
because this getter cannot be extracted from the
Array
class.
end proc;
note is(
this,
Array)
because this setter cannot be extracted from the
Array
class.
throw a
ConstantError exception
— an array’s
length
cannot be set from a constant expression
end if;
throw a
RangeError exception
— array length out of range or not an integer
end if;
if newLength < oldLength then
note Delete all indexed properties greater than or
equal to the new length
return i none and newLength i <
oldLength
end proc;
end if;
end proc;
ArrayPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
Array),
stdFunction(
public::“
toString
”,
Array_toString, 0),
stdFunction(
public::“
toLocaleString
”,
Array_toLocaleString, 0),
stdFunction(
public::“
concat
”,
Array_concat, 1),
stdFunction(
public::“
join
”,
Array_join, 1),
stdFunction(
public::“
pop
”,
Array_pop, 0),
stdFunction(
public::“
push
”,
Array_push, 1),
stdFunction(
public::“
reverse
”,
Array_reverse, 0),
stdFunction(
public::“
shift
”,
Array_shift, 0),
stdFunction(
public::“
slice
”,
Array_slice, 2),
stdFunction(
public::“
sort
”,
Array_sort, 1),
stdFunction(
public::“
splice
”,
Array_splice, 2),
stdFunction(
public::“
unshift
”,
Array_unshift, 1)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
throw a
ConstantError exception
—
toString
cannot be called on an
Array
from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
note This function ignores any arguments passed to it
in args.
end proc;
throw a
ConstantError exception
—
toLocaleString
cannot be called on an
Array
from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
note This function passes any arguments passed to it
in args to toLocaleString
applied to the elements of the array.
separator:
String
the list-separator string appropriate for the host’s current locale, derived in an implementation-defined
way;
while i length do
s:
Object call(
elt,
toLocaleStringMethod,
args,
phase);
throw a
TypeError exception
—
toLocaleString
should return a string
end if;
end if;
i i + 1;
if i length then result result separator end if
end while;
return result
end proc;
throw a
ConstantError exception
—
concat
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
constituents:
Object[]
[this] args;
for each o constituents do
while k oLength do
Evaluate
indexWrite(
array,
i,
elt,
phase) and ignore its result
end if;
k k + 1;
i i + 1
end while
else Evaluate
indexWrite(
array,
i,
o,
phase) and ignore its result;
i i + 1
end if
end for each;
return array
end proc;
throw a
ConstantError exception
—
join
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end proc;
while i length do
end if;
i i + 1;
if i length then result result separator end if
end while;
return result
end proc;
throw a
ConstantError exception
—
pop
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |
args| 0
then throw an
ArgumentError exception
— no arguments can be supplied
end if;
if length 0 then
length length – 1;
end if
end if;
Evaluate
writeLength(
this,
length,
phase) and ignore its result;
return result
end proc;
throw a
ConstantError exception
—
push
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
for each arg args do
Evaluate
indexWrite(
this,
length,
arg,
phase) and ignore its result;
length length + 1
end for each;
Evaluate
writeLength(
this,
length,
phase) and ignore its result;
return lengthf64
end proc;
throw a
ConstantError exception
—
reverse
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |
args| 0
then throw an
ArgumentError exception
— no arguments can be supplied
end if;
while lo < hi do
Evaluate
indexWrite(
this,
lo,
hiElt,
phase) and ignore its result;
Evaluate
indexWrite(
this,
hi,
loElt,
phase) and ignore its result;
lo lo + 1;
hi hi – 1
end while;
return this
end proc;
throw a
ConstantError exception
—
shift
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |
args| 0
then throw an
ArgumentError exception
— no arguments can be supplied
end if;
if length 0 then
if elt none then result elt end if;
while i length do
Evaluate
indexWrite(
this,
i – 1,
elt,
phase) and ignore its result;
i i + 1
end while;
length length – 1;
end if;
Evaluate
writeLength(
this,
length,
phase) and ignore its result;
return result
end proc;
throw a
ConstantError exception
—
slice
cannot be called on an
Array
from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |args| > 2 then
throw an
ArgumentError exception
— at most two arguments can be supplied
end if;
end proc;
while i < end do
Evaluate
indexWrite(
slice,
j,
elt,
phase) and ignore its result;
i i + 1;
j j + 1
end while;
Evaluate
writeLength(
slice,
j,
phase) and ignore its result;
return slice
end proc;
throw a
ConstantError exception
—
sort
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
Evaluate ???? and ignore its result
end proc;
throw a
ConstantError exception
—
splice
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if |args| < 2 then
throw an
ArgumentError exception
— at least two arguments must be supplied
end if;
newElts:
Object[]
args[2 ...];
countDiff:
Integer newEltCount –
deleteCount;
if countDiff < 0 then
i start + deleteCount;
while i length do
Evaluate
indexWrite(
this,
i +
countDiff,
elt,
phase) and ignore its result;
i i + 1
end while;
i 0;
while i countDiff do
i i – 1;
Evaluate
indexWrite(
this,
length +
i,
none,
phase) and ignore its result
end while
elsif countDiff > 0 then
i length;
while i start + deleteCount do
i i – 1;
Evaluate
indexWrite(
this,
i +
countDiff,
elt,
phase) and ignore its result
end while
end if;
Evaluate
writeLength(
this,
length +
countDiff,
phase) and ignore its result;
i start;
for each arg newElts do
Evaluate
indexWrite(
this,
i,
arg,
phase) and ignore its result;
i i + 1
end for each;
return deletedSlice
end proc;
throw a
ConstantError exception
—
unshift
cannot be called from a constant expression
end if;
note This function is generic and can be applied even
if this is not an Array
.
if nArgs = 0 then
At the implementation’s discretion, either do nothing or
return newLengthf64
end if;
Evaluate
writeLength(
this,
newLength,
phase) and ignore its result;
while i 0 do
i i – 1;
Evaluate
indexWrite(
this,
i +
nArgs,
elt,
phase) and ignore its result
end while;
for each arg args do
Evaluate
indexWrite(
this,
i,
arg,
phase) and ignore its result;
i i + 1
end for each;
return newLengthf64
end proc;
Namespace
Namespace:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
NamespacePrototype,
complete:
true,
name: “
Namespace
”,
typeofString: “
namespace
”,
dynamic:
false,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
ordinaryCall,
construct:
constructNamespace,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
note This function can be used in a constant
expression if its argument is a string.
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
throw a
ConstantError exception
— a constant expression cannot construct new anonymous namespaces
end if;
if name = “”
then return public
else
end if
end if
end proc;
NamespacePrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdFunction(
public::“
toString
”,
Namespace_toString, 0),
stdReserve(
public::“
valueOf
”,
ObjectPrototype)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function does not check phase
and therefore can be used in a constant expression.
note This function ignores any arguments passed to it
in args.
end proc;
Attribute
Attribute:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
ObjectPrototype,
complete:
true,
name: “
Attribute
”,
typeofString: “
object
”,
dynamic:
false,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
Date
Date:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
DatePrototype,
complete:
true,
name: “
Date
”,
typeofString: “
object
”,
dynamic:
true,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
RegExp
RegExp:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
RegExpPrototype,
complete:
true,
name: “
RegExp
”,
typeofString: “
object
”,
dynamic:
true,
final:
true,
defaultValue:
null,
defaultHint:
hintNumber,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
Class
Class:
Class
=
new ClasslocalBindings: {},
instanceProperties: {
classPrototypeGetter},
super:
Object,
prototype:
ClassPrototype,
complete:
true,
name: “
Class
”,
typeofString: “
function
”,
dynamic:
false,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
note this Class
because this getter cannot be extracted from the
Class
class.
if prototype =
none then return undefined else return prototype end if
end proc;
ClassPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
Class),
stdFunction(
public::“
toString
”,
Class_toString, 0),
stdReserve(
public::“
valueOf
”,
ObjectPrototype),
stdConstBinding(
public::“
length
”,
Number, 1
f64)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
note This function does not check phase
and therefore can be used in a constant expression.
note This function ignores any arguments passed to it
in args.
return “
[class
”
c.
name “
]
”
end proc;
Function
Function:
Class
=
new ClasslocalBindings: {},
instanceProperties: {
ivarFunctionLength},
super:
Object,
prototype:
FunctionPrototype,
complete:
true,
name: “
Function
”,
typeofString: “
function
”,
dynamic:
false,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
PrototypeFunction
PrototypeFunction:
Class
=
new ClasslocalBindings: {},
instanceProperties:
{
new InstanceVariablemultiname: {
public::“
prototype
”},
final:
true,
enumerable:
false,
type:
Object,
defaultValue:
undefined,
immutable:
false},
super:
Function,
prototype:
FunctionPrototype,
complete:
true,
name: “
Function
”,
typeofString: “
function
”,
dynamic:
true,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
Package
Package:
Class
=
new ClasslocalBindings: {},
instanceProperties: {},
super:
Object,
prototype:
ObjectPrototype,
complete:
true,
name: “
Package
”,
typeofString: “
object
”,
dynamic:
true,
final:
true,
defaultValue:
null,
defaultHint:
hintString,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
dummyCall,
construct:
dummyConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
Error
Error:
Class
=
new ClasslocalBindings: {},
instanceProperties: {
new InstanceVariablemultiname: {
public::“
name
”},
final:
false,
enumerable:
true,
type:
String,
defaultValue:
null,
immutable:
false,
new InstanceVariablemultiname: {
public::“
message
”},
final:
false,
enumerable:
true,
type:
String,
defaultValue:
null,
immutable:
false},
super:
Object,
prototype:
ErrorPrototype,
complete:
true,
name: “
Error
”,
typeofString: “
object
”,
dynamic:
true,
final:
false,
defaultValue:
null,
defaultHint:
hintNumber,
hasProperty:
ordinaryHasProperty,
bracketRead:
ordinaryBracketRead,
bracketWrite:
ordinaryBracketWrite,
bracketDelete:
ordinaryBracketDelete,
read:
ordinaryRead,
write:
ordinaryWrite,
delete:
ordinaryDelete,
enumerate:
ordinaryEnumerate,
call:
callError,
construct:
ordinaryConstruct,
init:
initError,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end if
end proc;
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
Evaluate
dotWrite(
this, {
public::“
name
”},
name,
phase) and ignore its result;
end if;
Evaluate
dotWrite(
this, {
public::“
message
”},
message,
phase) and ignore its result
end proc;
ErrorPrototype:
SimpleInstance
=
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
Error),
stdFunction(
public::“
toString
”,
Error_toString, 1),
stdVarBinding(
public::“
name
”,
String, “
Error
”),
stdVarBinding(
public::“
message
”,
String, an
implementation-defined string)},
archetype:
ObjectPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
throw a
ConstantError exception
—
toString
cannot be called on an
Error
from a constant expression
end if;
note This function ignores any arguments passed to it
in args.
return an implementation-defined string derived from
name, message, and optionally other properties of err
end proc;
Error Subclasses
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
end if
end proc;
c:
Class
new ClasslocalBindings: {},
instanceProperties: {},
super:
Error,
complete:
false,
name:
name,
typeofString: “
object
”,
dynamic:
true,
final:
false,
defaultValue:
null,
defaultHint:
hintNumber,
hasProperty:
Error.
hasProperty,
bracketRead:
Error.
bracketRead,
bracketWrite:
Error.
bracketWrite,
bracketDelete:
Error.
bracketDelete,
read:
Error.
read,
write:
Error.
write,
delete:
Error.
delete,
enumerate:
Error.
enumerate,
call:
call,
construct:
ordinaryConstruct,
init:
none,
is:
ordinaryIs,
coerce:
ordinaryCoerce;
prototype:
SimpleInstance
new SimpleInstancelocalBindings:
{
stdConstBinding(
public::“
constructor
”,
Class,
c),
stdVarBinding(
public::“
name
”,
String,
name),
stdVarBinding(
public::“
message
”,
String, an
implementation-defined string)},
archetype:
ErrorPrototype,
sealed:
prototypesSealed,
type:
Object,
slots: {},
call:
none,
construct:
none,
env:
none;
if |args| > 1 then
throw an
ArgumentError exception
— at most one argument can be supplied
end if;
Evaluate
dotWrite(
this, {
public::“
name
”},
name2,
phase) and ignore its result;
end if;
Evaluate
dotWrite(
this, {
public::“
message
”},
message,
phase) and ignore its result
end proc;
return c
end proc;