Issue #1038 ... optimize away trailing return / and return undefined

This commit is contained in:
Jeremy Ashkenas 2011-01-15 14:14:11 -05:00
parent d9d50fdf54
commit f4a7cca075
5 changed files with 34 additions and 8 deletions

View File

@ -58,7 +58,12 @@
}), o('REGEX', function() {
return new Literal($1);
}), o('BOOL', function() {
return new Literal($1 === 'undefined' ? 'void 0' : $1);
var val;
val = new Literal($1);
if ($1 === 'undefined') {
val.isUndefined = true;
}
return val;
})
],
Assign: [

View File

@ -221,6 +221,9 @@
expr = this.expressions[len];
if (!(expr instanceof Comment)) {
this.expressions[len] = expr.makeReturn();
if (expr instanceof Return && !expr.expression) {
this.expressions.splice(len, 1);
}
break;
}
}
@ -351,7 +354,7 @@
};
Literal.prototype.compileNode = function(o) {
var code;
code = this.value.reserved ? "\"" + this.value + "\"" : this.value;
code = this.isUndefined ? 'void 0' : this.value.reserved ? "\"" + this.value + "\"" : this.value;
if (this.isStatement()) {
return "" + this.tab + code + ";";
} else {
@ -365,8 +368,10 @@
})();
exports.Return = Return = (function() {
__extends(Return, Base);
function Return(expression) {
this.expression = expression;
function Return(expr) {
if (expr && !expr.unwrap().isUndefined) {
this.expression = expr;
}
}
Return.prototype.children = ['expression'];
Return.prototype.isStatement = YES;

View File

@ -71,7 +71,14 @@ case 30:this.$ = new yy.Literal($$[$0]);
break;
case 31:this.$ = new yy.Literal($$[$0]);
break;
case 32:this.$ = new yy.Literal($$[$0] === 'undefined' ? 'void 0' : $$[$0]);
case 32:this.$ = (function () {
var val;
val = new yy.Literal($$[$0]);
if ($$[$0] === 'undefined') {
val.isUndefined = true;
}
return val;
}());
break;
case 33:this.$ = new yy.Assign($$[$0-2], $$[$0]);
break;

View File

@ -127,7 +127,9 @@ grammar =
o 'JS', -> new Literal $1
o 'REGEX', -> new Literal $1
o 'BOOL', ->
new Literal if $1 is 'undefined' then 'void 0' else $1
val = new Literal $1
val.isUndefined = yes if $1 is 'undefined'
val
]
# Assignment of a variable, property, or index to a value.

View File

@ -196,6 +196,7 @@ exports.Expressions = class Expressions extends Base
expr = @expressions[len]
if expr not instanceof Comment
@expressions[len] = expr.makeReturn()
@expressions.splice(len, 1) if expr instanceof Return and not expr.expression
break
this
@ -289,7 +290,12 @@ exports.Literal = class Literal extends Base
if not (o and (o.loop or o.block and (@value isnt 'continue'))) then this else no
compileNode: (o) ->
code = if @value.reserved then "\"#{@value}\"" else @value
code = if @isUndefined
'void 0'
else if @value.reserved
"\"#{@value}\""
else
@value
if @isStatement() then "#{@tab}#{code};" else code
toString: ->
@ -300,7 +306,8 @@ exports.Literal = class Literal extends Base
# A `return` is a *pureStatement* -- wrapping it in a closure wouldn't
# make sense.
exports.Return = class Return extends Base
constructor: (@expression) ->
constructor: (expr) ->
@expression = expr if expr and not expr.unwrap().isUndefined
children: ['expression']