tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

regress-222029-001.js (2403B)


      1 /* -*- indent-tabs-mode: nil; js-indent-level: 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/. */
      5 
      6 /*
      7 *
      8 * Date:    13 Oct 2003
      9 * SUMMARY: Make our f.caller property match IE's wrt f.apply and f.call
     10 * See http://bugzilla.mozilla.org/show_bug.cgi?id=222029
     11 *
     12 * Below, when gg calls f via |f.call|, we have this call chain:
     13 *
     14 *          calls                                  calls
     15 *   gg() --------->  Function.prototype.call()  --------->  f()
     16 *
     17 *
     18 * The question this bug addresses is, "What should we say |f.caller| is?"
     19 *
     20 * Before this fix, SpiderMonkey said it was |Function.prototype.call|.
     21 * After this fix, SpiderMonkey emulates IE and says |gg| instead.
     22 *
     23 */
     24 //-----------------------------------------------------------------------------
     25 var UBound = 0;
     26 var BUGNUMBER = 222029;
     27 var summary = "Make our f.caller property match IE's wrt f.apply and f.call";
     28 var status = '';
     29 var statusitems = [];
     30 var actual = '';
     31 var actualvalues = [];
     32 var expect= '';
     33 var expectedvalues = [];
     34 
     35 
     36 function f()
     37 {
     38  return f.caller.p ;
     39 }
     40 
     41 
     42 /*
     43 * Call |f| directly
     44 */
     45 function g()
     46 {
     47  return f();
     48 }
     49 g.p = "hello";
     50 
     51 
     52 /*
     53 * Call |f| via |f.call|
     54 */
     55 function gg()
     56 {
     57  return f.call(this);
     58 }
     59 gg.p = "hello";
     60 
     61 
     62 /*
     63 * Call |f| via |f.apply|
     64 */
     65 function ggg()
     66 {
     67  return f.apply(this);
     68 }
     69 ggg.p = "hello";
     70 
     71 
     72 /*
     73 * Shadow |p| on |Function.prototype.call|, |Function.prototype.apply|.
     74 * In Sections 2 and 3 below, we no longer expect to recover this value -
     75 */
     76 Function.prototype.call.p = "goodbye";
     77 Function.prototype.apply.p = "goodbye";
     78 
     79 
     80 
     81 status = inSection(1);
     82 actual = g();
     83 expect = "hello";
     84 addThis();
     85 
     86 status = inSection(2);
     87 actual = gg();
     88 expect = "hello";
     89 addThis();
     90 
     91 status = inSection(3);
     92 actual = ggg();
     93 expect = "hello";
     94 addThis();
     95 
     96 
     97 
     98 
     99 //-----------------------------------------------------------------------------
    100 test();
    101 //-----------------------------------------------------------------------------
    102 
    103 
    104 
    105 function addThis()
    106 {
    107  statusitems[UBound] = status;
    108  actualvalues[UBound] = actual;
    109  expectedvalues[UBound] = expect;
    110  UBound++;
    111 }
    112 
    113 
    114 function test()
    115 {
    116  printBugNumber(BUGNUMBER);
    117  printStatus(summary);
    118 
    119  for (var i=0; i<UBound; i++)
    120  {
    121    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
    122  }
    123 }