Home | History | Annotate | Download | only in Regress
      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 "AS
      8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
      9 * 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. All
     17 * Rights Reserved.
     18 *
     19 * Contributor(s): brendan (at) mozilla.org, pschwartau (at) netscape.com
     20 * Date: 15 Feb 2001
     21 *
     22 * SUMMARY:  self.eval(str) inside a function
     23 * NOTE: 'self' is just a variable used to capture the global JS object.
     24 *
     25 * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498
     26 * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251
     27 * See http://bugzilla.mozilla.org/show_bug.cgi?id=69441 (!!!)
     28 *
     29 * Brendan:
     30 *
     31 * "ECMA-262 Edition 3, 10.1.3 requires a FunctionDeclaration parsed as part
     32 * of  a Program by eval to create a property of eval's caller's variable object.
     33 * This test evals in the body of a with statement, whose scope chain *is*
     34 * relevant to the effect of parsing the FunctionDeclaration."
     35 */
     36 //-------------------------------------------------------------------------------------------------
     37 var bug = 68498;
     38 var summary = 'Testing self.eval(str) inside a function';
     39 var statprefix = '; currently at expect[';
     40 var statsuffix = '] within test -';
     41 var sToEval='';
     42 var actual=[ ];
     43 var expect=[ ];
     44 
     45 
     46 // Capture a reference to the global object -
     47 var self = this;
     48 
     49 // You shouldn't see this global variable's value in any printout -
     50 var x = 'outer';
     51 
     52 // This function is the heart of the test -
     53 function f(o,s,x) {with(o) eval(s); return z;};
     54 
     55 // Run-time statements to pass to the eval inside f
     56 sToEval += 'actual[0] = typeof g;'
     57 sToEval += 'function g(){actual[1]=(typeof w == "undefined"  ||  w); return x};'
     58 sToEval += 'actual[2] = w;'
     59 sToEval += 'actual[3] = typeof g;'
     60 sToEval += 'var z=g();'
     61 
     62 // Set the actual-results array. The next line will set actual[0] - actual[4] in one shot
     63 actual[4] = f({w:44}, sToEval, 'inner');
     64 actual[5] = 'z' in self && z;
     65 
     66 
     67 /* Set the expected-results array.
     68 *
     69 *  Sample issue: why do we set expect[4] = 'inner'?  Look at actual[4]...
     70 *  1. The return value of f equals z, which is not defined at compile-time
     71 *  2. At run-time (via with(o) eval(s) inside f), z is defined as the return value of g
     72 *  3. At run-time (via with(o) eval(s) inside f), g is defined to return x
     73 *  4. In the scope of with(o), x is undefined
     74 *  5. Farther up the scope chain, x can be located as an argument of f
     75 *  6. The value of this argument at run-time is 'inner'
     76 *  7. Even farther up the scope chain, the name x can be found as a global variable
     77 *  8. The value of this global variable is 'outer', but we should NOT have gone
     78 *      this far up the scope chain to find x...therefore we expect 'inner'
     79 */
     80 expect[0] = 'function';
     81 expect[1] = 44;
     82 expect[2] = 44;
     83 expect[3] = 'function';
     84 expect[4] = 'inner';
     85 expect[5] = false;
     86 
     87 
     88 
     89 //------------------------------------------------------------------------------------------------
     90 test();
     91 //-------------------------------------------------------------------------------------------------
     92 
     93 
     94 function test()
     95 {
     96   enterFunc ('test');
     97   printBugNumber (bug);
     98   printStatus (summary);
     99 
    100   for (var i in expect)
    101   {
    102     reportCompare(expect[i], actual[i], getStatus(i));
    103   }
    104 
    105   exitFunc ('test');
    106 }
    107 
    108 
    109 function getStatus(i)
    110 {
    111   return (summary  +  statprefix  +  i  +  statsuffix);
    112 }
    113