Home | History | Annotate | Download | only in Function
      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: 07 May 2001
     21 *
     22 * SUMMARY:  Testing the arguments object
     23 *
     24 * See http://bugzilla.mozilla.org/show_bug.cgi?id=72884
     25 */
     26 //-------------------------------------------------------------------------------------------------
     27 var UBound = 0;
     28 var bug = 72884;
     29 var summary = 'Testing the arguments object';
     30 var status = '';
     31 var statusitems = [ ];
     32 var actual = '';
     33 var actualvalues = [ ];
     34 var expect= '';
     35 var expectedvalues = [ ];
     36 var a = '';
     37 
     38 
     39 status = inSection(1);
     40 function f()
     41 {
     42   delete arguments.length;
     43   return arguments;
     44 }
     45 
     46 a = f();
     47 actual = a instanceof Object;
     48 expect = true;
     49 addThis();
     50 
     51 actual = a instanceof Array;
     52 expect = false;
     53 addThis();
     54 
     55 actual = a.length;
     56 expect = undefined;
     57 addThis();
     58 
     59 
     60 
     61 status = inSection(2);
     62 a = f(1,2,3);
     63 actual = a instanceof Object;
     64 expect = true;
     65 addThis();
     66 
     67 actual = a instanceof Array;
     68 expect = false;
     69 addThis();
     70 
     71 actual = a.length;
     72 expect = undefined;
     73 addThis();
     74 
     75 actual = a[0];
     76 expect = 1;
     77 addThis();
     78 
     79 actual = a[1];
     80 expect = 2;
     81 addThis();
     82 
     83 actual = a[2];
     84 expect = 3;
     85 addThis();
     86 
     87 
     88 
     89 status = inSection(3);
     90 /*
     91  * Brendan:
     92  *
     93  * Note that only callee and length can be overridden, so deleting an indexed
     94  * property and asking for it again causes it to be recreated by args_resolve:
     95  *
     96  * function g(){delete arguments[0]; return arguments[0]}
     97  * g(42)     // should this print 42?
     98  *
     99  * I'm not positive this violates ECMA, which allows in chapter 16 for extensions
    100  * including properties (does it allow for magically reappearing properties?).  The
    101  * delete operator successfully deletes arguments[0] and results in true, but that
    102  * is not distinguishable from the case where arguments[0] was delegated to
    103  * Arguments.prototype[0], which was how the bad old code worked.
    104  *
    105  * I'll ponder this last detail...
    106  *
    107  * UPDATE: Per ECMA-262, delete on an arguments[i] should succeed
    108  * and remove that property from the arguments object, leaving any get
    109  * of it after the delete to evaluate to undefined.
    110  */
    111 function g()
    112 {
    113   delete arguments[0];
    114   return arguments[0];
    115 }
    116 actual = g(42);
    117 expect = undefined;  // not 42...
    118 addThis();
    119 
    120 
    121 
    122 //-------------------------------------------------------------------------------------------------
    123 test();
    124 //-------------------------------------------------------------------------------------------------
    125 
    126 
    127 function addThis()
    128 {
    129   statusitems[UBound] = status;
    130   actualvalues[UBound] = actual;
    131   expectedvalues[UBound] = expect;
    132   UBound++;
    133 }
    134 
    135 
    136 function test()
    137 {
    138   enterFunc ('test');
    139   printBugNumber (bug);
    140   printStatus (summary);
    141 
    142   for (var i = 0; i < UBound; i++)
    143   {
    144     reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
    145   }
    146 
    147   exitFunc ('test');
    148 }
    149