Re: Callback from C to Eiffel
Berend de Boer <[email protected]>
| Newsgroups | gmane.comp.lang.eiffel.gobo.devel |
|---|---|
| Message-ID | <[email protected]> |
>>>>> "Emmanuel" == Emmanuel Stapf [ES] <[email protected]> writes: Emmanuel> The easiest way for doing this kind of callback is to Emmanuel> store the eiffel routine address by doing: Hi Emmanuel, I finally had the time to test this, but I get a segment violation. I used Eric's example which I included below. Here's my result: # ./project project: system execution failed. Following is the set of recorded exceptions: ------------------------------------------------------------------------------- Class / Object Routine Nature of exception Effect ------------------------------------------------------------------------------- FOO foo_c Segmentation fault: <00000000B79BC03C> Operating system signal. Fail ------------------------------------------------------------------------------- FOO foo_c <00000000B79BC03C> Routine failure. Fail ------------------------------------------------------------------------------- FOO make @3 <00000000B79BC03C> Routine failure. Fail ------------------------------------------------------------------------------- FOO root's creation <00000000B79BC03C> Routine failure. Exit ------------------------------------------------------------------------------- When I add debug statements it appears the $Current simply is not correct when going back from C to Eiffel. Inside Eiffel when doing things like: print ("Current: " + ($Current).out + "%N") It is different from what it should be. I can print that when in finalized mode as the executable doesn't dump then (but doesn't have the correct Current of course). The output of print(i) is correct though. On more complex examples where I need Current to be valid it simply doesn't work. Here is the output for a finalized system: Current: 0xB79D403C Current: 0xB7222298 1FOO [0xB79D403C] me: STRING_8 [0xB79D423C] Could you please have a look? You obviously need to change the path in the .ecf file. Here's how I compiled the object file: cc -c -I/usr/local/Eiffel61/studio/spec/linux-x86/include -o foo_c.o foo_c.c Finally my estudio version is 6.1.7.1477. Haven't tried this code with gec yet, first need Eiffel Studio to work as I need a real gc for a big project. =========================foo.e========================= class FOO create make feature make is do c_set_address ($f) c_set_object ($Current) print ("Current: " + ($Current).out + "%N") me := "hello world" foo_c end c_set_address (p: POINTER) is external "C inline use <foo_c.h>" alias "signal_callback = $p;" end c_set_object (a: POINTER) is external "C inline use <foo_c.h>" alias "signal_object = eif_protect($a);" end f (i: INTEGER) is do print ("Current: " + ($Current).out + "%N") print (i) print (me) end me: STRING foo_c is external "C" end end ================================================== =========================foo_c.h========================= //#include "ge_eiffel.h" //#include "ge_gc.h" #include <eif_portable.h> #include <eif_hector.h> #include <eif_macros.h> extern EIF_REFERENCE signal_object; extern void (*signal_callback)(EIF_REFERENCE, EIF_INTEGER_32); extern void foo_c(Void); ================================================== =========================foo_c.c========================= #include "foo_c.h" EIF_REFERENCE signal_object; void (*signal_callback)(EIF_REFERENCE, EIF_INTEGER_32); void foo_c() { (signal_callback) (eif_adopt(signal_object), 1); } ================================================== =========================project.ecf========================= <?xml version="1.0" encoding="ISO-8859-1"?> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-3-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-3-0 http://www.eiffel.com/developers/xml/configuration-1-3-0.xsd" name="project" uuid="D9168F8A-7E13-4E12-92A4-EC3FDCE24B6E"> <target name="project"> <root class="FOO" feature="make"/> <option warning="true"> <assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/> </option> <external_include location="/home/berend/src/test/eiffel_signal_callback/"/> <external_object location="/home/berend/src/test/eiffel_signal_callback/foo_c.o"/> <precompile name="base_pre" location="$ISE_PRECOMP\base.ecf"/> <library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/> <cluster name="project" location=".\" recursive="true"> <file_rule> <exclude>/EIFGENs$</exclude> <exclude>/.svn$</exclude> <exclude>/CVS$</exclude> </file_rule> </cluster> </target> <target name="project_dotnet" extends="project"> <setting name="msil_generation" value="true"/> </target> </system> ================================================== -- Live long and prosper, Berend de Boer ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ gobo-eiffel-develop mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop
smime.p7s
(application/x-pkcs7-signature, 1.1 KB) - not displayed