r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Red] Red language group

jocko
9-Jun-2011
[1933]
thanks, works fine
Kaj
9-Jun-2011
[1934x2]
If I have an #import function returning an integer! but I define 
it as logic! will that work properly, doing an implicit as-logic 
on the return value?
That would make some convenience wrappers unnecessary
jocko
10-Jun-2011
[1936]
Same error with CharToOem ...
Dockimbel
10-Jun-2011
[1937x3]
Jocko: sorry to hear that, I will improve the fix I did yesterday 
right now.
Kaj: you can do an explicit casting, if is allowed by this matrix: 
http://static.red-lang.org/red-system-specs.html#section-4.7
Jocko: fixed by last commit: https://github.com/dockimbel/Red/commit/7b069cfefdf869cedfac9d2e1685c222320aaafd
Kaj
10-Jun-2011
[1940]
I'm currently doing explicit castings, but that requires a wrapper 
function, which takes up space in the source and in every binary. 
So I was wondering if it would be a good idea to obsolete some of 
those wrappers
Dockimbel
10-Jun-2011
[1941x3]
So you are asking to make the type system even weaker, I thought 
you were a proponent of strong typing ;-)
Could you solve is with defines? Something like: #define foo [as 
logic! _foo]
is => it
Kaj
10-Jun-2011
[1944x3]
I don't think it would make typing weaker, because it is about the 
definition of external functions, that you have to believe on the 
blue eyes of the #import spec writer, anyway
C functions don't have a logic! type, so I would argue that defining 
one in a return type if you know the C function returns a compatible 
value actually makes typing stronger
A define would still generate code, so it wouldn't lead to reduction 
of source or binary size
Dockimbel
10-Jun-2011
[1947x2]
The integer! -> logic! is not free, it implies generating extra code 
for converting properly (see the type matrix). So the define won't 
generate any more overhead than needed.
I just did a test using as-logic to convert an integer! returned 
by an imported function, it seems that the compiler is not generating 
the conversion code in such case...I need to investigate that issue 
deeper.
Kaj
10-Jun-2011
[1949x2]
I'm fine with the extra code generated. It would be like inlining 
just one as-logic operation, and only generated when needed
The alternative is always going through the wrapper function, which 
is slower, and only for the as-logic, so this strikes me as a case 
where you would want to inline. The #import spec can be a nice syntax 
touch to signal that
Dockimbel
10-Jun-2011
[1951x5]
Pushed a fix for the missing conversion code on type casting function 
call return value.
Right, as-logic will inline some conversion code only when required 
by the conversion rules from the type casting matrix.
I am considering your request for an implicit casting for imported 
functions using a return: [logic!] declaration. I could add it, by 
forcing a type conversion if the function is imported, but if the 
function already returns the right value (0 | 1), it will have to 
pay an extra cost for a useless conversion and no way to avoid it.
Like in the case where users would link to their own external libs, 
where return values are prepared specifically for Red/System.
So manually controlling the casting seems like a better option.
Kaj
10-Jun-2011
[1956x2]
But then you have the overhead of the wrapper function
How about having return: [logic!] mean that 0 | 1 is returned, so 
no conversion is necessary?
Dockimbel
10-Jun-2011
[1958]
Wrapper: not necessarily if you use a define as shown above.
Kaj
10-Jun-2011
[1959]
The problem with that is that you have to do it for every function. 
It's more work, in a different place than the #import. It feels like 
a hack, whereas return: [logic!] lets the compiler know the exact 
type
Dockimbel
10-Jun-2011
[1960]
Well, that is the default behaviour already. You just have to be 
sure that the imported function is respecting that convention strictly.
Kaj
10-Jun-2011
[1961]
Besides, the #define would still generate the extra code, wouldn't 
it? There's currently no way to specify that no conversion is necessary 
for a return value
Dockimbel
10-Jun-2011
[1962]
Just don't use any type casting and no conversion code will be added.
Kaj
10-Jun-2011
[1963]
But will integer! than be handled as logic! in expressions?
Dockimbel
10-Jun-2011
[1964]
Certainly not, but we were talking about an imported function with 
a return: [logic!] declaration?
Kaj
10-Jun-2011
[1965x2]
Well, that was my original question, whether that already works as 
I would like :-)
So it can only be used when strictly 0 and 1 are returned in integer! 
format?
Dockimbel
10-Jun-2011
[1967]
Exactly.
Kaj
10-Jun-2011
[1968]
OK, thanks
Dockimbel
10-Jun-2011
[1969]
If you function return 0 for false and a positive number for true, 
it needs a runtime conversion.
Kaj
10-Jun-2011
[1970x2]
Fair enough
Any plans to implement automatic inlining in the future?
Dockimbel
10-Jun-2011
[1972x3]
Yes, but probably as part of a future optimizing compiler version.
So, probably when Red/System will be rewritten in Red.
I would also adopt a fastcall convention as default for Red/System 
function calls.
Kaj
10-Jun-2011
[1975]
Awaiting that, I'll refrain from the #define solution, then
Dockimbel
11-Jun-2011
[1976]
Andreas, Kaj: what were the changes required on ELF emitter to make 
it work on Syllable? Just entry point address?
Kaj
11-Jun-2011
[1977]
Base address, really, and address alignment
Dockimbel
11-Jun-2011
[1978]
Ah, yes, base address, not entry point. Thanks.
Kaj
11-Jun-2011
[1979x2]
Base address for Syllable Desktop is 80000000h which currently needs 
to be coded as -2147483648
The same change would be necessary for BeOS, by the way
Andreas
14-Jun-2011
[1981x2]
Red/System can now generate dynamically linked ELF binaries.
Along with some additional pre-processor directives added (#if, #either, 
#switch), this now enables the Red/System runtime being fully writen 
in Red/System itself.