In InternalCopy, there is a line:
CopyFields(originalObject, visited, cloneObject, typeToReflect);
...but then in CopyFields, you have the line:
var clonedFieldValue = InternalCopy(originalFieldValue, visited);
This results in a StackOverflow exception.