A dynamic compiler determines whether to inline methods in place of virtual
method calls by inspecting such calls' receiver expressions. If a given
call site meets other criteria for inlining, the method is inlined if its
receiver expression can be proved to have a property called
"pre-existence." One kind of expression whose pre-existence is easily
proved is a calling-procedure argument to which the body of the calling
procedure makes no assignment. One of the other criteria is that the
argument's static type is a class whose definition of the callee method
has not been overridden, and the compiler employs a dependency data
structure to record against both the caller and the callee that the caller
contains code whose validity depends on the assumption that this criterion
has been met. If the compiler thereafter compiles another implementation
of the callee method, it inspects the dependency structures in which
dependencies have been recorded against the callee method, and it
recompiles the callers whose object code's validity is indicated by such
structures to depend on that callee method's not having been overridden.
The restriction of inlining to pre-existing receiver expression allows
currently running invocations of the original compilation of the caller
method to continue without fear of error.