move super reference into closure

This commit is contained in:
Sebastian McKenzie
2015-01-10 22:26:51 +11:00
parent 1985146760
commit 54b05f33f2
8 changed files with 41 additions and 55 deletions

View File

@@ -58,15 +58,23 @@ Class.prototype.run = function () {
t.variableDeclarator(className, constructor)
]));
var closureArgs = [];
var closureParams = [];
//
if (superName) {
// so we're only evaluating it once
var superRef = this.scope.generateUidBasedOnNode(superName, this.file);
body.unshift(t.variableDeclaration("var", [
t.variableDeclarator(superRef, superName)
]));
superName = superRef;
closureArgs.push(superName);
if (!t.isIdentifier(superName)) {
var superRef = this.scope.generateUidBasedOnNode(superName, this.file);
body.unshift(t.variableDeclaration("var", [
t.variableDeclarator(superRef, superName)
]));
superName = superRef;
}
closureParams.push(superName);
this.superName = superName;
body.push(t.expressionStatement(t.callExpression(file.addHelper("inherits"), [className, superName])));
@@ -84,8 +92,8 @@ Class.prototype.run = function () {
} else {
body.push(t.returnStatement(className));
init = t.callExpression(
t.functionExpression(null, [], t.blockStatement(body)),
[]
t.functionExpression(null, closureParams, t.blockStatement(body)),
closureArgs
);
}
@@ -212,25 +220,12 @@ Class.prototype.superProperty = function (property, isStatic, isComputed) {
this.file.addHelper("get"),
[
t.callExpression(
t.memberExpression(
t.identifier("Object"),
t.identifier("getPrototypeOf"),
false
),
t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")),
[
isStatic ?
this.className :
t.memberExpression(
this.className,
t.identifier("prototype"),
false
)
isStatic ? this.className : t.memberExpression(this.className, t.identifier("prototype"))
]
),
isComputed ?
property :
t.literal(property.name),
t.thisExpression()
isComputed ? property : t.literal(property.name), t.thisExpression()
]
);
};