Skip to content

Commit 68dcd5c

Browse files
committed
Don't constant-fold non-constant fields
for DataType/TypeName
1 parent 753729e commit 68dcd5c

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

base/inference.jl

+29-8
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,20 @@ const DataType_parameters_fieldindex = fieldindex(DataType, :parameters)
692692
const DataType_types_fieldindex = fieldindex(DataType, :types)
693693
const DataType_super_fieldindex = fieldindex(DataType, :super)
694694

695+
const TypeName_name_fieldindex = fieldindex(TypeName, :name)
696+
const TypeName_module_fieldindex = fieldindex(TypeName, :module)
697+
const TypeName_wrapper_fieldindex = fieldindex(TypeName, :wrapper)
698+
699+
function const_datatype_getfield_tfunc(sv, fld)
700+
if (fld == DataType_name_fieldindex ||
701+
fld == DataType_parameters_fieldindex ||
702+
fld == DataType_types_fieldindex ||
703+
fld == DataType_super_fieldindex)
704+
return abstract_eval_constant(getfield(sv, fld))
705+
end
706+
return nothing
707+
end
708+
695709
# returns (type, isexact)
696710
function getfield_tfunc(s00::ANY, name)
697711
if isa(s00, TypeVar)
@@ -719,12 +733,22 @@ function getfield_tfunc(s00::ANY, name)
719733
elseif nv === :body || nv === 2
720734
return Const(sv.body)
721735
end
736+
elseif isa(sv, DataType)
737+
t = const_datatype_getfield_tfunc(sv, isa(nv, Symbol) ?
738+
fieldindex(DataType, nv, false) : nv)
739+
t !== nothing && return t
740+
elseif isa(sv, TypeName)
741+
fld = isa(nv, Symbol) ? fieldindex(TypeName, nv, false) : nv
742+
if (fld == TypeName_name_fieldindex ||
743+
fld == TypeName_module_fieldindex ||
744+
fld == TypeName_wrapper_fieldindex)
745+
return abstract_eval_constant(getfield(sv, fld))
746+
end
722747
end
723748
if isa(sv, Module) && isa(nv, Symbol)
724749
return abstract_eval_global(sv, nv)
725750
end
726-
if (isa(sv, DataType) || isa(sv, SimpleVector) || isa(sv, TypeName)
727-
|| isimmutable(sv)) && isdefined(sv, nv)
751+
if (isa(sv, SimpleVector) || isimmutable(sv)) && isdefined(sv, nv)
728752
return abstract_eval_constant(getfield(sv, nv))
729753
end
730754
end
@@ -784,12 +808,9 @@ function getfield_tfunc(s00::ANY, name)
784808
else
785809
sp = nothing
786810
end
787-
if (sp !== nothing &&
788-
(fld == DataType_name_fieldindex ||
789-
fld == DataType_parameters_fieldindex ||
790-
fld == DataType_types_fieldindex ||
791-
fld == DataType_super_fieldindex))
792-
return Const(getfield(sp, fld))
811+
if sp !== nothing
812+
t = const_datatype_getfield_tfunc(sp, fld)
813+
t !== nothing && return t
793814
end
794815
R = s.types[fld]
795816
if isempty(s.parameters)

0 commit comments

Comments
 (0)