World: r3wp
[Red] Red language group
older newer | first last |
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. | |
older newer | first last |