178 * @param method the method compiled to produce {@code compiledCode} or {@code null} if the
179 * input to {@code compResult} was not a {@link ResolvedJavaMethod}
180 * @param compilationRequest the compilation request or {@code null}
181 * @param compilationResult the code to be compiled
182 * @param predefinedInstalledCode a pre-allocated {@link InstalledCode} object to use as a
183 * reference to the installed code. If {@code null}, a new {@link InstalledCode}
184 * object will be created.
185 * @param speculationLog the speculation log to be used
186 * @param isDefault specifies if the installed code should be made the default implementation of
187 * {@code compRequest.getMethod()}. The default implementation for a method is the
188 * code executed for standard calls to the method. This argument is ignored if
189 * {@code compRequest == null}.
190 * @param context a custom debug context to use for the code installation
191 * @return a reference to the compiled and ready-to-run installed code
192 * @throws BailoutException if the code installation failed
193 */
194 @SuppressWarnings("try")
195 public InstalledCode createInstalledCode(DebugContext debug, ResolvedJavaMethod method, CompilationRequest compilationRequest, CompilationResult compilationResult,
196 SpeculationLog speculationLog, InstalledCode predefinedInstalledCode, boolean isDefault, Object[] context) {
197 Object[] debugContext = context != null ? context : new Object[]{getProviders().getCodeCache(), method, compilationResult};
198 CodeInstallationTask[] tasks = new CodeInstallationTask[codeInstallationTaskFactories.size()];
199 for (int i = 0; i < codeInstallationTaskFactories.size(); i++) {
200 tasks[i] = codeInstallationTaskFactories.get(i).create();
201 }
202 try (DebugContext.Scope s2 = debug.scope("CodeInstall", debugContext);
203 DebugContext.Activation a = debug.activate()) {
204 for (CodeInstallationTask task : tasks) {
205 task.preProcess(compilationResult);
206 }
207
208 CompiledCode compiledCode = createCompiledCode(method, compilationRequest, compilationResult);
209 InstalledCode installedCode = getProviders().getCodeCache().installCode(method, compiledCode, predefinedInstalledCode, speculationLog, isDefault);
210
211 // Run post-code installation tasks.
212 try {
213 for (CodeInstallationTask task : tasks) {
214 task.postProcess(installedCode);
215 }
216 for (CodeInstallationTask task : tasks) {
217 task.releaseInstallation(installedCode);
218 }
219 } catch (Throwable t) {
220 installedCode.invalidate();
|
178 * @param method the method compiled to produce {@code compiledCode} or {@code null} if the
179 * input to {@code compResult} was not a {@link ResolvedJavaMethod}
180 * @param compilationRequest the compilation request or {@code null}
181 * @param compilationResult the code to be compiled
182 * @param predefinedInstalledCode a pre-allocated {@link InstalledCode} object to use as a
183 * reference to the installed code. If {@code null}, a new {@link InstalledCode}
184 * object will be created.
185 * @param speculationLog the speculation log to be used
186 * @param isDefault specifies if the installed code should be made the default implementation of
187 * {@code compRequest.getMethod()}. The default implementation for a method is the
188 * code executed for standard calls to the method. This argument is ignored if
189 * {@code compRequest == null}.
190 * @param context a custom debug context to use for the code installation
191 * @return a reference to the compiled and ready-to-run installed code
192 * @throws BailoutException if the code installation failed
193 */
194 @SuppressWarnings("try")
195 public InstalledCode createInstalledCode(DebugContext debug, ResolvedJavaMethod method, CompilationRequest compilationRequest, CompilationResult compilationResult,
196 SpeculationLog speculationLog, InstalledCode predefinedInstalledCode, boolean isDefault, Object[] context) {
197 Object[] debugContext = context != null ? context : new Object[]{getProviders().getCodeCache(), method, compilationResult};
198 CodeInstallationTask[] tasks;
199 synchronized (this) {
200 tasks = new CodeInstallationTask[codeInstallationTaskFactories.size()];
201 for (int i = 0; i < codeInstallationTaskFactories.size(); i++) {
202 tasks[i] = codeInstallationTaskFactories.get(i).create();
203 }
204 }
205 try (DebugContext.Scope s2 = debug.scope("CodeInstall", debugContext);
206 DebugContext.Activation a = debug.activate()) {
207 for (CodeInstallationTask task : tasks) {
208 task.preProcess(compilationResult);
209 }
210
211 CompiledCode compiledCode = createCompiledCode(method, compilationRequest, compilationResult);
212 InstalledCode installedCode = getProviders().getCodeCache().installCode(method, compiledCode, predefinedInstalledCode, speculationLog, isDefault);
213
214 // Run post-code installation tasks.
215 try {
216 for (CodeInstallationTask task : tasks) {
217 task.postProcess(installedCode);
218 }
219 for (CodeInstallationTask task : tasks) {
220 task.releaseInstallation(installedCode);
221 }
222 } catch (Throwable t) {
223 installedCode.invalidate();
|