got pattern matching working

This commit is contained in:
Jeremy Ashkenas 2010-02-11 18:44:00 -05:00
parent a379530d41
commit 98f15d001f
2 changed files with 7 additions and 5 deletions

View File

@ -764,7 +764,7 @@
// object literals to a value. Peeks at their properties to assign inner names. // object literals to a value. Peeks at their properties to assign inner names.
// See: http://wiki.ecmascript.org/doku.php?id=harmony:destructuring // See: http://wiki.ecmascript.org/doku.php?id=harmony:destructuring
compile_pattern_match: function compile_pattern_match(o) { compile_pattern_match: function compile_pattern_match(o) {
var __a, __b, access_class, assigns, i, obj, val, val_var; var __a, __b, access_class, assigns, i, idx, obj, val, val_var;
val_var = o.scope.free_variable(); val_var = o.scope.free_variable();
assigns = [this.idt() + val_var + ' = ' + this.value.compile(o) + ';']; assigns = [this.idt() + val_var + ' = ' + this.value.compile(o) + ';'];
o.top = true; o.top = true;
@ -772,13 +772,14 @@
__a = this.variable.base.objects; __a = this.variable.base.objects;
for (i = 0; i < __a.length; i++) { for (i = 0; i < __a.length; i++) {
obj = __a[i]; obj = __a[i];
idx = i;
if (this.variable.is_object()) { if (this.variable.is_object()) {
__b = [obj.value, obj.variable.base]; __b = [obj.value, obj.variable.base];
obj = __b[0]; obj = __b[0];
i = __b[1]; idx = __b[1];
} }
access_class = this.variable.is_array() ? IndexNode : AccessorNode; access_class = this.variable.is_array() ? IndexNode : AccessorNode;
obj instanceof SplatNode ? (val = new LiteralNode(obj.compile_value(o, val_var, this.variable.base.objects.indexOf(obj)))) : (val = new ValueNode(new LiteralNode(val_var), [new access_class(new LiteralNode(i))])); obj instanceof SplatNode ? (val = new LiteralNode(obj.compile_value(o, val_var, this.variable.base.objects.indexOf(obj)))) : (val = new ValueNode(new LiteralNode(val_var), [new access_class(idx)]));
assigns.push(new AssignNode(obj, val).compile(o)); assigns.push(new AssignNode(obj, val).compile(o));
} }
return assigns.join("\n"); return assigns.join("\n");

View File

@ -594,12 +594,13 @@ AssignNode: exports.AssignNode: inherit Node, {
o.top: true o.top: true
o.as_statement: true o.as_statement: true
for obj, i in @variable.base.objects for obj, i in @variable.base.objects
[obj, i]: [obj.value, obj.variable.base] if @variable.is_object() idx: i
[obj, idx]: [obj.value, obj.variable.base] if @variable.is_object()
access_class: if @variable.is_array() then IndexNode else AccessorNode access_class: if @variable.is_array() then IndexNode else AccessorNode
if obj instanceof SplatNode if obj instanceof SplatNode
val: new LiteralNode(obj.compile_value(o, val_var, @variable.base.objects.indexOf(obj))) val: new LiteralNode(obj.compile_value(o, val_var, @variable.base.objects.indexOf(obj)))
else else
val: new ValueNode(new LiteralNode(val_var), [new access_class(new LiteralNode(i))]) val: new ValueNode(new LiteralNode(val_var), [new access_class(idx)])
assigns.push(new AssignNode(obj, val).compile(o)) assigns.push(new AssignNode(obj, val).compile(o))
assigns.join("\n") assigns.join("\n")