summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLauro Moura <lauromoura@expertisesolutions.com.br>2018-12-14 20:39:09 -0200
committerVitor Sousa <vitorsousa@expertisesolutions.com.br>2018-12-14 20:47:46 -0200
commit9603cc07eb6e04bec8aef6b4facf9865d9b9a479 (patch)
treee230baf664529d2d312b36f59795e027f3def6e7 /src
parentdd5c23035312f5da3358cb30ec9359e40314e0ad (diff)
efl-mono: Fix call of virtual methods after new API
Summary: After the new API, the virtual wrapper classes (*NativeInherit) just declared the wrappers for the current class. But as they didn't have any inheritance information, reimplementing methods from a parent Eo class wouldn't work. (e.g. Efl.Ui.Button reimplementing Efl.Object FinalizeAdd). This commit changes these NativeInherit classes to mimic the inheritance chain of their regular/abstract counterparts, reusing the virtual wrapper implementations. In order to access the correct Eo class created, the methods on it were changed from static to instance methods. The instance will be held as a class member of the regular/abstract API class to keep the delegates alive and allow getting C Function pointers from them. The class_initializer method was also split in two. The method collecting the wrapper delegates was extracted in order to call the parent ones. Also avoid exception in cached strings queries as TryGetValue requires non-null keys. Test Plan: Run test suite. Reviewers: vitor.sousa, felipealmeida Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D7460
Diffstat (limited to 'src')
-rw-r--r--src/bin/eolian_mono/eolian/mono/function_definition.hh15
-rw-r--r--src/bin/eolian_mono/eolian/mono/function_helpers.hh2
-rw-r--r--src/bin/eolian_mono/eolian/mono/function_registration.hh10
-rw-r--r--src/bin/eolian_mono/eolian/mono/klass.hh40
-rw-r--r--src/bin/eolian_mono/eolian/mono/name_helpers.hh6
-rw-r--r--src/bin/eolian_mono/eolian_mono.cc1
-rw-r--r--src/bindings/mono/eo_mono/iwrapper.cs8
-rw-r--r--src/tests/efl_mono/Eo.cs35
-rw-r--r--src/tests/efl_mono/libefl_mono_native_test.c26
9 files changed, 124 insertions, 19 deletions
diff --git a/src/bin/eolian_mono/eolian/mono/function_definition.hh b/src/bin/eolian_mono/eolian/mono/function_definition.hh
index 2821360a04..756136007c 100644
--- a/src/bin/eolian_mono/eolian/mono/function_definition.hh
+++ b/src/bin/eolian_mono/eolian/mono/function_definition.hh
@@ -75,7 +75,7 @@ struct native_function_definition_generator
75 75
76 if(!as_generator 76 if(!as_generator
77 (scope_tab 77 (scope_tab
78 << " private static " 78 << " private "
79 << eolian_mono::marshall_type(true) << " " 79 << eolian_mono::marshall_type(true) << " "
80 << string 80 << string
81 << "(System.IntPtr obj, System.IntPtr pd" 81 << "(System.IntPtr obj, System.IntPtr pd"
@@ -98,7 +98,7 @@ struct native_function_definition_generator
98 << eolian_mono::native_function_definition_epilogue(*klass) 98 << eolian_mono::native_function_definition_epilogue(*klass)
99 << scope_tab << scope_tab << "} else {\n" 99 << scope_tab << scope_tab << "} else {\n"
100 << scope_tab << scope_tab << scope_tab << (return_type != " void" ? "return " : "") << string 100 << scope_tab << scope_tab << scope_tab << (return_type != " void" ? "return " : "") << string
101 << "(Efl.Eo.Globals.efl_super(obj, " << klass_inherit_name << ".klass)" << *(", " << argument) << ");\n" 101 << "(Efl.Eo.Globals.efl_super(obj, " << "EoKlass)" << *(", " << argument) << ");\n"
102 << scope_tab << scope_tab << "}\n" 102 << scope_tab << scope_tab << "}\n"
103 << scope_tab << "}\n" 103 << scope_tab << "}\n"
104 ) 104 )
@@ -114,13 +114,10 @@ struct native_function_definition_generator
114 , context)) 114 , context))
115 return false; 115 return false;
116 116
117 if(!as_generator 117 // This is the delegate that will be passed to Eo to be called from C.
118 (scope_tab << "private static " 118 if(!as_generator(
119 << string 119 scope_tab << "private " << f.c_name << "_delegate " << f.c_name << "_static_delegate;\n"
120 << "_delegate " 120 ).generate(sink, attributes::unused, context))
121 << string << "_static_delegate = new " << string << "_delegate(" << name_helpers::klass_native_inherit_name(*klass) << "." << string << ");\n"
122 )
123 .generate(sink, std::make_tuple(f.c_name, f.c_name, f.c_name, escape_keyword(f.name)), context))
124 return false; 121 return false;
125 return true; 122 return true;
126 } 123 }
diff --git a/src/bin/eolian_mono/eolian/mono/function_helpers.hh b/src/bin/eolian_mono/eolian/mono/function_helpers.hh
index 06bf5d44ec..017ddad9d8 100644
--- a/src/bin/eolian_mono/eolian/mono/function_helpers.hh
+++ b/src/bin/eolian_mono/eolian/mono/function_helpers.hh
@@ -41,7 +41,7 @@ struct native_function_definition_preamble_generator
41 ).generate(sink, std::make_tuple(f.parameters, f.parameters, f.parameters, f.return_type), context)) 41 ).generate(sink, std::make_tuple(f.parameters, f.parameters, f.parameters, f.return_type), context))
42 return false; 42 return false;
43 43
44 return true; 44 return as_generator("\n").generate(sink, attributes::unused, context);
45 } 45 }
46}; 46};
47 47
diff --git a/src/bin/eolian_mono/eolian/mono/function_registration.hh b/src/bin/eolian_mono/eolian/mono/function_registration.hh
index e8a41047f9..0b8da4a05a 100644
--- a/src/bin/eolian_mono/eolian/mono/function_registration.hh
+++ b/src/bin/eolian_mono/eolian/mono/function_registration.hh
@@ -35,14 +35,20 @@ struct function_registration_generator
35 else 35 else
36 { 36 {
37 auto index = index_generator(); 37 auto index = index_generator();
38 38
39 if(!as_generator(
40 scope_tab << scope_tab << f.c_name << "_static_delegate = new " << f.c_name << "_delegate(" <<
41 escape_keyword(f.name) << ");\n"
42 ).generate(sink, attributes::unused, context))
43 return false;
44
39 if(!as_generator 45 if(!as_generator
40#ifdef _WIN32 46#ifdef _WIN32
41 (scope_tab << scope_tab << "descs[" << index << "].api_func = Marshal.StringToHGlobalAnsi(\"" << string << "\");\n" 47 (scope_tab << scope_tab << "descs[" << index << "].api_func = Marshal.StringToHGlobalAnsi(\"" << string << "\");\n"
42#else 48#else
43 (scope_tab << scope_tab << "descs[" << index << "].api_func = Efl.Eo.Globals.dlsym(Efl.Eo.Globals.RTLD_DEFAULT, \"" << string << "\");\n" 49 (scope_tab << scope_tab << "descs[" << index << "].api_func = Efl.Eo.Globals.dlsym(Efl.Eo.Globals.RTLD_DEFAULT, \"" << string << "\");\n"
44#endif 50#endif
45 << scope_tab << scope_tab << "descs[" << index << "].func = Marshal.GetFunctionPointerForDelegate(" << name_helpers::klass_native_inherit_name(*klass) << "." << string << "_static_delegate);\n" 51 << scope_tab << scope_tab << "descs[" << index << "].func = Marshal.GetFunctionPointerForDelegate(" << string << "_static_delegate);\n"
46 ) 52 )
47 .generate(sink, std::make_tuple(f.c_name, f.c_name), context)) 53 .generate(sink, std::make_tuple(f.c_name, f.c_name), context))
48 return false; 54 return false;
diff --git a/src/bin/eolian_mono/eolian/mono/klass.hh b/src/bin/eolian_mono/eolian/mono/klass.hh
index f10c3a38d4..90133291a8 100644
--- a/src/bin/eolian_mono/eolian/mono/klass.hh
+++ b/src/bin/eolian_mono/eolian/mono/klass.hh
@@ -357,10 +357,19 @@ struct klass
357 { 357 {
358 auto inative_cxt = context_add_tag(class_context{class_context::inherit_native}, context); 358 auto inative_cxt = context_add_tag(class_context{class_context::inherit_native}, context);
359 auto native_inherit_name = name_helpers::klass_native_inherit_name(cls); 359 auto native_inherit_name = name_helpers::klass_native_inherit_name(cls);
360 auto inherit_name = name_helpers::klass_inherit_name(cls);
361 std::string base_name;
362 if(!root)
363 {
364 attributes::klass_def parent_klass(get_klass(*cls.parent, cls.unit), cls.unit);
365 base_name = name_helpers::klass_full_native_inherit_name(parent_klass);
366 }
367
360 if(!as_generator 368 if(!as_generator
361 ( 369 (
362 "internal " << class_type << " " << native_inherit_name << " {\n" 370 "public " << class_type << " " << native_inherit_name << " " << (root ? "" : (": " + base_name)) <<"{\n"
363 << scope_tab << "public static byte class_initializer(IntPtr klass)\n" 371 << scope_tab << (root ? "protected IntPtr EoKlass { get; set; }\n" : "\n")
372 << scope_tab << "public " << (root ? "" : "new ") << "Efl_Op_Description[] GetEoOps()\n"
364 << scope_tab << "{\n" 373 << scope_tab << "{\n"
365 << scope_tab << scope_tab << "Efl_Op_Description[] descs = new Efl_Op_Description[" << grammar::int_ << "];\n" 374 << scope_tab << scope_tab << "Efl_Op_Description[] descs = new Efl_Op_Description[" << grammar::int_ << "];\n"
366 ) 375 )
@@ -371,20 +380,35 @@ struct klass
371 if(!as_generator(*(function_registration(index_generator, cls))) 380 if(!as_generator(*(function_registration(index_generator, cls)))
372 .generate(sink, helpers::get_all_implementable_methods(cls), inative_cxt)) return false; 381 .generate(sink, helpers::get_all_implementable_methods(cls), inative_cxt)) return false;
373 382
383 if(!root)
384 if(!as_generator(scope_tab << scope_tab << "descs = descs.Concat(base.GetEoOps()).ToArray();\n").generate(sink, attributes::unused, inative_cxt))
385 return false;
386
387 if(!as_generator(
388 scope_tab << scope_tab << "return descs;\n"
389 << scope_tab << "}\n"
390 ).generate(sink, attributes::unused, inative_cxt))
391 return false;
392
374 if(!as_generator 393 if(!as_generator
375 ( scope_tab << scope_tab << "IntPtr descs_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(descs[0])*" << function_count << ");\n" 394 (scope_tab << "public " << (root ? "" : "new " ) << "byte class_initializer(IntPtr klass)\n"
395 << scope_tab << "{\n"
396 << scope_tab << scope_tab << "var descs = GetEoOps();\n"
397 << scope_tab << scope_tab << "var count = descs.Length;\n"
398 << scope_tab << scope_tab << "IntPtr descs_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(descs[0])*count);\n"
376 << scope_tab << scope_tab << "IntPtr ptr = descs_ptr;\n" 399 << scope_tab << scope_tab << "IntPtr ptr = descs_ptr;\n"
377 << scope_tab << scope_tab << "for(int i = 0; i != " << function_count << "; ++i)\n" 400 << scope_tab << scope_tab << "for(int i = 0; i != count; ++i)\n"
378 << scope_tab << scope_tab << "{\n" 401 << scope_tab << scope_tab << "{\n"
379 << scope_tab << scope_tab << scope_tab << "Marshal.StructureToPtr(descs[i], ptr, false);\n" 402 << scope_tab << scope_tab << scope_tab << "Marshal.StructureToPtr(descs[i], ptr, false);\n"
380 << scope_tab << scope_tab << scope_tab << "ptr = IntPtr.Add(ptr, Marshal.SizeOf(descs[0]));\n" 403 << scope_tab << scope_tab << scope_tab << "ptr = IntPtr.Add(ptr, Marshal.SizeOf(descs[0]));\n"
381 << scope_tab << scope_tab << "}\n" 404 << scope_tab << scope_tab << "}\n"
382 << scope_tab << scope_tab << "Efl_Object_Ops ops;\n" 405 << scope_tab << scope_tab << "Efl_Object_Ops ops;\n"
383 << scope_tab << scope_tab << "ops.descs = descs_ptr;\n" 406 << scope_tab << scope_tab << "ops.descs = descs_ptr;\n"
384 << scope_tab << scope_tab << "ops.count = (UIntPtr)" << function_count << ";\n" 407 << scope_tab << scope_tab << "ops.count = (UIntPtr)count;\n"
385 << scope_tab << scope_tab << "IntPtr ops_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ops));\n" 408 << scope_tab << scope_tab << "IntPtr ops_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ops));\n"
386 << scope_tab << scope_tab << "Marshal.StructureToPtr(ops, ops_ptr, false);\n" 409 << scope_tab << scope_tab << "Marshal.StructureToPtr(ops, ops_ptr, false);\n"
387 << scope_tab << scope_tab << "Efl.Eo.Globals.efl_class_functions_set(klass, ops_ptr, IntPtr.Zero);\n" 410 << scope_tab << scope_tab << "Efl.Eo.Globals.efl_class_functions_set(klass, ops_ptr, IntPtr.Zero);\n"
411 << scope_tab << scope_tab << "EoKlass = klass;\n"
388 ).generate(sink, attributes::unused, inative_cxt)) return false; 412 ).generate(sink, attributes::unused, inative_cxt)) return false;
389 413
390 414
@@ -413,6 +437,7 @@ struct klass
413 bool is_inherit = is_inherit_context(context); 437 bool is_inherit = is_inherit_context(context);
414 438
415 std::string class_getter = "return Efl.Eo.Globals.efl_class_get(handle);"; 439 std::string class_getter = "return Efl.Eo.Globals.efl_class_get(handle);";
440 std::string native_inherit_full_name = name_helpers::klass_full_native_inherit_name(cls);
416 441
417 // The klass field is static but there is no problem if multiple C# classes inherit from this generated one 442 // The klass field is static but there is no problem if multiple C# classes inherit from this generated one
418 // as it is just a simple wrapper, forwarding the Eo calls either to the user API (where C#'s virtual method 443 // as it is just a simple wrapper, forwarding the Eo calls either to the user API (where C#'s virtual method
@@ -421,6 +446,7 @@ struct klass
421 { 446 {
422 if(!as_generator( 447 if(!as_generator(
423 scope_tab << "public " << (root ? "" : "new ") << "static System.IntPtr klass = System.IntPtr.Zero;\n" 448 scope_tab << "public " << (root ? "" : "new ") << "static System.IntPtr klass = System.IntPtr.Zero;\n"
449 << scope_tab << "public " << (root ? "" : "new ") << "static " << native_inherit_full_name << " nativeInherit = new " << native_inherit_full_name << "();\n"
424 ).generate(sink, attributes::unused, context)) 450 ).generate(sink, attributes::unused, context))
425 return false; 451 return false;
426 class_getter = "return klass;"; 452 class_getter = "return klass;";
@@ -493,7 +519,7 @@ struct klass
493 scope_tab << "///<summary>Creates a new instance.</summary>\n" 519 scope_tab << "///<summary>Creates a new instance.</summary>\n"
494 << scope_tab << "///<param name=\"parent\">Parent instance.</param>\n" 520 << scope_tab << "///<param name=\"parent\">Parent instance.</param>\n"
495 << scope_tab << "///<param name=\"init_cb\">Delegate to call constructing methods that should be run inside the constructor.</param>\n" 521 << scope_tab << "///<param name=\"init_cb\">Delegate to call constructing methods that should be run inside the constructor.</param>\n"
496 << scope_tab << "public " << inherit_name << "(Efl.Object parent = null, ConstructingMethod init_cb=null) : base(" << native_inherit_name << ".class_initializer, \"" << inherit_name << "\", " << name_helpers::klass_get_name(cls) << "(), typeof(" << inherit_name << "), parent, ref klass)\n" 522 << scope_tab << "public " << inherit_name << "(Efl.Object parent = null, ConstructingMethod init_cb=null) : base(nativeInherit.class_initializer, \"" << inherit_name << "\", " << name_helpers::klass_get_name(cls) << "(), typeof(" << inherit_name << "), parent, ref klass)\n"
497 << scope_tab << "{\n" 523 << scope_tab << "{\n"
498 << scope_tab << scope_tab << "if (init_cb != null) {\n" 524 << scope_tab << scope_tab << "if (init_cb != null) {\n"
499 << scope_tab << scope_tab << scope_tab << "init_cb(this);\n" 525 << scope_tab << scope_tab << scope_tab << "init_cb(this);\n"
@@ -518,7 +544,7 @@ struct klass
518 scope_tab << "///<summary>Creates a new instance.</summary>\n" 544 scope_tab << "///<summary>Creates a new instance.</summary>\n"
519 << scope_tab << "///<param name=\"parent\">Parent instance.</param>\n" 545 << scope_tab << "///<param name=\"parent\">Parent instance.</param>\n"
520 << scope_tab << "///<param name=\"init_cb\">Delegate to call constructing methods that should be run inside the constructor.</param>\n" 546 << scope_tab << "///<param name=\"init_cb\">Delegate to call constructing methods that should be run inside the constructor.</param>\n"
521 << scope_tab << "public " << inherit_name << "(Efl.Object parent = null, ConstructingMethod init_cb=null) : this(" << native_inherit_name << ".class_initializer, \"" << inherit_name << "\", " << name_helpers::klass_get_name(cls) << "(), typeof(" << inherit_name << "), parent, ref klass)\n" 547 << scope_tab << "public " << inherit_name << "(Efl.Object parent = null, ConstructingMethod init_cb=null) : this(nativeInherit.class_initializer, \"" << inherit_name << "\", " << name_helpers::klass_get_name(cls) << "(), typeof(" << inherit_name << "), parent, ref klass)\n"
522 << scope_tab << "{\n" 548 << scope_tab << "{\n"
523 << scope_tab << scope_tab << "if (init_cb != null) {\n" 549 << scope_tab << scope_tab << "if (init_cb != null) {\n"
524 << scope_tab << scope_tab << scope_tab << "init_cb(this);\n" 550 << scope_tab << scope_tab << scope_tab << "init_cb(this);\n"
diff --git a/src/bin/eolian_mono/eolian/mono/name_helpers.hh b/src/bin/eolian_mono/eolian/mono/name_helpers.hh
index 06291f412c..cfda7229f6 100644
--- a/src/bin/eolian_mono/eolian/mono/name_helpers.hh
+++ b/src/bin/eolian_mono/eolian/mono/name_helpers.hh
@@ -354,6 +354,12 @@ inline std::string klass_native_inherit_name(T const& klass)
354} 354}
355 355
356template<typename T> 356template<typename T>
357inline std::string klass_full_native_inherit_name(T const& klass)
358{
359 return klass_full_concrete_name(klass) + "NativeInherit";
360}
361
362template<typename T>
357inline std::string klass_get_name(T const& clsname) 363inline std::string klass_get_name(T const& clsname)
358{ 364{
359 return utils::to_lowercase(join_namespaces(clsname.namespaces, '_') + clsname.eolian_name + "_class_get"); 365 return utils::to_lowercase(join_namespaces(clsname.namespaces, '_') + clsname.eolian_name + "_class_get");
diff --git a/src/bin/eolian_mono/eolian_mono.cc b/src/bin/eolian_mono/eolian_mono.cc
index 328b983052..2e0e8918cb 100644
--- a/src/bin/eolian_mono/eolian_mono.cc
+++ b/src/bin/eolian_mono/eolian_mono.cc
@@ -131,6 +131,7 @@ run(options_type const& opts)
131 if (!as_generator("using System;\n" 131 if (!as_generator("using System;\n"
132 "using System.Runtime.InteropServices;\n" 132 "using System.Runtime.InteropServices;\n"
133 "using System.Collections.Generic;\n" 133 "using System.Collections.Generic;\n"
134 "using System.Linq;\n"
134 "using System.ComponentModel;\n") 135 "using System.ComponentModel;\n")
135 .generate(iterator, efl::eolian::grammar::attributes::unused, efl::eolian::grammar::context_null())) 136 .generate(iterator, efl::eolian::grammar::attributes::unused, efl::eolian::grammar::context_null()))
136 { 137 {
diff --git a/src/bindings/mono/eo_mono/iwrapper.cs b/src/bindings/mono/eo_mono/iwrapper.cs
index 11e9fa8091..35ee606540 100644
--- a/src/bindings/mono/eo_mono/iwrapper.cs
+++ b/src/bindings/mono/eo_mono/iwrapper.cs
@@ -141,6 +141,10 @@ public class Globals {
141 public static IntPtr cached_string_to_intptr(Dictionary<String, IntPtr> dict, String str) 141 public static IntPtr cached_string_to_intptr(Dictionary<String, IntPtr> dict, String str)
142 { 142 {
143 IntPtr ptr = IntPtr.Zero; 143 IntPtr ptr = IntPtr.Zero;
144
145 if (str == null)
146 return ptr;
147
144 if (!dict.TryGetValue(str, out ptr)) 148 if (!dict.TryGetValue(str, out ptr))
145 { 149 {
146 ptr = Eina.StringConversion.ManagedStringToNativeUtf8Alloc(str); 150 ptr = Eina.StringConversion.ManagedStringToNativeUtf8Alloc(str);
@@ -153,6 +157,10 @@ public class Globals {
153 public static IntPtr cached_stringshare_to_intptr(Dictionary<String, IntPtr> dict, String str) 157 public static IntPtr cached_stringshare_to_intptr(Dictionary<String, IntPtr> dict, String str)
154 { 158 {
155 IntPtr ptr = IntPtr.Zero; 159 IntPtr ptr = IntPtr.Zero;
160
161 if (str == null)
162 return ptr;
163
156 if (!dict.TryGetValue(str, out ptr)) 164 if (!dict.TryGetValue(str, out ptr))
157 { 165 {
158 ptr = Eina.Stringshare.eina_stringshare_add(str); 166 ptr = Eina.Stringshare.eina_stringshare_add(str);
diff --git a/src/tests/efl_mono/Eo.cs b/src/tests/efl_mono/Eo.cs
index 7d5df72457..5567f1ef33 100644
--- a/src/tests/efl_mono/Eo.cs
+++ b/src/tests/efl_mono/Eo.cs
@@ -345,4 +345,39 @@ class TestCsharpProperties
345 } 345 }
346} 346}
347 347
348class TestEoGrandChildrenFinalize
349{
350 public sealed class Child : Dummy.TestObject
351 {
352 public int receivedValue = 0;
353 public override Efl.Object FinalizeAdd()
354 {
355 receivedValue = 42;
356 return this;
357 }
358 }
359
360 public static void test_grand_children_finalize()
361 {
362 Child obj = new Child();
363 Test.AssertEquals(42, obj.receivedValue);
364 }
365
366 public sealed class GrandChild : Dummy.Child
367 {
368 public int receivedValue = 0;
369 public override Efl.Object FinalizeAdd()
370 {
371 receivedValue = -42;
372 return this;
373 }
374 }
375
376 public static void test_grand_grand_children_finalize()
377 {
378 GrandChild obj = new GrandChild();
379 Test.AssertEquals(-42, obj.receivedValue);
380 }
381}
382
348} 383}
diff --git a/src/tests/efl_mono/libefl_mono_native_test.c b/src/tests/efl_mono/libefl_mono_native_test.c
index 52876e6859..841c6a92c6 100644
--- a/src/tests/efl_mono/libefl_mono_native_test.c
+++ b/src/tests/efl_mono/libefl_mono_native_test.c
@@ -36,6 +36,7 @@
36 36
37#include "dummy_numberwrapper.eo.h" 37#include "dummy_numberwrapper.eo.h"
38#include "dummy_test_object.eo.h" 38#include "dummy_test_object.eo.h"
39#include "dummy_child.eo.h"
39#include "dummy_test_iface.eo.h" 40#include "dummy_test_iface.eo.h"
40#include "dummy_another_iface.eo.h" 41#include "dummy_another_iface.eo.h"
41 42
@@ -66,6 +67,10 @@ typedef struct Dummy_Numberwrapper_Data
66 int number; 67 int number;
67} Dummy_Numberwrapper_Data; 68} Dummy_Numberwrapper_Data;
68 69
70typedef struct Dummy_Child_Data
71{
72} Dummy_Child_Data;
73
69 74
70static 75static
71void *_new_int(int v) 76void *_new_int(int v)
@@ -3898,8 +3903,29 @@ int _dummy_test_object_dummy_test_iface_iface_prop_get(EINA_UNUSED const Eo *obj
3898 return pd->iface_prop; 3903 return pd->iface_prop;
3899} 3904}
3900 3905
3906/// Dummy.Child
3907static Efl_Object *
3908_dummy_child_efl_object_constructor(Eo *obj, EINA_UNUSED Dummy_Child_Data *pd)
3909{
3910 efl_constructor(efl_super(obj, DUMMY_CHILD_CLASS));
3911 return obj;
3912}
3913
3914EOLIAN static void
3915_dummy_child_class_constructor(Efl_Class *klass)
3916{
3917 (void)klass;
3918}
3919
3920EOLIAN static void
3921_dummy_child_class_destructor(Efl_Class *klass)
3922{
3923 (void)klass;
3924}
3925
3901#include "dummy_test_object.eo.c" 3926#include "dummy_test_object.eo.c"
3902#include "dummy_numberwrapper.eo.c" 3927#include "dummy_numberwrapper.eo.c"
3928#include "dummy_child.eo.c"
3903#include "dummy_test_iface.eo.c" 3929#include "dummy_test_iface.eo.c"
3904#include "dummy_another_iface.eo.c" 3930#include "dummy_another_iface.eo.c"
3905 3931