internal override void MixinsUpdated(RubyModule/*!*/[]/*!*/ oldMixins, RubyModule/*!*/[]/*!*/ newMixins) {
Context.RequiresClassHierarchyLock();
// visit newly inserted modules in reverse method resolution order:
int j = oldMixins.Length - 1;
for (int i = newMixins.Length - 1; i >= 0; i--) {
var mixin = newMixins[i];
if (j < 0 || mixin != oldMixins[j]) {
// new module:
mixin.AddDependentClass(this);
InitializeNewMixin(mixin);
Debug.Assert(!mixin.MethodInitializationNeeded || MethodInitializationNeeded);
if (!mixin.MethodInitializationNeeded) {
foreach (var entry in mixin.GetMethods()) {
// Skip mixins that are below the current mixin in MRO:
PrepareMethodUpdate(entry.Key, entry.Value, i + 1);
}
}
} else {
// original module:
j--;
}
}
Debug.Assert(j == -1);
}