cell factor_vm::lookup_method(cell obj, cell methods) { cell tag = TAG(obj); cell method = array_nth(untag<array>(methods),tag); if(tag == TUPLE_TYPE) { if(TAG(method) == ARRAY_TYPE) return lookup_tuple_method(obj,method); else return method; } else return method; }
cell factor_vm::lookup_hairy_method(cell obj, cell methods) { cell method = array_nth(untag<array>(methods),TAG(obj)); if(tagged<object>(method).type_p(WORD_TYPE)) return method; else { switch(TAG(obj)) { case TUPLE_TYPE: return lookup_tuple_method(obj,method); break; case OBJECT_TYPE: return lookup_hi_tag_method(obj,method); break; default: critical_error("Bad methods array",methods); return 0; } } }