This commit is contained in:
yimi0 2018-06-01 05:29:32 +00:00 committed by GitHub
commit 6c6a93b595
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 17 deletions

View File

@ -253,9 +253,12 @@ function run() {
var result = {
_class: "AST_" + value.TYPE
};
value.CTOR.PROPS.forEach(function(prop) {
var ctor = value.CTOR;
do {
ctor.SELF_PROPS.forEach(function(prop) {
result[prop] = value[prop];
});
} while (ctor = ctor.BASE);
return result;
}
return value;

View File

@ -47,31 +47,35 @@ function DEFNODE(type, props, methods, base) {
if (arguments.length < 4) base = AST_Node;
if (!props) props = [];
else props = props.split(/\s+/);
var self_props = props;
if (base && base.PROPS)
props = props.concat(base.PROPS);
var code = "return function AST_" + type + "(props){ if (props) { ";
for (var i = props.length; --i >= 0;) {
code += "this." + props[i] + " = props." + props[i] + ";";
}
var proto = base && new base;
if (proto && proto.initialize || (methods && methods.initialize))
code += "this.initialize();";
code += "}}";
var code = "return function AST_" + type + "(props) {\
if (props) {\
var ctor = this.CTOR;\
do {\
var self_props = ctor.SELF_PROPS;\
for (var i = self_props.length; i;) {\
var k = self_props[--i];\
this[k] = props[k];\
}\
} while (ctor = ctor.BASE);\
if (this.initialize) {\
this.initialize();\
}\
}\
}";
var ctor = new Function(code)();
var proto = base && new base;
if (proto) {
ctor.prototype = proto;
ctor.BASE = base;
}
if (base) base.SUBCLASSES.push(ctor);
ctor.prototype.CTOR = ctor;
ctor.PROPS = props || null;
ctor.SELF_PROPS = self_props;
ctor.SELF_PROPS = props;
ctor.SUBCLASSES = [];
if (type) {
ctor.prototype.TYPE = ctor.TYPE = type;
}
if (methods) for (i in methods) if (HOP(methods, i)) {
if (methods) for (var i in methods) if (HOP(methods, i)) {
if (/^\$/.test(i)) {
ctor[i.substr(1)] = methods[i];
} else {