Skip to content

Commit

Permalink
clean up some unnecessary code around GenSyms
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed May 2, 2016
1 parent 6bc704d commit ec7d30b
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 79 deletions.
37 changes: 18 additions & 19 deletions base/inference.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ end
type InferenceState
atypes #::Type # type sig
sp::SimpleVector # static parameters
gensym_types::Array{Any,1} # types of the GenSym's in this function
label_counter::Int # index of the current highest label for this function
fedbackvars::Dict{GenSym, Bool}
mod::Module
Expand Down Expand Up @@ -136,8 +135,7 @@ type InferenceState
end

gensym_uses = find_gensym_uses(linfo.code)
gensym_types = linfo.gensymtypes
gensym_init = copy(gensym_types)
gensym_init = copy(linfo.gensymtypes)

# exception handlers
cur_hand = ()
Expand All @@ -149,7 +147,7 @@ type InferenceState

inmodule = isdefined(linfo, :def) ? linfo.def.module : current_module() # toplevel thunks are inferred in the current module
frame = new(
atypes, sp, gensym_types, nl, Dict{GenSym, Bool}(), inmodule, 0, false,
atypes, sp, nl, Dict{GenSym, Bool}(), inmodule, 0, false,
linfo, linfo, la, s, Union{}, W, n,
cur_hand, handler_at, n_handlers,
gensym_uses, gensym_init,
Expand Down Expand Up @@ -1165,7 +1163,7 @@ function abstract_eval_global(M::Module, s::Symbol)
end

function abstract_eval_gensym(s::GenSym, sv::InferenceState)
typ = sv.gensym_types[s.id+1]
typ = sv.linfo.gensymtypes[s.id+1]
if typ === NF
return Bottom
end
Expand Down Expand Up @@ -1375,8 +1373,8 @@ function find_gensym_uses(e::ANY, uses, line)
end

function newvar!(sv::InferenceState, typ)
id = length(sv.gensym_types)
push!(sv.gensym_types, typ)
id = length(sv.linfo.gensymtypes)
push!(sv.linfo.gensymtypes, typ)
return GenSym(id)
end

Expand Down Expand Up @@ -1654,9 +1652,9 @@ function typeinf_frame(frame)
changes = changes::StateUpdate
id = (changes.var::GenSym).id + 1
new = changes.vtype.typ
old = frame.gensym_types[id]
old = frame.linfo.gensymtypes[id]
if old===NF || !(new old)
frame.gensym_types[id] = tmerge(old, new)
frame.linfo.gensymtypes[id] = tmerge(old, new)
for r in frame.gensym_uses[id]
if !is(s[r], ()) # s[r] === () => unreached statement
push!(W, r)
Expand Down Expand Up @@ -1696,7 +1694,7 @@ function typeinf_frame(frame)
# See issue #3821 (using !typeseq instead of !subtype),
# and issue #7810.
id = var.id+1
vt = frame.gensym_types[id]
vt = frame.linfo.gensymtypes[id]
ot = frame.gensym_init[id]
if ot===NF || !(vtot && otvt)
frame.gensym_init[id] = vt
Expand Down Expand Up @@ -1786,7 +1784,7 @@ function typeinf_frame(frame)
frame.cur_hand = ()
frame.handler_at = Any[ () for i=1:n ]
frame.n_handlers = 0
frame.gensym_types[:] = frame.gensym_init
frame.linfo.gensymtypes[:] = frame.gensym_init
@goto restart_typeinf
else
# if a static_typeof was never reached,
Expand Down Expand Up @@ -1858,12 +1856,13 @@ function finish(me::InferenceState)
@assert me.inworkq

# annotate fulltree with type information
for i = 1:length(me.gensym_types)
if me.gensym_types[i] === NF
me.gensym_types[i] = Union{}
gt = me.linfo.gensymtypes
for i = 1:length(gt)
if gt[i] === NF
gt[i] = Union{}
end
end
type_annotate!(me.linfo, me.stmt_types, me, me.bestguess, me.nargs)
type_annotate!(me.linfo, me.stmt_types, me, me.nargs)

# make sure (meta pure) is stripped from full tree
ispure = popmeta!(me.linfo.code, :pure)[1]
Expand Down Expand Up @@ -1966,7 +1965,7 @@ function expr_cannot_delete(ex::Expr)
end

# annotate types of all symbols in AST
function type_annotate!(linfo::LambdaInfo, states::Array{Any,1}, sv::ANY, rettype::ANY, nargs)
function type_annotate!(linfo::LambdaInfo, states::Array{Any,1}, sv::ANY, nargs)
nslots = length(states[1])
for i = 1:nslots
linfo.slottypes[i] = Bottom
Expand Down Expand Up @@ -2601,11 +2600,11 @@ function inlineable(f::ANY, ft::ANY, e::Expr, atypes::Vector{Any}, sv::Inference
# re-number the GenSyms and copy their type-info to the new ast
gensym_types = linfo.gensymtypes
if !isempty(gensym_types)
incr = length(sv.gensym_types)
incr = length(sv.linfo.gensymtypes)
if incr != 0
body = gensym_increment(body, incr)
end
append!(sv.gensym_types, gensym_types)
append!(sv.linfo.gensymtypes, gensym_types)
end

# ok, substitute argument expressions for argument names in the body
Expand Down Expand Up @@ -3350,7 +3349,7 @@ function replace_getfield!(linfo::LambdaInfo, e::Expr, tupname, vals, field_name
val = val::GenSym
typ = exprtype(val, sv)
if a.typ typ && !(typ a.typ)
sv.gensym_types[val.id+1] = a.typ
sv.linfo.gensymtypes[val.id+1] = a.typ
end
end
e.args[i] = val
Expand Down
4 changes: 2 additions & 2 deletions src/alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,8 @@ void jl_lambda_info_set_ast(jl_lambda_info_t *li, jl_value_t *ast)
jl_array_t *vis = jl_lam_vinfo((jl_expr_t*)ast);
size_t nslots = jl_array_len(vis);
jl_value_t *gensym_types = jl_lam_gensyms((jl_expr_t*)ast);
size_t ngensym = (jl_is_array(gensym_types) ? jl_array_len(gensym_types) : jl_unbox_long(gensym_types));
assert(jl_is_long(gensym_types));
size_t ngensym = jl_unbox_long(gensym_types);
li->slotnames = jl_alloc_cell_1d(nslots);
jl_gc_wb(li, li->slotnames);
li->slottypes = jl_nothing;
Expand Down Expand Up @@ -1062,7 +1063,6 @@ UNBOX_FUNC(bool, int8_t)
UNBOX_FUNC(float32, float)
UNBOX_FUNC(float64, double)
UNBOX_FUNC(voidpointer, void*)
UNBOX_FUNC(gensym, ssize_t)

#define BOX_FUNC(typ,c_type,pfx,nw) \
JL_DLLEXPORT jl_value_t *pfx##_##typ(c_type x) \
Expand Down
44 changes: 4 additions & 40 deletions src/ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ typedef struct _jl_ast_context_t {
value_t null_sym;
value_t jlgensym_sym;
value_t slot_sym;
arraylist_t gensym_to_flisp;
jl_ast_context_list_t list;
int ref;
jl_task_t *task;
Expand Down Expand Up @@ -579,19 +578,13 @@ static value_t julia_to_scm_(fl_context_t *fl_ctx, jl_value_t *v);
static value_t julia_to_scm(fl_context_t *fl_ctx, jl_value_t *v)
{
value_t temp;
arraylist_t *jlgensym_to_flisp = &jl_ast_ctx(fl_ctx)->gensym_to_flisp;
if (jlgensym_to_flisp->len)
jlgensym_to_flisp->len = 0; // in case we didn't free it last time we got here (for example, if we threw an error)
else
arraylist_new(jlgensym_to_flisp, 0);
// need try/catch to reset GC handle stack in case of error
FL_TRY_EXTERN(fl_ctx) {
temp = julia_to_scm_(fl_ctx, v);
}
FL_CATCH_EXTERN(fl_ctx) {
temp = fl_list2(fl_ctx, jl_ast_ctx(fl_ctx)->error_sym, cvalue_static_cstring(fl_ctx, "expression too large"));
}
arraylist_free(jlgensym_to_flisp);
return temp;
}

Expand Down Expand Up @@ -622,20 +615,8 @@ static value_t julia_to_scm_(fl_context_t *fl_ctx, jl_value_t *v)
{
if (jl_is_symbol(v))
return symbol(fl_ctx, jl_symbol_name((jl_sym_t*)v));
if (jl_is_gensym(v)) {
size_t idx = ((jl_gensym_t*)v)->id;
size_t i;
arraylist_t *jlgensym_to_flisp = &jl_ast_ctx(fl_ctx)->gensym_to_flisp;
for (i = 0; i < jlgensym_to_flisp->len; i+=2) {
if ((ssize_t)jlgensym_to_flisp->items[i] == idx)
return fl_list2(fl_ctx, jl_ast_ctx(fl_ctx)->jlgensym_sym, fixnum((size_t)jlgensym_to_flisp->items[i+1]));
}
arraylist_push(jlgensym_to_flisp, (void*)idx);
value_t flv = fl_applyn(fl_ctx, 0, symbol_value(symbol(fl_ctx, "make-jlgensym")));
assert(iscons(flv) && car_(flv) == jl_ast_ctx(fl_ctx)->jlgensym_sym);
arraylist_push(jlgensym_to_flisp, (void*)(size_t)numval(car_(cdr_(flv))));
return flv;
}
if (jl_is_gensym(v))
return fl_list2(fl_ctx, jl_ast_ctx(fl_ctx)->jlgensym_sym, fixnum((size_t)((jl_gensym_t*)v)->id));
if (v == jl_true)
return fl_ctx->T;
if (v == jl_false)
Expand Down Expand Up @@ -865,24 +846,6 @@ JL_DLLEXPORT jl_value_t *jl_macroexpand(jl_value_t *expr)
return jl_call_scm_on_ast("jl-macroexpand", expr);
}

ssize_t jl_max_jlgensym_in(jl_value_t *v)
{
ssize_t genid = -1;
if (jl_is_gensym(v)) {
genid = ((jl_gensym_t*)v)->id;
}
else if (jl_is_expr(v)) {
jl_expr_t *e = (jl_expr_t*)v;
size_t i, l = jl_array_len(e->args);
for (i = 0; i < l; i++) {
ssize_t maxid = jl_max_jlgensym_in(jl_exprarg(e, i));
if (maxid > genid)
genid = maxid;
}
}
return genid;
}

// wrap expr in a thunk AST
jl_lambda_info_t *jl_wrap_expr(jl_value_t *expr)
{
Expand All @@ -896,7 +859,8 @@ jl_lambda_info_t *jl_wrap_expr(jl_value_t *expr)
vi = (jl_value_t*)jl_alloc_cell_1d(3);
jl_cellset(vi, 0, mt);
jl_cellset(vi, 1, mt);
jl_cellset(vi, 2, jl_box_long(jl_max_jlgensym_in(expr)+1));
// front end always wraps toplevel exprs with gensyms in (thunk (lambda () ...))
jl_cellset(vi, 2, jl_box_long(0));
jl_cellset(le->args, 1, vi);
if (!jl_is_expr(expr) || ((jl_expr_t*)expr)->head != body_sym) {
bo = jl_exprn(body_sym, 1);
Expand Down
4 changes: 0 additions & 4 deletions src/cgutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,10 +256,6 @@ static Value *literal_pointer_val(jl_value_t *p)
// Symbols are prefixed with jl_sym#
return julia_gv("jl_sym#", addr, NULL, p);
}
if (jl_is_gensym(p)) {
// GenSyms are prefixed with jl_gensym#
return julia_gv("jl_gensym#", p);
}
// something else gets just a generic name
return julia_gv("jl_global#", p);
}
Expand Down
12 changes: 1 addition & 11 deletions src/interpreter.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,17 +445,7 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, jl_lambda_info_t *la

jl_value_t *jl_toplevel_eval_body(jl_array_t *stmts)
{
ssize_t ngensym = 0;
size_t i, l = jl_array_len(stmts);
for (i = 0; i < l; i++) {
ssize_t maxid = jl_max_jlgensym_in(jl_cellref(stmts, i))+1;
if (maxid > ngensym)
ngensym = maxid;
}
jl_value_t **locals = NULL;
assert(ngensym == 0);
jl_value_t *ret = eval_body(stmts, locals, NULL, 0, 1);
return ret;
return eval_body(stmts, NULL, NULL, 0, 1);
}

static jl_value_t *eval_body(jl_array_t *stmts, jl_value_t **locals, jl_lambda_info_t *lam,
Expand Down
1 change: 0 additions & 1 deletion src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -1064,7 +1064,6 @@ JL_DLLEXPORT uint64_t jl_unbox_uint64(jl_value_t *v);
JL_DLLEXPORT float jl_unbox_float32(jl_value_t *v);
JL_DLLEXPORT double jl_unbox_float64(jl_value_t *v);
JL_DLLEXPORT void *jl_unbox_voidpointer(jl_value_t *v);
JL_DLLEXPORT ssize_t jl_unbox_gensym(jl_value_t *v);

JL_DLLEXPORT int jl_get_size(jl_value_t *val, size_t *pnt);

Expand Down
2 changes: 0 additions & 2 deletions src/julia_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,6 @@ void *jl_install_thread_signal_handler(void);

jl_fptr_t jl_get_builtin_fptr(jl_value_t *b);

ssize_t jl_max_jlgensym_in(jl_value_t *v);

extern uv_loop_t *jl_io_loop;

JL_DLLEXPORT void jl_uv_associate_julia_struct(uv_handle_t *handle,
Expand Down

0 comments on commit ec7d30b

Please sign in to comment.