@@ -1423,8 +1423,8 @@ function typeinf_uncached(linfo::LambdaStaticData, atypes::ANY, sparams::SimpleV
1423
1423
args = f_argnames (ast)
1424
1424
la = length (args)
1425
1425
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 )
1428
1428
body = (ast. args[3 ]. args):: Array{Any,1}
1429
1429
n = length (body)
1430
1430
@@ -1491,14 +1491,13 @@ function typeinf_uncached(linfo::LambdaStaticData, atypes::ANY, sparams::SimpleV
1491
1491
1492
1492
# types of closed vars
1493
1493
cenv = ObjectIdDict ()
1494
- for vi in (ast. args[2 ][3 ]):: Array{Any,1}
1494
+ for vi in (ast. args[2 ][2 ]):: Array{Any,1}
1495
1495
vi:: Array{Any,1}
1496
1496
vname = vi[1 ]
1497
1497
vtype = vi[2 ]
1498
1498
cenv[vname] = vtype
1499
1499
s[1 ][vname] = VarState (vtype,false )
1500
1500
end
1501
- vinflist = ast. args[2 ][2 ]:: Array{Any,1}
1502
1501
for vi in vinflist
1503
1502
vi:: Array{Any,1}
1504
1503
if (vi[3 ]& 4 )!= 0
@@ -1839,29 +1838,29 @@ function type_annotate(ast::Expr, states::Array{Any,1}, sv::ANY, rettype::ANY, a
1839
1838
ast. args[3 ]. typ = rettype
1840
1839
1841
1840
# 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}
1843
1842
if (vi[3 ]& 4 )== 0
1844
1843
vi[2 ] = get (decls, vi[1 ], vi[2 ])
1845
1844
end
1846
1845
if haskey (undefs, vi[1 ])
1847
1846
vi[3 ] |= 32
1848
1847
end
1849
1848
end
1850
- for vi in ast. args[2 ][3 ]:: Array{Any,1}
1849
+ for vi in ast. args[2 ][2 ]:: Array{Any,1}
1851
1850
if (vi[3 ]& 4 )== 0
1852
1851
vi[2 ] = get (decls, vi[1 ], vi[2 ])
1853
1852
end
1854
1853
if haskey (undefs, vi[1 ])
1855
1854
vi[3 ] |= 32
1856
1855
end
1857
1856
end
1858
- ast. args[2 ][4 ] = sv. gensym_types
1857
+ ast. args[2 ][3 ] = sv. gensym_types
1859
1858
1860
1859
for (li:: LambdaStaticData ) in closures
1861
1860
if ! li. inferred
1862
1861
a = li. ast
1863
1862
# 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}
1865
1864
if (vi[3 ]& 4 )== 0
1866
1865
vi[2 ] = get (decls, vi[1 ], vi[2 ])
1867
1866
end
@@ -2184,6 +2183,20 @@ function effect_free(e::ANY, sv, allow_volatile::Bool)
2184
2183
return false
2185
2184
end
2186
2185
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
+
2187
2200
# inline functions whose bodies "inline_worthy"
2188
2201
# where the function body doesn't contain any argument more than once.
2189
2202
# 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
2311
2324
needcopy = false
2312
2325
end
2313
2326
ast = ast:: Expr
2314
- vinflist = ast. args[2 ][2 ]:: Array{Any,1}
2327
+ vinflist = ast. args[2 ][1 ]:: Array{Any,1}
2315
2328
for vi in vinflist
2316
2329
if (vi[3 ]& 1 )!= 0
2317
2330
# captures variables (TODO )
@@ -2360,9 +2373,9 @@ function inlineable(f::ANY, e::Expr, atype::ANY, sv::StaticVarInfo, enclosing_as
2360
2373
end
2361
2374
2362
2375
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)
2366
2379
2367
2380
# check for vararg function
2368
2381
args = f_argnames (ast)
@@ -2438,7 +2451,7 @@ function inlineable(f::ANY, e::Expr, atype::ANY, sv::StaticVarInfo, enclosing_as
2438
2451
# annotate variables in the body expression with their module
2439
2452
if need_mod_annotate
2440
2453
mfrom = linfo. module; mto = (inference_stack:: CallStack ). mod
2441
- enc_capt = enclosing_ast. args[2 ][3 ]
2454
+ enc_capt = enclosing_ast. args[2 ][2 ]
2442
2455
if ! isempty (enc_capt)
2443
2456
# add captured var names to list of locals
2444
2457
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
2600
2613
end
2601
2614
2602
2615
# 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 ]
2604
2617
if gensym_types != 0
2605
2618
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 ]]
2607
2620
end
2608
2621
if ! isempty (gensym_types)
2609
2622
incr = length (sv. gensym_types)
2610
2623
if incr != 0
2611
2624
body = gensym_increment (body, incr)
2612
2625
end
2613
- append! (sv. gensym_types, ast. args[2 ][4 ])
2626
+ append! (sv. gensym_types, ast. args[2 ][3 ])
2614
2627
end
2615
2628
end
2616
2629
@@ -2927,9 +2940,7 @@ end
2927
2940
2928
2941
function add_variable (ast, name, typ, is_sa)
2929
2942
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}
2933
2944
push! (vinflist, vinf)
2934
2945
end
2935
2946
@@ -2946,7 +2957,7 @@ function contains_is1(vinflist::Array{Any,1}, x::Symbol)
2946
2957
return false
2947
2958
end
2948
2959
function unique_name (ast)
2949
- locllist = ast. args[2 ][2 ]:: Array{Any,1}
2960
+ locllist = ast. args[2 ][1 ]:: Array{Any,1}
2950
2961
for g in some_names
2951
2962
if ! contains_is1 (locllist, g)
2952
2963
return g
@@ -2959,8 +2970,8 @@ function unique_name(ast)
2959
2970
g
2960
2971
end
2961
2972
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}
2964
2975
for g in some_names
2965
2976
if ! contains_is1 (locllist1, g) &&
2966
2977
! contains_is1 (locllist2, g)
@@ -2977,7 +2988,7 @@ end
2977
2988
2978
2989
function unique_names (ast, n)
2979
2990
ns = []
2980
- locllist = ast. args[2 ][2 ]:: Array{Any,1}
2991
+ locllist = ast. args[2 ][1 ]:: Array{Any,1}
2981
2992
for g in some_names
2982
2993
if ! contains_is1 (locllist, g)
2983
2994
push! (ns, g)
@@ -3013,7 +3024,7 @@ function is_known_call_p(e::Expr, pred::Function, sv)
3013
3024
end
3014
3025
3015
3026
function is_var_assigned (ast, v)
3016
- for vi in ast. args[2 ][2 ]
3027
+ for vi in ast. args[2 ][1 ]
3017
3028
if symequal (vi[1 ], v) && (vi[3 ]& 2 )!= 0
3018
3029
return true
3019
3030
end
@@ -3023,8 +3034,7 @@ end
3023
3034
3024
3035
function delete_var! (ast, v)
3025
3036
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 ])
3028
3038
end
3029
3039
filter! (x-> ! (isa (x,Expr) && (x. head === :(= ) || x. head === :const ) &&
3030
3040
symequal (x. args[1 ],v)),
@@ -3036,8 +3046,8 @@ end
3036
3046
# and not assigned.
3037
3047
# "sa" is the result of find_sa_vars
3038
3048
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 ]
3041
3051
for (v,init) in sa
3042
3052
if ((isa (init,Symbol) || isa (init,SymbolNode)) &&
3043
3053
any (vi-> symequal (vi[1 ],init), varinfo) &&
@@ -3087,7 +3097,8 @@ function find_sa_vars(ast)
3087
3097
body = ast. args[3 ]. args
3088
3098
av = ObjectIdDict ()
3089
3099
av2 = ObjectIdDict ()
3090
- vnames = ast. args[2 ][1 ]
3100
+ vinfos = ast. args[2 ][1 ]:: Array{Any,1}
3101
+ args = ast. args[1 ]
3091
3102
for i = 1 : length (body)
3092
3103
e = body[i]
3093
3104
if isa (e,Expr) && is (e. head,:(= ))
@@ -3098,7 +3109,7 @@ function find_sa_vars(ast)
3098
3109
av2[(lhs:: SymbolNode ). name] = true
3099
3110
else
3100
3111
lhs = lhs:: Symbol
3101
- if contains_is (vnames, lhs) # exclude globals
3112
+ if contains_is1 (vinfos, lhs) && ! contains_is (args,lhs) # exclude globals & args
3102
3113
if ! haskey (av, lhs)
3103
3114
av[lhs] = e. args[2 ]
3104
3115
else
@@ -3109,7 +3120,7 @@ function find_sa_vars(ast)
3109
3120
end
3110
3121
end
3111
3122
filter! ((var,_)-> ! haskey (av2,var), av)
3112
- for vi in ast . args[ 2 ][ 2 ]
3123
+ for vi in vinfos
3113
3124
if (vi[3 ]& 1 )!= 0
3114
3125
# remove captured vars
3115
3126
delete! (av, vi[1 ])
@@ -3255,7 +3266,7 @@ function replace_getfield!(ast, e::ANY, tupname, vals, sv, i0)
3255
3266
val = val:: SymbolNode
3256
3267
if a. typ <: val.typ && ! typeseq (a. typ,val. typ)
3257
3268
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}
3259
3270
if vi[1 ] === val. name
3260
3271
vi[2 ] = a. typ
3261
3272
break
0 commit comments