Skip to content

Commit a9915ff

Browse files
committed
remove redundant list of local var names from AST, add list of static params
part of #10403 ast.args[2][1] has been removed since all of its information was also in the varinfo lists ast.args[2][2]. the varinfo lists are now at ast.args[2][1]. args[2][2] is captured var info, args[2][3] is gensym info, and now args[2][4] is a list of static parameter names. GlobalRef is now built in so it can be used more extensively.
1 parent 43d5a9f commit a9915ff

12 files changed

+132
-128
lines changed

base/boot.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@
106106
# name::Symbol
107107
#end
108108

109+
#immutable GlobalRef
110+
# mod::Module
111+
# name::Symbol
112+
#end
113+
109114
# type Task
110115
# parent::Task
111116
# last::Task
@@ -235,11 +240,6 @@ type SymbolNode
235240
SymbolNode(name::Symbol, t::ANY) = new(name, t)
236241
end
237242

238-
immutable GlobalRef
239-
mod::Module
240-
name::Symbol
241-
end
242-
243243
immutable ASCIIString <: DirectIndexString
244244
data::Array{UInt8,1}
245245
end
@@ -285,6 +285,7 @@ _new(:TopNode, :Symbol)
285285
_new(:NewvarNode, :Symbol)
286286
_new(:QuoteNode, :ANY)
287287
_new(:GenSym, :Int)
288+
eval(:(Core.call(::Type{GlobalRef}, m::Module, s::Symbol) = $(Expr(:new, :GlobalRef, :m, :s))))
288289

289290
Module(name::Symbol=:anonymous, std_imports::Bool=true) = ccall(:jl_f_new_module, Any, (Any, Bool), name, std_imports)::Module
290291

base/inference.jl

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,8 +1423,8 @@ function typeinf_uncached(linfo::LambdaStaticData, atypes::ANY, sparams::SimpleV
14231423
args = f_argnames(ast)
14241424
la = length(args)
14251425
assert(is(ast.head,:lambda))
1426-
locals = (ast.args[2][1])::Array{Any,1}
1427-
vars = append_any(args, locals)
1426+
vinflist = ast.args[2][1]::Array{Any,1}
1427+
vars = map(vi->vi[1], vinflist)
14281428
body = (ast.args[3].args)::Array{Any,1}
14291429
n = length(body)
14301430

@@ -1491,14 +1491,13 @@ function typeinf_uncached(linfo::LambdaStaticData, atypes::ANY, sparams::SimpleV
14911491

14921492
# types of closed vars
14931493
cenv = ObjectIdDict()
1494-
for vi in (ast.args[2][3])::Array{Any,1}
1494+
for vi in (ast.args[2][2])::Array{Any,1}
14951495
vi::Array{Any,1}
14961496
vname = vi[1]
14971497
vtype = vi[2]
14981498
cenv[vname] = vtype
14991499
s[1][vname] = VarState(vtype,false)
15001500
end
1501-
vinflist = ast.args[2][2]::Array{Any,1}
15021501
for vi in vinflist
15031502
vi::Array{Any,1}
15041503
if (vi[3]&4)!=0
@@ -1839,29 +1838,29 @@ function type_annotate(ast::Expr, states::Array{Any,1}, sv::ANY, rettype::ANY, a
18391838
ast.args[3].typ = rettype
18401839

18411840
# add declarations for variables that are always the same type
1842-
for vi in ast.args[2][2]::Array{Any,1}
1841+
for vi in ast.args[2][1]::Array{Any,1}
18431842
if (vi[3]&4)==0
18441843
vi[2] = get(decls, vi[1], vi[2])
18451844
end
18461845
if haskey(undefs, vi[1])
18471846
vi[3] |= 32
18481847
end
18491848
end
1850-
for vi in ast.args[2][3]::Array{Any,1}
1849+
for vi in ast.args[2][2]::Array{Any,1}
18511850
if (vi[3]&4)==0
18521851
vi[2] = get(decls, vi[1], vi[2])
18531852
end
18541853
if haskey(undefs, vi[1])
18551854
vi[3] |= 32
18561855
end
18571856
end
1858-
ast.args[2][4] = sv.gensym_types
1857+
ast.args[2][3] = sv.gensym_types
18591858

18601859
for (li::LambdaStaticData) in closures
18611860
if !li.inferred
18621861
a = li.ast
18631862
# pass on declarations of captured vars
1864-
for vi in a.args[2][3]::Array{Any,1}
1863+
for vi in a.args[2][2]::Array{Any,1}
18651864
if (vi[3]&4)==0
18661865
vi[2] = get(decls, vi[1], vi[2])
18671866
end
@@ -2184,6 +2183,20 @@ function effect_free(e::ANY, sv, allow_volatile::Bool)
21842183
return false
21852184
end
21862185

2186+
function ast_localvars(ast)
2187+
args = ObjectIdDict()
2188+
for argname in (ast.args[1]::Array{Any,1})
2189+
args[argname] = true
2190+
end
2191+
locals = Any[]
2192+
for vi in (ast.args[2][1]::Array{Any,1})
2193+
if !haskey(args, vi[1])
2194+
push!(locals, vi[1])
2195+
end
2196+
end
2197+
locals
2198+
end
2199+
21872200
# inline functions whose bodies "inline_worthy"
21882201
# where the function body doesn't contain any argument more than once.
21892202
# functions with closure environments or varargs are also excluded.
@@ -2311,7 +2324,7 @@ function inlineable(f::ANY, e::Expr, atype::ANY, sv::StaticVarInfo, enclosing_as
23112324
needcopy = false
23122325
end
23132326
ast = ast::Expr
2314-
vinflist = ast.args[2][2]::Array{Any,1}
2327+
vinflist = ast.args[2][1]::Array{Any,1}
23152328
for vi in vinflist
23162329
if (vi[3]&1)!=0
23172330
# captures variables (TODO)
@@ -2360,9 +2373,9 @@ function inlineable(f::ANY, e::Expr, atype::ANY, sv::StaticVarInfo, enclosing_as
23602373
end
23612374

23622375
spnames = Any[ sp[i].name for i=1:2:length(sp) ]
2363-
enc_vinflist = enclosing_ast.args[2][2]::Array{Any,1}
2364-
enc_locllist = enclosing_ast.args[2][1]::Array{Any,1}
2365-
locllist = ast.args[2][1]::Array{Any,1}
2376+
enc_vinflist = enclosing_ast.args[2][1]::Array{Any,1}
2377+
enc_locllist = ast_localvars(enclosing_ast)
2378+
locllist = ast_localvars(ast)
23662379

23672380
# check for vararg function
23682381
args = f_argnames(ast)
@@ -2438,7 +2451,7 @@ function inlineable(f::ANY, e::Expr, atype::ANY, sv::StaticVarInfo, enclosing_as
24382451
# annotate variables in the body expression with their module
24392452
if need_mod_annotate
24402453
mfrom = linfo.module; mto = (inference_stack::CallStack).mod
2441-
enc_capt = enclosing_ast.args[2][3]
2454+
enc_capt = enclosing_ast.args[2][2]
24422455
if !isempty(enc_capt)
24432456
# add captured var names to list of locals
24442457
enc_vars = vcat(enc_locllist, map(vi->vi[1], enc_capt))
@@ -2600,17 +2613,17 @@ function inlineable(f::ANY, e::Expr, atype::ANY, sv::StaticVarInfo, enclosing_as
26002613
end
26012614

26022615
# re-number the GenSyms and copy their type-info to the new ast
2603-
gensym_types = ast.args[2][4]
2616+
gensym_types = ast.args[2][3]
26042617
if gensym_types != 0
26052618
if (isa(gensym_types,Integer))
2606-
gensym_types = Any[Any for i = 1:ast.args[2][4]]
2619+
gensym_types = Any[Any for i = 1:ast.args[2][3]]
26072620
end
26082621
if !isempty(gensym_types)
26092622
incr = length(sv.gensym_types)
26102623
if incr != 0
26112624
body = gensym_increment(body, incr)
26122625
end
2613-
append!(sv.gensym_types, ast.args[2][4])
2626+
append!(sv.gensym_types, ast.args[2][3])
26142627
end
26152628
end
26162629

@@ -2927,9 +2940,7 @@ end
29272940

29282941
function add_variable(ast, name, typ, is_sa)
29292942
vinf = Any[name, typ, 2+16*is_sa]
2930-
locllist = ast.args[2][1]::Array{Any,1}
2931-
vinflist = ast.args[2][2]::Array{Any,1}
2932-
push!(locllist, name)
2943+
vinflist = ast.args[2][1]::Array{Any,1}
29332944
push!(vinflist, vinf)
29342945
end
29352946

@@ -2946,7 +2957,7 @@ function contains_is1(vinflist::Array{Any,1}, x::Symbol)
29462957
return false
29472958
end
29482959
function unique_name(ast)
2949-
locllist = ast.args[2][2]::Array{Any,1}
2960+
locllist = ast.args[2][1]::Array{Any,1}
29502961
for g in some_names
29512962
if !contains_is1(locllist, g)
29522963
return g
@@ -2959,8 +2970,8 @@ function unique_name(ast)
29592970
g
29602971
end
29612972
function unique_name(ast1, ast2)
2962-
locllist1 = ast1.args[2][2]::Array{Any,1}
2963-
locllist2 = ast2.args[2][2]::Array{Any,1}
2973+
locllist1 = ast1.args[2][1]::Array{Any,1}
2974+
locllist2 = ast2.args[2][1]::Array{Any,1}
29642975
for g in some_names
29652976
if !contains_is1(locllist1, g) &&
29662977
!contains_is1(locllist2, g)
@@ -2977,7 +2988,7 @@ end
29772988

29782989
function unique_names(ast, n)
29792990
ns = []
2980-
locllist = ast.args[2][2]::Array{Any,1}
2991+
locllist = ast.args[2][1]::Array{Any,1}
29812992
for g in some_names
29822993
if !contains_is1(locllist, g)
29832994
push!(ns, g)
@@ -3013,7 +3024,7 @@ function is_known_call_p(e::Expr, pred::Function, sv)
30133024
end
30143025

30153026
function is_var_assigned(ast, v)
3016-
for vi in ast.args[2][2]
3027+
for vi in ast.args[2][1]
30173028
if symequal(vi[1], v) && (vi[3]&2)!=0
30183029
return true
30193030
end
@@ -3023,8 +3034,7 @@ end
30233034

30243035
function delete_var!(ast, v)
30253036
if !isa(v, GenSym)
3026-
filter!(vi->!symequal(vi[1],v), ast.args[2][2])
3027-
filter!(x->!symequal(x,v), ast.args[2][1])
3037+
filter!(vi->!symequal(vi[1],v), ast.args[2][1])
30283038
end
30293039
filter!(x->!(isa(x,Expr) && (x.head === :(=) || x.head === :const) &&
30303040
symequal(x.args[1],v)),
@@ -3036,8 +3046,8 @@ end
30363046
# and not assigned.
30373047
# "sa" is the result of find_sa_vars
30383048
function remove_redundant_temp_vars(ast, sa)
3039-
varinfo = ast.args[2][2]
3040-
gensym_types = ast.args[2][4]
3049+
varinfo = ast.args[2][1]
3050+
gensym_types = ast.args[2][3]
30413051
for (v,init) in sa
30423052
if ((isa(init,Symbol) || isa(init,SymbolNode)) &&
30433053
any(vi->symequal(vi[1],init), varinfo) &&
@@ -3087,7 +3097,8 @@ function find_sa_vars(ast)
30873097
body = ast.args[3].args
30883098
av = ObjectIdDict()
30893099
av2 = ObjectIdDict()
3090-
vnames = ast.args[2][1]
3100+
vinfos = ast.args[2][1]::Array{Any,1}
3101+
args = ast.args[1]
30913102
for i = 1:length(body)
30923103
e = body[i]
30933104
if isa(e,Expr) && is(e.head,:(=))
@@ -3098,7 +3109,7 @@ function find_sa_vars(ast)
30983109
av2[(lhs::SymbolNode).name] = true
30993110
else
31003111
lhs = lhs::Symbol
3101-
if contains_is(vnames, lhs) # exclude globals
3112+
if contains_is1(vinfos,lhs) && !contains_is(args,lhs) # exclude globals & args
31023113
if !haskey(av, lhs)
31033114
av[lhs] = e.args[2]
31043115
else
@@ -3109,7 +3120,7 @@ function find_sa_vars(ast)
31093120
end
31103121
end
31113122
filter!((var,_)->!haskey(av2,var), av)
3112-
for vi in ast.args[2][2]
3123+
for vi in vinfos
31133124
if (vi[3]&1)!=0
31143125
# remove captured vars
31153126
delete!(av, vi[1])
@@ -3255,7 +3266,7 @@ function replace_getfield!(ast, e::ANY, tupname, vals, sv, i0)
32553266
val = val::SymbolNode
32563267
if a.typ <: val.typ && !typeseq(a.typ,val.typ)
32573268
val.typ = a.typ
3258-
for vi in ast.args[2][2]::Array{Any,1}
3269+
for vi in ast.args[2][1]::Array{Any,1}
32593270
if vi[1] === val.name
32603271
vi[2] = a.typ
32613272
break

base/interactiveutil.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ function code_warntype(io::IO, f, t::ANY)
210210
show_expr_type_emphasize::Bool = may_show_expr_type_emphasize::Bool = true
211211
for ast in ct
212212
println(io, "Variables:")
213-
vars = ast.args[2][2]
213+
vars = ast.args[2][1]
214214
for v in vars
215215
print(io, " ", v[1])
216216
show_expr_type(io, v[2])

src/ast.c

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,15 @@ static jl_value_t *scm_to_julia_(value_t e, int eo)
301301

302302
value_t ee = car_(e);
303303
jl_array_t *vinf = jl_alloc_cell_1d(4);
304-
jl_cellset(vinf, 0, full_list(car_(ee),eo));
304+
jl_cellset(vinf, 0, full_list_of_lists(car_(ee),eo));
305305
ee = cdr_(ee);
306306
jl_cellset(vinf, 1, full_list_of_lists(car_(ee),eo));
307307
ee = cdr_(ee);
308-
jl_cellset(vinf, 2, full_list_of_lists(car_(ee),eo));
308+
jl_cellset(vinf, 2, isfixnum(car_(ee)) ?
309+
jl_box_long(numval(car_(ee))) :
310+
full_list(car_(ee),eo));
309311
ee = cdr_(ee);
310-
jl_cellset(vinf, 3, isfixnum(car_(ee)) ?
311-
jl_box_long(numval(car_(ee))) :
312-
full_list(car_(ee),eo));
312+
jl_cellset(vinf, 3, full_list(car_(ee),eo));
313313
assert(!iscons(cdr_(ee)));
314314
jl_cellset(ex->args, 1, vinf);
315315
e = cdr_(e);
@@ -319,8 +319,7 @@ static jl_value_t *scm_to_julia_(value_t e, int eo)
319319
jl_cellset(ex->args, i, scm_to_julia_(car_(e), eo));
320320
e = cdr_(e);
321321
}
322-
return
323-
(jl_value_t*)jl_new_lambda_info((jl_value_t*)ex, jl_emptysvec);
322+
return (jl_value_t*)jl_new_lambda_info((jl_value_t*)ex, jl_emptysvec);
324323
}
325324

326325
e = cdr_(e);
@@ -620,8 +619,8 @@ jl_lambda_info_t *jl_wrap_expr(jl_value_t *expr)
620619
vi = (jl_value_t*)jl_alloc_cell_1d(4);
621620
jl_cellset(vi, 0, mt);
622621
jl_cellset(vi, 1, mt);
623-
jl_cellset(vi, 2, mt);
624-
jl_cellset(vi, 3, jl_box_long(jl_max_jlgensym_in(expr)+1));
622+
jl_cellset(vi, 2, jl_box_long(jl_max_jlgensym_in(expr)+1));
623+
jl_cellset(vi, 3, mt);
625624
jl_cellset(le->args, 1, vi);
626625
if (!jl_is_expr(expr) || ((jl_expr_t*)expr)->head != body_sym) {
627626
bo = jl_exprn(body_sym, 1);
@@ -659,8 +658,8 @@ jl_sym_t *jl_lam_argname(jl_lambda_info_t *li, int i)
659658
return (jl_sym_t*)jl_cellref(jl_lam_args(ast),i);
660659
}
661660

662-
// get array of local var symbols
663-
jl_array_t *jl_lam_locals(jl_expr_t *l)
661+
// get array of var info records (for args and locals)
662+
jl_array_t *jl_lam_vinfo(jl_expr_t *l)
664663
{
665664
assert(jl_is_expr(l));
666665
jl_value_t *le = jl_exprarg(l, 1);
@@ -670,8 +669,8 @@ jl_array_t *jl_lam_locals(jl_expr_t *l)
670669
return (jl_array_t*)ll;
671670
}
672671

673-
// get array of var info records
674-
jl_array_t *jl_lam_vinfo(jl_expr_t *l)
672+
// get array of var info records for captured vars
673+
jl_array_t *jl_lam_capt(jl_expr_t *l)
675674
{
676675
assert(jl_is_expr(l));
677676
jl_value_t *le = jl_exprarg(l, 1);
@@ -681,25 +680,25 @@ jl_array_t *jl_lam_vinfo(jl_expr_t *l)
681680
return (jl_array_t*)ll;
682681
}
683682

684-
// get array of var info records for captured vars
685-
jl_array_t *jl_lam_capt(jl_expr_t *l)
683+
// get array of types for GenSym vars, or its length (if not type-inferred)
684+
jl_value_t *jl_lam_gensyms(jl_expr_t *l)
686685
{
687686
assert(jl_is_expr(l));
688687
jl_value_t *le = jl_exprarg(l, 1);
689688
assert(jl_is_array(le));
690-
jl_value_t *ll = jl_cellref(le, 2);
691-
assert(jl_is_array(ll));
692-
return (jl_array_t*)ll;
689+
assert(jl_array_len(le) == 4);
690+
return jl_cellref(le, 2);
693691
}
694692

695-
// get array of types for GenSym vars, or it's length (if not type-inferred)
696-
jl_value_t *jl_lam_gensyms(jl_expr_t *l)
693+
// get array of static parameter symbols
694+
jl_array_t *jl_lam_staticparams(jl_expr_t *l)
697695
{
698696
assert(jl_is_expr(l));
699697
jl_value_t *le = jl_exprarg(l, 1);
700698
assert(jl_is_array(le));
701699
assert(jl_array_len(le) == 4);
702-
return jl_cellref(le, 3);
700+
assert(jl_is_array(jl_cellref(le, 3)));
701+
return (jl_array_t*)jl_cellref(le, 3);
703702
}
704703

705704
int jl_lam_vars_captured(jl_expr_t *ast)

src/builtins.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,7 @@ void jl_init_primitives(void)
12381238
add_builtin("QuoteNode", (jl_value_t*)jl_quotenode_type);
12391239
add_builtin("TopNode", (jl_value_t*)jl_topnode_type);
12401240
add_builtin("NewvarNode", (jl_value_t*)jl_newvarnode_type);
1241+
add_builtin("GlobalRef", (jl_value_t*)jl_globalref_type);
12411242

12421243
#ifdef _P64
12431244
add_builtin("Int", (jl_value_t*)jl_int64_type);

0 commit comments

Comments
 (0)