def genParenthesizedCases(): for reverse in [True, False]: if reverse: name = "paren_expr_before_literal" desc = "Parenthesized expression before literal" else: name = "literal_before_paren_expr" desc = "Literal before parenthesized expression" reversegroup = CaseGroup(name, desc, []) for input_in_parens in [True, False]: if input_in_parens: name = "input_in_parens" desc = "Input variable in parenthesized expression" else: name = "input_outside_parens" desc = "Input variable outside parenthesized expression" casegroup = CaseGroup(name, desc, []) for in_type, out_type in genConversionPairs(): name = in_type + "_to_" + out_type casegroup.children.append( ParenthesizedCase(name, in_type, out_type, reverse, input_in_parens)) reversegroup.children.append(casegroup) yield reversegroup
def genArithmeticCases(reverse=False): op_names = [("add", "Addition", "+"), ("sub", "Subtraction", "-"), ("mul", "Multiplication", "*"), ("div", "Division", "/")] for name, desc, op in op_names: casegroup = CaseGroup(name, desc, []) for in_type, out_type in genConversionPairs(): if op == "-" and isUintTypeName(out_type): continue # Can't handle at the moment name = in_type + "_to_" + out_type casegroup.children.append( ArithmeticCase(name, op, in_type, out_type, reverse)) yield casegroup
def genComparisonCases(reverse=False): op_names = [ ("equal", "Equal", "=="), ("not_equal", "Not equal", "!="), ("less", "Less than", "<"), ("greater", "Greater than", ">"), ("less_or_equal", "Less than or equal", "<="), ("greater_or_equal", "Greater than or equal", ">="), ] for name, desc, op in op_names: casegroup = CaseGroup(name, desc, []) type_order = IN_TYPE_ORDER if name in ["equal", "not_equal"] else ["int", "uint"] for in_type, out_type in genConversionPairs(order=type_order, scalar_to_vector=False): name = in_type + "_to_" + out_type casegroup.children.append(ComparisonsCase(name, op, in_type, out_type, reverse)) yield casegroup
def genAllCases(): yield CaseGroup("arithmetic", "Arithmetic operations", [ CaseGroup("input_before_literal", "Input before literal", genArithmeticCases(reverse=False)), CaseGroup("literal_before_input", "Literal before input", genArithmeticCases(reverse=True)), ]) yield CaseGroup("comparisons", "Comparisons", [ CaseGroup("input_before_literal", "Input before literal", genComparisonCases(reverse=False)), CaseGroup("literal_before_input", "Literal before input", genComparisonCases(reverse=True)), ]) yield CaseGroup( "array_subscripts", "Array subscripts", [ CaseGroup("input_before_subscript", "Input before subscript", genArrayCases(reverse=False)), CaseGroup("subscript_before_input", "Subscript before input", genArrayCases(reverse=True)), # CaseGroup("unpack", "Unpack array and repack as value", # genArrayUnpackCases()), ]) yield CaseGroup("functions", "Function calls", genFunctionsCases()) yield CaseGroup("struct_fields", "Struct field selectors", [ CaseGroup("input_before_field", "Input before field", genStructCases(reverse=False)), CaseGroup("field_before_input", "Field before input", genStructCases(reverse=True)), ]) yield CaseGroup("parenthesized_expressions", "Parenthesized expressions", genParenthesizedCases()) yield CaseGroup("invalid", "Invalid conversions", [ CaseGroup("variables", "Single variables", genInvalidCases()), CaseGroup("arrays", "Arrays", genInvalidArrayCases()), CaseGroup("structs", "Structs", genInvalidStructCases()), ])