mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-17 20:01:32 +03:00
wish, some bugfixes, numbered the opcodes
This commit is contained in:
parent
62dc052760
commit
9a5bd10871
148
noun/nock.c
148
noun/nock.c
@ -519,23 +519,37 @@ _n_mush_in(u3_noun val)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FRAG 0
|
/* These must match the order in the section marked OPCODE TABLE */
|
||||||
#define QUOT 1
|
#define HALT 0
|
||||||
#define NOCK 2
|
#define COPY 1
|
||||||
#define DEEP 3
|
#define TOSS 2
|
||||||
#define BUMP 4
|
#define SWAP 3
|
||||||
#define SAME 5
|
#define SWAT 4
|
||||||
#define BAIL 6
|
#define SKIP 5
|
||||||
#define HEAD 7
|
#define SKIN 6
|
||||||
#define TAIL 8
|
#define CONS 7
|
||||||
#define COPY 9
|
#define SCON 8
|
||||||
#define SWAP 10
|
#define HEAD 9
|
||||||
#define CONS 11
|
#define TAIL 10
|
||||||
#define SCON 12
|
#define FRAG 11
|
||||||
#define SKIN 13
|
#define QUOT 12
|
||||||
#define SKIP 14
|
#define QUIP 13
|
||||||
#define WISH 15
|
#define NOCK 14
|
||||||
#define KICK 16
|
#define NOCT 15
|
||||||
|
#define DEEP 16
|
||||||
|
#define PEEP 17
|
||||||
|
#define BUMP 18
|
||||||
|
#define SAME 19
|
||||||
|
#define KICK 20
|
||||||
|
#define TICK 21
|
||||||
|
#define WISH 22
|
||||||
|
#define FAST 23
|
||||||
|
#define CUSH 24
|
||||||
|
#define DROP 25
|
||||||
|
#define PUMO 26
|
||||||
|
#define GEMO 27
|
||||||
|
#define HECK 28
|
||||||
|
#define SLOG 29
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
_n_apen(u3_noun* dst, u3_noun src)
|
_n_apen(u3_noun* dst, u3_noun src)
|
||||||
@ -600,17 +614,28 @@ _n_bint(u3_noun* ops, u3_noun hif, u3_noun nef, c3_o tel_o)
|
|||||||
tot_s += _n_emit(ops, DROP);
|
tot_s += _n_emit(ops, DROP);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case c3__live:
|
case c3__live: {
|
||||||
|
u3_noun yep = u3_nul,
|
||||||
|
nop = u3_nul;
|
||||||
|
c3_s y_s = 0,
|
||||||
|
n_s = 0;
|
||||||
|
|
||||||
tot_s += _n_emit(ops, COPY);
|
tot_s += _n_emit(ops, COPY);
|
||||||
tot_s += _n_comp(ops, hod, c3n);
|
tot_s += _n_comp(ops, hod, c3n);
|
||||||
tot_s += _n_emit(ops, PEEP);
|
tot_s += _n_emit(ops, PEEP);
|
||||||
tot_s += _n_emit(ops, u3nc(SKIN, sizeof(c3_y) +
|
|
||||||
sizeof(c3_y) + sizeof(c3_s)));
|
n_s += _n_emit(&nop, HECK);
|
||||||
tot_s += _n_emit(ops, TOSS);
|
|
||||||
tot_s += _n_emit(ops, u3nc(SKIP, sizeof(c3_y)));
|
y_s += _n_emit(&yep, TOSS);
|
||||||
tot_s += _n_emit(ops, HECK);
|
y_s += _n_emit(&yep, u3nc(SKIP, n_s));
|
||||||
|
|
||||||
|
tot_s += n_emit(ops, u3nc(SKIN, y_s));
|
||||||
|
_n_apen(ops, yep); tot_s += y_s;
|
||||||
|
_n_apen(ops, nop); tot_s += n_s;
|
||||||
|
|
||||||
tot_s += _n_comp(ops, nef, tel_o);
|
tot_s += _n_comp(ops, nef, tel_o);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case c3__slog:
|
case c3__slog:
|
||||||
tot_s += _n_emit(ops, COPY);
|
tot_s += _n_emit(ops, COPY);
|
||||||
@ -632,6 +657,7 @@ _n_bint(u3_noun* ops, u3_noun hif, u3_noun nef, c3_o tel_o)
|
|||||||
case c3__memo: {
|
case c3__memo: {
|
||||||
u3_noun nop = u3_nul,
|
u3_noun nop = u3_nul,
|
||||||
yep = u3_nul;
|
yep = u3_nul;
|
||||||
|
|
||||||
c3_s y_s = 0,
|
c3_s y_s = 0,
|
||||||
n_s = 0; // top->[bus]
|
n_s = 0; // top->[bus]
|
||||||
tot_s += _n_emit(ops, COPY); // [bus bus]
|
tot_s += _n_emit(ops, COPY); // [bus bus]
|
||||||
@ -647,11 +673,11 @@ _n_bint(u3_noun* ops, u3_noun hif, u3_noun nef, c3_o tel_o)
|
|||||||
n_s += _n_emit(&nop, TOSS); // [key bus]
|
n_s += _n_emit(&nop, TOSS); // [key bus]
|
||||||
n_s += _n_emit(&nop, SWAP); // [bus key]
|
n_s += _n_emit(&nop, SWAP); // [bus key]
|
||||||
n_s += _n_comp(&nop, nef, c3n); // [pro key]
|
n_s += _n_comp(&nop, nef, c3n); // [pro key]
|
||||||
n_s += _n_emit(ops, PUMO);
|
n_s += _n_emit(&nop, PUMO);
|
||||||
|
|
||||||
// YES branch, i.e. gemo gave us [0 pro]
|
// YES branch, i.e. gemo gave us [0 pro]
|
||||||
y_s += _n_emit(&yep, TAIL); // [pro key bus]
|
y_s += _n_emit(&yep, TAIL); // [pro key bus]
|
||||||
y_s += _n_emit(ops, SWAT); // [pro bus]
|
y_s += _n_emit(&yep, SWAT); // [pro bus]
|
||||||
y_s += _n_emit(&yep, u3nc(SKIP, n_s));
|
y_s += _n_emit(&yep, u3nc(SKIP, n_s));
|
||||||
|
|
||||||
tot_s += _n_emit(ops, u3nc(SKIN, y_s));
|
tot_s += _n_emit(ops, u3nc(SKIN, y_s));
|
||||||
@ -788,11 +814,11 @@ _n_comp(u3_noun* ops, u3_noun fol, c3_o tel_o) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static c3_y*
|
static c3_y*
|
||||||
_n_asm(u3_noun ops)
|
_n_asm(u3_noun ops, c3_s len_s)
|
||||||
{
|
{
|
||||||
u3_noun top = ops;
|
u3_noun top = ops;
|
||||||
c3_s i_s = _n_comp(&ops, fol);
|
c3_y* buf_y = u3a_malloc(sizeof(c3_y) * (len_s+1));
|
||||||
c3_y* buf_y = u3a_malloc(sizeof(c3_y) * (i_s+1));
|
c3_s i_s = len_s;
|
||||||
|
|
||||||
buf_y[i_s] = HALT;
|
buf_y[i_s] = HALT;
|
||||||
while ( --i_s >= 0 ) {
|
while ( --i_s >= 0 ) {
|
||||||
@ -889,7 +915,9 @@ _n_rean(c3_y* buf, c3_s* ip_s)
|
|||||||
static inline c3_y*
|
static inline c3_y*
|
||||||
_n_bite(u3_noun fol)
|
_n_bite(u3_noun fol)
|
||||||
{
|
{
|
||||||
return _n_asm(_n_comp(&bok, fol, c3y));
|
u3_noun bok = u3_nul;
|
||||||
|
c3_s len_s = _n_comp(&bok, fol, c3y)
|
||||||
|
return _n_asm(bok, len_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static c3_y*
|
static c3_y*
|
||||||
@ -907,9 +935,12 @@ _n_find(u3_noun fol)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static u3_noun
|
/* _n_burn(): run pog, subject is top of cap stack, return value on cap stack
|
||||||
|
*/
|
||||||
|
static void
|
||||||
_n_burn(c3_y* pog)
|
_n_burn(c3_y* pog)
|
||||||
{
|
{
|
||||||
|
/* OPCODE TABLE */
|
||||||
static void* lab[] = {
|
static void* lab[] = {
|
||||||
&&do_halt, &&do_copy, &&do_toss,
|
&&do_halt, &&do_copy, &&do_toss,
|
||||||
&&do_swap, &&do_swat,
|
&&do_swap, &&do_swat,
|
||||||
@ -921,11 +952,11 @@ _n_burn(c3_y* pog)
|
|||||||
&&do_deep, &&do_peep,
|
&&do_deep, &&do_peep,
|
||||||
&&do_bump, &&do_same,
|
&&do_bump, &&do_same,
|
||||||
&&do_kick, &&do_tick,
|
&&do_kick, &&do_tick,
|
||||||
|
&&do_wish, &&do_fast,
|
||||||
&&do_cush, &&do_drop,
|
&&do_cush, &&do_drop,
|
||||||
&&do_pumo, &&do_gemo,
|
&&do_pumo, &&do_gemo,
|
||||||
&&do_heck, &&do_slog, &&do_fast,
|
&&do_heck, &&do_slog,
|
||||||
};
|
};
|
||||||
#define BURN() goto *lab[pog[ip_s++]]
|
|
||||||
|
|
||||||
c3_s sip_s, ip_s = 0;
|
c3_s sip_s, ip_s = 0;
|
||||||
c3_y op;
|
c3_y op;
|
||||||
@ -935,12 +966,11 @@ _n_burn(c3_y* pog)
|
|||||||
u3_noun x, o;
|
u3_noun x, o;
|
||||||
u3p(void) empty = u3R->cap_p;
|
u3p(void) empty = u3R->cap_p;
|
||||||
|
|
||||||
|
#define BURN() goto *lab[pog[ip_s++]]
|
||||||
BURN();
|
BURN();
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
do_halt:
|
do_halt:
|
||||||
x = _n_pop();
|
return;
|
||||||
c3_assert( empty == u3R->cap_p );
|
|
||||||
return x;
|
|
||||||
|
|
||||||
do_copy:
|
do_copy:
|
||||||
top = _n_peek();
|
top = _n_peek();
|
||||||
@ -1031,7 +1061,7 @@ _n_burn(c3_y* pog)
|
|||||||
|
|
||||||
do_nock:
|
do_nock:
|
||||||
gop = _n_find(_n_pop());
|
gop = _n_find(_n_pop());
|
||||||
_n_push(_n_burn(gop));
|
_n_burn(gop);
|
||||||
BURN();
|
BURN();
|
||||||
|
|
||||||
do_noct:
|
do_noct:
|
||||||
@ -1079,9 +1109,9 @@ _n_burn(c3_y* pog)
|
|||||||
if ( u3_none == fol ) {
|
if ( u3_none == fol ) {
|
||||||
return u3m_bail(c3__exit);
|
return u3m_bail(c3__exit);
|
||||||
}
|
}
|
||||||
|
*top = o;
|
||||||
gop = _n_find(fol);
|
gop = _n_find(fol);
|
||||||
_n_push(o);
|
_n_burn(gop);
|
||||||
*top = _n_burn(gop);
|
|
||||||
}
|
}
|
||||||
BURN();
|
BURN();
|
||||||
|
|
||||||
@ -1103,6 +1133,38 @@ _n_burn(c3_y* pog)
|
|||||||
}
|
}
|
||||||
BURN();
|
BURN();
|
||||||
|
|
||||||
|
do_fast: // top->[pro clu]
|
||||||
|
top = _n_peek();
|
||||||
|
up = _n_peet();
|
||||||
|
u3t_off(noc_o);
|
||||||
|
u3j_mine(*up, u3k(*top));
|
||||||
|
u3t_on(noc_o);
|
||||||
|
*up = *top;
|
||||||
|
u3a_pop(sizeof(u3_noun));
|
||||||
|
BURN();
|
||||||
|
|
||||||
|
do_wish:
|
||||||
|
top = _n_peek();
|
||||||
|
up = _n_peet();
|
||||||
|
u3t_off(noc_o);
|
||||||
|
x = u3m_soft_esc(*up, u3k(*top));
|
||||||
|
u3t_on(noc_o);
|
||||||
|
|
||||||
|
if ( c3n == u3du(x) ) {
|
||||||
|
return u3m_bail(u3nt(1, *top, 0));
|
||||||
|
}
|
||||||
|
else if ( c3n == u3du(u3t(x)) ) {
|
||||||
|
// replace with proper error stack push
|
||||||
|
u3t_push(u3nc(c3__hunk, _n_mush(*top)));
|
||||||
|
return u3m_bail(c3__exit);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
u3z(*top);
|
||||||
|
*top = u3k(u3t(u3t(x)));
|
||||||
|
u3z(x);
|
||||||
|
BURN();
|
||||||
|
}
|
||||||
|
|
||||||
do_cush:
|
do_cush:
|
||||||
u3t_push(_n_pop());
|
u3t_push(_n_pop());
|
||||||
BURN();
|
BURN();
|
||||||
@ -1136,15 +1198,5 @@ _n_burn(c3_y* pog)
|
|||||||
u3t_slog(_n_pop());
|
u3t_slog(_n_pop());
|
||||||
u3t_on(noc_o);
|
u3t_on(noc_o);
|
||||||
BURN();
|
BURN();
|
||||||
|
|
||||||
do_fast: // top->[pro clu]
|
|
||||||
top = _n_peek();
|
|
||||||
up = _n_peet();
|
|
||||||
u3t_off(noc_o);
|
|
||||||
u3j_mine(*up, u3k(*top));
|
|
||||||
u3t_on(noc_o);
|
|
||||||
*up = *top;
|
|
||||||
u3a_pop(sizeof(u3_noun));
|
|
||||||
BURN();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user