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