1.1 --- a/jitcraft/Types.cpp Sun Jul 08 15:23:48 2012 -0700
1.2 +++ b/jitcraft/Types.cpp Sun Jul 08 16:49:17 2012 -0700
1.3 @@ -109,3 +109,44 @@
1.4 type->parameters_ = parameters;
1.5 return type;
1.6 }
1.7 +
1.8 +bool
1.9 +Type::Compare(Type *left, Type *right)
1.10 +{
1.11 + if (left->kind() != right->kind())
1.12 + return false;
1.13 +
1.14 + switch (left->kind()) {
1.15 + case Type::PRIMITIVE:
1.16 + return (left->primitive() == right->primitive() &&
1.17 + left->tag() == right->tag());
1.18 +
1.19 + case Type::ARRAY:
1.20 + {
1.21 + if (left->levels() != right->levels())
1.22 + return false;
1.23 + if (left->elements() != right->elements())
1.24 + return false;
1.25 + return Compare(left->contained(), right->contained());
1.26 + }
1.27 +
1.28 + case Type::FUNCTION:
1.29 + {
1.30 + if (!Compare(left->returnType(), right->returnType()))
1.31 + return false;
1.32 + if (left->parameters()->length() != right->parameters()->length())
1.33 + return false;
1.34 + for (unsigned i = 0; i < left->parameters()->length(); i++) {
1.35 + Type *leftparam = left->parameterAt(i);
1.36 + Type *rightparam = right->parameterAt(i);
1.37 + if (!Compare(leftparam, rightparam))
1.38 + return false;
1.39 + }
1.40 + return true;
1.41 + }
1.42 +
1.43 + default:
1.44 + assert(left->kind() == Type::REFERENCE);
1.45 + return Compare(left->contained(), right->contained());
1.46 + }
1.47 +}