[vm/concurrency] Allow code to be already installed when arriving in CompileFunction runtime entry
Issue https://github.com/dart-lang/sdk/issues/36097
TEST=Tests using --enable-isolate-groups with JIT sharing.
Change-Id: I155eef4731312f55f6c14a81aa0333cb84b70131
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175300
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 2c54ec6..3e142f4 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -211,17 +211,15 @@
DEFINE_RUNTIME_ENTRY(CompileFunction, 1) {
ASSERT(thread->IsMutatorThread());
const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
- Object& result = Object::Handle(zone);
- ASSERT(!function.HasCode());
- result = Compiler::CompileFunction(thread, function);
- if (result.IsError()) {
- if (result.IsLanguageError()) {
- Exceptions::ThrowCompileTimeError(LanguageError::Cast(result));
- UNREACHABLE();
- }
- Exceptions::PropagateError(Error::Cast(result));
- }
+ // In single-isolate scenarios the lazy compile stub is only invoked if
+ // there's no existing code. In multi-isolate scenarios with shared JITed code
+ // we can end up in the lazy compile runtime entry here with code being
+ // installed.
+ ASSERT(!function.HasCode() || FLAG_enable_isolate_groups);
+
+ // Will throw if compilation failed (e.g. with compile-time error).
+ function.EnsureHasCode();
}
bool Compiler::CanOptimizeFunction(Thread* thread, const Function& function) {