1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
* License, v. 2.0. If a copy of the MPL was not distributed with this
4
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
9
ECMA Section: 12.6.3 The for...in Statement
11
The production IterationStatement : for ( LeftHandSideExpression in Expression )
12
Statement is evaluated as follows:
14
1. Evaluate the Expression.
15
2. Call GetValue(Result(1)).
16
3. Call ToObject(Result(2)).
17
4. Let C be "normal completion".
18
5. Get the name of the next property of Result(3) that doesn't have the
19
DontEnum attribute. If there is no such property, go to step 14.
20
6. Evaluate the LeftHandSideExpression (it may be evaluated repeatedly).
21
7. Call PutValue(Result(6), Result(5)). PutValue( V, W ):
22
1. If Type(V) is not Reference, generate a runtime error.
24
3. If Result(2) is null, go to step 6.
25
4. Call the [[Put]] method of Result(2), passing GetPropertyName(V)
26
for the property name and W for the value.
28
6. Call the [[Put]] method for the global object, passing
29
GetPropertyName(V) for the property name and W for the value.
31
8. Evaluate Statement.
32
9. If Result(8) is a value completion, change C to be "normal completion
33
after value V" where V is the value carried by Result(8).
34
10. If Result(8) is a break completion, go to step 14.
35
11. If Result(8) is a continue completion, go to step 5.
36
12. If Result(8) is a return completion, return Result(8).
40
Author: christine@netscape.com
41
Date: 11 september 1997
43
var SECTION = "12.6.3-4";
44
var VERSION = "ECMA_1";
46
var TITLE = "The for..in statement";
47
var BUGNUMBER="http://scopus.mcom.com/bugsplat/show_bug.cgi?id=344855";
49
writeHeaderToLog( SECTION + " "+ TITLE);
51
// for ( LeftHandSideExpression in Expression )
52
// LeftHandSideExpression:NewExpression:MemberExpression
54
var o = new MyObject();
57
for ( MyObject in o ) {
58
result += o[MyObject];
61
new TestCase( SECTION,
62
"for ( MyObject in o ) { result += o[MyObject] }",
72
new TestCase( SECTION,
73
"for ( value in o ) { result += o[value]",
83
new TestCase( SECTION,
84
"value = \"value\"; for ( value in o ) { result += o[value]",
94
new TestCase( SECTION,
95
"value = 0; for ( value in o ) { result += o[value]",
101
var ob = { 0:"hello" };
107
new TestCase( SECTION,
108
"ob = { 0:\"hello\" }; for ( ob[0] in o ) { result += o[ob[0]]",
113
for ( ob["0"] in o ) {
114
result += o[ob["0"]];
117
new TestCase( SECTION,
118
"value = 0; for ( ob[\"0\"] in o ) { result += o[o[\"0\"]]",
123
var ob = { value:"hello" };
124
for ( ob[value] in o ) {
125
result += o[ob[value]];
128
new TestCase( SECTION,
129
"ob = { 0:\"hello\" }; for ( ob[value] in o ) { result += o[ob[value]]",
134
for ( ob["value"] in o ) {
135
result += o[ob["value"]];
138
new TestCase( SECTION,
139
"value = 0; for ( ob[\"value\"] in o ) { result += o[ob[\"value\"]]",
144
for ( ob.value in o ) {
145
result += o[ob.value];
148
new TestCase( SECTION,
149
"value = 0; for ( ob.value in o ) { result += o[ob.value]",
153
// LeftHandSideExpression:NewExpression:MemberExpression [ Expression ]
154
// LeftHandSideExpression:NewExpression:MemberExpression . Identifier
155
// LeftHandSideExpression:NewExpression:new MemberExpression Arguments
156
// LeftHandSideExpression:NewExpression:PrimaryExpression:( Expression )
157
// LeftHandSideExpression:CallExpression:MemberExpression Arguments
158
// LeftHandSideExpression:CallExpression Arguments
159
// LeftHandSideExpression:CallExpression [ Expression ]
160
// LeftHandSideExpression:CallExpression . Identifier
164
function MyObject() {