forked from xuos/xiuos
				
			
		
			
				
	
	
		
			162 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
// Copyright JS Foundation and other contributors, http://js.foundation
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
assert (eval () === undefined);
 | 
						|
assert (eval (undefined) === undefined);
 | 
						|
assert (eval (null) === null);
 | 
						|
assert (eval (true) === true);
 | 
						|
assert (eval (false) === false);
 | 
						|
assert (eval (1) === 1);
 | 
						|
assert (eval (eval) === eval);
 | 
						|
 | 
						|
/* Indirect eval */
 | 
						|
function f1()
 | 
						|
{
 | 
						|
 var v1 = 'local value';
 | 
						|
 | 
						|
 assert (v1 === 'local value');
 | 
						|
 assert (typeof (this.v1) === 'undefined');
 | 
						|
 | 
						|
 r = this.eval ('var v1 = "global value";');
 | 
						|
 | 
						|
 assert (v1 === 'local value');
 | 
						|
 assert (this.v1 === 'global value');
 | 
						|
 assert (r === undefined);
 | 
						|
};
 | 
						|
 | 
						|
f1 ();
 | 
						|
 | 
						|
/* Direct eval from strict mode code */
 | 
						|
function f2 (global)
 | 
						|
{
 | 
						|
 'use strict';
 | 
						|
 var v2 = 'local value';
 | 
						|
 | 
						|
 assert (v2 === 'local value');
 | 
						|
 assert (typeof (global.v2) === 'undefined');
 | 
						|
 | 
						|
 r = eval ('var v2 = "global value";');
 | 
						|
 | 
						|
 assert (v2 === 'local value');
 | 
						|
 assert (typeof (global.v2) === 'undefined');
 | 
						|
 assert (r === undefined);
 | 
						|
 | 
						|
 try
 | 
						|
 {
 | 
						|
   eval ('arguments = 1;');
 | 
						|
   assert (false);
 | 
						|
 }
 | 
						|
 catch (e)
 | 
						|
 {
 | 
						|
   assert (e instanceof SyntaxError);
 | 
						|
 }
 | 
						|
}
 | 
						|
 | 
						|
f2 (this);
 | 
						|
 | 
						|
var y;
 | 
						|
 | 
						|
for (var i = 0; i < 100; i++)
 | 
						|
{
 | 
						|
  var r = eval ('var x =' + ' 1;');
 | 
						|
  assert (typeof (x) === 'number');
 | 
						|
  assert (r === undefined);
 | 
						|
 | 
						|
  delete x;
 | 
						|
  assert (typeof (x) === 'undefined');
 | 
						|
 | 
						|
  r = eval ('"use ' + 's' + 't' + 'r' + 'i' + 'c' + 't"; va' + 'r x = 1;');
 | 
						|
  assert (typeof (x) === 'undefined');
 | 
						|
  assert (r === "use strict");
 | 
						|
 | 
						|
  y = 'str';
 | 
						|
  assert (typeof (y) === 'string');
 | 
						|
 | 
						|
  delete y;
 | 
						|
  assert (typeof (y) === 'string');
 | 
						|
 | 
						|
  r = eval ('var y = "another ' + 'string";');
 | 
						|
  assert (y === 'another string');
 | 
						|
  assert (r == undefined);
 | 
						|
 | 
						|
  delete y;
 | 
						|
  assert (typeof (y) === 'string');
 | 
						|
 | 
						|
  r = eval ('if (true) 3; else 5;');
 | 
						|
  assert (r === 3);
 | 
						|
}
 | 
						|
 | 
						|
// Check SyntaxError handling
 | 
						|
try
 | 
						|
{
 | 
						|
  eval ('var var;');
 | 
						|
  assert (false);
 | 
						|
}
 | 
						|
catch (e)
 | 
						|
{
 | 
						|
  assert (e instanceof SyntaxError);
 | 
						|
}
 | 
						|
 | 
						|
try
 | 
						|
{
 | 
						|
  eval ("v_0 = {a: Math, /[]/};");
 | 
						|
  assert (false);
 | 
						|
}
 | 
						|
catch(e)
 | 
						|
{
 | 
						|
  assert (e instanceof SyntaxError);
 | 
						|
}
 | 
						|
 | 
						|
// nested eval with function expressions
 | 
						|
code = 'eval("(function (){})")';
 | 
						|
code = "eval ('" + code + "')";
 | 
						|
eval (code);
 | 
						|
 | 
						|
// Eval enclosed in brackets is still an eval.
 | 
						|
var p1 = 0;
 | 
						|
 | 
						|
function f3() {
 | 
						|
  var p1 = 5;
 | 
						|
  (eval)("assert(p1 === 5)");
 | 
						|
}
 | 
						|
f3();
 | 
						|
 | 
						|
function f4() {
 | 
						|
  var p1 = 6;
 | 
						|
  ((eval))("assert(p1 === 6)");
 | 
						|
}
 | 
						|
f4();
 | 
						|
 | 
						|
function f5() {
 | 
						|
  var p1 = 7;
 | 
						|
  (((((eval)))("assert(p1 === 7)")));
 | 
						|
}
 | 
						|
f5();
 | 
						|
 | 
						|
function f6() {
 | 
						|
  var p1 = 8;
 | 
						|
  var e = eval;
 | 
						|
 | 
						|
  e("assert(p1 === 0)");
 | 
						|
  (((((e)))("assert(p1 === 0)")));
 | 
						|
}
 | 
						|
f6();
 | 
						|
 | 
						|
y = 1;
 | 
						|
function f7() {
 | 
						|
  function x() { return y; }
 | 
						|
  eval("assert(x()() === 5); function y() { return 5 } assert(x()() === 5)");
 | 
						|
}
 | 
						|
f7()
 |