mirror of
https://github.com/janet-lang/janet
synced 2025-01-12 16:40:27 +00:00
Add destructuring in def and var statements for tables and structs.
This commit is contained in:
parent
ddee7f55e3
commit
c76b08cecc
@ -57,7 +57,6 @@ static void destructure(DstCompiler *c, Dst left, DstSlot right,
|
|||||||
left = dst_ast_unwrap1(left);
|
left = dst_ast_unwrap1(left);
|
||||||
switch (dst_type(left)) {
|
switch (dst_type(left)) {
|
||||||
default:
|
default:
|
||||||
printf("%s\n", dst_type_names[dst_type(left)]);
|
|
||||||
dstc_cerror(c, ast, "unexpected type in destructuring");
|
dstc_cerror(c, ast, "unexpected type in destructuring");
|
||||||
break;
|
break;
|
||||||
case DST_SYMBOL:
|
case DST_SYMBOL:
|
||||||
@ -73,7 +72,7 @@ static void destructure(DstCompiler *c, Dst left, DstSlot right,
|
|||||||
DstSlot newright;
|
DstSlot newright;
|
||||||
Dst subval = dst_getindex(left, i);
|
Dst subval = dst_getindex(left, i);
|
||||||
localright = dstc_preread(c, ast, 0xFF, 1, right);
|
localright = dstc_preread(c, ast, 0xFF, 1, right);
|
||||||
localsub = dstc_lsloti(c);
|
localsub = dstc_lslotn(c, 0xFF, 3);
|
||||||
if (i < 0x100) {
|
if (i < 0x100) {
|
||||||
dstc_emit(c, ast,
|
dstc_emit(c, ast,
|
||||||
(i << 24) |
|
(i << 24) |
|
||||||
@ -102,10 +101,36 @@ static void destructure(DstCompiler *c, Dst left, DstSlot right,
|
|||||||
/* Free right */
|
/* Free right */
|
||||||
dstc_freeslot(c, right);
|
dstc_freeslot(c, right);
|
||||||
break;
|
break;
|
||||||
/* TODO table destructuring */
|
case DST_TABLE:
|
||||||
/*case DST_TABLE:*/
|
case DST_STRUCT:
|
||||||
/*case DST_STRUCT:*/
|
{
|
||||||
/*break;*/
|
int32_t localright, localsub;
|
||||||
|
const DstKV *kv = NULL;
|
||||||
|
while ((kv = dst_next(left, kv))) {
|
||||||
|
DstSlot newright;
|
||||||
|
DstSlot kslot = dstc_cslot(dst_ast_unwrap(kv->key));
|
||||||
|
Dst subval = kv->value;
|
||||||
|
localright = dstc_preread(c, ast, 0xFF, 1, right);
|
||||||
|
localsub = dstc_lslotn(c, 0xFF, 3);
|
||||||
|
int32_t localk = dstc_preread(c, ast, 0xFF, 2, kslot);
|
||||||
|
dstc_emit(c, ast,
|
||||||
|
(localk << 24) |
|
||||||
|
(localright << 16) |
|
||||||
|
(localsub << 8) |
|
||||||
|
DOP_GET);
|
||||||
|
dstc_postread(c, kslot, localk);
|
||||||
|
newright.index = localsub;
|
||||||
|
newright.envindex = 0;
|
||||||
|
newright.constant = dst_wrap_nil();
|
||||||
|
newright.flags = DST_SLOTTYPE_ANY;
|
||||||
|
/* Traverse into the structure */
|
||||||
|
destructure(c, subval, newright, leaf, argn, argv);
|
||||||
|
dstc_postread(c, right, localright);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Free right */
|
||||||
|
dstc_freeslot(c, right);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user