4679c040c6
Adds a new code path for NativeCallable.isolateLocal invocations. If the current thread is not entered into any isolate, but owns the target isolate, then it enters the target isolate, invokes, then exits the isolate. Fixes: https://github.com/dart-lang/sdk/issues/61623 TEST=tests/ffi/function_callbacks_isolate_ownership_test.dart Change-Id: I401f185fadf7d2a55190dafd15387e1c418c67c9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/452380 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Liam Appelbe <liama@google.com>
126 lines
4.3 KiB
C++
126 lines
4.3 KiB
C++
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_VM_RUNTIME_ENTRY_H_
|
|
#define RUNTIME_VM_RUNTIME_ENTRY_H_
|
|
|
|
#include "vm/allocation.h"
|
|
#if !defined(DART_PRECOMPILED_RUNTIME)
|
|
#include "vm/compiler/runtime_api.h"
|
|
#endif
|
|
#include "vm/native_arguments.h"
|
|
#include "vm/runtime_entry_list.h"
|
|
|
|
namespace dart {
|
|
|
|
typedef void (*RuntimeFunction)(NativeArguments arguments);
|
|
|
|
#if !defined(DART_PRECOMPILED_RUNTIME)
|
|
using BaseRuntimeEntry = compiler::RuntimeEntry;
|
|
#else
|
|
using BaseRuntimeEntry = ValueObject;
|
|
#endif
|
|
|
|
// Class RuntimeEntry is used to encapsulate runtime functions, it includes
|
|
// the entry point for the runtime function and the number of arguments expected
|
|
// by the function.
|
|
class RuntimeEntry : public BaseRuntimeEntry {
|
|
public:
|
|
RuntimeEntry(const char* name,
|
|
const void* function,
|
|
intptr_t argument_count,
|
|
bool is_leaf,
|
|
bool is_float,
|
|
bool can_lazy_deopt)
|
|
:
|
|
#if !defined(DART_PRECOMPILED_RUNTIME)
|
|
compiler::RuntimeEntry(this),
|
|
#endif
|
|
name_(name),
|
|
function_(function),
|
|
argument_count_(argument_count),
|
|
is_leaf_(is_leaf),
|
|
is_float_(is_float),
|
|
can_lazy_deopt_(can_lazy_deopt) {
|
|
}
|
|
|
|
const char* name() const { return name_; }
|
|
const void* function() const { return function_; }
|
|
intptr_t argument_count() const { return argument_count_; }
|
|
bool is_leaf() const { return is_leaf_; }
|
|
bool is_float() const { return is_float_; }
|
|
bool can_lazy_deopt() const { return can_lazy_deopt_; }
|
|
uword GetEntryPoint() const;
|
|
uword GetEntryPointNoRedirect() const {
|
|
return reinterpret_cast<uword>(function());
|
|
}
|
|
|
|
static uword InterpretCallEntry();
|
|
|
|
static constexpr const char* RuntimeEntryNames[] = {
|
|
#define RUNTIME_ENTRY_NAME(name) #name,
|
|
RUNTIME_ENTRY_LIST(RUNTIME_ENTRY_NAME)
|
|
#undef RUNTIME_ENTRY_NAME
|
|
};
|
|
static constexpr const char* LeafRuntimeEntryNames[] = {
|
|
#define LEAF_RUNTIME_ENTRY_NAME(type, name, ...) #name,
|
|
LEAF_RUNTIME_ENTRY_LIST(LEAF_RUNTIME_ENTRY_NAME)
|
|
#undef LEAF_RUNTIME_ENTRY_NAME
|
|
};
|
|
|
|
private:
|
|
const char* const name_;
|
|
const void* const function_;
|
|
const intptr_t argument_count_;
|
|
const bool is_leaf_;
|
|
const bool is_float_;
|
|
const bool can_lazy_deopt_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(RuntimeEntry);
|
|
};
|
|
|
|
#define DECLARE_RUNTIME_ENTRY(name) \
|
|
extern const RuntimeEntry k##name##RuntimeEntry; \
|
|
extern "C" void DRT_##name(NativeArguments arguments);
|
|
|
|
#define DEFINE_LEAF_RUNTIME_ENTRY(name, argument_count, func) \
|
|
extern const RuntimeEntry k##name##RuntimeEntry( \
|
|
"DLRT_" #name, reinterpret_cast<const void*>(func), argument_count, \
|
|
true, false, /*can_lazy_deopt=*/false)
|
|
|
|
#define DEFINE_FLOAT_LEAF_RUNTIME_ENTRY(name, argument_count, func) \
|
|
extern const RuntimeEntry k##name##RuntimeEntry( \
|
|
"DLRT_" #name, reinterpret_cast<const void*>(func), argument_count, \
|
|
true, true, /*can_lazy_deopt=*/false)
|
|
|
|
#define DECLARE_LEAF_RUNTIME_ENTRY(type, name, ...) \
|
|
extern const RuntimeEntry k##name##RuntimeEntry; \
|
|
extern "C" type DLRT_##name(__VA_ARGS__);
|
|
|
|
// Declare all runtime functions here.
|
|
RUNTIME_ENTRY_LIST(DECLARE_RUNTIME_ENTRY)
|
|
LEAF_RUNTIME_ENTRY_LIST(DECLARE_LEAF_RUNTIME_ENTRY)
|
|
|
|
#undef DECLARE_RUNTIME_ENTRY
|
|
#undef DECLARE_LEAF_RUNTIME_ENTRY
|
|
|
|
// See StubCode::GenerateFfiCallbackTrampolineStub.
|
|
extern "C" Thread* DLRT_GetFfiCallbackMetadata(uword trampoline,
|
|
uword* out_entry_point,
|
|
uword* out_callback_kind);
|
|
extern "C" void DLRT_ExitTemporaryIsolate();
|
|
extern "C" void DLRT_ExitIsolateGroupBoundIsolate();
|
|
extern "C" void DLRT_ExitSyncCallbackTargetIsolate();
|
|
|
|
const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason);
|
|
|
|
void DeoptimizeAt(Thread* mutator_thread,
|
|
const Code& optimized_code,
|
|
StackFrame* frame);
|
|
void DeoptimizeFunctionsOnStack();
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_RUNTIME_ENTRY_H_
|