freenode/#clasp - IRC Chatlog
Search
21:13:22
Bike
hey. shiho ran into some kind of problem on boot. and i have a question, where are C++ files in the build system? I want to try removing some
21:15:56
Bike
i'm removing the standard-optimized-reader/writer-method things as a prelude to removing the ECL dispatch system
21:16:08
drmeister
It really should just build - when I stopped by the CL code was building. The C++ is done at that point.
21:18:16
drmeister
Crap - it's not like I haven't removed a hundred C++ files. I'm kind of drawing a blank. Ask me tomorrow - I'll probably remember when I stop trying.
21:21:52
shiho
then I got Condition of type: SIMPLE-ERROR Constructing call to intrinsic cc_dispatch_slot_reader - mismatch of arg#0 value[((PREPARE-OP COMPILE-OP))], expected type #<POINTER-TYPE {}*> - received type COMMON-LISP::CONS Available restarts: (use :r1 to invoke restart 1)
21:23:29
drmeister
Bike: So you are removing ECL dispatch? There are a few functions in genericFunction.cc that are needed by fastgf.
21:24:59
Bike
the one in particular that i'm worried about is that there's a "CompiledDispatchFunction_sp" which is treated differently from a general function
21:26:09
Bike
I was hoping I could have set-funcallable-instance-function just work the same for all functions, but i suppose it's okay if it just differentiates that
21:26:25
Bike
hopefully i can just pass invalidated-dispatch-function as a function instead of a symbol, though
21:27:13
drmeister
Here's why - the first entry point takes the arguments from the calling convention and creates a Vaslist and rewinds it - it passes that to the second entry point.
21:29:12
Bike
I think I can remove ECL independently, and just leavea test for the compiled dispatch function type
21:37:10
drmeister
I already have the instance (and the value for the slot-writer) from the dispatch function - I don't need to read them out of the va_list again.
3:28:48
beach
I have started some serious thinking about determining control flow of an arbitrary function with nested functions.
3:31:12
beach
Bike: But, you are right. It is sufficiently complicated that you should leave this to me.
3:32:32
beach
Initial goal: Handle enough cases that the result of simple LETs and things like CAR and CDR can be inlined.
3:34:22
beach
In terms of research, I should figure out examples (that I am convinced exist) where determining precise control flow requires knowing the precise control flow. Hence the difficulty here.
3:59:32
drmeister
Is there a way to get at the value of a :class allocation slot from the class of an object?
4:37:08
beach
Inlining global functions such as CAR is not as trivial as we might have thought. For good reasons, in Common Lisp, you are not allowed to shadow CAR in an FLET, so we must give it a different name, and make sure that references to it in the form of direct function calls are renamed. References like #'CAR should not be affected.
4:38:52
beach
Though I guess we could translate each call, like (car x) becomes (flet ((car (x)) <copy-of-ast>) (car x))
4:43:06
beach
In that case, it is fairly simple. Just replace (car x) by (flet ((<gensym> (x) <copy-of-ast>)) (<gensym> x)).
5:32:51
drmeister
Next I'll add multiple entry points - but I have to work on some other stuff for a couple of days. (I keep saying that - but I keep working on code).
7:15:14
beach
If by "multiple entry points" you mean different entry points into a function according to the number of arguments passed, then it may not be worthwhile. With a lot of inlining, most functions will do some non-trivial computations, and the cost of that computation may dwarf the cost of a test for the number of arguments.
7:39:57
Shinmera
I think I recall learning in my compilers class that JDK compiled multiple entry points for some methods, but I can't recall why.
8:30:25
loke
Shinmera: you might be thinking of how the Java compiler implements covariant return types.
8:46:51
beach
I think what drmeister is doing is taken from an idea from the Movitz compiler in order to avoid checking the number of arguments in many cases. A static programming language would not have that problem.
8:49:44
beach
See page 4 of this document: http://www.european-lisp-workshop.org/archives/2004/submissions/Fjeld.pdf
8:51:37
beach
In most cases, a register could then be freed up, namely the one that holds the argument count.
8:59:18
beach
As an example of complex control flow, I came up with the function F in this paste: http://paste.lisp.org/+7P28