freenode/#clasp - IRC Chatlog
Search
15:44:39
drmeister
Bike: I fixed the problem with multiple-value-call and the VALUES compiler-macro compiles fine now.
16:05:09
drmeister
Bike: Didn't I need to implement some kind of typeq-instruction code to speed up the runtime check?
16:41:34
Bike
ah, yeah. like, you have (typeq foo character) turn into a mir:characterp instruction. you'd want something like that for function and symbol, which presumably can be fast tag checks.
16:45:45
drmeister
Let's call them extended-tags for classes. The lowest three bits are used to tag general objects (#B001), fixnums (#Bx00), characters (#B010), and single-floats (#B110) - there are a few others as well. Every bit pattern of three bits is used.
16:48:27
drmeister
The header of the object has a pattern #Byyyyyyyyyyyyyyyyyyy01. The #B01 says what follows is a general object.
16:48:57
drmeister
The yyyyy part is an integer value that lets call an "extended-tag". Currently it's assigned by the static analyzer.
16:50:41
drmeister
It appears to but it doesn't overlap - it's a completely separate tagging system to support MPS. The Boehm GC uses only #B01 in that position.
16:51:03
drmeister
MPS needs additional tags in that position to support forwarded pointers and padding entries.
16:55:22
drmeister
Because each block of memory that MPS manages needs a header with a tag to tell MPS what the block represents.
16:55:54
drmeister
Besides that each pointer in Clasp has a tag that represents what kind of object that pointer represents.
16:57:41
drmeister
I'm not making this clear - there is no problems with the tags - there are two separate tagging systems, one for blocks of memory and one for pointers.
16:59:16
drmeister
The remaining 60 bits of a block-tag are used to indicate the class of the object in the memory block.
17:01:02
drmeister
And the remaining 60 bits are used to indicate the class of the object in the memory block.
17:02:17
drmeister
The other yyyyyy bits are a shifted integer value that describes what the block contains.
17:05:12
drmeister
The other two are to indicate that the block is either used as a "padding" block or a "forwarding" pointer.
17:08:14
drmeister
That is complicated - it keeps a table that for simple objects contains the size and for complex objects that contain an internal array allows the size to be calculated.
17:09:20
drmeister
Clasp can be built in three fundamentally different configurations: boehmdc, boehm and mps
17:09:50
drmeister
boehmdc is "boehm using dynamic_cast" it doesn't YET have extended tags so they aren't available for a fast typep calculation.
17:12:48
drmeister
The boehm and mps builds replace dynamic_cast with a fast integer comparison that compares the extended tag in the header with integer ranges to determin IsA relationships.
17:15:08
drmeister
So if I'm, compiling code for boehmdc I'll generate a call to "cc_typep", which will use dynamic_cast.
17:16:24
drmeister
When it's compiling from the boehm or MPS version it will instead generate an integer comparison.
17:21:45
drmeister
And if type inference is working and the type is known at compile time then it won't generate anything - it will just do the call directly.
17:25:27
drmeister
Yes - that's what I believe. I think I see typep tests being generated at the moment. But I'll need to look more carefully to validate this.
17:45:38
drmeister
The FUNCALL compiler macro is working now in that cclasp compiles with it turned on. Both the FUNCALL and VALUES compiler macros are on.