18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The contents of this file are subject to the Netscape Public
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* License Version 1.1 (the "License"); you may not use this file
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* except in compliance with the License. You may obtain a copy of
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the License at http://www.mozilla.org/NPL/
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Software distributed under the License is distributed on an
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* or implied. See the License for the specific language governing
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* rights and limitations under the License.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Original Code is mozilla.org code.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Initial Developer of the Original Code is Netscape
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Communications Corporation.  Portions created by Netscape are
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Copyright (C) 1998 Netscape Communications Corporation.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* All Rights Reserved.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Contributor(s): pschwartau@netscape.com
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Date: 2001-07-13
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* SUMMARY: Applying Function.prototype.call to the Function object itself
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* ECMA-262 15.3.4.4 Function.prototype.call (thisArg [,arg1 [,arg2,�] ] )
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* When applied to the Function object itself, thisArg should be ignored.
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* As explained by Waldemar (waldemar@netscape.com):
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Function.call(obj, "print(this)") is equivalent to invoking
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Function("print(this)") with this set to obj. Now, Function("print(this)")
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* is equivalent to new Function("print(this)") (see 15.3.1.1), and the latter
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* ignores the this value that you passed it and constructs a function
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* (which we'll call F) which will print the value of the this that will be
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* passed in when F will be invoked.
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* With the last set of () you're invoking F(), which means you're calling it
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* with no this value. When you don't provide a this value, it defaults to the
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* global object.
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UBound = 0;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar bug = '(none)';
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar summary = 'Applying Function.prototype.call to the Function object itself';
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar status = '';
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar statusitems = [];
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar actual = '';
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar actualvalues = [];
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar expect= '';
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar expectedvalues = [];
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar self = this; // capture a reference to the global object
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnOBJECT_GLOBAL = self.toString();
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnOBJECT_OBJECT = (new Object).toString();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnHello = 'Hello';
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnRed = 'red';
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar objTEST = {color:cnRed};
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar f = new Function();
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar g = new Function();
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectf = Function.call(self, 'return cnHello');
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectg = Function.call(objTEST, 'return cnHello');
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section A of test';
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = f();
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnHello;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis();
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section B of test';
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = g();
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnHello;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis();
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectf = Function.call(self, 'return this.toString()');
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectg = Function.call(objTEST, 'return this.toString()');
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section C of test';
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = f();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnOBJECT_GLOBAL;
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis();
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section D of test';
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = g();
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnOBJECT_GLOBAL;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis();
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectf = Function.call(self, 'return this.color');
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectg = Function.call(objTEST, 'return this.color');
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section E of test';
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = f();
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = undefined;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis();
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section F of test';
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = g();
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = undefined;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis();
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttest();
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction captureThis()
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  statusitems[UBound] = status;
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  actualvalues[UBound] = actual;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  expectedvalues[UBound] = expect;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  UBound++;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test()
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  enterFunc ('test');
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  printBugNumber (bug);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  printStatus (summary);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  for (var i = 0; i < UBound; i++)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  {
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  }
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  exitFunc ('test');
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
132