self-compiling ranges and expressions
This commit is contained in:
parent
38d1381c02
commit
950d1199c2
|
@ -311,7 +311,7 @@
|
||||||
// JavaScript without translation, eg.: strings, numbers, true, false, null...
|
// JavaScript without translation, eg.: strings, numbers, true, false, null...
|
||||||
LiteralNode = (exports.LiteralNode = inherit(Node, {
|
LiteralNode = (exports.LiteralNode = inherit(Node, {
|
||||||
constructor: function constructor(value) {
|
constructor: function constructor(value) {
|
||||||
this.children = [(this.value = value)];
|
this.value = value;
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
// Break and continue must be treated as statements -- they lose their meaning
|
// Break and continue must be treated as statements -- they lose their meaning
|
||||||
|
@ -563,12 +563,14 @@
|
||||||
return this.from_var + ' = ' + this.from.compile(o) + '; ' + this.to_var + ' = ' + this.to.compile(o) + ";\n" + this.idt();
|
return this.from_var + ' = ' + this.from.compile(o) + '; ' + this.to_var + ' = ' + this.to.compile(o) + ";\n" + this.idt();
|
||||||
},
|
},
|
||||||
compile_node: function compile_node(o) {
|
compile_node: function compile_node(o) {
|
||||||
var compare, equals, idx, incr, intro, step;
|
var compare, equals, idx, incr, intro, step, vars;
|
||||||
if (!(o.index)) {
|
if (!(o.index)) {
|
||||||
return this.compile_array(o);
|
return this.compile_array(o);
|
||||||
}
|
}
|
||||||
idx = del(o, 'index');
|
idx = del(o, 'index');
|
||||||
step = del(o, 'step');
|
step = del(o, 'step');
|
||||||
|
vars = idx + '=' + this.from_var;
|
||||||
|
step = step ? step.compile(o) : '1';
|
||||||
equals = this.exclusive ? '' : '=';
|
equals = this.exclusive ? '' : '=';
|
||||||
intro = '(' + this.from_var + ' <= ' + this.to_var + ' ? ' + idx;
|
intro = '(' + this.from_var + ' <= ' + this.to_var + ' ? ' + idx;
|
||||||
compare = intro + ' <' + equals + ' ' + this.to_var + ' : ' + idx + ' >' + equals + ' ' + this.to_var + ')';
|
compare = intro + ' <' + equals + ' ' + this.to_var + ' : ' + idx + ' >' + equals + ' ' + this.to_var + ')';
|
||||||
|
@ -583,7 +585,7 @@
|
||||||
body = Expressions.wrap([new LiteralNode('i')]);
|
body = Expressions.wrap([new LiteralNode('i')]);
|
||||||
arr = Expressions.wrap([new ForNode(body, {
|
arr = Expressions.wrap([new ForNode(body, {
|
||||||
source: (new ValueNode(this))
|
source: (new ValueNode(this))
|
||||||
}, 'i')
|
}, new LiteralNode('i'))
|
||||||
]);
|
]);
|
||||||
return (new ParentheticalNode(new CallNode(new CodeNode([], arr)))).compile(o);
|
return (new ParentheticalNode(new CallNode(new CodeNode([], arr)))).compile(o);
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ statement Expressions
|
||||||
LiteralNode: exports.LiteralNode: inherit Node, {
|
LiteralNode: exports.LiteralNode: inherit Node, {
|
||||||
|
|
||||||
constructor: (value) ->
|
constructor: (value) ->
|
||||||
@children: [@value: value]
|
@value: value
|
||||||
this
|
this
|
||||||
|
|
||||||
# Break and continue must be treated as statements -- they lose their meaning
|
# Break and continue must be treated as statements -- they lose their meaning
|
||||||
|
@ -442,6 +442,8 @@ RangeNode: exports.RangeNode: inherit Node, {
|
||||||
return @compile_array(o) unless o.index
|
return @compile_array(o) unless o.index
|
||||||
idx: del o, 'index'
|
idx: del o, 'index'
|
||||||
step: del o, 'step'
|
step: del o, 'step'
|
||||||
|
vars: idx + '=' + @from_var
|
||||||
|
step: if step then step.compile(o) else '1'
|
||||||
equals: if @exclusive then '' else '='
|
equals: if @exclusive then '' else '='
|
||||||
intro: '(' + @from_var + ' <= ' + @to_var + ' ? ' + idx
|
intro: '(' + @from_var + ' <= ' + @to_var + ' ? ' + idx
|
||||||
compare: intro + ' <' + equals + ' ' + @to_var + ' : ' + idx + ' >' + equals + ' ' + @to_var + ')'
|
compare: intro + ' <' + equals + ' ' + @to_var + ' : ' + idx + ' >' + equals + ' ' + @to_var + ')'
|
||||||
|
@ -453,7 +455,7 @@ RangeNode: exports.RangeNode: inherit Node, {
|
||||||
# TODO: This generates pretty ugly code ... shrink it.
|
# TODO: This generates pretty ugly code ... shrink it.
|
||||||
compile_array: (o) ->
|
compile_array: (o) ->
|
||||||
body: Expressions.wrap([new LiteralNode('i')])
|
body: Expressions.wrap([new LiteralNode('i')])
|
||||||
arr: Expressions.wrap([new ForNode(body, {source: (new ValueNode(this))}, 'i')])
|
arr: Expressions.wrap([new ForNode(body, {source: (new ValueNode(this))}, new LiteralNode('i'))])
|
||||||
(new ParentheticalNode(new CallNode(new CodeNode([], arr)))).compile(o)
|
(new ParentheticalNode(new CallNode(new CodeNode([], arr)))).compile(o)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue