# A kind of Depth-First-Search for superclasses ordering
# *`v` : the current executed instance of VirtualMachine
# * `res` : Result Array, ie current superclasses ordering
private fun dfs(v: VirtualMachine, res: Array[MClass]): Array[MClass]
do
# Add this class at the beginning
res.insert(self, 0)
var direct_parents = self.in_hierarchy(v.mainmodule).direct_greaters.to_a
if direct_parents.length > 1 then
# Prefix represents the class which has the most properties
# we try to choose it in first to reduce the number of potential recompilations
var prefix = null
var max = -1
for cl in direct_parents do
# If we never have visited this class
if not res.has(cl) then
var properties_length = cl.mmethods.length + cl.mattributes.length
if properties_length > max then
max = properties_length
prefix = cl
end
end
end
if prefix != null then
if self.prefix == null then self.prefix = prefix
# Add the prefix class ordering at the beginning of our sequence
var prefix_res = new Array[MClass]
prefix_res = prefix.dfs(v, prefix_res)
# Then we recurse on other classes
for cl in direct_parents do
if cl != prefix then
res = new Array[MClass]
res = cl.dfs(v, res)
for cl_res in res do
if not prefix_res.has(cl_res) then prefix_res.push(cl_res)
end
end
end
res = prefix_res
end
res.push(self)
else
if direct_parents.length > 0 then
if prefix == null then prefix = direct_parents.first
res = direct_parents.first.dfs(v, res)
end
end
if not res.has(self) then res.push(self)
return res
end
src/vm/virtual_machine.nit:682,2--741,4