diff --git a/lib/output.js b/lib/output.js index 90589a2d465..49c93c9ae6c 100644 --- a/lib/output.js +++ b/lib/output.js @@ -80,11 +80,12 @@ function OutputStream(options) { while (code.length < 4) code = "0" + code; return "\\u" + code; } - }); + }).replace(/\x0B/g, "\\x0B"); }; function make_string(str) { var dq = 0, sq = 0; + str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g, function(s){ switch (s) { case "\\": return "\\\\"; @@ -278,12 +279,48 @@ function OutputStream(options) { var add_mapping = options.source_map ? function(token, name) { try { - if (token) options.source_map.add( - token.file || "?", - current_line, current_col, - token.line, token.col, - (!name && token.type == "name") ? token.value : name - ); + if (token) { + var remainder = 0; + var offset = 0; + var tokenName; + var tokenChars; + var escapable = [ + {find:'\n', replace:'\\n'}, + {find:'\r', replace:'\\r'}, + {find:'\t', replace:'\\t'}, + {find:'\u2028', replace:'\\u2028'}, + {find:'\u2029', replace:'\\u2029'} + ]; + + tokenName = (!name && token.type == "name") ? token.value : name; + + if(tokenName) { + // Cast to a string, it might be a number + tokenName = new String(tokenName); + + // Fixes offsets for escaped chars in keys of object literals + tokenChars = tokenName.split(''); + for(var i=0, ii=tokenChars.length; i