Index: sky/engine/bindings/mojo_natives.cc |
diff --git a/sky/engine/bindings/mojo_natives.cc b/sky/engine/bindings/mojo_natives.cc |
index 5c00b3df56914d3c5d2f865a9f8e0a792c6c49ca..25faf767fdcd3be99c61814d5595457357400601 100644 |
--- a/sky/engine/bindings/mojo_natives.cc |
+++ b/sky/engine/bindings/mojo_natives.cc |
@@ -43,7 +43,7 @@ namespace blink { |
V(MojoMessagePipe_Read, 5) \ |
V(MojoHandle_Close, 1) \ |
V(MojoHandle_Wait, 3) \ |
- V(MojoHandle_Register, 1) \ |
+ V(MojoHandle_Register, 2) \ |
V(MojoHandle_WaitMany, 3) \ |
V(MojoHandleWatcher_SendControlData, 4) \ |
V(MojoHandleWatcher_RecvControlData, 1) \ |
@@ -98,16 +98,13 @@ static void SetInvalidArgumentReturn(Dart_NativeArguments arguments) { |
arguments, static_cast<int64_t>(MOJO_RESULT_INVALID_ARGUMENT)); |
} |
-static Dart_Handle MojoLib() { |
- return DartBuiltin::LookupLibrary("dart:mojo.core"); |
-} |
- |
-static Dart_Handle SignalsStateToDart(Dart_Handle klass, |
- const MojoHandleSignalsState& state) { |
- Dart_Handle arg1 = Dart_NewInteger(state.satisfied_signals); |
- Dart_Handle arg2 = Dart_NewInteger(state.satisfiable_signals); |
- Dart_Handle args[] = {arg1, arg2}; |
- return Dart_New(klass, Dart_Null(), 2, args); |
+static Dart_Handle SignalsStateToDart(const MojoHandleSignalsState& state) { |
+ Dart_Handle list = Dart_NewList(2); |
+ Dart_Handle arg0 = Dart_NewInteger(state.satisfied_signals); |
+ Dart_Handle arg1 = Dart_NewInteger(state.satisfiable_signals); |
+ Dart_ListSetAt(list, 0, arg0); |
+ Dart_ListSetAt(list, 1, arg1); |
+ return list; |
} |
#define CHECK_INTEGER_ARGUMENT(args, num, result, failure) \ |
@@ -135,46 +132,23 @@ static void MojoHandleCloserCallback(void* isolate_data, |
delete callback_peer; |
} |
-// Setup a weak persistent handle for a Dart MojoHandle that calls MojoClose |
-// on the handle when the MojoHandle is GC'd or the VM is going down. |
+// Setup a weak persistent handle for a MojoHandle that calls MojoClose on the |
+// handle when the MojoHandle is GC'd or the VM is going down. |
void MojoHandle_Register(Dart_NativeArguments arguments) { |
- // An instance of Dart class MojoHandle. |
Dart_Handle mojo_handle_instance = Dart_GetNativeArgument(arguments, 0); |
if (!Dart_IsInstance(mojo_handle_instance)) { |
SetInvalidArgumentReturn(arguments); |
return; |
} |
- // TODO(zra): Here, we could check that mojo_handle_instance is really a |
- // MojoHandle instance, but with the Dart API it's not too easy to get a Type |
- // object from the class name outside of the root library. For now, we'll rely |
- // on the existence of the right fields to be sufficient. |
- |
- Dart_Handle raw_mojo_handle_instance = Dart_GetField( |
- mojo_handle_instance, ToDart("_handle")); |
- if (Dart_IsError(raw_mojo_handle_instance)) { |
- SetInvalidArgumentReturn(arguments); |
- return; |
- } |
- |
- Dart_Handle mojo_handle = Dart_GetField( |
- raw_mojo_handle_instance, ToDart("h")); |
- if (Dart_IsError(mojo_handle)) { |
- SetInvalidArgumentReturn(arguments); |
- return; |
- } |
int64_t raw_handle = static_cast<int64_t>(MOJO_HANDLE_INVALID); |
- Dart_Handle result = Dart_IntegerToInt64(mojo_handle, &raw_handle); |
- if (Dart_IsError(result)) { |
- SetInvalidArgumentReturn(arguments); |
- return; |
- } |
- |
+ CHECK_INTEGER_ARGUMENT(arguments, 1, &raw_handle, InvalidArgument); |
if (raw_handle == static_cast<int64_t>(MOJO_HANDLE_INVALID)) { |
SetInvalidArgumentReturn(arguments); |
return; |
} |
+ // Set up a finalizer. |
CloserCallbackPeer* callback_peer = new CloserCallbackPeer(); |
callback_peer->handle = static_cast<MojoHandle>(raw_handle); |
Dart_NewWeakPersistentHandle(mojo_handle_instance, |
@@ -206,17 +180,13 @@ void MojoHandle_Wait(Dart_NativeArguments arguments) { |
static_cast<MojoHandleSignals>(signals), |
static_cast<MojoDeadline>(deadline), &state); |
- Dart_Handle klass = Dart_GetClass( |
- MojoLib(), ToDart("MojoHandleSignalsState")); |
- DART_CHECK_VALID(klass); |
- |
// The return value is structured as a list of length 2: |
// [0] MojoResult |
// [1] MojoHandleSignalsState. (may be null) |
Dart_Handle list = Dart_NewList(2); |
Dart_ListSetAt(list, 0, Dart_NewInteger(r)); |
if (mojo::WaitManyResult(r).AreSignalsStatesValid()) { |
- Dart_ListSetAt(list, 1, SignalsStateToDart(klass, state)); |
+ Dart_ListSetAt(list, 1, SignalsStateToDart(state)); |
} else { |
Dart_ListSetAt(list, 1, Dart_Null()); |
} |
@@ -265,10 +235,6 @@ void MojoHandle_WaitMany(Dart_NativeArguments arguments) { |
mojo::WaitManyResult wmr = mojo::WaitMany( |
mojo_handles, mojo_signals, static_cast<MojoDeadline>(deadline), &states); |
- Dart_Handle klass = Dart_GetClass( |
- MojoLib(), ToDart("MojoHandleSignalsState")); |
- DART_CHECK_VALID(klass); |
- |
// The return value is structured as a list of length 3: |
// [0] MojoResult |
// [1] index of handle that caused a return (may be null) |
@@ -282,7 +248,7 @@ void MojoHandle_WaitMany(Dart_NativeArguments arguments) { |
if (wmr.AreSignalsStatesValid()) { |
Dart_Handle stateList = Dart_NewList(handles_len); |
for (int i = 0; i < handles_len; i++) { |
- Dart_ListSetAt(stateList, i, SignalsStateToDart(klass, states[i])); |
+ Dart_ListSetAt(stateList, i, SignalsStateToDart(states[i])); |
} |
Dart_ListSetAt(list, 2, stateList); |
} else { |