<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
That is a bit wierd.<br>Lots of things seem wierd at first..and wierd even at second,<br>but often there are reasons things are how they are,<br>and often there are barriers to change.<BR><br> <BR>I would expect Ctypes.char = CHAR.<BR> <BR><br>But I don't know why it isn't.<BR> <BR> <BR>I realize that CHAR ideally is some idealized abstract thing that can hold a unicode character.<BR>But it isn't. It is 8 bits and will never be larger.<BR> <BR> <BR>You are really best not to interface directly to C that you didn't write<br>and the C that you write that you interface to, you are best restricting<br>to a subset of C.<BR> <BR><br>And use m3-libs/m3core/src/unix for working examples.<BR> <BR><br>I remember when I added "BITS FOR" in Ctypes, it broke stuff.<BR>I either didn't commit that or later removed it, leaving things as they<BR>have been historically.<BR> <BR> <BR> - Jay<br><BR><div><div id="SkyDrivePlaceholder"></div>> To: dabenavidesd@yahoo.es<br>> Date: Tue, 20 Mar 2012 15:06:59 -0700<br>> From: mika@async.caltech.edu<br>> CC: m3devel@elegosoft.com<br>> Subject: Re: [M3devel] Problem interfacing C lib<br>> <br>> char_star is, at least in my installation<br>> <br>> UNTRACED REF [-16_7f-1 .. 16_7f]<br>> <br>> But it's a good point that it's not actually an UNTRACED REF ARRAY OF CHAR<br>> <br>> However <br>> <br>> ADR(chars[0]) <br>> <br>> ought to be more or less precisely of the type char_star<br>> <br>> ... so I doubt that is the problem.<br>> <br>> I'm curious about whether the assembly code for the call changes without<br>> the <*EXTERNAL*> pragma... it shouldn't should it?  In which case, where<br>> is chars passed, in pure Modula-3 code?  I don't know enough about the<br>> standard ABI of amd64 to know what the code should look like I'm afraid.<br>> <br>>    Mika<br>> <br>> "Daniel Alejandro Benavides D." writes:<br>> >Hi all:<br>> >I think the unchecked error lays down to:<br>> >Unsafe Operations section 2.7 (cf. Green Book SPWM3, p- 61):<br>> >it's allowed to have " ... a value of type ADDRESS to be assigned to a vari=<br>> >able of type UNTRACED REF T. It is an unchecked runtime error if the value =<br>> >does not address a variable of type T."<br>> ><br>> >which could be reads conversely as:<br>> ><br>> >a value of type UNTRACED REF T to be assigned to a variable of type ADDRESS=<br>> >. It is a checked runtime error if the variable does not address      a var=<br>> >iable of type .T=20<br>> >=20<br>> >And because because char_star is a subrange [-128 .. 127] OF INTEGER (and n=<br>> >ot ADDRESS)  and chars is UNTRACED REF ARRAY OF CHAR erro is cf. the specif=<br>> >ication.<br>> >So maybe you need to change your char_star<br>> ><br>> >Thanks in advance<br>> ><br>> ><br>> >--- El mar, 20/3/12, Dragi=C5=A1a Duri=C4=87 <dragisha@m3w.org> escribi=C3=<br>> >=B3:<br>> ><br>> >> De: Dragi=C5=A1a Duri=C4=87 <dragisha@m3w.org><br>> >> Asunto: Re: [M3devel] Problem interfacing C lib<br>> >> Para: "Mika Nystrom" <mika@async.caltech.edu><br>> >> CC: m3devel@elegosoft.com<br>> >> Fecha: martes, 20 de marzo, 2012 01:04<br>> >> Errorr is SIGSEGV.<br>> >>=20<br>> >> chars is UNTRACED REF ARRAY OF CHAR but it is lesser<br>> >> problem, I think. It looks like  formal 'what' is not<br>> >> sent at all!? It's place is taken by next argument - INTEGER<br>> >> len (equal 0x7 in this example).<br>> >>=20<br>> >> One common problem I meet often (as I bind C often :) is<br>> >> this - address of open array argument is ot what it looks<br>> >> like. To be sure you are getting address of various UNTRACED<br>> >> REF..ARRAY.. and open array procedure arguments - use=20<br>> >>=20<br>> >> ADR(chars[0])<br>> >>=20<br>> >> and do not use:<br>> >>=20<br>> >> LOOPHOLE(chars, ADDRESS)<br>> >>=20<br>> >> Of course, I tried ADR(chars[0]) :) - Same thing happened.<br>> >> Right now II downgraded my code to use strstr(3), but this<br>> >> argument passing still bugs me.<br>> >>=20<br>> >> dd<br>> >>=20<br>> >>=20<br>> >> On Mar 20, 2012, at 1:26 AM, Mika Nystrom wrote:<br>> >>=20<br>> >> > What are the declarations of all the variables involved<br>> >> in the call?<br>> >> >=20<br>> >> > And what is the actual error?  Is it a SIGBUS,<br>> >> SIGSEGV?<br>> >> >=20<br>> >> > =3D?utf-8?Q?Dragi=3DC5=3DA1a_Duri=3DC4=3D87?=3D writes:<br>> >> >> I had some error before I LOOPHOLEd it.<br>> >> >>=20<br>> >> >> On Mar 19, 2012, at 7:27 PM, Daniel Alejandro<br>> >> Benavides D. wrote:<br>> >> >>=20<br>> >> >>> Hi all:<br>> >> >>> if chars is ADDRESS type why are you<br>> >> LOOPHOLE'ing it?=3D20<br>> >> >>> Thanks in advance<br>> >> >>> =3D20<br>> >> >>> --- El lun, 19/3/12, Dragi=3DC5=3DA1a Duri=3DC4=3D87<br>> >> <dragisha@m3w.org><br>> >> =3D<br>> >> >> escribi=3DC3=3DB3:<br>> >> >>> =3D20<br>> >> >>>> De: Dragi=3DC5=3DA1a Duri=3DC4=3D87 <dragisha@m3w.org><br>> >> >>>> Asunto: [M3devel] Problem interfacing C<br>> >> lib<br>> >> >>>> Para: "m3devel" <m3devel@elegosoft.com><br>> >> >>>> Fecha: lunes, 19 de marzo, 2012 12:13<br>> >> >>>> #1  0x00000035bd8172a0 in<br>> >> >>>> evbuffer_search_range (buffer=3D3D0x694090,<br>> >> what=3D3D0x7 <Address<br>> >> >>>> 0x7 out of bounds>, len=3D3D0,<br>> >> start=3D3D0x0,<br>> >> >>>> end=3D3D0x7fffffffdbb0)<br>> >> >>>>   at buffer.c:2441<br>> >> >>>> #2  0x0000000000404a0c in<br>> >> Buffer__Search (t=3D3D<error<br>> >> >>>> reading variable>, pattern=3D3D<error<br>> >> reading<br>> >> >>>> variable>, from=3D3D<error reading<br>> >> variable>,=3D20<br>> >> >>>>   to=3D3D<error reading<br>> >> variable>) at<br>> >> >>>> ../src/Buffer.m3:150<br>> >> >>>> =3D20<br>> >> >>>> Buffer.m3:150<br>> >> >>>>       pos :=3D3D<br>> >> >>>> evbuffer.search_range(t.b, LOOPHOLE(chars,<br>> >> ADDRESS), len,<br>> >> >>>> NIL, NIL);<br>> >> >>>> =3D20<br>> >> >>>> t.b is a pointer, so is chars=3DE2=3D80=3DA6 len<br>> >> is Utypes.size_t and<br>> >> >>>> it's value is 7.<br>> >> >>>> =3D20<br>> >> >>>> <* EXTERNAL evbuffer_search_range *><br>> >> >>>> PROCEDURE search_range(buf: t; what:<br>> >> char_star; len: size_t;<br>> >> >>>> start, end: UNTRACED REF ptr): ptr;<br>> >> >>>> =3D20<br>> >> >>>> t is an ADDRESS, and so on=3DE2=3D80=3DA6<br>> >> >>>> =3D20<br>> >> >>>> Critical Mass Modula-3 version d5.9.0<br>> >> >>>> last updated: 2010-07-21<br>> >> >>>> compiled: 2010-10-04 07:24:16<br>> >> >>>> configuration: /etc/cm3.cfg<br>> >> >>>> host: AMD64_LINUX<br>> >> >>>> target: AMD64_LINUX<br>> >> >>>> =3D20<br>> >> >>>> =3D20<br>> >> >>>> Any ideas? TIA,<br>> >> >>>> dd<br>> >> >>>> =3D20<br>> >> >>>> =3D20<br>> >>=20<br>> >> <br></div>                                           </div></body>
</html>