Issue #1598 -- enabling super() calls in static functions in class bodies.

This commit is contained in:
Jeremy Ashkenas 2011-08-14 16:51:59 -04:00
parent c6c988ae28
commit 50982b668b
2 changed files with 15 additions and 5 deletions

View File

@ -537,7 +537,7 @@
return this;
};
Call.prototype.superReference = function(o) {
var method, name;
var accesses, method, name;
method = o.scope.method;
if (!method) throw SyntaxError('cannot call super outside of a function.');
name = method.name;
@ -545,7 +545,10 @@
throw SyntaxError('cannot call super on an anonymous function.');
}
if (method.klass) {
return (new Value(new Literal(method.klass), [new Access(new Literal("__super__")), new Access(new Literal(name))])).compile(o);
accesses = [new Access(new Literal('__super__'))];
if (method.static) accesses.push(new Access(new Literal('constructor')));
accesses.push(new Access(new Literal(name)));
return (new Value(new Literal(method.klass), accesses)).compile(o);
} else {
return "" + name + ".__super__.constructor";
}
@ -973,7 +976,9 @@
assign = new Assign(new Literal(this.externalCtor), func);
}
} else {
if (!assign.variable["this"]) {
if (assign.variable["this"]) {
func.static = true;
} else {
assign.variable = new Value(new Literal(name), [new Access(new Literal('prototype')), new Access(base)]);
if (func instanceof Code && func.bound) {
this.boundFuncs.push(base);

View File

@ -475,7 +475,10 @@ exports.Call = class Call extends Base
{name} = method
throw SyntaxError 'cannot call super on an anonymous function.' unless name?
if method.klass
(new Value (new Literal method.klass), [new Access(new Literal "__super__"), new Access new Literal name]).compile o
accesses = [new Access(new Literal '__super__')]
accesses.push new Access new Literal 'constructor' if method.static
accesses.push new Access new Literal name
(new Value (new Literal method.klass), accesses).compile o
else
"#{name}.__super__.constructor"
@ -856,7 +859,9 @@ exports.Class = class Class extends Base
@externalCtor = o.scope.freeVariable 'class'
assign = new Assign new Literal(@externalCtor), func
else
unless assign.variable.this
if assign.variable.this
func.static = yes
else
assign.variable = new Value(new Literal(name), [(new Access new Literal 'prototype'), new Access base ])
if func instanceof Code and func.bound
@boundFuncs.push base