>>>>> "Emmanuel" == Emmanuel Stapf [ES] <
manus@...> 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
gobo-eiffel-develop@...
https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop