mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-06 06:48:48 +00:00
TMP changes
This commit is contained in:
parent
39715334c7
commit
2c03654cca
5 changed files with 26 additions and 5 deletions
|
|
@ -84,7 +84,7 @@ struct re_pattern_buffer *Lregexp(char *regexp);
|
|||
|
||||
int LregexpMatch(struct re_pattern_buffer *b, char *s, int pos);
|
||||
|
||||
void *Bstring(void *);
|
||||
void *Bstring(void *p);
|
||||
|
||||
void *Lclone(void *p);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,3 +31,7 @@ void s_enter_f(struct State *s, char *func_ip, size_t params_sz,
|
|||
void s_exit_f(struct State *s);
|
||||
|
||||
void **var_by_category(struct State *s, enum VarCategory category, int id);
|
||||
|
||||
// --- changed runtime operations ---
|
||||
|
||||
void *s_Bsexp(struct State *state, int bn, int tag);
|
||||
|
|
|
|||
|
|
@ -67,17 +67,19 @@ void run(bytefile *bf) {
|
|||
if (l < 1) {
|
||||
failure("BINOP: l < 1");
|
||||
}
|
||||
f_binop(&s, ops[l-1]);
|
||||
void* left = s_pop(&s);
|
||||
void* right = s_pop(&s);
|
||||
s_push(&s, (void*)ops_func[l-1](left, right));
|
||||
break;
|
||||
|
||||
case 1:
|
||||
switch (l) {
|
||||
case 0: // CONST %d
|
||||
s_put_i(&s, ip_read_int(&s.ip));
|
||||
s_push(&s, (void*)BOX(ip_read_int(&s.ip)));
|
||||
break;
|
||||
|
||||
case 1: // STRING %s
|
||||
s_put_const_str(&s, ip_read_string(&s.ip, bf));
|
||||
s_push(&s, Bstring((void*)ip_read_string(&s.ip, bf)));
|
||||
break;
|
||||
|
||||
case 2: // SEXP %s %d // create sexpr with tag=%s and %d elements from stack
|
||||
|
|
|
|||
|
|
@ -4,6 +4,19 @@
|
|||
|
||||
extern size_t STACK_SIZE;
|
||||
|
||||
extern size_t __gc_stack_top, __gc_stack_bottom;
|
||||
|
||||
#define PRE_GC() \
|
||||
bool flag = false; \
|
||||
flag = __gc_stack_top == 0; \
|
||||
if (flag) { __gc_stack_top = (size_t)__builtin_frame_address(0); } \
|
||||
assert(__gc_stack_top != 0); \
|
||||
assert(__builtin_frame_address(0) <= (void *)__gc_stack_top);
|
||||
|
||||
#define POST_GC() \
|
||||
assert(__builtin_frame_address(0) <= (void *)__gc_stack_top); \
|
||||
if (flag) { __gc_stack_top = 0; }
|
||||
|
||||
// ------ basic stack oprs ------
|
||||
|
||||
void s_push(struct State *s, void *val) {
|
||||
|
|
@ -134,3 +147,5 @@ void **var_by_category(struct State *s, enum VarCategory category,
|
|||
|
||||
return var;
|
||||
}
|
||||
|
||||
// --- changed runtime operations ---
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ void **f_prev_fp(struct Frame *fp) {
|
|||
uint64_t f_locals_sz(struct Frame *fp) { return UNBOX(fp->locals_sz_box); }
|
||||
uint64_t f_args_sz(struct Frame *fp) { return UNBOX(fp->args_sz_box); }
|
||||
void **f_locals(struct Frame *fp) { return (void **)fp - f_locals_sz(fp) - frame_sz(); }
|
||||
void **f_args(struct Frame *fp) { return (void **)fp + f_args_sz(fp); }
|
||||
void **f_args(struct Frame *fp) { return (void **)fp + 1; }
|
||||
|
||||
|
||||
// --- State ---
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue