void getNativeField(Dart_NativeArguments args, int index, T** value) { Dart_Handle handle = Dart_GetNativeArgument(args, index); assert(Dart_IsInstance(handle)); std::intptr_t ptr; Dart_GetNativeInstanceField(handle, 0, &ptr); *value = reinterpret_cast<T*>(ptr); }
gboolean _gdart_marshaller_check_argument_object( GdartBridgeContext *self, Dart_Handle element, gpointer type, const ObjectInfoKlass *type_klass, Dart_Handle *dart_error_out, GError **error) { Dart_Handle base_object_class, temp_result, inner_container, name_handle; bool is_proper_type; RawPointerContainer* raw_pointer; GdartBridgeContextWrappedObject* object_info; GObject* object; GType gtype; GIInfoType object_info_type; base_object_class = gdart_bridge_context_get_base_object_class(self, dart_error_out, error); if (base_object_class == NULL) { return false; } if (Dart_IsNull(element)) { return TRUE; } temp_result = Dart_ObjectIsType(element, base_object_class, &is_proper_type); if (Dart_IsError(temp_result)) { *dart_error_out = temp_result; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); goto error; } if (!is_proper_type) { *dart_error_out = gdart_bridge_context_create_error_handle(self, "%s: received an unexpected base info type", G_STRFUNC); g_set_error(error, GDART_ERROR, 1, "%s: received an unexpected base info type", G_STRFUNC); goto error; } name_handle = Dart_NewStringFromCString("_internal"); if (Dart_IsError(name_handle)) { *dart_error_out = name_handle; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); return FALSE; } inner_container = Dart_GetField(element, name_handle); if (Dart_IsError(inner_container)) { *dart_error_out = inner_container; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); return FALSE; } temp_result = Dart_GetNativeInstanceField(inner_container, 0, (intptr_t*) &raw_pointer); if (Dart_IsError(temp_result)) { *dart_error_out = temp_result; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); return FALSE; } object_info = (GdartBridgeContextWrappedObject*) raw_pointer->raw_pointer; if (!object_info->object_info_klass.get_type(object_info->object_info, self, &object_info_type, dart_error_out, error)) return FALSE; if (object_info_type != GI_INFO_TYPE_OBJECT) { *dart_error_out = gdart_bridge_context_create_error_handle(self, "%s: expected an object but got a struct", G_STRFUNC); g_set_error(error, GDART_ERROR, 1, "%s: expected an object but got a struct", G_STRFUNC); goto error; } object = (GObject*) object_info->object; if (!type_klass->get_gtype(type, self, >ype, dart_error_out, error)) return FALSE; if (!g_type_is_a(G_OBJECT_TYPE(object), gtype)) { *dart_error_out = gdart_bridge_context_create_error_handle(self, "%s: expected an object of one type but got another", G_STRFUNC); g_set_error(error, GDART_ERROR, 1, "%s: expected an object of one type but got another", G_STRFUNC); goto error; } return TRUE; error: return FALSE; }
gboolean _gdart_marshaller_check_argument_struct_from_gtype( GdartBridgeContext *self, Dart_Handle element, GType type, Dart_Handle *dart_error_out, GError **error) { Dart_Handle base_object_class, temp_result, inner_container, name_handle; bool is_proper_type; RawPointerContainer* raw_pointer; GdartBridgeContextWrappedObject* object_info; base_object_class = gdart_bridge_context_get_base_object_class(self, dart_error_out, error); if (base_object_class == NULL) { return false; } if (Dart_IsNull(element)) { return TRUE; } temp_result = Dart_ObjectIsType(element, base_object_class, &is_proper_type); if (Dart_IsError(temp_result)) { *dart_error_out = temp_result; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); goto error; } if (!is_proper_type) { *dart_error_out = gdart_bridge_context_create_error_handle(self, "%s: received an unexpected base info type", G_STRFUNC); g_set_error(error, GDART_ERROR, 1, "%s: received an unexpected base info type", G_STRFUNC); goto error; } name_handle = Dart_NewStringFromCString("_internal"); if (Dart_IsError(name_handle)) { *dart_error_out = name_handle; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); return FALSE; } inner_container = Dart_GetField(element, name_handle); if (Dart_IsError(inner_container)) { *dart_error_out = inner_container; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); return FALSE; } temp_result = Dart_GetNativeInstanceField(inner_container, 0, (intptr_t*) &raw_pointer); if (Dart_IsError(temp_result)) { *dart_error_out = temp_result; g_set_error(error, GDART_ERROR, 1, "Error from Dart operation."); return FALSE; } object_info = (GdartBridgeContextWrappedObject*) raw_pointer->raw_pointer; /* TODO: This is super-unreliable because there is no way to trust the gtype * given. * if (object_info->type != type) { *dart_error_out = gdart_bridge_context_create_error_handle(self, "%s: got an argument of the wrong type. This might be due to a problem in the GIR file", G_STRFUNC); g_set_error(error, GDART_ERROR, 1, "%s: got an argument of the wrong type. This might be due to a problem in the GIR file", G_STRFUNC); goto error; } */ return TRUE; error: return FALSE; }