protected boolean isSubTypeOf(final Value value, final Value expected) {
		Type expectedType = ((BasicValue) expected).getType();
		Type type = ((BasicValue) value).getType();
		switch (expectedType.getSort()) {
		case Type.INT:
		case Type.FLOAT:
		case Type.LONG:
		case Type.DOUBLE:
			return type.equals(expectedType);
		case Type.ARRAY:
		case Type.OBJECT:
			if ("Lnull;".equals(type.getDescriptor())) {
				return true;
			} else if (type.getSort() == Type.OBJECT
					|| type.getSort() == Type.ARRAY) {
				return isAssignableFrom(expectedType, type);
			} else {
				return false;
			}
		default:
			throw new Error("Internal error");
		}
	}