リビジョン | 614 (tree) |
---|---|
日時 | 2019-04-20 05:19:54 |
作者 | jakobthomsen |
fix list typing: use lists of structs
@@ -1,5 +1,5 @@ | ||
1 | 1 | // JPL - Jakob's Programming Language (working title). Written 2019 by Jakob Thomsen. |
2 | -memory = 138 2048 | |
2 | +memory = 138 8192 | |
3 | 3 | dummy() {} |
4 | 4 | // A self-hosting jpl-to-c compiler, (c) 2019 by Jakob Thomsen |
5 | 5 | // (mailto: JakobThomsen@gmx.net) |
@@ -1437,60 +1437,45 @@ | ||
1437 | 1437 | |
1438 | 1438 | struct block(u64 blockid, u64 remainsize, u64 postaddr, u64 preaddr, list<varentry> varlist) 11 |
1439 | 1439 | |
1440 | -blockpush(list blocklist, u64 blockid, u64 remainsize, u64 postaddr, u64 preaddr, list<varentry> varlist) 17 | |
1440 | +blockpush(list<block> blocklist, u64 blockid, u64 remainsize, u64 postaddr, u64 preaddr, list<varentry> varlist) 17 | |
1441 | 1441 | { |
1442 | - { | |
1443 | - //`fprintf(stderr, "BLOCKOPEN: store varlist addr %llu\n", (unsigned long long)memory[memory[state.stackbase + 5]]);` | |
1444 | - push_move(blocklist, varlist) | |
1445 | - } | |
1446 | - push(blocklist, preaddr) | |
1447 | - push(blocklist, postaddr) | |
1448 | - push(blocklist, remainsize) | |
1449 | - push(blocklist, blockid) | |
1450 | 1442 | let u64 dummyval = 0 |
1451 | 1443 | let list<varentry> dummylist = 0 |
1452 | 1444 | ==8== |
1453 | 1445 | let block b = 0 |
1454 | 1446 | ==9== |
1455 | - block(b, dummyval, dummyval, dummyval, dummyval, dummylist) | |
1456 | - //b.0 = blockid | |
1457 | - //b.1 = remainsize | |
1458 | - //b.2 = postaddr | |
1459 | - //b.3 = preaddr | |
1460 | - //b.4 = varlist | |
1461 | - //` | |
1462 | - //*tree_elem_ref(heap, 5/*blocksize*/, &memory[state.stackbase + 8], 4/*varlist-idx*/) = memory[memory[state.stackbase + 5]]; | |
1463 | - //memory[memory[state.stackbase + 5]] = 0; // MOVE varlist | |
1464 | - //` | |
1465 | - //push_move(blocklist, b) | |
1466 | - //block(b, dummyval, dummyval, dummyval, dummyval, dummylist) // DUMMY | |
1447 | + block(b, blockid, remainsize, postaddr, preaddr, varlist) | |
1448 | + // HACK: restore moved values | |
1449 | + blockid = b.0 | |
1450 | + remainsize = b.1 | |
1451 | + postaddr = b.2 | |
1452 | + preaddr = b.3 | |
1453 | + //varlist = b.4 // moving varlist OK | |
1454 | + | |
1455 | + push_move(blocklist, b) | |
1456 | + block(b, dummyval, dummyval, dummyval, dummyval, dummylist) // DUMMY | |
1467 | 1457 | } |
1468 | 1458 | |
1469 | -blockpop(list blocklist, u64 blockid, u64 remainsize, u64 postaddr, u64 preaddr, list<varentry> varlist) 8 | |
1459 | +blockpop(list<block> blocklist, u64 blockid, u64 remainsize, u64 postaddr, u64 preaddr, list<varentry> varlist) 15 | |
1470 | 1460 | { |
1471 | - pop(blocklist, blockid) | |
1472 | - pop(blocklist, remainsize) | |
1473 | - pop(blocklist, postaddr) | |
1474 | - pop(blocklist, preaddr) | |
1475 | - pop_move(varlist, blocklist) // restore previous local varlist | |
1476 | 1461 | ==6== |
1477 | - //let block b = 0 | |
1478 | -//==7== | |
1479 | - //pop_move(b, blocklist) | |
1480 | - //blockid = b.0 | |
1481 | - //remainsize = b.1 | |
1482 | - //postaddr = b.2 | |
1483 | - //preaddr = b.3 | |
1462 | + let block b = 0 | |
1463 | +==7== | |
1464 | + pop_move(b, blocklist) | |
1465 | + blockid = b.0 | |
1466 | + remainsize = b.1 | |
1467 | + postaddr = b.2 | |
1468 | + preaddr = b.3 | |
1484 | 1469 | //varlist = b.4 // restore previous local varlist |
1485 | - //` | |
1486 | - //memory[state.stackbase + 6] = *tree_elem_ref(heap, 5/*blocksize*/, &memory[memory[state.stackbase + 5]], 4/*varlist-idx*/); | |
1487 | - //*tree_elem_ref(heap, 5/*blocksize*/, &memory[memory[state.stackbase + 5]], 4/*varlist-idx*/) = 0; // MOVE | |
1488 | - //` | |
1470 | + ` | |
1471 | + memory[memory[state.stackbase + 5]] = *tree_elem_ref(heap, 5/*blocksize*/, &memory[state.stackbase + 6], 4/*varlist-idx*/); | |
1472 | + *tree_elem_ref(heap, 5/*blocksize*/, &memory[state.stackbase + 6], 4/*varlist-idx*/) = 0; // MOVE | |
1473 | + ` | |
1489 | 1474 | } |
1490 | 1475 | |
1491 | -blockopen(u64 tmpaddr, list blocklist, u64 remainsize, list<varentry> varlist) 28 | |
1492 | -{ // 0: tmpaddr, 1: blocklist, 2: remain_size, 3: local varlist | |
1493 | -==4== // 0 constant | |
1476 | +blockopen(u64 tmpaddr, list<block> blocklist, u64 remainsize, list<varentry> varlist) 28 | |
1477 | +{ | |
1478 | +==4== | |
1494 | 1479 | let u64 blocktype = 0 |
1495 | 1480 | ==5== |
1496 | 1481 | let u64 preaddr = 0 |
@@ -1504,7 +1489,7 @@ | ||
1504 | 1489 | emitenter(preaddr) |
1505 | 1490 | } |
1506 | 1491 | |
1507 | -blockclose(u64 tmpaddr, list fndefs, u64 info, list blocklist, u64 remainsize, list<varentry> varlist, u64 defargcnt, u64 defbodysz) 78 | |
1492 | +blockclose(u64 tmpaddr, list fndefs, u64 info, list<block> blocklist, u64 remainsize, list<varentry> varlist, u64 defargcnt, u64 defbodysz) 78 | |
1508 | 1493 | { |
1509 | 1494 | ==8== |
1510 | 1495 | when varlist |
@@ -1624,7 +1609,7 @@ | ||
1624 | 1609 | } |
1625 | 1610 | } |
1626 | 1611 | |
1627 | -findvarref(list blocklist, list<varentry> varlist, u64 id, u64 idx, u64 indirect, type type) | |
1612 | +findvarref(list<block> blocklist, list<varentry> varlist, u64 id, u64 idx, u64 indirect, type type) | |
1628 | 1613 | { |
1629 | 1614 | ` |
1630 | 1615 | memory[memory[state.stackbase + 3]] = ~0; // default: invalid index |
@@ -1648,15 +1633,8 @@ | ||
1648 | 1633 | |
1649 | 1634 | if(blocklist && memory[memory[state.stackbase + 3]] == ~0) |
1650 | 1635 | { |
1651 | - blocklist = heap[blocklist].elem0; // skip blocktype | |
1652 | - blocklist = heap[blocklist].elem0; // skip remain_size | |
1653 | - blocklist = heap[blocklist].elem0; // skip postaddr | |
1654 | - blocklist = heap[blocklist].elem0; // skip preaddr | |
1655 | - current = heap[blocklist].elem1; // varlist | |
1656 | - blocklist = heap[blocklist].elem0; // skip varlist | |
1657 | - | |
1658 | - //current = *tree_elem_ref(heap, 5/*blocksize*/, &heap[blocklist].elem1, 4/*varlist-idx*/); | |
1659 | - //blocklist = heap[blocklist].elem0; // skip block | |
1636 | + current = *tree_elem_ref(heap, 5/*blocksize*/, &heap[blocklist].elem1, 4/*varlist-idx*/); | |
1637 | + blocklist = heap[blocklist].elem0; // skip block | |
1660 | 1638 | } |
1661 | 1639 | else |
1662 | 1640 | { |
@@ -1675,7 +1653,7 @@ | ||
1675 | 1653 | ` |
1676 | 1654 | } |
1677 | 1655 | |
1678 | -PROCVARREF(list fndefs, list blocklist, list<varentry> varlist, type type, u64 id, u64 indirect, u64 unwrap) 22 | |
1656 | +PROCVARREF(list fndefs, list<block> blocklist, list<varentry> varlist, type type, u64 id, u64 indirect, u64 unwrap) 22 | |
1679 | 1657 | { |
1680 | 1658 | ==7== |
1681 | 1659 | print("/*") printid(id) print("*/") |
@@ -1824,7 +1802,7 @@ | ||
1824 | 1802 | } |
1825 | 1803 | } |
1826 | 1804 | |
1827 | -procvarref(list fndefs, list blocklist, list<varentry> varlist, u64 indirect, type type) 33 | |
1805 | +procvarref(list fndefs, list<block> blocklist, list<varentry> varlist, u64 indirect, type type) 33 | |
1828 | 1806 | { |
1829 | 1807 | ==5== |
1830 | 1808 | let u64 id = 0 |
@@ -1967,7 +1945,7 @@ | ||
1967 | 1945 | match(")") |
1968 | 1946 | } |
1969 | 1947 | |
1970 | -prconinput(u64 tmpaddr, list blocklist, u64 remainsize, u64 id, list<varentry> varlist) 27 | |
1948 | +prconinput(u64 tmpaddr, list<block> blocklist, u64 remainsize, u64 id, list<varentry> varlist) 27 | |
1971 | 1949 | { |
1972 | 1950 | ==5== |
1973 | 1951 | let u64 preaddr = 0 |
@@ -2030,7 +2008,7 @@ | ||
2030 | 2008 | match("{") |
2031 | 2009 | } |
2032 | 2010 | |
2033 | -pcountdown(u64 tmpaddr, list blocklist, u64 remainsize, u64 id, list<varentry> varlist) 27 | |
2011 | +pcountdown(u64 tmpaddr, list<block> blocklist, u64 remainsize, u64 id, list<varentry> varlist) 27 | |
2034 | 2012 | { |
2035 | 2013 | ==5== |
2036 | 2014 | let u64 preaddr = 0 |
@@ -2096,7 +2074,7 @@ | ||
2096 | 2074 | varentry(entry, maintype, maintype, maintype, maintype, maintype) // DUMMY |
2097 | 2075 | } |
2098 | 2076 | |
2099 | -prcconsume(u64 tmpaddr, list blocklist, u64 info, list<varentry> varlist, u64 defargcnt, u64 defbodysz, u64 remainsize) 34 | |
2077 | +prcconsume(u64 tmpaddr, list<block> blocklist, u64 info, list<varentry> varlist, u64 defargcnt, u64 defbodysz, u64 remainsize) 34 | |
2100 | 2078 | { |
2101 | 2079 | ==7== |
2102 | 2080 | let u64 preaddr = 0 |
@@ -2158,7 +2136,7 @@ | ||
2158 | 2136 | match("{") |
2159 | 2137 | } |
2160 | 2138 | |
2161 | -prcforeach(u64 tmpaddr, list blocklist, u64 info, list<varentry> varlist, u64 defargcnt, u64 defbodysz, u64 remainsize) 36 | |
2139 | +prcforeach(u64 tmpaddr, list<block> blocklist, u64 info, list<varentry> varlist, u64 defargcnt, u64 defbodysz, u64 remainsize) 36 | |
2162 | 2140 | { |
2163 | 2141 | ==7== |
2164 | 2142 | let u64 preaddr = 0 |
@@ -2227,7 +2205,7 @@ | ||
2227 | 2205 | match("{") |
2228 | 2206 | } |
2229 | 2207 | |
2230 | -procwhen(u64 tmpaddr, list fndefs, list blocklist, u64 remainsize, u64 id, list<varentry> varlist) 44 | |
2208 | +procwhen(u64 tmpaddr, list fndefs, list<block> blocklist, u64 remainsize, u64 id, list<varentry> varlist) 44 | |
2231 | 2209 | { |
2232 | 2210 | ==6== |
2233 | 2211 | let u64 preaddr = 0 |
@@ -2359,7 +2337,7 @@ | ||
2359 | 2337 | } |
2360 | 2338 | } |
2361 | 2339 | |
2362 | -procaccess(u64 tmpaddr, list fndefs, list blocklist, list<varentry> varlist, u64 defargcnt, u64 defbodysz, u64 remainsize) 38 | |
2340 | +procaccess(u64 tmpaddr, list fndefs, list<block> blocklist, list<varentry> varlist, u64 defargcnt, u64 defbodysz, u64 remainsize) 38 | |
2363 | 2341 | { |
2364 | 2342 | ==7== |
2365 | 2343 | let u64 blockid = 657807020572803072 // "if" - continue as if normal if-then-else |
@@ -2432,7 +2410,7 @@ | ||
2432 | 2410 | match("{") |
2433 | 2411 | } |
2434 | 2412 | |
2435 | -procassign(list fndefs, list blocklist, list<varentry> varlist, u64 id) 46 | |
2413 | +procassign(list fndefs, list<block> blocklist, list<varentry> varlist, u64 id) 46 | |
2436 | 2414 | { |
2437 | 2415 | ==4== |
2438 | 2416 | let u64 buf = 0 // no unwrap |
@@ -2508,7 +2486,7 @@ | ||
2508 | 2486 | } |
2509 | 2487 | } |
2510 | 2488 | |
2511 | -proclet(list fndefs, list blocklist, list<varentry> varlist, u64 def_id, u64 id, type typedst, u64 varidx, u64 defargcnt, u64 defbodysz, u64 remainsize) 46 | |
2489 | +proclet(list fndefs, list<block> blocklist, list<varentry> varlist, u64 def_id, u64 id, type typedst, u64 varidx, u64 defargcnt, u64 defbodysz, u64 remainsize) 46 | |
2512 | 2490 | { |
2513 | 2491 | ==10== |
2514 | 2492 | let u64 buf = 1 |
@@ -2571,7 +2549,7 @@ | ||
2571 | 2549 | print(";\n") |
2572 | 2550 | } |
2573 | 2551 | |
2574 | -procdyn(list fndefs, list blocklist, list<varentry> varlist, u64 def_id, u64 id, u64 defargcnt, u64 defbodysz, u64 remainsize) 61 | |
2552 | +procdyn(list fndefs, list<block> blocklist, list<varentry> varlist, u64 def_id, u64 id, u64 defargcnt, u64 defbodysz, u64 remainsize) 61 | |
2575 | 2553 | { |
2576 | 2554 | let u64 varidx = 0 |
2577 | 2555 | let type dyntype = 0 |
@@ -2594,7 +2572,7 @@ | ||
2594 | 2572 | pushvarref(varlist, id, varidx, indirect, dyntype) |
2595 | 2573 | } |
2596 | 2574 | |
2597 | -procsize(list fndefs, list blocklist, list<varentry> varlist) 43 | |
2575 | +procsize(list fndefs, list<block> blocklist, list<varentry> varlist) 43 | |
2598 | 2576 | { |
2599 | 2577 | ==3== |
2600 | 2578 | let u64 indirect = 0 |
@@ -2629,7 +2607,7 @@ | ||
2629 | 2607 | match(")") |
2630 | 2608 | } |
2631 | 2609 | |
2632 | -procpushmv(list fndefs, list blocklist, list<varentry> varlist) 44 | |
2610 | +procpushmv(list fndefs, list<block> blocklist, list<varentry> varlist) 44 | |
2633 | 2611 | { |
2634 | 2612 | skipws() |
2635 | 2613 | match("(") |
@@ -2670,7 +2648,7 @@ | ||
2670 | 2648 | match(")") |
2671 | 2649 | } |
2672 | 2650 | |
2673 | -procpopmv(list fndefs, list blocklist, list<varentry> varlist) 43 | |
2651 | +procpopmv(list fndefs, list<block> blocklist, list<varentry> varlist) 43 | |
2674 | 2652 | { // NOTE: arguments REVERSED: pop(elem, list) !!! |
2675 | 2653 | ==3== |
2676 | 2654 | let u64 indirect = 0 |
@@ -2706,7 +2684,7 @@ | ||
2706 | 2684 | match(")") |
2707 | 2685 | } |
2708 | 2686 | |
2709 | -procpush(list fndefs, list blocklist, list<varentry> varlist) 44 | |
2687 | +procpush(list fndefs, list<block> blocklist, list<varentry> varlist) 44 | |
2710 | 2688 | { |
2711 | 2689 | skipws() |
2712 | 2690 | match("(") |
@@ -2768,7 +2746,7 @@ | ||
2768 | 2746 | print(");\n") |
2769 | 2747 | } |
2770 | 2748 | |
2771 | -procpop(list fndefs, list blocklist, list<varentry> varlist) 44 | |
2749 | +procpop(list fndefs, list<block> blocklist, list<varentry> varlist) 44 | |
2772 | 2750 | { |
2773 | 2751 | ==3== |
2774 | 2752 | let u64 indirect = 0 |
@@ -2823,7 +2801,7 @@ | ||
2823 | 2801 | match(")") |
2824 | 2802 | } |
2825 | 2803 | |
2826 | -procfree(list fndefs, list blocklist, list<varentry> varlist) 42 | |
2804 | +procfree(list fndefs, list<block> blocklist, list<varentry> varlist) 42 | |
2827 | 2805 | { |
2828 | 2806 | ==3== |
2829 | 2807 | let u64 indirect = 0 |
@@ -2840,7 +2818,7 @@ | ||
2840 | 2818 | match(")") |
2841 | 2819 | } |
2842 | 2820 | |
2843 | -proccall(u64 tmpaddr, list fndefs, list scopelist, u64 id, list<varentry> varlist, u64 def_id, u64 defargcnt, u64 defbodysz, u64 remainsize) 43 | |
2821 | +proccall(u64 tmpaddr, list fndefs, list<block> scopelist, u64 id, list<varentry> varlist, u64 def_id, u64 defargcnt, u64 defbodysz, u64 remainsize) 43 | |
2844 | 2822 | { |
2845 | 2823 | ==9== |
2846 | 2824 | let u64 callee_id = 0 |
@@ -2929,7 +2907,7 @@ | ||
2929 | 2907 | calleeargs = 0 // clear REFERENCE to keep list alive in fndefs |
2930 | 2908 | } |
2931 | 2909 | |
2932 | -parsedef(u64 tmpaddr, list fndefs, list scopelist, u64 c, list<varentry> varlist, u64 def_id, list defpars, u64 defbodysz, u64 remainsize, u64 in_c_code) 93 | |
2910 | +parsedef(u64 tmpaddr, list fndefs, list<block> scopelist, u64 c, list<varentry> varlist, u64 def_id, list defpars, u64 defbodysz, u64 remainsize, u64 in_c_code) 93 | |
2933 | 2911 | { |
2934 | 2912 | ==10== |
2935 | 2913 | let u64 resultnow = 0 |
@@ -3361,7 +3339,7 @@ | ||
3361 | 3339 | push(fndefs, def_id)) // fndefs def_id |
3362 | 3340 | } |
3363 | 3341 | |
3364 | -parsedefs(u64 tmpaddr, list fndefs, list scopelist, u64 c) 113 | |
3342 | +parsedefs(u64 tmpaddr, list fndefs, list<block> scopelist, u64 c) 113 | |
3365 | 3343 | { |
3366 | 3344 | ==4== // isalpha? |
3367 | 3345 | let u64 buf = 0 |
@@ -3504,7 +3482,7 @@ | ||
3504 | 3482 | } |
3505 | 3483 | } |
3506 | 3484 | |
3507 | -parseprog(u64 tmpaddr, list fndefs, list scopelist) 124 | |
3485 | +parseprog(u64 tmpaddr, list fndefs, list<block> scopelist) 124 | |
3508 | 3486 | { |
3509 | 3487 | { // TEST |
3510 | 3488 | let list destr_pars = 0 |
@@ -3532,10 +3510,10 @@ | ||
3532 | 3510 | ==7== |
3533 | 3511 | let u64 peek = 0 |
3534 | 3512 | ==8== |
3535 | - equ(result0 sym lookahead) // lookahead == '/' | |
3513 | + equ(result0, sym, lookahead) // lookahead == '/' | |
3536 | 3514 | peekchar(peek) // peek-char |
3537 | - equ(result1 sym peek) // peek() == '/' | |
3538 | - and(result0 result0 result1) // lookahead == '/' && peek() == '/' | |
3515 | + equ(result1, sym, peek) // peek() == '/' | |
3516 | + and(result0, result0, result1) // lookahead == '/' && peek() == '/' | |
3539 | 3517 | if result0 |
3540 | 3518 | { |
3541 | 3519 | comment(lookahead) |
@@ -3542,7 +3520,7 @@ | ||
3542 | 3520 | } |
3543 | 3521 | else |
3544 | 3522 | { |
3545 | - parsedefs(tmpaddr fndefs scopelist lookahead) | |
3523 | + parsedefs(tmpaddr, fndefs, scopelist, lookahead) | |
3546 | 3524 | } |
3547 | 3525 | } |
3548 | 3526 | } |
@@ -3633,7 +3611,7 @@ | ||
3633 | 3611 | print(" {\n") |
3634 | 3612 | builtins(tmpaddr) |
3635 | 3613 | ==5== |
3636 | - let list blocklist = 0 | |
3614 | + let list<block> blocklist = 0 | |
3637 | 3615 | ==6== |
3638 | 3616 | parseprog(tmpaddr, fndefs, blocklist) |
3639 | 3617 | print(" default:\n") |