Fix mangling of property names which overwrite unmangleable properties

Fixes #747.
This commit is contained in:
Richard van Velzen
2015-07-31 15:56:33 +02:00
parent 958b6c2e57
commit 759b3f7d6d
3 changed files with 54 additions and 12 deletions

View File

@@ -83,6 +83,7 @@ function mangle_properties(ast, options) {
var regex = options.regex; var regex = options.regex;
var names_to_mangle = []; var names_to_mangle = [];
var unmangleable = [];
// step 1: find candidates to mangle // step 1: find candidates to mangle
ast.walk(new TreeWalker(function(node){ ast.walk(new TreeWalker(function(node){
@@ -108,20 +109,14 @@ function mangle_properties(ast, options) {
// step 2: transform the tree, renaming properties // step 2: transform the tree, renaming properties
return ast.transform(new TreeTransformer(function(node){ return ast.transform(new TreeTransformer(function(node){
if (node instanceof AST_ObjectKeyVal) { if (node instanceof AST_ObjectKeyVal) {
if (should_mangle(node.key)) { node.key = mangle(node.key);
node.key = mangle(node.key);
}
} }
else if (node instanceof AST_ObjectProperty) { else if (node instanceof AST_ObjectProperty) {
// setter or getter // setter or getter
if (should_mangle(node.key.name)) { node.key.name = mangle(node.key.name);
node.key.name = mangle(node.key.name);
}
} }
else if (node instanceof AST_Dot) { else if (node instanceof AST_Dot) {
if (should_mangle(node.property)) { node.property = mangle(node.property);
node.property = mangle(node.property);
}
} }
else if (node instanceof AST_Sub) { else if (node instanceof AST_Sub) {
node.property = mangleStrings(node.property); node.property = mangleStrings(node.property);
@@ -143,6 +138,7 @@ function mangle_properties(ast, options) {
// only function declarations after this line // only function declarations after this line
function can_mangle(name) { function can_mangle(name) {
if (unmangleable.indexOf(name) >= 0) return false;
if (reserved.indexOf(name) >= 0) return false; if (reserved.indexOf(name) >= 0) return false;
if (options.only_cache) { if (options.only_cache) {
return cache.props.has(name); return cache.props.has(name);
@@ -161,9 +157,17 @@ function mangle_properties(ast, options) {
function add(name) { function add(name) {
if (can_mangle(name)) if (can_mangle(name))
push_uniq(names_to_mangle, name); push_uniq(names_to_mangle, name);
if (!should_mangle(name)) {
push_uniq(unmangleable, name);
}
} }
function mangle(name) { function mangle(name) {
if (!should_mangle(name)) {
return name;
}
var mangled = cache.props.get(name); var mangled = cache.props.get(name);
if (!mangled) { if (!mangled) {
do { do {
@@ -206,9 +210,7 @@ function mangle_properties(ast, options) {
node.cdr = mangleStrings(node.cdr); node.cdr = mangleStrings(node.cdr);
} }
else if (node instanceof AST_String) { else if (node instanceof AST_String) {
if (should_mangle(node.value)) { node.value = mangle(node.value);
node.value = mangle(node.value);
}
} }
else if (node instanceof AST_Conditional) { else if (node instanceof AST_Conditional) {
node.consequent = mangleStrings(node.consequent); node.consequent = mangleStrings(node.consequent);

View File

@@ -0,0 +1,37 @@
dont_reuse_prop: {
mangle_props = {
regex: /asd/
};
input: {
var obj = {};
obj.a = 123;
obj.asd = 256;
console.log(obj.a);
}
expect: {
var obj = {};
obj.a = 123;
obj.b = 256;
console.log(obj.a);
}
}
unmangleable_props_should_always_be_reserved: {
mangle_props = {
regex: /asd/
};
input: {
var obj = {};
obj.asd = 256;
obj.a = 123;
console.log(obj.a);
}
expect: {
var obj = {};
obj.b = 256;
obj.a = 123;
console.log(obj.a);
}
}

View File

@@ -92,6 +92,9 @@ function run_compress_tests() {
} }
var input = as_toplevel(test.input); var input = as_toplevel(test.input);
var input_code = make_code(test.input); var input_code = make_code(test.input);
if (test.mangle_props) {
input = U.mangle_properties(input, test.mangle_props);
}
var output = input.transform(cmp); var output = input.transform(cmp);
output.figure_out_scope(); output.figure_out_scope();
output = make_code(output, false); output = make_code(output, false);