shithub: pokecrystal

Download patch

ref: d8c82b789636560c6789793b8b2534930986ea4e
parent: ca0981eb36a86c1cd868e6f8ca13b42162afdc3f
parent: 2fd792bbdad32891f131b5735f22230d48674954
author: Bryan Bishop <[email protected]>
date: Sat Aug 31 06:18:22 EDT 2013

Merge pull request #184 from kanzure/preprocessor-macro-sanity-check-function

Move macro sanity check into a separate function.

--- a/preprocessor.py
+++ b/preprocessor.py
@@ -446,6 +446,60 @@
     options += [something.__name__]
     return (base in options)
 
+def check_macro_sanity(params, macro, original_line):
+    """
+    Checks whether or not the correct number of arguments are being passed to a
+    certain macro. There are a number of possibilities based on the types of
+    parameters that define the macro.
+
+    @param params: a list of parameters given to the macro
+    @param macro: macro klass
+    @param original_line: the line being preprocessed
+    """
+    allowed_length = 0
+
+    for (index, param_type) in macro.param_types.items():
+        param_klass = param_type["class"]
+
+        if param_klass.byte_type == "db":
+            allowed_length += 1 # just one value
+        elif param_klass.byte_type == "dw":
+            if param_klass.size == 2:
+                allowed_length += 1 # just label
+            elif param_klass.size == 3:
+                allowed_length += 2 # bank and label
+            else:
+                raise MacroException(
+                    "dunno what to do with a macro param with a size > 3 (size={size})"
+                    .format(size=param_klass.size)
+                )
+        else:
+            raise MacroException(
+                "dunno what to do with this non db/dw macro param: {klass} in line {line}"
+                .format(klass=param_klass, line=original_line)
+            )
+
+    # sometimes the allowed length can vary
+    if hasattr(macro, "allowed_lengths"):
+        allowed_lengths = macro.allowed_lengths + [allowed_length]
+    else:
+        allowed_lengths = [allowed_length]
+
+    # used twice, so precompute once
+    params_len = len(params)
+
+    if params_len not in allowed_lengths:
+        raise PreprocessorException(
+            "mismatched number of parameters ({count}, instead of any of {allowed}) on this line: {line}"
+            .format(
+                count=params_len,
+                allowed=allowed_lengths,
+                line=original_line,
+            )
+        )
+
+    return True
+
 def macro_translator(macro, token, line, show_original_lines=False, do_macro_sanity_check=False):
     """
     Converts a line with a macro into a rgbasm-compatible line.
@@ -500,56 +554,10 @@
     if not macro.override_byte_check:
         sys.stdout.write("db ${0:02X}\n".format(macro.id))
 
-    # --- long-winded sanity check goes here ---
-
+    # Does the number of parameters on this line match any allowed number of
+    # parameters that the macro expects?
     if do_macro_sanity_check:
-
-        # sanity check... this won't work because PointerLabelBeforeBank shows
-        # up as two params, so these two lengths will always be different.
-        #assert len(params) == len(macro.param_types), \
-        #       "mismatched number of parameters on this line: " + \
-        #       original_line
-
-        # v2 sanity check :) although it sorta sucks that this loop happens twice?
-        allowed_length = 0
-        for (index, param_type) in macro.param_types.items():
-            param_klass = param_type["class"]
-
-            if param_klass.byte_type == "db":
-                allowed_length += 1 # just one value
-            elif param_klass.byte_type == "dw":
-                if param_klass.size == 2:
-                    allowed_length += 1 # just label
-                elif param_klass.size == 3:
-                    allowed_length += 2 # bank and label
-                else:
-                    raise MacroException(
-                        "dunno what to do with a macro param with a size > 3 (size={size})"
-                        .format(size=param_klass.size)
-                    )
-            else:
-                raise MacroException(
-                    "dunno what to do with this non db/dw macro param: {klass} in line {line}"
-                    .format(klass=param_klass, line=original_line)
-                )
-
-        # sometimes the allowed length can vary
-        if hasattr(macro, "allowed_lengths"):
-            allowed_lengths = macro.allowed_lengths + [allowed_length]
-        else:
-            allowed_lengths = [allowed_length]
-
-        if len(params) not in allowed_lengths:
-            raise PreprocessorException(
-                "mismatched number of parameters ({count}, instead of any of {allowed}) on this line: {line}"
-                .format(
-                    count=len(params),
-                    allowed=allowed_lengths,
-                    line=original_line,
-                )
-            )
-
-    # --- end of ridiculously long sanity check ---
+        check_macro_sanity(params, macro, original_line)
 
     # used for storetext
     correction = 0