lib/uglify.js in uglifier-1.2.4 vs lib/uglify.js in uglifier-1.2.5
- old
+ new
@@ -1,22 +1,22 @@
(function(global) {
(function(/*! Stitch !*/) {
if (!this.require) {
var modules = {}, cache = {}, require = function(name, root) {
- var module = cache[name], path = expand(root, name), fn;
+ var path = expand(root, name), module = cache[path], fn;
if (module) {
- return module;
+ return module.exports;
} else if (fn = modules[path] || modules[path = expand(path, './index')]) {
- module = {id: name, exports: {}};
+ module = {id: path, exports: {}};
try {
- cache[name] = module.exports;
+ cache[path] = module;
fn(module.exports, function(name) {
return require(name, dirname(path));
}, module);
- return cache[name] = module.exports;
+ return module.exports;
} catch (err) {
- delete cache[name];
+ delete cache[path];
throw err;
}
} else {
throw 'module \'' + name + '\' not found';
}
@@ -1194,12 +1194,11 @@
return;
}
oScope = bIsGlobal ? oSyntacticCodeUnit.scope : oSourceElements.scope;
// Skip a Directive Prologue.
while (nAfterDirectivePrologue < oSourceElements.length &&
- 'stat' === oSourceElements[nAfterDirectivePrologue][0] &&
- 'string' === oSourceElements[nAfterDirectivePrologue][1][0]) {
+ 'directive' === oSourceElements[nAfterDirectivePrologue][0]) {
nAfterDirectivePrologue += 1;
aSourceElementsData.push(null);
}
if (oSourceElements.length === nAfterDirectivePrologue) {
return;
@@ -1258,1388 +1257,10 @@
}(oAbstractSyntaxTree = oProcessor.ast_add_scope(oAbstractSyntaxTree)));
return oAbstractSyntaxTree;
};
/*jshint sub:false */
-
-if (require.main === module) {
- (function() {
- 'use strict';
- /*jshint bitwise:true, curly:true, eqeqeq:true, forin:true, immed:true,
- latedef:true, newcap:true, noarge:true, noempty:true, nonew:true,
- onevar:true, plusplus:true, regexp:true, undef:true, strict:true,
- sub:false, trailing:true */
-
- var _,
- /**
- * NodeJS module for unit testing.
- * @namespace
- * @type {!TAssert}
- * @see http://nodejs.org/docs/v0.6.10/api/all.html#assert
- */
- oAssert = (/** @type {!TAssert} */ require('assert')),
- /**
- * The parser of ECMA-262 found in UglifyJS.
- * @namespace
- * @type {!TParser}
- */
- oParser = (/** @type {!TParser} */ require('./parse-js')),
- /**
- * The processor of <abbr title="abstract syntax tree">AST</abbr>s
- * found in UglifyJS.
- * @namespace
- * @type {!TProcessor}
- */
- oProcessor = (/** @type {!TProcessor} */ require('./process')),
- /**
- * An instance of an object that allows the traversal of an <abbr
- * title="abstract syntax tree">AST</abbr>.
- * @type {!TWalker}
- */
- oWalker,
- /**
- * A collection of functions for the removal of the scope information
- * during the traversal of an <abbr title="abstract syntax tree"
- * >AST</abbr>.
- * @namespace
- * @type {!Object.<string, function(...[*])>}
- */
- oWalkersPurifiers = {
- /**#nocode+*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
- /**
- * Deletes the scope information from the branch of the abstract
- * syntax tree representing the encountered function declaration.
- * @param {string} sIdentifier The identifier of the function.
- * @param {!Array.<string>} aFormalParameterList Formal parameters.
- * @param {!TSyntacticCodeUnit} oFunctionBody Function code.
- */
- 'defun': function(
- sIdentifier,
- aFormalParameterList,
- oFunctionBody) {
- delete oFunctionBody.scope;
- },
- /**
- * Deletes the scope information from the branch of the abstract
- * syntax tree representing the encountered function expression.
- * @param {?string} sIdentifier The optional identifier of the
- * function.
- * @param {!Array.<string>} aFormalParameterList Formal parameters.
- * @param {!TSyntacticCodeUnit} oFunctionBody Function code.
- */
- 'function': function(
- sIdentifier,
- aFormalParameterList,
- oFunctionBody) {
- delete oFunctionBody.scope;
- }
- /**#nocode-*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
- },
- /**
- * Initiates the traversal of a source element.
- * @param {!TWalker} oWalker An instance of an object that allows the
- * traversal of an abstract syntax tree.
- * @param {!TSyntacticCodeUnit} oSourceElement A source element from
- * which the traversal should commence.
- * @return {function(): !TSyntacticCodeUnit} A function that is able to
- * initiate the traversal from a given source element.
- */
- cContext = function(oWalker, oSourceElement) {
- /**
- * @return {!TSyntacticCodeUnit} A function that is able to
- * initiate the traversal from a given source element.
- */
- var fLambda = function() {
- return oWalker.walk(oSourceElement);
- };
-
- return fLambda;
- },
- /**
- * A record consisting of configuration for the code generation phase.
- * @type {!Object}
- */
- oCodeGenerationOptions = {
- beautify: true
- },
- /**
- * Tests whether consolidation of an ECMAScript program yields expected
- * results.
- * @param {{
- * sTitle: string,
- * sInput: string,
- * sOutput: string
- * }} oUnitTest A record consisting of data about a unit test: its
- * name, an ECMAScript program, and, if consolidation is to take
- * place, the resulting ECMAScript program.
- */
- cAssert = function(oUnitTest) {
- var _,
- /**
- * An array-like object representing the <abbr title=
- * "abstract syntax tree">AST</abbr> obtained after consolidation.
- * @type {!TSyntacticCodeUnit}
- */
- oSyntacticCodeUnitActual =
- exports.ast_consolidate(oParser.parse(oUnitTest.sInput)),
- /**
- * An array-like object representing the expected <abbr title=
- * "abstract syntax tree">AST</abbr>.
- * @type {!TSyntacticCodeUnit}
- */
- oSyntacticCodeUnitExpected = oParser.parse(
- oUnitTest.hasOwnProperty('sOutput') ?
- oUnitTest.sOutput : oUnitTest.sInput);
-
- delete oSyntacticCodeUnitActual.scope;
- oWalker = oProcessor.ast_walker();
- oWalker.with_walkers(
- oWalkersPurifiers,
- cContext(oWalker, oSyntacticCodeUnitActual));
- try {
- oAssert.deepEqual(
- oSyntacticCodeUnitActual,
- oSyntacticCodeUnitExpected);
- } catch (oException) {
- console.error(
- '########## A unit test has failed.\n' +
- oUnitTest.sTitle + '\n' +
- '##### actual code (' +
- oProcessor.gen_code(oSyntacticCodeUnitActual).length +
- ' bytes)\n' +
- oProcessor.gen_code(
- oSyntacticCodeUnitActual,
- oCodeGenerationOptions) + '\n' +
- '##### expected code (' +
- oProcessor.gen_code(oSyntacticCodeUnitExpected).length +
- ' bytes)\n' +
- oProcessor.gen_code(
- oSyntacticCodeUnitExpected,
- oCodeGenerationOptions));
- }
- };
-
- [
- // 7.6.1 Reserved Words.
- {
- sTitle:
- 'Omission of keywords while choosing an identifier name.',
- sInput:
- '(function() {' +
- ' var a, b, c, d, e, f, g, h, i, j, k, l, m,' +
- ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
- ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
- ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
- ' $, _,' +
- ' aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am,' +
- ' an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az,' +
- ' aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM,' +
- ' aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ,' +
- ' a$, a_,' +
- ' ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm,' +
- ' bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz,' +
- ' bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,' +
- ' bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ,' +
- ' b$, b_,' +
- ' ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm,' +
- ' cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz,' +
- ' cA, cB, cC, cD, cE, cF, cG, cH, cI, cJ, cK, cL, cM,' +
- ' cN, cO, cP, cQ, cR, cS, cT, cU, cV, cW, cX, cY, cZ,' +
- ' c$, c_,' +
- ' da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm,' +
- ' dn, dq, dr, ds, dt, du, dv, dw, dx, dy, dz,' +
- ' dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, dK, dL, dM,' +
- ' dN, dO, dP, dQ, dR, dS, dT, dU, dV, dW, dX, dY, dZ,' +
- ' d$, d_;' +
- ' void ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",' +
- ' "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var dp =' +
- ' "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",' +
- ' a, b, c, d, e, f, g, h, i, j, k, l, m,' +
- ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
- ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
- ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
- ' $, _,' +
- ' aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am,' +
- ' an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az,' +
- ' aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM,' +
- ' aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ,' +
- ' a$, a_,' +
- ' ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm,' +
- ' bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz,' +
- ' bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,' +
- ' bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ,' +
- ' b$, b_,' +
- ' ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm,' +
- ' cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz,' +
- ' cA, cB, cC, cD, cE, cF, cG, cH, cI, cJ, cK, cL, cM,' +
- ' cN, cO, cP, cQ, cR, cS, cT, cU, cV, cW, cX, cY, cZ,' +
- ' c$, c_,' +
- ' da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm,' +
- ' dn, dq, dr, ds, dt, du, dv, dw, dx, dy, dz,' +
- ' dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, dK, dL, dM,' +
- ' dN, dO, dP, dQ, dR, dS, dT, dU, dV, dW, dX, dY, dZ,' +
- ' d$, d_;' +
- ' void [dp, dp];' +
- '}());'
- },
- // 7.8.1 Null Literals.
- {
- sTitle:
- 'Evaluation with regard to the null value.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var foo;' +
- ' void [null, null, null];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void [null, null];' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var a = null, foo;' +
- ' void [a, a, a];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void [null, null];' +
- '}());'
- },
- // 7.8.2 Boolean Literals.
- {
- sTitle:
- 'Evaluation with regard to the false value.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var foo;' +
- ' void [false, false, false];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void [false, false];' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var a = false, foo;' +
- ' void [a, a, a];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void [false, false];' +
- '}());'
- },
- {
- sTitle:
- 'Evaluation with regard to the true value.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var foo;' +
- ' void [true, true, true];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void [true, true];' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var a = true, foo;' +
- ' void [a, a, a];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void [true, true];' +
- '}());'
- },
- // 7.8.4 String Literals.
- {
- sTitle:
- 'Evaluation with regard to the String value of a string literal.',
- sInput:
- '(function() {' +
- ' var foo;' +
- ' void ["abcd", "abcd", "abc", "abc"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var a = "abcd", foo;' +
- ' void [a, a, "abc", "abc"];' +
- '}());'
- },
- // 7.8.5 Regular Expression Literals.
- {
- sTitle:
- 'Preservation of the pattern of a regular expression literal.',
- sInput:
- 'void [/abcdefghijklmnopqrstuvwxyz/, /abcdefghijklmnopqrstuvwxyz/];'
- },
- {
- sTitle:
- 'Preservation of the flags of a regular expression literal.',
- sInput:
- 'void [/(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim,' +
- ' /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim,' +
- ' /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim];'
- },
- // 10.2 Lexical Environments.
- {
- sTitle:
- 'Preservation of identifier names in the same scope.',
- sInput:
- '/*jshint shadow:true */' +
- 'var a;' +
- 'function b(i) {' +
- '}' +
- 'for (var c; 0 === Math.random(););' +
- 'for (var d in {});' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- 'void [b(a), b(c), b(d)];' +
- 'void [typeof e];' +
- 'i: for (; 0 === Math.random();) {' +
- ' if (42 === (new Date()).getMinutes()) {' +
- ' continue i;' +
- ' } else {' +
- ' break i;' +
- ' }' +
- '}' +
- 'try {' +
- '} catch (f) {' +
- '} finally {' +
- '}' +
- '(function g(h) {' +
- '}());' +
- 'void [{' +
- ' i: 42,' +
- ' "j": 42,' +
- ' \'k\': 42' +
- '}];' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];',
- sOutput:
- '/*jshint shadow:true */' +
- 'var a;' +
- 'function b(i) {' +
- '}' +
- 'for (var c; 0 === Math.random(););' +
- 'for (var d in {});' +
- '(function() {' +
- ' var i = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [i];' +
- ' void [b(a), b(c), b(d)];' +
- ' void [typeof e];' +
- ' i: for (; 0 === Math.random();) {' +
- ' if (42 === (new Date()).getMinutes()) {' +
- ' continue i;' +
- ' } else {' +
- ' break i;' +
- ' }' +
- ' }' +
- ' try {' +
- ' } catch (f) {' +
- ' } finally {' +
- ' }' +
- ' (function g(h) {' +
- ' }());' +
- ' void [{' +
- ' i: 42,' +
- ' "j": 42,' +
- ' \'k\': 42' +
- ' }];' +
- ' void [i];' +
- '}());'
- },
- {
- sTitle:
- 'Preservation of identifier names in nested function code.',
- sInput:
- '(function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' (function() {' +
- ' var a;' +
- ' for (var b; 0 === Math.random(););' +
- ' for (var c in {});' +
- ' void [typeof d];' +
- ' h: for (; 0 === Math.random();) {' +
- ' if (42 === (new Date()).getMinutes()) {' +
- ' continue h;' +
- ' } else {' +
- ' break h;' +
- ' }' +
- ' }' +
- ' try {' +
- ' } catch (e) {' +
- ' } finally {' +
- ' }' +
- ' (function f(g) {' +
- ' }());' +
- ' void [{' +
- ' h: 42,' +
- ' "i": 42,' +
- ' \'j\': 42' +
- ' }];' +
- ' }());' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var h = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [h];' +
- ' (function() {' +
- ' var a;' +
- ' for (var b; 0 === Math.random(););' +
- ' for (var c in {});' +
- ' void [typeof d];' +
- ' h: for (; 0 === Math.random();) {' +
- ' if (42 === (new Date()).getMinutes()) {' +
- ' continue h;' +
- ' } else {' +
- ' break h;' +
- ' }' +
- ' }' +
- ' try {' +
- ' } catch (e) {' +
- ' } finally {' +
- ' }' +
- ' (function f(g) {' +
- ' }());' +
- ' void [{' +
- ' h: 42,' +
- ' "i": 42,' +
- ' \'j\': 42' +
- ' }];' +
- ' }());' +
- ' void [h];' +
- '}());'
- },
- {
- sTitle:
- 'Consolidation of a closure with other source elements.',
- sInput:
- '(function(foo) {' +
- '}("abcdefghijklmnopqrstuvwxyz"));' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];',
- sOutput:
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' (function(foo) {' +
- ' })(a);' +
- ' void [a];' +
- '}());'
- },
- {
- sTitle:
- 'Consolidation of function code instead of a sole closure.',
- sInput:
- '(function(foo, bar) {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}("abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"));',
- sOutput:
- '(function(foo, bar) {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}("abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"));'
- },
- // 11.1.5 Object Initialiser.
- {
- sTitle:
- 'Preservation of property names of an object initialiser.',
- sInput:
- 'var foo = {' +
- ' abcdefghijklmnopqrstuvwxyz: 42,' +
- ' "zyxwvutsrqponmlkjihgfedcba": 42,' +
- ' \'mlkjihgfedcbanopqrstuvwxyz\': 42' +
- '};' +
- 'void [' +
- ' foo.abcdefghijklmnopqrstuvwxyz,' +
- ' "zyxwvutsrqponmlkjihgfedcba",' +
- ' \'mlkjihgfedcbanopqrstuvwxyz\'' +
- '];'
- },
- {
- sTitle:
- 'Evaluation with regard to String values derived from identifier ' +
- 'names used as property accessors.',
- sInput:
- '(function() {' +
- ' var foo;' +
- ' void [' +
- ' Math.abcdefghij,' +
- ' Math.abcdefghij,' +
- ' Math.abcdefghi,' +
- ' Math.abcdefghi' +
- ' ];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var a = "abcdefghij", foo;' +
- ' void [' +
- ' Math[a],' +
- ' Math[a],' +
- ' Math.abcdefghi,' +
- ' Math.abcdefghi' +
- ' ];' +
- '}());'
- },
- // 11.2.1 Property Accessors.
- {
- sTitle:
- 'Preservation of identifiers in the nonterminal MemberExpression.',
- sInput:
- 'void [' +
- ' Math.E,' +
- ' Math.LN10,' +
- ' Math.LN2,' +
- ' Math.LOG2E,' +
- ' Math.LOG10E,' +
- ' Math.PI,' +
- ' Math.SQRT1_2,' +
- ' Math.SQRT2,' +
- ' Math.abs,' +
- ' Math.acos' +
- '];'
- },
- // 12.2 Variable Statement.
- {
- sTitle:
- 'Preservation of the identifier of a variable that is being ' +
- 'declared in a variable statement.',
- sInput:
- '(function() {' +
- ' var abcdefghijklmnopqrstuvwxyz;' +
- ' void [abcdefghijklmnopqrstuvwxyz];' +
- '}());'
- },
- {
- sTitle:
- 'Exclusion of a variable statement in global code.',
- sInput:
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- 'var foo = "abcdefghijklmnopqrstuvwxyz",' +
- ' bar = "abcdefghijklmnopqrstuvwxyz";' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];'
- },
- {
- sTitle:
- 'Exclusion of a variable statement in function code that ' +
- 'contains a with statement.',
- sInput:
- '(function() {' +
- ' with ({});' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' var foo;' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- '}());'
- },
- {
- sTitle:
- 'Exclusion of a variable statement in function code that ' +
- 'contains a direct call to the eval function.',
- sInput:
- '/*jshint evil:true */' +
- 'void [' +
- ' function() {' +
- ' eval("");' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' var foo;' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' }' +
- '];'
- },
- {
- sTitle:
- 'Consolidation within a variable statement in global code.',
- sInput:
- 'var foo = function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '};',
- sOutput:
- 'var foo = function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '};'
- },
- {
- sTitle:
- 'Consolidation within a variable statement excluded in function ' +
- 'code due to the presence of a with statement.',
- sInput:
- '(function() {' +
- ' with ({});' +
- ' var foo = function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' };' +
- '}());',
- sOutput:
- '(function() {' +
- ' with ({});' +
- ' var foo = function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' };' +
- '}());'
- },
- {
- sTitle:
- 'Consolidation within a variable statement excluded in function ' +
- 'code due to the presence of a direct call to the eval function.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' eval("");' +
- ' var foo = function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' };' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' eval("");' +
- ' var foo = function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' };' +
- '}());'
- },
- {
- sTitle:
- 'Inclusion of a variable statement in function code that ' +
- 'contains no with statement and no direct call to the eval ' +
- 'function.',
- sInput:
- '(function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' var foo;' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a];' +
- ' var foo;' +
- ' void [a];' +
- '}());'
- },
- {
- sTitle:
- 'Ignorance with regard to a variable statement in global code.',
- sInput:
- 'var foo = "abcdefghijklmnopqrstuvwxyz";' +
- 'void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];',
- sOutput:
- 'var foo = "abcdefghijklmnopqrstuvwxyz";' +
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());'
- },
- // 12.4 Expression Statement.
- {
- sTitle:
- 'Preservation of identifiers in an expression statement.',
- sInput:
- 'void [typeof abcdefghijklmnopqrstuvwxyz,' +
- ' typeof abcdefghijklmnopqrstuvwxyz];'
- },
- // 12.6.3 The {@code for} Statement.
- {
- sTitle:
- 'Preservation of identifiers in the variable declaration list of ' +
- 'a for statement.',
- sInput:
- 'for (var abcdefghijklmnopqrstuvwxyz; 0 === Math.random(););' +
- 'for (var abcdefghijklmnopqrstuvwxyz; 0 === Math.random(););'
- },
- // 12.6.4 The {@code for-in} Statement.
- {
- sTitle:
- 'Preservation of identifiers in the variable declaration list of ' +
- 'a for-in statement.',
- sInput:
- 'for (var abcdefghijklmnopqrstuvwxyz in {});' +
- 'for (var abcdefghijklmnopqrstuvwxyz in {});'
- },
- // 12.7 The {@code continue} Statement.
- {
- sTitle:
- 'Preservation of the identifier in a continue statement.',
- sInput:
- 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
- ' continue abcdefghijklmnopqrstuvwxyz;' +
- '}' +
- 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
- ' continue abcdefghijklmnopqrstuvwxyz;' +
- '}'
- },
- // 12.8 The {@code break} Statement.
- {
- sTitle:
- 'Preservation of the identifier in a break statement.',
- sInput:
- 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
- ' break abcdefghijklmnopqrstuvwxyz;' +
- '}' +
- 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
- ' break abcdefghijklmnopqrstuvwxyz;' +
- '}'
- },
- // 12.9 The {@code return} Statement.
- {
- sTitle:
- 'Exclusion of a return statement in function code that contains ' +
- 'a with statement.',
- sInput:
- '(function() {' +
- ' with ({});' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' if (0 === Math.random()) {' +
- ' return;' +
- ' } else {' +
- ' }' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- '}());'
- },
- {
- sTitle:
- 'Exclusion of a return statement in function code that contains ' +
- 'a direct call to the eval function.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' eval("");' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' if (0 === Math.random()) {' +
- ' return;' +
- ' } else {' +
- ' }' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- '}());'
- },
- {
- sTitle:
- 'Consolidation within a return statement excluded in function ' +
- 'code due to the presence of a with statement.',
- sInput:
- '(function() {' +
- ' with ({});' +
- ' return function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' };' +
- '}());',
- sOutput:
- '(function() {' +
- ' with ({});' +
- ' return function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' };' +
- '}());'
- },
- {
- sTitle:
- 'Consolidation within a return statement excluded in function ' +
- 'code due to the presence of a direct call to the eval function.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' eval("");' +
- ' return function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' };' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' eval("");' +
- ' return function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' };' +
- '}());'
- },
- {
- sTitle:
- 'Inclusion of a return statement in function code that contains ' +
- 'no with statement and no direct call to the eval function.',
- sInput:
- '(function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- ' if (0 === Math.random()) {' +
- ' return;' +
- ' } else {' +
- ' }' +
- ' void ["abcdefghijklmnopqrstuvwxyz"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a];' +
- ' if (0 === Math.random()) {' +
- ' return;' +
- ' } else {' +
- ' }' +
- ' void [a];' +
- '}());'
- },
- // 12.10 The {@code with} Statement.
- {
- sTitle:
- 'Preservation of the statement in a with statement.',
- sInput:
- 'with ({}) {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}'
- },
- {
- sTitle:
- 'Exclusion of a with statement in the same syntactic code unit.',
- sInput:
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- 'with ({' +
- ' foo: "abcdefghijklmnopqrstuvwxyz",' +
- ' bar: "abcdefghijklmnopqrstuvwxyz"' +
- '}) {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];'
- },
- {
- sTitle:
- 'Exclusion of a with statement in nested function code.',
- sInput:
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- '(function() {' +
- ' with ({' +
- ' foo: "abcdefghijklmnopqrstuvwxyz",' +
- ' bar: "abcdefghijklmnopqrstuvwxyz"' +
- ' }) {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' }' +
- '}());' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];'
- },
- // 12.12 Labelled Statements.
- {
- sTitle:
- 'Preservation of the label of a labelled statement.',
- sInput:
- 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random(););' +
- 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random(););'
- },
- // 12.14 The {@code try} Statement.
- {
- sTitle:
- 'Preservation of the identifier in the catch clause of a try' +
- 'statement.',
- sInput:
- 'try {' +
- '} catch (abcdefghijklmnopqrstuvwxyz) {' +
- '} finally {' +
- '}' +
- 'try {' +
- '} catch (abcdefghijklmnopqrstuvwxyz) {' +
- '} finally {' +
- '}'
- },
- // 13 Function Definition.
- {
- sTitle:
- 'Preservation of the identifier of a function declaration.',
- sInput:
- 'function abcdefghijklmnopqrstuvwxyz() {' +
- '}' +
- 'void [abcdefghijklmnopqrstuvwxyz];'
- },
- {
- sTitle:
- 'Preservation of the identifier of a function expression.',
- sInput:
- 'void [' +
- ' function abcdefghijklmnopqrstuvwxyz() {' +
- ' },' +
- ' function abcdefghijklmnopqrstuvwxyz() {' +
- ' }' +
- '];'
- },
- {
- sTitle:
- 'Preservation of a formal parameter of a function declaration.',
- sInput:
- 'function foo(abcdefghijklmnopqrstuvwxyz) {' +
- '}' +
- 'function bar(abcdefghijklmnopqrstuvwxyz) {' +
- '}'
- },
- {
- sTitle:
- 'Preservation of a formal parameter in a function expression.',
- sInput:
- 'void [' +
- ' function(abcdefghijklmnopqrstuvwxyz) {' +
- ' },' +
- ' function(abcdefghijklmnopqrstuvwxyz) {' +
- ' }' +
- '];'
- },
- {
- sTitle:
- 'Exclusion of a function declaration.',
- sInput:
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- 'function foo() {' +
- '}' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];'
- },
- {
- sTitle:
- 'Consolidation within a function declaration.',
- sInput:
- 'function foo() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}',
- sOutput:
- 'function foo() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}'
- },
- // 14 Program.
- {
- sTitle:
- 'Preservation of a program without source elements.',
- sInput:
- ''
- },
- // 14.1 Directive Prologues and the Use Strict Directive.
- {
- sTitle:
- 'Preservation of a Directive Prologue in global code.',
- sInput:
- '"abcdefghijklmnopqrstuvwxyz";' +
- '\'zyxwvutsrqponmlkjihgfedcba\';'
- },
- {
- sTitle:
- 'Preservation of a Directive Prologue in a function declaration.',
- sInput:
- 'function foo() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' \'zyxwvutsrqponmlkjihgfedcba\';' +
- '}'
- },
- {
- sTitle:
- 'Preservation of a Directive Prologue in a function expression.',
- sInput:
- 'void [' +
- ' function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' \'zyxwvutsrqponmlkjihgfedcba\';' +
- ' }' +
- '];'
- },
- {
- sTitle:
- 'Ignorance with regard to a Directive Prologue in global code.',
- sInput:
- '"abcdefghijklmnopqrstuvwxyz";' +
- 'void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];',
- sOutput:
- '"abcdefghijklmnopqrstuvwxyz";' +
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());'
- },
- {
- sTitle:
- 'Ignorance with regard to a Directive Prologue in a function' +
- 'declaration.',
- sInput:
- 'function foo() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}',
- sOutput:
- 'function foo() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}'
- },
- {
- sTitle:
- 'Ignorance with regard to a Directive Prologue in a function' +
- 'expression.',
- sInput:
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());'
- },
- // 15.1 The Global Object.
- {
- sTitle:
- 'Preservation of a property of the global object.',
- sInput:
- 'void [undefined, undefined, undefined, undefined, undefined];'
- },
- // 15.1.2.1.1 Direct Call to Eval.
- {
- sTitle:
- 'Exclusion of a direct call to the eval function in the same ' +
- 'syntactic code unit.',
- sInput:
- '/*jshint evil:true */' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- 'eval("");' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];'
- },
- {
- sTitle:
- 'Exclusion of a direct call to the eval function in nested ' +
- 'function code.',
- sInput:
- '/*jshint evil:true */' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];' +
- '(function() {' +
- ' eval("");' +
- '}());' +
- 'void ["abcdefghijklmnopqrstuvwxyz"];'
- },
- {
- sTitle:
- 'Consolidation within a direct call to the eval function.',
- sInput:
- '/*jshint evil:true */' +
- 'eval(function() {' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- 'eval(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());'
- },
- // Consolidation proper.
- {
- sTitle:
- 'No consolidation if it does not result in a reduction of the ' +
- 'number of source characters.',
- sInput:
- '(function() {' +
- ' var foo;' +
- ' void ["ab", "ab", "abc", "abc"];' +
- '}());'
- },
- {
- sTitle:
- 'Identification of a range of source elements at the beginning ' +
- 'of global code.',
- sInput:
- '/*jshint evil:true */' +
- '"abcdefghijklmnopqrstuvwxyz";' +
- 'void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- 'eval("");',
- sOutput:
- '/*jshint evil:true */' +
- '"abcdefghijklmnopqrstuvwxyz";' +
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());' +
- 'eval("");'
- },
- {
- sTitle:
- 'Identification of a range of source elements in the middle of ' +
- 'global code.',
- sInput:
- '/*jshint evil:true */' +
- '"abcdefghijklmnopqrstuvwxyz";' +
- 'eval("");' +
- 'void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- 'eval("");',
- sOutput:
- '/*jshint evil:true */' +
- '"abcdefghijklmnopqrstuvwxyz";' +
- 'eval("");' +
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());' +
- 'eval("");'
- },
- {
- sTitle:
- 'Identification of a range of source elements at the end of ' +
- 'global code.',
- sInput:
- '/*jshint evil:true */' +
- '"abcdefghijklmnopqrstuvwxyz";' +
- 'eval("");' +
- 'void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];',
- sOutput:
- '/*jshint evil:true */' +
- '"abcdefghijklmnopqrstuvwxyz";' +
- 'eval("");' +
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());'
- },
- {
- sTitle:
- 'Identification of a range of source elements at the beginning ' +
- 'of function code.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' eval("");' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' (function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' }());' +
- ' eval("");' +
- '}());'
- },
- {
- sTitle:
- 'Identification of a range of source elements in the middle of ' +
- 'function code.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' eval("");' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- ' eval("");' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' eval("");' +
- ' (function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' }());' +
- ' eval("");' +
- '}());'
- },
- {
- sTitle:
- 'Identification of a range of source elements at the end of ' +
- 'function code.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' eval("");' +
- ' void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' "abcdefghijklmnopqrstuvwxyz";' +
- ' eval("");' +
- ' (function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- ' }());' +
- '}());'
- },
- {
- sTitle:
- 'Evaluation with regard to String values of String literals and ' +
- 'String values derived from identifier names used as property' +
- 'accessors.',
- sInput:
- '(function() {' +
- ' var foo;' +
- ' void ["abcdefg", Math.abcdefg, "abcdef", Math.abcdef];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var a = "abcdefg", foo;' +
- ' void [a, Math[a], "abcdef", Math.abcdef];' +
- '}());'
- },
- {
- sTitle:
- 'Evaluation with regard to the necessity of adding a variable ' +
- 'statement.',
- sInput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' void ["abcdefgh", "abcdefgh"];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' void ["abcdefg", "abcdefg"];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var foo;' +
- ' void ["abcd", "abcd"];' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var a = "abcdefgh";' +
- ' void [a, a];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' void ["abcdefg", "abcdefg"];' +
- '}());' +
- 'eval("");' +
- '(function() {' +
- ' var a = "abcd", foo;' +
- ' void [a, a];' +
- '}());'
- },
- {
- sTitle:
- 'Evaluation with regard to the necessity of enclosing source ' +
- 'elements.',
- sInput:
- '/*jshint evil:true */' +
- 'void ["abcdefghijklmnopqrstuvwxy", "abcdefghijklmnopqrstuvwxy"];' +
- 'eval("");' +
- 'void ["abcdefghijklmnopqrstuvwx", "abcdefghijklmnopqrstuvwx"];' +
- 'eval("");' +
- '(function() {' +
- ' void ["abcdefgh", "abcdefgh"];' +
- '}());' +
- '(function() {' +
- ' void ["abcdefghijklmnopqrstuvwxy",' +
- ' "abcdefghijklmnopqrstuvwxy"];' +
- ' eval("");' +
- ' void ["abcdefghijklmnopqrstuvwx",' +
- ' "abcdefghijklmnopqrstuvwx"];' +
- ' eval("");' +
- ' (function() {' +
- ' void ["abcdefgh", "abcdefgh"];' +
- ' }());' +
- '}());',
- sOutput:
- '/*jshint evil:true */' +
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxy";' +
- ' void [a, a];' +
- '}());' +
- 'eval("");' +
- 'void ["abcdefghijklmnopqrstuvwx", "abcdefghijklmnopqrstuvwx"];' +
- 'eval("");' +
- '(function() {' +
- ' var a = "abcdefgh";' +
- ' void [a, a];' +
- '}());' +
- '(function() {' +
- ' (function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxy";' +
- ' void [a, a];' +
- ' }());' +
- ' eval("");' +
- ' void ["abcdefghijklmnopqrstuvwx", "abcdefghijklmnopqrstuvwx"];' +
- ' eval("");' +
- ' (function() {' +
- ' var a = "abcdefgh";' +
- ' void [a, a];' +
- ' }());' +
- '}());'
- },
- {
- sTitle:
- 'Employment of a closure while consolidating in global code.',
- sInput:
- 'void ["abcdefghijklmnopqrstuvwxyz",' +
- ' "abcdefghijklmnopqrstuvwxyz"];',
- sOutput:
- '(function() {' +
- ' var a = "abcdefghijklmnopqrstuvwxyz";' +
- ' void [a, a];' +
- '}());'
- },
- {
- sTitle:
- 'Assignment of a shorter identifier to a value whose ' +
- 'consolidation results in a greater reduction of the number of ' +
- 'source characters.',
- sInput:
- '(function() {' +
- ' var b, c, d, e, f, g, h, i, j, k, l, m,' +
- ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
- ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
- ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
- ' $, _;' +
- ' void ["abcde", "abcde", "edcba", "edcba", "edcba"];' +
- '}());',
- sOutput:
- '(function() {' +
- ' var a = "edcba",' +
- ' b, c, d, e, f, g, h, i, j, k, l, m,' +
- ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
- ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
- ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
- ' $, _;' +
- ' void ["abcde", "abcde", a, a, a];' +
- '}());'
- }
- ].forEach(cAssert);
- }());
-}
-
/* Local Variables: */
/* mode: js */
/* coding: utf-8 */
/* indent-tabs-mode: nil */
/* tab-width: 2 */
@@ -2846,33 +1467,36 @@
var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy"));
/* -----[ Tokenizer ]----- */
-// regexps adapted from http://xregexp.com/plugins/#unicode
-var UNICODE = {
- letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
- non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
- space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
- connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
+var UNICODE = { // Unicode 6.1
+ letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
+ combining_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u08FE\\u0900-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C01-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C82\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D02\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1DC0-\\u1DE6\\u1DFC-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
+ connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]"),
+ digit: new RegExp("[\\u0030-\\u0039\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19]")
};
function is_letter(ch) {
return UNICODE.letter.test(ch);
};
function is_digit(ch) {
ch = ch.charCodeAt(0);
- return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
+ return ch >= 48 && ch <= 57;
};
+function is_unicode_digit(ch) {
+ return UNICODE.digit.test(ch);
+}
+
function is_alphanumeric_char(ch) {
return is_digit(ch) || is_letter(ch);
};
function is_unicode_combining_mark(ch) {
- return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
+ return UNICODE.combining_mark.test(ch);
};
function is_unicode_connector_punctuation(ch) {
return UNICODE.connector_punctuation.test(ch);
};
@@ -2882,11 +1506,11 @@
};
function is_identifier_char(ch) {
return is_identifier_start(ch)
|| is_unicode_combining_mark(ch)
- || is_digit(ch)
+ || is_unicode_digit(ch)
|| is_unicode_connector_punctuation(ch)
|| ch == "\u200c" // zero-width non-joiner <ZWNJ>
|| ch == "\u200d" // zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)
;
};
@@ -2984,10 +1608,14 @@
nlb : S.newline_before
};
if (!is_comment) {
ret.comments_before = S.comments_before;
S.comments_before = [];
+ // make note of any newlines in the comments that came before
+ for (var i = 0, len = ret.comments_before.length; i < len; i++) {
+ ret.nlb = ret.nlb || ret.comments_before[i].nlb;
+ }
}
S.newline_before = false;
return ret;
};
@@ -3025,11 +1653,11 @@
return false;
}
if (ch == "+") return after_e;
after_e = false;
if (ch == ".") {
- if (!has_dot && !has_x)
+ if (!has_dot && !has_x && !has_e)
return has_dot = true;
return false;
}
return is_alphanumeric_char(ch);
});
@@ -3119,11 +1747,11 @@
return with_eof_error("Unterminated multiline comment", function(){
var i = find("*/", true),
text = S.text.substring(S.pos, i);
S.pos = i + 2;
S.line += text.split("\n").length - 1;
- S.newline_before = text.indexOf("\n") >= 0;
+ S.newline_before = S.newline_before || text.indexOf("\n") >= 0;
// https://github.com/mishoo/UglifyJS/issues/#issue/100
if (/^@cc_on/i.test(text)) {
warn("WARNING: at line " + S.line);
warn("*** Found \"conditional comment\": " + text);
@@ -3331,17 +1959,18 @@
NodeWithToken.prototype.toString = function() { return this.name; };
function parse($TEXT, exigent_mode, embed_tokens) {
var S = {
- input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
- token : null,
- prev : null,
- peeked : null,
- in_function : 0,
- in_loop : 0,
- labels : []
+ input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
+ token : null,
+ prev : null,
+ peeked : null,
+ in_function : 0,
+ in_directives : true,
+ in_loop : 0,
+ labels : []
};
S.token = next();
function is(type, value) {
@@ -3356,10 +1985,13 @@
S.token = S.peeked;
S.peeked = null;
} else {
S.token = S.input();
}
+ S.in_directives = S.in_directives && (
+ S.token.type == "string" || is("punc", ";")
+ );
return S.token;
};
function prev() {
return S.prev;
@@ -3432,12 +2064,16 @@
if (is("operator", "/") || is("operator", "/=")) {
S.peeked = null;
S.token = S.input(S.token.value.substr(1)); // force regexp
}
switch (S.token.type) {
- case "num":
case "string":
+ var dir = S.in_directives, stat = simple_statement();
+ if (dir && stat[1][0] == "string" && !is("punc", ","))
+ return as("directive", stat[1][1]);
+ return stat;
+ case "num":
case "regexp":
case "operator":
case "atom":
return simple_statement();
@@ -3608,10 +2244,11 @@
})(true, []),
// body
(function(){
++S.in_function;
var loop = S.in_loop;
+ S.in_directives = true;
S.in_loop = 0;
var a = block_();
--S.in_function;
S.in_loop = loop;
return a;
@@ -4195,10 +2832,13 @@
"with": function(expr, block) {
return [ this[0], walk(expr), walk(block) ];
},
"atom": function(name) {
return [ this[0], name ];
+ },
+ "directive": function(dir) {
+ return [ this[0], dir ];
}
};
var user = {};
var stack = [];
@@ -4267,22 +2907,30 @@
this.rev_mangled = {}; // reverse lookup (mangled => orig.name)
this.cname = -1; // current mangled name
this.refs = {}; // names referenced from this scope
this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes
this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes
+ this.directives = []; // directives activated from this scope
this.parent = parent; // parent scope
this.children = []; // sub-scopes
if (parent) {
this.level = parent.level + 1;
parent.children.push(this);
} else {
this.level = 0;
}
};
+function base54_digits() {
+ if (typeof DIGITS_OVERRIDE_FOR_TESTING != "undefined")
+ return DIGITS_OVERRIDE_FOR_TESTING;
+ else
+ return "etnrisouaflchpdvmgybwESxTNCkLAOM_DPHBjFIqRUzWXV$JKQGYZ0516372984";
+}
+
var base54 = (function(){
- var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789";
+ var DIGITS = base54_digits();
return function(num) {
var ret = "", base = 54;
do {
ret += DIGITS.charAt(num % base);
num = Math.floor(num / base);
@@ -4369,10 +3017,13 @@
if (name != null) {
if (type == "var" || !HOP(this.names, name))
this.names[name] = type || "var";
return name;
}
+ },
+ active: function(dir) {
+ return member(dir, this.directives) || this.parent && this.parent.active(dir);
}
};
function ast_add_scope(ast) {
@@ -4488,16 +3139,26 @@
/* -----[ mangle names ]----- */
function ast_mangle(ast, options) {
var w = ast_walker(), walk = w.walk, scope;
- options = options || {};
+ options = defaults(options, {
+ mangle : true,
+ toplevel : false,
+ defines : null,
+ except : null,
+ no_functions : false
+ });
function get_mangled(name, newMangle) {
+ if (!options.mangle) return name;
if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel
if (options.except && member(name, options.except))
return name;
+ if (options.no_functions && HOP(scope.names, name) &&
+ (scope.names[name] == 'defun' || scope.names[name] == 'lambda'))
+ return name;
return scope.get_mangled(name, newMangle);
};
function get_define(name) {
if (options.defines) {
@@ -4511,11 +3172,11 @@
return null;
}
};
function _lambda(name, args, body) {
- if (!options.no_functions) {
+ if (!options.no_functions && options.mangle) {
var is_defun = this[0] == "defun", extra;
if (name) {
if (is_defun) name = get_mangled(name);
else if (body.scope.references(name)) {
extra = {};
@@ -4597,10 +3258,13 @@
"toplevel": function(body) {
var self = this;
return with_scope(self.scope, function(){
return [ self[0], MAP(body, walk) ];
});
+ },
+ "directive": function() {
+ return MAP.at_top(this);
}
}, function() {
return walk(ast_add_scope(ast));
});
};
@@ -4991,14 +3655,15 @@
function ast_squeeze(ast, options) {
options = defaults(options, {
make_seqs : true,
dead_code : true,
no_warnings : false,
- keep_comps : true
+ keep_comps : true,
+ unsafe : false
});
- var w = ast_walker(), walk = w.walk;
+ var w = ast_walker(), walk = w.walk, scope;
function negate(c) {
var not_c = [ "unary-prefix", "!", c ];
switch (c[0]) {
case "unary-prefix":
@@ -5057,13 +3722,23 @@
}
return block;
};
function _lambda(name, args, body) {
- return [ this[0], name, args, tighten(body, "lambda") ];
+ return [ this[0], name, args, with_scope(body.scope, function() {
+ return tighten(body, "lambda");
+ }) ];
};
+ function with_scope(s, cont) {
+ var _scope = scope;
+ scope = s;
+ var ret = cont();
+ scope = _scope;
+ return ret;
+ };
+
// this function does a few things:
// 1. discard useless blocks
// 2. join consecutive var declarations
// 3. remove obviously dead code
// 4. transform consecutive statements using the comma operator
@@ -5197,10 +3872,13 @@
function make_real_if(c, t, e) {
c = walk(c);
t = walk(t);
e = walk(e);
+ if (empty(e) && empty(t))
+ return [ "stat", c ];
+
if (empty(t)) {
c = negate(c);
t = e;
e = null;
} else if (empty(e)) {
@@ -5217,12 +3895,10 @@
e = tmp;
c = n;
}
})();
}
- if (empty(e) && empty(t))
- return [ "stat", c ];
var ret = [ "if", c, t, e ];
if (t[0] == "if" && empty(t[3]) && empty(e)) {
ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ]));
}
else if (t[0] == "stat") {
@@ -5276,11 +3952,13 @@
return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ];
}
},
"if": make_if,
"toplevel": function(body) {
- return [ "toplevel", tighten(body) ];
+ return with_scope(this.scope, function() {
+ return [ "toplevel", tighten(body) ];
+ });
},
"switch": function(expr, body) {
var last = body.length - 1;
return [ "switch", walk(expr), MAP(body, function(branch, i){
var block = tighten(branch[1]);
@@ -5347,15 +4025,37 @@
~okOps.indexOf(rvalue[1]) && rvalue[2][0] === "name" &&
rvalue[2][1] === lvalue[1]) {
return [ this[0], rvalue[1], lvalue, rvalue[3] ]
}
return [ this[0], op, lvalue, rvalue ];
+ },
+ "directive": function(dir) {
+ if (scope.active(dir))
+ return [ "block" ];
+ scope.directives.push(dir);
+ return [ this[0], dir ];
+ },
+ "call": function(expr, args) {
+ expr = walk(expr);
+ if (options.unsafe && expr[0] == "dot" && expr[1][0] == "string" && expr[2] == "toString") {
+ return expr[1];
+ }
+ return [ this[0], expr, MAP(args, walk) ];
+ },
+ "num": function (num) {
+ if (!isFinite(num))
+ return [ "binary", "/", num === 1 / 0
+ ? [ "num", 1 ] : num === -1 / 0
+ ? [ "unary-prefix", "-", [ "num", 1 ] ]
+ : [ "num", 0 ], [ "num", 0 ] ];
+
+ return [ this[0], num ];
}
}, function() {
for (var i = 0; i < 2; ++i) {
ast = prepare_ifs(ast);
- ast = walk(ast);
+ ast = walk(ast_add_scope(ast));
}
return ast;
});
};
@@ -5515,11 +4215,11 @@
}
return !HOP(DOT_CALL_NO_PARENS, expr[0]);
};
function make_num(num) {
- var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m;
+ var str = num.toString(10), a = [ str.replace(/^0\./, ".").replace('e+', 'e') ], m;
if (Math.floor(num) === num) {
if (num >= 0) {
a.push("0x" + num.toString(16).toLowerCase(), // probably pointless
"0" + num.toString(8)); // same.
} else {
@@ -5540,11 +4240,11 @@
var make = w.walk;
return w.with_walkers({
"string": encode_string,
"num": make_num,
"name": make_name,
- "debugger": function(){ return "debugger" },
+ "debugger": function(){ return "debugger;" },
"toplevel": function(statements) {
return make_block_statements(statements)
.join(newline + newline);
},
"splice": function(statements) {
@@ -5622,11 +4322,11 @@
return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]);
},
"dot": function(expr) {
var out = make(expr), i = 1;
if (expr[0] == "num") {
- if (!/\./.test(expr[1]))
+ if (!/[a-f.]/i.test(out))
out += ".";
} else if (expr[0] != "function" && needs_parens(expr))
out = "(" + out + ")";
while (i < arguments.length)
out += "." + make_name(arguments[i++]);
@@ -5741,10 +4441,11 @@
}).join("," + newline);
}) + newline + indent("}");
return obj_needs_parens ? "(" + out + ")" : out;
},
"regexp": function(rx, mods) {
+ if (options.ascii_only) rx = to_ascii(rx);
return "/" + rx + "/" + mods;
},
"array": function(elements) {
if (elements.length == 0) return "[]";
return add_spaces([ "[", add_commas(MAP(elements, function(el, i){
@@ -5764,10 +4465,13 @@
"with": function(expr, block) {
return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]);
},
"atom": function(name) {
return make_name(name);
+ },
+ "directive": function(dir) {
+ return make_string(dir) + ";";
}
}, function(){ return make(ast) });
// The squeezer replaces "block"-s that contain only a single
// statement with the statement itself; technically, the AST
@@ -5813,21 +4517,23 @@
function must_has_semicolon(node) {
switch (node[0]) {
case "with":
case "while":
- return empty(node[2]); // `with' or `while' with empty body?
+ return empty(node[2]) || must_has_semicolon(node[2]);
case "for":
case "for-in":
- return empty(node[4]); // `for' with empty body?
+ return empty(node[4]) || must_has_semicolon(node[4]);
case "if":
if (empty(node[2]) && !node[3]) return true; // `if' with empty `then' and no `else'
if (node[3]) {
if (empty(node[3])) return true; // `else' present but empty
return must_has_semicolon(node[3]); // dive into the `else' branch
}
return must_has_semicolon(node[2]); // dive into the `then' branch
+ case "directive":
+ return true;
}
};
function make_block_statements(statements, noindent) {
for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) {
@@ -6055,9 +4761,10 @@
&& (args[0][1] > 0 && expr[2] == "substring" || expr[2] == "substr")) {
return [ "call", [ "dot", expr[1], "slice"], args];
}
if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) {
// foo.toString() ==> foo+""
+ if (expr[1][0] == "string") return expr[1];
return [ "binary", "+", expr[1], [ "string", "" ]];
}
if (expr[0] == "name") {
if (expr[1] == "Array" && args.length != 1 && !scope.has("Array")) {
return [ "array", args ];