1/*
2* The contents of this file are subject to the Netscape Public
3* License Version 1.1 (the "License"); you may not use this file
4* except in compliance with the License. You may obtain a copy of
5* the License at http://www.mozilla.org/NPL/
6*
7* Software distributed under the License is distributed on an
8* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed
9* or implied. See the License for the specific language governing
10* rights and limitations under the License.
11*
12* The Original Code is mozilla.org code.
13*
14* The Initial Developer of the Original Code is Netscape
15* Communications Corporation.  Portions created by Netscape are
16* Copyright (C) 1998 Netscape Communications Corporation.
17* All Rights Reserved.
18*
19* Contributor(s): coliver@mminternet.com, pschwartau@netscape.com
20* Date: 2001-07-03
21*
22* SUMMARY:  Testing scope with nested functions
23*
24* From correspondence with Christopher Oliver <coliver@mminternet.com>:
25*
26* > Running this test with Rhino produces the following exception:
27* >
28* > uncaught JavaScript exception: undefined: Cannot find default value for
29* > object. (line 3)
30* >
31* > This is due to a bug in org.mozilla.javascript.NativeCall which doesn't
32* > implement toString or valueOf or override getDefaultValue.
33* > However, even after I hacked in an implementation of getDefaultValue in
34* > NativeCall, Rhino still produces a different result then SpiderMonkey:
35* >
36* > [object Call]
37* > [object Object]
38* > [object Call]
39*
40* Note the results should be:
41*
42*   [object global]
43*   [object Object]
44*   [object global]
45*
46* This is what we are checking for in this testcase -
47*/
48//-----------------------------------------------------------------------------
49var UBound = 0;
50var bug = '(none)';
51var summary = 'Testing scope with nested functions';
52var statprefix = 'Section ';
53var statsuffix = ' of test -';
54var self = this; // capture a reference to the global object;
55var cnGlobal = self.toString();
56var cnObject = (new Object).toString();
57var statusitems = [];
58var actualvalues = [];
59var expectedvalues = [];
60
61
62function a()
63{
64  function b()
65  {
66    capture(this.toString());
67  }
68
69  this.c = function()
70  {
71    capture(this.toString());
72    b();
73  }
74
75  b();
76}
77
78
79var obj = new a();  // captures actualvalues[0]
80obj.c();            // captures actualvalues[1], actualvalues[2]
81
82
83// The values we expect - see introduction above -
84expectedvalues[0] = cnGlobal;
85expectedvalues[1] = cnObject;
86expectedvalues[2] = cnGlobal;
87
88
89
90//-----------------------------------------------------------------------------
91test();
92//-----------------------------------------------------------------------------
93
94
95
96function capture(val)
97{
98  actualvalues[UBound] = val;
99  statusitems[UBound] = getStatus(UBound);
100  UBound++;
101}
102
103
104function test()
105{
106  enterFunc ('test');
107  printBugNumber (bug);
108  printStatus (summary);
109
110  for (var i=0; i<UBound; i++)
111  {
112    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
113  }
114
115  exitFunc ('test');
116}
117
118
119function getStatus(i)
120{
121  return statprefix + i + statsuffix;
122}
123