Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(636)

Unified Diff: runtime/vm/simulator_dbc.cc

Issue 2793163002: Do not embed is_auto_setup_scope into the compilation of native calls. (Closed)
Patch Set: . Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/simulator_dbc.cc
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index b7a43e059d172277589908f794133e4df36c46c7..a8037836bee61b2b49c966a421b49de460325845 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -930,10 +930,10 @@ static DART_NOINLINE bool InvokeRuntime(Thread* thread,
}
-static DART_NOINLINE bool InvokeNative(Thread* thread,
- Simulator* sim,
- SimulatorBootstrapNativeCall f,
- NativeArguments* args) {
+static DART_NOINLINE bool InvokeBootstrapNative(Thread* thread,
+ Simulator* sim,
+ SimulatorBootstrapNativeCall f,
+ NativeArguments* args) {
SimulatorSetjmpBuffer buffer(sim);
if (!setjmp(buffer.buffer_)) {
thread->set_vm_tag(reinterpret_cast<uword>(f));
@@ -947,15 +947,33 @@ static DART_NOINLINE bool InvokeNative(Thread* thread,
}
-static DART_NOINLINE bool InvokeNativeWrapper(Thread* thread,
- Simulator* sim,
- Dart_NativeFunction f,
- NativeArguments* args) {
+static DART_NOINLINE bool InvokeNativeNoScopeWrapper(Thread* thread,
+ Simulator* sim,
+ Dart_NativeFunction f,
+ NativeArguments* args) {
SimulatorSetjmpBuffer buffer(sim);
if (!setjmp(buffer.buffer_)) {
thread->set_vm_tag(reinterpret_cast<uword>(f));
- NativeEntry::NativeCallWrapper(reinterpret_cast<Dart_NativeArguments>(args),
- f);
+ NativeEntry::NoScopeNativeCallWrapper(
+ reinterpret_cast<Dart_NativeArguments>(args), f);
+ thread->set_vm_tag(VMTag::kDartTagId);
+ thread->set_top_exit_frame_info(0);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
+static DART_NOINLINE bool InvokeNativeAutoScopeWrapper(Thread* thread,
+ Simulator* sim,
+ Dart_NativeFunction f,
+ NativeArguments* args) {
+ SimulatorSetjmpBuffer buffer(sim);
+ if (!setjmp(buffer.buffer_)) {
+ thread->set_vm_tag(reinterpret_cast<uword>(f));
+ NativeEntry::AutoScopeNativeCallWrapper(
+ reinterpret_cast<Dart_NativeArguments>(args), f);
thread->set_vm_tag(VMTag::kDartTagId);
thread->set_top_exit_frame_info(0);
return true;
@@ -1092,13 +1110,18 @@ static DART_NOINLINE bool InvokeNativeWrapper(Thread* thread,
HANDLE_EXCEPTION; \
}
-#define INVOKE_NATIVE(Func, Args) \
- if (!InvokeNative(thread, this, Func, &Args)) { \
+#define INVOKE_BOOTSTRAP_NATIVE(Func, Args) \
+ if (!InvokeBootstrapNative(thread, this, Func, &Args)) { \
+ HANDLE_EXCEPTION; \
+ }
+
+#define INVOKE_NATIVE_NO_SCOPE(Func, Args) \
+ if (!InvokeNativeNoScopeWrapper(thread, this, Func, &Args)) { \
HANDLE_EXCEPTION; \
}
-#define INVOKE_NATIVE_WRAPPER(Func, Args) \
- if (!InvokeNativeWrapper(thread, this, Func, &Args)) { \
+#define INVOKE_NATIVE_AUTO_SCOPE(Func, Args) \
+ if (!InvokeNativeAutoScopeWrapper(thread, this, Func, &Args)) { \
HANDLE_EXCEPTION; \
}
@@ -1894,13 +1917,33 @@ RawObject* Simulator::Call(const Code& code,
SP[-1] = null_value;
Exit(thread, FP, SP + 1, pc);
NativeArguments args(thread, argc_tag, incoming_args, SP - 1);
- INVOKE_NATIVE(native_target, args);
+ INVOKE_BOOTSTRAP_NATIVE(native_target, args);
+ SP -= 1;
+ DISPATCH();
+ }
+
+ {
+ BYTECODE(NativeNoScopeCall, 0);
+ RawFunction* function = FrameFunction(FP);
+ RawObject** incoming_args =
+ (function->ptr()->num_optional_parameters_ == 0)
+ ? FrameArguments(FP, function->ptr()->num_fixed_parameters_)
+ : FP;
+
+ Dart_NativeFunction native_target =
+ reinterpret_cast<Dart_NativeFunction>(SP[-1]);
+ intptr_t argc_tag = reinterpret_cast<intptr_t>(SP[-0]);
+ SP[-0] = 0; // argc_tag is not smi tagged!
+ SP[-1] = null_value;
+ Exit(thread, FP, SP + 1, pc);
+ NativeArguments args(thread, argc_tag, incoming_args, SP - 1);
+ INVOKE_NATIVE_NO_SCOPE(native_target, args);
SP -= 1;
DISPATCH();
}
{
- BYTECODE(NativeCall, 0);
+ BYTECODE(NativeAutoScopeCall, 0);
RawFunction* function = FrameFunction(FP);
RawObject** incoming_args =
(function->ptr()->num_optional_parameters_ == 0)
@@ -1914,7 +1957,7 @@ RawObject* Simulator::Call(const Code& code,
SP[-1] = null_value;
Exit(thread, FP, SP + 1, pc);
NativeArguments args(thread, argc_tag, incoming_args, SP - 1);
- INVOKE_NATIVE_WRAPPER(native_target, args);
+ INVOKE_NATIVE_AUTO_SCOPE(native_target, args);
SP -= 1;
DISPATCH();
}

Powered by Google App Engine
This is Rietveld 408576698