1425bb815Sopenharmony_ci// Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci// 3425bb815Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci// you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci// You may obtain a copy of the License at 6425bb815Sopenharmony_ci// 7425bb815Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci// 9425bb815Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci// See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci// limitations under the License. 14425bb815Sopenharmony_ci 15425bb815Sopenharmony_civar f = new Function (''); 16425bb815Sopenharmony_ciassert (f () === undefined); 17425bb815Sopenharmony_ci 18425bb815Sopenharmony_civar f = new Function ('"use strict"; f = undefined;'); 19425bb815Sopenharmony_ciassert (f () === undefined && f === undefined); 20425bb815Sopenharmony_ci 21425bb815Sopenharmony_civar f = new Function ('"use strict"; q = undefined;'); 22425bb815Sopenharmony_citry 23425bb815Sopenharmony_ci{ 24425bb815Sopenharmony_ci f (); 25425bb815Sopenharmony_ci assert (false); 26425bb815Sopenharmony_ci} 27425bb815Sopenharmony_cicatch (e) 28425bb815Sopenharmony_ci{ 29425bb815Sopenharmony_ci assert (e instanceof ReferenceError); 30425bb815Sopenharmony_ci} 31425bb815Sopenharmony_ci 32425bb815Sopenharmony_civar singleArgFunction = new Function ('arg', 'return arg'); 33425bb815Sopenharmony_ci 34425bb815Sopenharmony_ciassert (singleArgFunction (5) === 5); 35425bb815Sopenharmony_ci 36425bb815Sopenharmony_cifor (i = 1; i < 10; i ++) 37425bb815Sopenharmony_ci{ 38425bb815Sopenharmony_ci var f = new Function ('a', 'b', 'var q = a; b++; function f (k) {return q + k + b++;}; return f;'); 39425bb815Sopenharmony_ci 40425bb815Sopenharmony_ci var fns = new Array (); 41425bb815Sopenharmony_ci 42425bb815Sopenharmony_ci for (var n = 0; n < 10; n++) 43425bb815Sopenharmony_ci { 44425bb815Sopenharmony_ci var r = f (1, 7); 45425bb815Sopenharmony_ci fns[n] = r; 46425bb815Sopenharmony_ci 47425bb815Sopenharmony_ci var check_value = 10; 48425bb815Sopenharmony_ci 49425bb815Sopenharmony_ci for (var m = 0; m < 100; m++) 50425bb815Sopenharmony_ci { 51425bb815Sopenharmony_ci var value = r (1); 52425bb815Sopenharmony_ci assert (check_value++ === value); 53425bb815Sopenharmony_ci } 54425bb815Sopenharmony_ci } 55425bb815Sopenharmony_ci 56425bb815Sopenharmony_ci var check_value = 109; 57425bb815Sopenharmony_ci for (var n = 0; n < 11; n++) 58425bb815Sopenharmony_ci { 59425bb815Sopenharmony_ci for (var m = 0; m < 10; m++) 60425bb815Sopenharmony_ci { 61425bb815Sopenharmony_ci var value = fns [m] (m * n); 62425bb815Sopenharmony_ci assert (value == check_value + m * n); 63425bb815Sopenharmony_ci } 64425bb815Sopenharmony_ci 65425bb815Sopenharmony_ci check_value++; 66425bb815Sopenharmony_ci } 67425bb815Sopenharmony_ci} 68425bb815Sopenharmony_ci 69425bb815Sopenharmony_civar f = new Function ("a,b", "c", "return a + b + c;"); 70425bb815Sopenharmony_ciassert (f (1,2,3) === 6); 71425bb815Sopenharmony_ci 72425bb815Sopenharmony_cif = new Function ("a,b", "c,d", "return a + b + c + d;"); 73425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10); 74425bb815Sopenharmony_ci 75425bb815Sopenharmony_cif = new Function ("a" , "b", "c,d", "return a + b + c + d;"); 76425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10); 77425bb815Sopenharmony_ci 78425bb815Sopenharmony_civar f = new Function (" a\t , b", "\u0020c", "return a + b + c;"); 79425bb815Sopenharmony_ciassert (f (1,2,3) === 6); 80425bb815Sopenharmony_ci 81425bb815Sopenharmony_cif = new Function ("a, \n b \u0020", "c \t, d\n", "return a + b + c + d;"); 82425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10); 83425bb815Sopenharmony_ci 84425bb815Sopenharmony_cif = new Function (" a\t" , "\nb ", " \u0020c , d ", "return a + b + c + d;"); 85425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10); 86425bb815Sopenharmony_ci 87425bb815Sopenharmony_citry 88425bb815Sopenharmony_ci{ 89425bb815Sopenharmony_ci new Function ({ 90425bb815Sopenharmony_ci toString : function () { 91425bb815Sopenharmony_ci throw new TypeError(); 92425bb815Sopenharmony_ci }, 93425bb815Sopenharmony_ci valueOf : function () { 94425bb815Sopenharmony_ci throw new TypeError(); 95425bb815Sopenharmony_ci } 96425bb815Sopenharmony_ci }); 97425bb815Sopenharmony_ci 98425bb815Sopenharmony_ci assert (false); 99425bb815Sopenharmony_ci} 100425bb815Sopenharmony_cicatch (e) 101425bb815Sopenharmony_ci{ 102425bb815Sopenharmony_ci assert (e instanceof TypeError); 103425bb815Sopenharmony_ci} 104425bb815Sopenharmony_ci 105425bb815Sopenharmony_civar p = { toString : function() { throw 1; } }; 106425bb815Sopenharmony_civar body = { toString : function() { throw "body"; } }; 107425bb815Sopenharmony_ci 108425bb815Sopenharmony_citry 109425bb815Sopenharmony_ci{ 110425bb815Sopenharmony_ci new Function (p, body); 111425bb815Sopenharmony_ci // Should not be reached. 112425bb815Sopenharmony_ci assert (false); 113425bb815Sopenharmony_ci} 114425bb815Sopenharmony_cicatch (e) 115425bb815Sopenharmony_ci{ 116425bb815Sopenharmony_ci assert (e === 1); 117425bb815Sopenharmony_ci} 118425bb815Sopenharmony_ci 119425bb815Sopenharmony_ci// Check SyntaxError handling 120425bb815Sopenharmony_citry 121425bb815Sopenharmony_ci{ 122425bb815Sopenharmony_ci new Function ('var var;'); 123425bb815Sopenharmony_ci assert (false); 124425bb815Sopenharmony_ci} 125425bb815Sopenharmony_cicatch (e) 126425bb815Sopenharmony_ci{ 127425bb815Sopenharmony_ci assert (e instanceof SyntaxError); 128425bb815Sopenharmony_ci} 129425bb815Sopenharmony_ci 130425bb815Sopenharmony_citry 131425bb815Sopenharmony_ci{ 132425bb815Sopenharmony_ci new Function ('a;b', 'return;'); 133425bb815Sopenharmony_ci assert (false); 134425bb815Sopenharmony_ci} 135425bb815Sopenharmony_cicatch (e) 136425bb815Sopenharmony_ci{ 137425bb815Sopenharmony_ci assert (e instanceof SyntaxError); 138425bb815Sopenharmony_ci} 139