private void interpreterCall() {
   if (isValid()) {
     // Stubs were deoptimized => reinstall.
     this.runtime.reinstallStubs();
   } else {
     if (uninitializedRootNode == UNINITIALIZED) {
       ensureCloned();
     }
     compilationProfile.reportInterpreterCall();
     if (!isCompiling()
         && compilationPolicy.shouldCompile(compilationProfile, getCompilerOptions())) {
       compile();
     }
   }
 }
 public void notifyCompilationFailed(Throwable t) {
   if (t instanceof BailoutException && !((BailoutException) t).isPermanent()) {
     /*
      * Non permanent bailouts are expected cases. A non permanent bailout would be for
      * example class redefinition during code installation. As opposed to permanent
      * bailouts, non permanent bailouts will trigger recompilation and are not considered a
      * failure state.
      */
   } else {
     compilationPolicy.recordCompilationFailure(t);
     if (TruffleCompilationExceptionsAreThrown.getValue()) {
       throw new OptimizationFailedException(t, this);
     }
     if (TruffleCompilationExceptionsArePrinted.getValue()
         || TruffleCompilationExceptionsAreFatal.getValue()) {
       printException(t);
       if (TruffleCompilationExceptionsAreFatal.getValue()) {
         System.exit(-1);
       }
     }
   }
 }