[Mono-list] Making a ruby.net compiler

Miguel de Icaza miguel@ximian.com
10 May 2003 14:05:22 -0400


    This morning (which is absolutely beautiful here in Boston) I woke
up with an idea to implement some of Fergus' comments:

> Sure, but no CIL implementations thus far are capable of making more
> significant changes, such as changing data representations to replace a
> class hierarchy with the use of tag bits for representing discriminated
> unions.  Nor does it look like we'll see this in the near future.

    And I figured: there is really nothing that prevents the runtime to
pick a few bits as tags on pointers to implement "isinst class".

    We could have a call that informs the runtime that isinst will be
used massively on a set of classes.  So for example, say your lisp
implementation will be using a lot of classes of type "Atom" and
"List", and that you want the following test to be as fast as possible:

	Type t = typeof (o);
	if (t == typeof (List)){
		List l = (List) o;
	} else if (t == typeof (Atom)){
		Atom a = (Atom) o; 
	} else {
		Its some other kind.

    You would inform the runtime about this:

	System.Runtime.FastCast (typeof (List));
	System.Runtime.FastCast (typeof (Atom));

    The runtime could reserve a few bits in the pointer.  The lower two
bits are ideal, the combination "00" means `normal object', and the
other three combinations 01, 10 and 11 map to special classes.

    So then the assembly language code for "o is List" instead of
involving a call to an expensive routine, becomes:

	mov $eax, o
	test $eax, 1
	jne 1f
	mov $eax, type_of_list_constant
	jmp 3f
	test $eax, 2
	jne 2f
	mov $eax, type_of_atom_constant
	jmp 3f
	call runtime_type_get_type_of_object

   The GC probably has to be modified to cope with this.