csharp: Fix wrapping of private classes

Summary:
Sometimes, valid Eo objects of private classes can be returned from
methods. Currently we try to wrap in a minimal `Efl.Object` instance,
but as it is an abstract class, we can't instantiate directly.

This commits adds a dummy `Efl.ObjectRealized` to be instantiated when
wrapping such classes alongside a test case.

Fixes: T8258

Reviewers: felipealmeida, brunobelo, segfaultxavi, Jaehyun_Cho

Reviewed By: brunobelo

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D10101
This commit is contained in:
Lauro Moura 2019-09-24 11:36:34 -03:00
parent 351072711c
commit 2e7b508312
9 changed files with 56 additions and 2 deletions

View File

@ -413,4 +413,15 @@ public abstract class EoWrapper : IWrapper, IDisposable
} // namespace Eo
/// <summary>Concrete realization of Efl.Object.
///
/// Some legacy classes (like Evas.Canvas) may be returned by some methods. As these classes are not bound, we
/// allow minimal interaction with them through <see cref="Efl.Object" />.
///
/// But as <see cref="Efl.Object" /> is abstract, whis realized class will allow us to create C# instances of it.</summary>
internal class ObjectRealized : Efl.Object
{
protected ObjectRealized(Efl.Eo.Globals.WrappingHandle ch) : base(ch) { }
}
} // namespace Efl

View File

@ -843,7 +843,7 @@ public static class ClassRegister
if (t == null)
{
return typeof(Efl.Object);
return typeof(Efl.ObjectRealized);
}
}

View File

@ -621,4 +621,15 @@ class TestStaticInterfaceMembers
}
}
class TestHiddenClasses
{
public static void test_hidden_class()
{
var obj = new Dummy.TestObject();
var hidden = obj.HiddenObject;
Test.AssertEquals(hidden.Name, "hidden_object");
}
}
}

View File

@ -0,0 +1,8 @@
#include "libefl_mono_native_test.h"
typedef struct Dummy_Hidden_Object_Data
{
} Dummy_Hidden_Object_Data;
#include "dummy_hidden_object.eo.c"

View File

@ -0,0 +1,2 @@
class Dummy.Hidden_Object extends Efl.Object {
}

View File

@ -22,6 +22,7 @@ typedef struct Dummy_Test_Object_Data
Eo *iface_provider;
int prop1;
int prop2;
Eo *hidden_object;
// Containers passed to C# as iterator/accessors
Eina_Array *out_array;
@ -75,6 +76,8 @@ _dummy_test_object_efl_object_constructor(Eo *obj, Dummy_Test_Object_Data *pd)
{
efl_constructor(efl_super(obj, DUMMY_TEST_OBJECT_CLASS));
pd->provider = efl_add(DUMMY_NUMBERWRAPPER_CLASS, obj);
pd->hidden_object = efl_add(DUMMY_HIDDEN_OBJECT_CLASS, obj);
efl_name_set(pd->hidden_object, "hidden_object");
if (efl_parent_get(obj) == NULL) { // Avoid recursion
pd->iface_provider = efl_add(DUMMY_TEST_OBJECT_CLASS, obj);
@ -4738,6 +4741,11 @@ int _dummy_test_object_dummy_test_iface_call_method_protected(const Eo *obj, EIN
return dummy_test_iface_method_protected(obj, x);
}
Eo *_dummy_test_object_hidden_object_get(EINA_UNUSED const Eo *obj, Dummy_Test_Object_Data *pd)
{
return pd->hidden_object;
}
// Inherit
int _dummy_inherit_helper_receive_dummy_and_call_int_out(Dummy_Test_Object *x)
{

View File

@ -1646,6 +1646,14 @@ class Dummy.Test_Object extends Efl.Object implements Dummy.Test_Iface {
}
return: const(ptr(Eina.Value_Type));
}
@property hidden_object {
get {}
values {
obj: Efl.Object;
}
}
}
implements {
Efl.Object.constructor;

View File

@ -56,6 +56,7 @@
#include "dummy_part_holder.eo.h"
#include "dummy_event_manager.eo.h"
#include "dummy_constructible_object.eo.h"
#include "dummy_hidden_object.eo.h"
#include <interfaces/efl_part.eo.h>

View File

@ -10,9 +10,13 @@ eo_files = [
'dummy_constructible_object.eo',
]
private_eo_files = [
'dummy_hidden_object.eo'
]
eo_file_targets = []
foreach eo_file : eo_files
foreach eo_file : eo_files + private_eo_files
eo_file_targets += custom_target('eolian_gen_' + eo_file,
input : eo_file,
output : [eo_file + '.h'],
@ -35,6 +39,7 @@ efl_mono_native_test = library('efl_mono_native_test',
'dummy_test_object.c',
'dummy_event_manager.c',
'dummy_constructible_object.c',
'dummy_hidden_object.c',
],
dependencies : [ecore, eo, efl],
)