diff -r e04c5be84792 -r dd57743d220e jitcraft/Types.cpp --- a/jitcraft/Types.cpp Sun Jul 08 15:23:48 2012 -0700 +++ b/jitcraft/Types.cpp Sun Jul 08 16:49:17 2012 -0700 @@ -109,3 +109,44 @@ type->parameters_ = parameters; return type; } + +bool +Type::Compare(Type *left, Type *right) +{ + if (left->kind() != right->kind()) + return false; + + switch (left->kind()) { + case Type::PRIMITIVE: + return (left->primitive() == right->primitive() && + left->tag() == right->tag()); + + case Type::ARRAY: + { + if (left->levels() != right->levels()) + return false; + if (left->elements() != right->elements()) + return false; + return Compare(left->contained(), right->contained()); + } + + case Type::FUNCTION: + { + if (!Compare(left->returnType(), right->returnType())) + return false; + if (left->parameters()->length() != right->parameters()->length()) + return false; + for (unsigned i = 0; i < left->parameters()->length(); i++) { + Type *leftparam = left->parameterAt(i); + Type *rightparam = right->parameterAt(i); + if (!Compare(leftparam, rightparam)) + return false; + } + return true; + } + + default: + assert(left->kind() == Type::REFERENCE); + return Compare(left->contained(), right->contained()); + } +}