Remove some unnecessary write barriers for better performance.
This commit is contained in:
parent
32952e9aa4
commit
075cbac672
12
interp.c
12
interp.c
|
|
@ -246,17 +246,11 @@ static value_t make_lambda(interp_state_t *state, value_t templ)
|
||||||
|
|
||||||
/* All but the instance variables are just shallow-copied. */
|
/* All but the instance variables are just shallow-copied. */
|
||||||
ls->slots[LAMBDA_SLOT_GLOBAL_VARS] = ts->slots[TEMPLATE_SLOT_GLOBAL_VARS];
|
ls->slots[LAMBDA_SLOT_GLOBAL_VARS] = ts->slots[TEMPLATE_SLOT_GLOBAL_VARS];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
|
||||||
ls->slots[LAMBDA_SLOT_FRAME_VARS] = ts->slots[TEMPLATE_SLOT_FRAME_VARS];
|
ls->slots[LAMBDA_SLOT_FRAME_VARS] = ts->slots[TEMPLATE_SLOT_FRAME_VARS];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
|
||||||
ls->slots[LAMBDA_SLOT_BYTE_CODE] = ts->slots[TEMPLATE_SLOT_BYTE_CODE];
|
ls->slots[LAMBDA_SLOT_BYTE_CODE] = ts->slots[TEMPLATE_SLOT_BYTE_CODE];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
|
||||||
ls->slots[LAMBDA_SLOT_TAIL_CALL] = ts->slots[TEMPLATE_SLOT_TAIL_CALL];
|
ls->slots[LAMBDA_SLOT_TAIL_CALL] = ts->slots[TEMPLATE_SLOT_TAIL_CALL];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
|
||||||
ls->slots[LAMBDA_SLOT_ARG_LIST] = ts->slots[TEMPLATE_SLOT_ARG_LIST];
|
ls->slots[LAMBDA_SLOT_ARG_LIST] = ts->slots[TEMPLATE_SLOT_ARG_LIST];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
|
||||||
ls->slots[LAMBDA_SLOT_CONTINUATION] = ts->slots[TEMPLATE_SLOT_CONTINUATION];
|
ls->slots[LAMBDA_SLOT_CONTINUATION] = ts->slots[TEMPLATE_SLOT_CONTINUATION];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
|
||||||
ls->slots[LAMBDA_SLOT_CONTEXT] = ts->slots[TEMPLATE_SLOT_CONTEXT];
|
ls->slots[LAMBDA_SLOT_CONTEXT] = ts->slots[TEMPLATE_SLOT_CONTEXT];
|
||||||
WRITE_BARRIER(lambda_root.value);
|
WRITE_BARRIER(lambda_root.value);
|
||||||
|
|
||||||
|
|
@ -266,8 +260,8 @@ static value_t make_lambda(interp_state_t *state, value_t templ)
|
||||||
for (size_t i = 0; i < t_inst->size; ++i)
|
for (size_t i = 0; i < t_inst->size; ++i)
|
||||||
{
|
{
|
||||||
l_inst->elements[i] = get_input(state, t_inst->bytes[i]);
|
l_inst->elements[i] = get_input(state, t_inst->bytes[i]);
|
||||||
WRITE_BARRIER(object_value(l_inst));
|
|
||||||
}
|
}
|
||||||
|
WRITE_BARRIER(object_value(l_inst));
|
||||||
|
|
||||||
unregister_gc_root(&templ_root);
|
unregister_gc_root(&templ_root);
|
||||||
unregister_gc_root(&lambda_root);
|
unregister_gc_root(&lambda_root);
|
||||||
|
|
@ -507,6 +501,10 @@ static void run_statement(interp_state_t *state, uint8_t code, uint8_t in1, uint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMPORTANT: It is assumed that get_input() does not trigger garbage collection.
|
||||||
|
* If this were to change additional write barriers and/or GC roots may be required.
|
||||||
|
*/
|
||||||
static value_t get_input(const interp_state_t *state, fixnum_t var)
|
static value_t get_input(const interp_state_t *state, fixnum_t var)
|
||||||
{
|
{
|
||||||
release_assert((var >= 0) && (var <= 255));
|
release_assert((var >= 0) && (var <= 255));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue