Skip to content

Commit

Permalink
Merge pull request JuliaLang#10275 from JuliaLang/teh/gcroots
Browse files Browse the repository at this point in the history
A collection of GC rooting/write barrier additions
  • Loading branch information
timholy committed Feb 23, 2015
2 parents 526429d + 35dd38f commit 5e2a617
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 21 deletions.
5 changes: 3 additions & 2 deletions src/gf.c
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,8 @@ static jl_function_t *cache_method(jl_methtable_t *mt, jl_tuple_t *type,
jl_value_t *temp=NULL;
jl_function_t *newmeth=NULL;
jl_tuple_t *origtype=NULL;
JL_GC_PUSH4(&type, &temp, &newmeth, &origtype);
jl_tuple_t *limited=NULL;
JL_GC_PUSH5(&type, &temp, &newmeth, &origtype, &limited);
origtype = (jl_tuple_t*)jl_f_tuple(NULL, jl_tuple_data(type), jl_tuple_len(type));

for (i=0; i < jl_tuple_len(type); i++) {
Expand Down Expand Up @@ -740,7 +741,7 @@ static jl_function_t *cache_method(jl_methtable_t *mt, jl_tuple_t *type,
if (!mt->defs->isstaged && jl_tuple_len(type) > mt->max_args &&
jl_is_vararg_type(jl_tupleref(decl,jl_tuple_len(decl)-1))) {
size_t nspec = mt->max_args + 2;
jl_tuple_t *limited = jl_alloc_tuple(nspec);
limited = jl_alloc_tuple(nspec);
for(i=0; i < nspec-1; i++) {
jl_tupleset(limited, i, jl_tupleref(type, i));
}
Expand Down
13 changes: 7 additions & 6 deletions src/interpreter.c
Original file line number Diff line number Diff line change
Expand Up @@ -335,11 +335,11 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, size_t nl, size_t ng
jl_value_t *para = eval(args[1], locals, nl, ngensym);
jl_value_t *super = NULL;
jl_value_t *temp = NULL;
JL_GC_PUSH3(&para, &super, &temp);
jl_datatype_t *dt = NULL;
JL_GC_PUSH4(&para, &super, &temp, &dt);
assert(jl_is_tuple(para));
assert(jl_is_symbol(name));
jl_datatype_t *dt =
jl_new_abstracttype(name, jl_any_type, (jl_tuple_t*)para);
dt = jl_new_abstracttype(name, jl_any_type, (jl_tuple_t*)para);
jl_binding_t *b = jl_get_binding_wr(jl_current_module, (jl_sym_t*)name);
temp = b->value;
check_can_assign_type(b);
Expand All @@ -357,7 +357,8 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, size_t nl, size_t ng
else if (ex->head == bitstype_sym) {
jl_value_t *name = args[0];
jl_value_t *super = NULL, *para = NULL, *vnb = NULL, *temp = NULL;
JL_GC_PUSH3(&para, &super, &temp);
jl_datatype_t *dt = NULL;
JL_GC_PUSH4(&para, &super, &temp, &dt);
assert(jl_is_symbol(name));
para = eval(args[1], locals, nl, ngensym);
assert(jl_is_tuple(para));
Expand All @@ -368,12 +369,12 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, size_t nl, size_t ng
if (nb < 1 || nb>=(1<<23) || (nb&7) != 0)
jl_errorf("invalid number of bits in type %s",
((jl_sym_t*)name)->name);
jl_datatype_t *dt =
jl_new_bitstype(name, jl_any_type, (jl_tuple_t*)para, nb);
dt = jl_new_bitstype(name, jl_any_type, (jl_tuple_t*)para, nb);
jl_binding_t *b = jl_get_binding_wr(jl_current_module, (jl_sym_t*)name);
temp = b->value;
check_can_assign_type(b);
b->value = (jl_value_t*)dt;
gc_wb_binding(b, dt);
super = eval(args[3], locals, nl, ngensym);
jl_set_datatype_super(dt, super);
b->value = temp;
Expand Down
9 changes: 6 additions & 3 deletions src/jltypes.c
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,9 @@ static jl_value_t *meet_tvars(jl_tvar_t *a, jl_tvar_t *b);
static jl_value_t *intersect_typevar(jl_tvar_t *a, jl_value_t *b,
cenv_t *penv, cenv_t *eqc, variance_t var)
{
JL_GC_PUSH1(&b);
jl_value_t *both=NULL;
jl_tvar_t *new_b=NULL;
JL_GC_PUSH3(&b, &both, &new_b);
if (var == covariant) {
// matching T to Type{S} in covariant context
b = type_to_static_parameter_value(b);
Expand Down Expand Up @@ -722,7 +724,7 @@ static jl_value_t *intersect_typevar(jl_tvar_t *a, jl_value_t *b,
return (jl_value_t*)a;
}
if (jl_is_typevar(b)) {
jl_value_t *both = meet_tvars(a, (jl_tvar_t*)b);
both = meet_tvars(a, (jl_tvar_t*)b);
if (both == jl_bottom_type) {
JL_GC_POP();
return both;
Expand Down Expand Up @@ -756,7 +758,7 @@ static jl_value_t *intersect_typevar(jl_tvar_t *a, jl_value_t *b,
return (jl_value_t*)a;
}
else {
jl_tvar_t *new_b = jl_new_typevar(underscore_sym, jl_bottom_type, b);
new_b = jl_new_typevar(underscore_sym, jl_bottom_type, b);
extend((jl_value_t*)new_b, b, penv);
extend((jl_value_t*)new_b, (jl_value_t*)a, penv);
JL_GC_POP();
Expand All @@ -768,6 +770,7 @@ static jl_value_t *intersect_typevar(jl_tvar_t *a, jl_value_t *b,
}

// convert (Type{T}, Type{S}, ...) to Type{(T,S,...)}
// NOTE: ptemp must be rooted by the caller
static int tuple_to_Type(jl_tuple_t *a, jl_tuple_t **ptemp)
{
int alen = jl_tuple_len(a);
Expand Down
28 changes: 18 additions & 10 deletions src/task.c
Original file line number Diff line number Diff line change
Expand Up @@ -686,14 +686,18 @@ static void record_backtrace(void)
static jl_value_t *array_ptr_void_type = NULL;
DLLEXPORT jl_value_t *jl_backtrace_from_here(void)
{
if (array_ptr_void_type == NULL)
array_ptr_void_type = jl_apply_type((jl_value_t*)jl_array_type,
jl_tuple2(jl_voidpointer_type,
jl_box_long(1)));
jl_array_t *bt = jl_alloc_array_1d(array_ptr_void_type, MAX_BT_SIZE);
jl_tuple_t *tp = NULL;
jl_array_t *bt = NULL;
JL_GC_PUSH2(&tp, &bt);
if (array_ptr_void_type == NULL) {
tp = jl_tuple2(jl_voidpointer_type, jl_box_long(1));
array_ptr_void_type = jl_apply_type((jl_value_t*)jl_array_type, tp);
}
bt = jl_alloc_array_1d(array_ptr_void_type, MAX_BT_SIZE);
size_t n = rec_backtrace((ptrint_t*)jl_array_data(bt), MAX_BT_SIZE);
if (n < MAX_BT_SIZE)
jl_array_del_end(bt, MAX_BT_SIZE-n);
JL_GC_POP();
return (jl_value_t*)bt;
}

Expand All @@ -719,12 +723,16 @@ DLLEXPORT jl_value_t *jl_lookup_code_address(void *ip, int skipC)

DLLEXPORT jl_value_t *jl_get_backtrace(void)
{
if (array_ptr_void_type == NULL)
array_ptr_void_type = jl_apply_type((jl_value_t*)jl_array_type,
jl_tuple2(jl_voidpointer_type,
jl_box_long(1)));
jl_array_t *bt = jl_alloc_array_1d(array_ptr_void_type, bt_size);
jl_tuple_t *tp = NULL;
jl_array_t *bt = NULL;
JL_GC_PUSH2(&tp, &bt);
if (array_ptr_void_type == NULL) {
tp = jl_tuple2(jl_voidpointer_type, jl_box_long(1));
array_ptr_void_type = jl_apply_type((jl_value_t*)jl_array_type, tp);
}
bt = jl_alloc_array_1d(array_ptr_void_type, bt_size);
memcpy(bt->data, bt_data, bt_size*sizeof(void*));
JL_GC_POP();
return (jl_value_t*)bt;
}

Expand Down

0 comments on commit 5e2a617

Please sign in to comment.