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