From 7c41e2031c91fd97b9138f34fe66edbef744092e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 26 Feb 2020 15:40:47 -0500 Subject: [PATCH 01/96] First step in development. Go to other branch --- src/coolc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coolc.sh b/src/coolc.sh index 3088de4f..d4f803a5 100755 --- a/src/coolc.sh +++ b/src/coolc.sh @@ -5,7 +5,7 @@ OUTPUT_FILE=${INPUT_FILE:0: -2}mips # Si su compilador no lo hace ya, aquí puede imprimir la información de contacto echo "LINEA_CON_NOMBRE_Y_VERSION_DEL_COMPILADOR" # TODO: Recuerde cambiar estas -echo "Copyright (c) 2019: Nombre1, Nombre2, Nombre3" # TODO: líneas a los valores correctos +echo "Copyright (c) 2020: Alejandro Díaz Roque, Rafael Horrach" # TODO: líneas a los valores correctos # Llamar al compilador echo "Compiling $INPUT_FILE into $OUTPUT_FILE" From 577524643dc5ef5b183af0aa679e5c3989590668 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 27 Feb 2020 18:09:27 -0500 Subject: [PATCH 02/96] Added a main.py file. The coolc.sh is a wrapper for it. --- src/coolc.sh | 11 ++++++++++- src/main.py | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main.py diff --git a/src/coolc.sh b/src/coolc.sh index d4f803a5..f3613a9e 100755 --- a/src/coolc.sh +++ b/src/coolc.sh @@ -1,11 +1,20 @@ # Incluya aquí las instrucciones necesarias para ejecutar su compilador + INPUT_FILE=$1 OUTPUT_FILE=${INPUT_FILE:0: -2}mips + +#El compilador va a ser un py. +#Aquí llamamos al compilador con los valores de la entrada estándar. + + + # Si su compilador no lo hace ya, aquí puede imprimir la información de contacto echo "LINEA_CON_NOMBRE_Y_VERSION_DEL_COMPILADOR" # TODO: Recuerde cambiar estas -echo "Copyright (c) 2020: Alejandro Díaz Roque, Rafael Horrach" # TODO: líneas a los valores correctos +echo "CopyLeft (L) 2020: Alejandro Díaz Roque, Rafael Horrach" # Llamar al compilador +python3 main.py $@ echo "Compiling $INPUT_FILE into $OUTPUT_FILE" + diff --git a/src/main.py b/src/main.py new file mode 100644 index 00000000..3c3f8db3 --- /dev/null +++ b/src/main.py @@ -0,0 +1,14 @@ +import sys, fileinput +from argparse import ArgumentParser + + +parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') +parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '*') +parser_input.add_argument("--lex", '-l', help = 'Output the lexer for the .cl file', action = 'store_true') +parser_input.add_argument("--ast", help = 'Output the abstract syntax tree (AST) for the .cl file', action = 'store_true') +parser_input.add_argument("--outputFile", '-oF', help = 'Put the info of the output options in the specified file.\n If no output option is specified the file creates empty.') +args = parser_input.parse_args() +working_input = fileinput.input(files = args.files_for_compile) +if args.outputFile: + fd = open(mode= 'x', file = './output_files' + args.outputFile) + From d87bae5105463d6725f2f098da50ad5bc2489d4a Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 27 Feb 2020 21:38:40 -0500 Subject: [PATCH 03/96] Added the base for the compiler structure --- src/compiler/__init__.py | 0 src/compiler/components/__init__.py | 0 src/compiler/components/abstract_component.py | 6 ++++++ src/compiler/components/dummy_component.py | 13 +++++++++++++ src/compiler/initialize.py | 10 ++++++++++ src/compiler/utils/__init__.py | 0 src/compiler/utils/container.py | 15 +++++++++++++++ 7 files changed, 44 insertions(+) create mode 100644 src/compiler/__init__.py create mode 100644 src/compiler/components/__init__.py create mode 100644 src/compiler/components/abstract_component.py create mode 100644 src/compiler/components/dummy_component.py create mode 100644 src/compiler/initialize.py create mode 100644 src/compiler/utils/__init__.py create mode 100644 src/compiler/utils/container.py diff --git a/src/compiler/__init__.py b/src/compiler/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/components/__init__.py b/src/compiler/components/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/components/abstract_component.py b/src/compiler/components/abstract_component.py new file mode 100644 index 00000000..3c5fe019 --- /dev/null +++ b/src/compiler/components/abstract_component.py @@ -0,0 +1,6 @@ + +class Component: + def __init__(self, input): + self.input = input + + \ No newline at end of file diff --git a/src/compiler/components/dummy_component.py b/src/compiler/components/dummy_component.py new file mode 100644 index 00000000..77d5888a --- /dev/null +++ b/src/compiler/components/dummy_component.py @@ -0,0 +1,13 @@ +from abstract_component import Component + + +class dummy_component (Component): + def __init__(self, input, component_type: str): + super().__init__(input) + self.component_type = component_type + + + def output(self): + return "Sorry, this is just a dummy %s component" %(self.component_type) + + diff --git a/src/compiler/initialize.py b/src/compiler/initialize.py new file mode 100644 index 00000000..c7c3c987 --- /dev/null +++ b/src/compiler/initialize.py @@ -0,0 +1,10 @@ +from .utils.container import component_container + + +class compiler: + def __init__(self, lexer, parser): + self.symbolTable = {} + + self.lexer = lexer + self.parser = parser + pass \ No newline at end of file diff --git a/src/compiler/utils/__init__.py b/src/compiler/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/utils/container.py b/src/compiler/utils/container.py new file mode 100644 index 00000000..01730e0c --- /dev/null +++ b/src/compiler/utils/container.py @@ -0,0 +1,15 @@ +from dependency_injector import containers, providers +from compiler.components.dummy_component import dummy_component + + + +class component_container (containers.DeclarativeContainer): + dummy_lexer = providers.Factory(dummy_component, "Lexer") + dummy_parser = providers.Factory(dummy_component, "Parser") + + + + + + + From 664f89d0ce7a8cf9c0a2e92537b01cf655c18cac Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 28 Feb 2020 13:51:53 -0500 Subject: [PATCH 04/96] Added lexer definitions --- src/compiler/utils/lexer_definitions.py | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/compiler/utils/lexer_definitions.py diff --git a/src/compiler/utils/lexer_definitions.py b/src/compiler/utils/lexer_definitions.py new file mode 100644 index 00000000..0acb7292 --- /dev/null +++ b/src/compiler/utils/lexer_definitions.py @@ -0,0 +1,47 @@ +tokens_collection = ( + # Identifiers + "ID", "TYPE", + + # Primitive Types + "INTEGER", "STRING", "BOOLEAN", + + # Literals + "LPAREN", "RPAREN", "LBRACE", "RBRACE", "COLON", "COMMA", "DOT", "SEMICOLON", "AT", + + # Operators + "PLUS", "MINUS", "MULTIPLY", "DIVIDE", "EQ", "LT", "LTEQ", "ASSIGN", "INT_COMP", "NOT", + + # Special Operators + "ARROW" +) + +class keyword(str): + def __eq__(self, other: str): + val = str(self) + if val != 'true' and val != 'false': + return val == other.lower() + return val[0] == other[0] and val[1:] == other.lower()[1:] + +basic_keywords = { + "case": keyword("case"), + "class": keyword("class"), + "else": keyword("else"), + "esac": keyword("esac"), + "fi": keyword("fi"), + "if": keyword("if"), + "in": keyword("in"), + "inherits": keyword("inherits"), + "isvoid": keyword("isvoid"), + "let": keyword("let"), + "loop": keyword("loop"), + "new": keyword("new"), + "of": keyword("of"), + "pool": keyword("pool"), + "self": keyword("self"), + "then": keyword("then"), + "while": keyword("while"), + "true": keyword("true"), + "false": keyword("false") +} + + From fb038dbbd14e5f74f9e1ad9aeadc95ae52db0e33 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 29 Feb 2020 12:30:48 -0500 Subject: [PATCH 05/96] All the cool lexer analyzer declarations --- src/compiler/utils/lexer_definitions.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compiler/utils/lexer_definitions.py b/src/compiler/utils/lexer_definitions.py index 0acb7292..ab9f2b69 100644 --- a/src/compiler/utils/lexer_definitions.py +++ b/src/compiler/utils/lexer_definitions.py @@ -41,7 +41,10 @@ def __eq__(self, other: str): "then": keyword("then"), "while": keyword("while"), "true": keyword("true"), - "false": keyword("false") + "false": keyword("false"), + 'not' : keyword('not') } +keywords_for_built_in_types = { +} From 6d7a1b43179511b09cf982c33facc39f512263cb Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 29 Feb 2020 12:32:36 -0500 Subject: [PATCH 06/96] More changes --- src/compiler/components/abstract_component.py | 21 +- src/compiler/components/dummy_component.py | 14 +- src/compiler/components/lexer_analyzer.py | 13 ++ src/compiler/initialize.py | 4 +- src/compiler/utils/compiler_containers.py | 21 ++ src/compiler/utils/lexer_definitions.py | 201 +++++++++++++++++- 6 files changed, 260 insertions(+), 14 deletions(-) create mode 100644 src/compiler/components/lexer_analyzer.py create mode 100644 src/compiler/utils/compiler_containers.py diff --git a/src/compiler/components/abstract_component.py b/src/compiler/components/abstract_component.py index 3c5fe019..30b7ed07 100644 --- a/src/compiler/components/abstract_component.py +++ b/src/compiler/components/abstract_component.py @@ -1,6 +1,19 @@ class Component: - def __init__(self, input): - self.input = input - - \ No newline at end of file + def __init__(self, + input_info, + component_name, + debug_session = False, + error_log_file = None, + build_after_initialize = True): + self.input_info = input_info + self.component_name = component_name + self.debug_session = debug_session + self.error_log_file = error_log_file + if build_after_initialize: self.build_component() + + + def build_component (self): + if self.debug_session: + print('Building %s component' %self.component_name) + diff --git a/src/compiler/components/dummy_component.py b/src/compiler/components/dummy_component.py index 77d5888a..36e261eb 100644 --- a/src/compiler/components/dummy_component.py +++ b/src/compiler/components/dummy_component.py @@ -1,13 +1,15 @@ -from abstract_component import Component +from .abstract_component import Component class dummy_component (Component): - def __init__(self, input, component_type: str): - super().__init__(input) - self.component_type = component_type + def __init__(self, component_name, *args, **kwargs): + component_name = component_name + "dummy_" + super().__init__(*args, component_name = component_name + "dummy_", **kwargs) + - def output(self): - return "Sorry, this is just a dummy %s component" %(self.component_type) + def build_component(self): + super().build_component() + return "Sorry, this is just a %s component" %(self.component_name) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py new file mode 100644 index 00000000..1ff485c8 --- /dev/null +++ b/src/compiler/components/lexer_analyzer.py @@ -0,0 +1,13 @@ +from .abstract_component import Component + + +class lexer_analyzer(Component): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @property + def tokens_collection(): + pass + + def build_component(self): + super().build_component() \ No newline at end of file diff --git a/src/compiler/initialize.py b/src/compiler/initialize.py index c7c3c987..317c53dc 100644 --- a/src/compiler/initialize.py +++ b/src/compiler/initialize.py @@ -1,10 +1,10 @@ -from .utils.container import component_container +from .utils.compiler_containers import component_container class compiler: def __init__(self, lexer, parser): self.symbolTable = {} - + self.lexer = lexer self.parser = parser pass \ No newline at end of file diff --git a/src/compiler/utils/compiler_containers.py b/src/compiler/utils/compiler_containers.py new file mode 100644 index 00000000..7fe71041 --- /dev/null +++ b/src/compiler/utils/compiler_containers.py @@ -0,0 +1,21 @@ +from dependency_injector import containers, providers +from compiler.components.dummy_component import dummy_component +import lexer_definitions + + +class component_container (containers.DeclarativeContainer): + dummy_lexer = providers.Factory(dummy_component, "Lexer") + dummy_parser = providers.Factory(dummy_component, "Parser") + + +container_dict = { + 'lexer_options': { 'd': component_container.dummy_lexer }, + 'parser_options': {'d' : component_container.dummy_parser} + } + +class lexer_analyzer_dependency_container (containers.DeclarativeContainer): + reserved_keywords_cool = providers.Callable(lambda value: value, lexer_definitions.basic_keywords) + tokens_collection_cool = providers.Callable(lambda value: value, lexer_definitions.tokens_collection) + simple_rules_cool = providers.Callable(lambda value: value, lexer_definitions.simple_rules_cool) + + diff --git a/src/compiler/utils/lexer_definitions.py b/src/compiler/utils/lexer_definitions.py index ab9f2b69..240ae8fd 100644 --- a/src/compiler/utils/lexer_definitions.py +++ b/src/compiler/utils/lexer_definitions.py @@ -1,3 +1,5 @@ +from ply.lex import TOKEN + tokens_collection = ( # Identifiers "ID", "TYPE", @@ -45,6 +47,201 @@ def __eq__(self, other: str): 'not' : keyword('not') } -keywords_for_built_in_types = { - +#Simple rules for cool +simple_rules = { + "t_LPAREN" : r'\(', + "t_RPAREN" : r'\)', + "t_LBRACE" : r'\{', + "t_RBRACE" : r'\}', + "t_COLON" : r'\:' , + "t_COMMA" : r'\,' , + "t_DOT" : r'\.' , + "t_SEMICOLON" : r'\;', + "t_AT" : r'\@', + "t_PLUS" : r'\+', + "t_MINUS" : r'\-', + "t_MULTIPLY" : r'\*', + "t_DIVIDE" : r'\/', + "t_EQ" : r'\=', + "t_LT" : r'\<', + "t_LTEQ" : r'\<\=', + "t_ASSIGN" : r'\<\-', + "t_INT_COMP" : r'~', + "t_NOT" : r'not', + "t_ignore" : ' \t\r\f' } +""" t_LPAREN = r'\(' # ( +t_RPAREN = r'\)' # ) +t_LBRACE = r'\{' # { +t_RBRACE = r'\}' # } +t_COLON = r'\:' # : +t_COMMA = r'\,' # , +t_DOT = r'\.' # . +t_SEMICOLON = r'\;' # ; +t_AT = r'\@' # @ +t_PLUS = r'\+' # + +t_MINUS = r'\-' # - +t_MULTIPLY = r'\*' # * +t_DIVIDE = r'\/' # / +t_EQ = r'\=' # = +t_LT = r'\<' # < +t_LTEQ = r'\<\=' # <= +t_ASSIGN = r'\<\-' # <- +t_INT_COMP = r'~' # ~ +t_NOT = r'not' # not + +#ignore spaces +t_ignore = ' \t\r\f' """ + +#Complex rules for cool + +@TOKEN(r"(true|false)") +def t_BOOLEAN (token): + token.value = True if token.value == basic_keywords['true'] else False + return token + +@TOKEN(r"\d+") +def t_INTEGER(token): + token.value = int(token.value) + return token + +@TOKEN(r"[A-Z][a-zA-Z_0-9]*") +def t_TYPE(token): + token.type = basic_keywords.get(token.value, 'TYPE') + return token + +@TOKEN(r"\n+") +def t_newline(token): + token.lexer.lineno += len(token.value) + + +@TOKEN(r"[a-z][a-zA-Z_0-9]*") +def t_ID(token): + token.type = basic_keywords.get(token.value, 'ID') + return token + + + +#Lexer states +def states(): + return ( + ("STRING", "exclusive"), + ("COMMENT", "exclusive") + ) + +# The string states + +@TOKEN(r"\"") +def t_STRING_start(token): + token.lexer.push_state("STRING") + token.lexer.string_backslashed = False + token.lexer.stringbuf = "" + + +@TOKEN(r"\n") +def t_STRING_newline(token): + token.lexer.lineno += 1 + if not token.lexer.string_backslashed: + print("String newline not escaped") + token.lexer.skip(1) + else: + token.lexer.string_backslashed = False + + +@TOKEN(r"\"") +def t_STRING_end(self, token): + if not token.lexer.string_backslashed: + token.lexer.pop_state() + token.value = token.lexer.stringbuf + token.type = "STRING" + return token + else: + token.lexer.stringbuf += '"' + token.lexer.string_backslashed = False + +@TOKEN(r"[^\n]") +def t_STRING_anything(self, token): + if token.lexer.string_backslashed: + if token.value == 'b': + token.lexer.stringbuf += '\b' + elif token.value == 't': + token.lexer.stringbuf += '\t' + elif token.value == 'n': + token.lexer.stringbuf += '\n' + elif token.value == 'f': + token.lexer.stringbuf += '\f' + elif token.value == '\\': + token.lexer.stringbuf += '\\' + else: + token.lexer.stringbuf += token.value + token.lexer.string_backslashed = False + else: + if token.value != '\\': + token.lexer.stringbuf += token.value + else: + token.lexer.string_backslashed = True + + + +complex_rules = [ + t_BOOLEAN, + t_INTEGER, + t_TYPE, + t_newline, + t_ID, + #---------- + #String states rules + t_STRING_start, + t_STRING_newline, + t_STRING_anything, + t_STRING_end + #---------- + ] + + +# STRING ignored characters +t_STRING_ignore = '' + + +# The comment states +@TOKEN(r"\(\*") +def t_COMMENT_start(self, token): + token.lexer.push_state("COMMENT") + token.lexer.comment_count = 0 + +#Comments can be recursive +@TOKEN(r"\(\*") +def t_COMMENT_startanother(self, t): + t.lexer.comment_count += 1 + +@TOKEN(r"\*\)") +def t_COMMENT_end(self, token): + if token.lexer.comment_count == 0: + token.lexer.pop_state() + else: + token.lexer.comment_count -= 1 + +# COMMENT ignored characters +t_COMMENT_ignore = '' + + + + + + +#Error handlers + +# STRING error handler +def t_STRING_error(self, token): + print("Illegal character! Line: {0}, character: {1}".format(token.lineno, token.value[0])) + token.lexer.skip(1) + + +# COMMENT error handler +def t_COMMENT_error(self, token): + token.lexer.skip(1) + +def t_error(self, token): + print("Illegal character! Line: {0}, character: {1}".format(token.lineno, token.value[0])) + token.lexer.skip(1) + From 888a63b7c3e2a8bbff3fb3d9bd85db7e2e819389 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 29 Feb 2020 15:08:18 -0500 Subject: [PATCH 07/96] Added functionality for lexer analyzer --- src/compiler/components/lexer_analyzer.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 1ff485c8..31362b32 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -1,13 +1,22 @@ from .abstract_component import Component - +from ..utils.compiler_containers import lexer_analyzer_dependency_container as injector +from ply import lex class lexer_analyzer(Component): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + @property - def tokens_collection(): - pass - + def tokens_collection(self): + return injector.tokens_collection_cool + + @property + def basic_reserved(self): + return injector.reserved_keywords_cool + def build_component(self): - super().build_component() \ No newline at end of file + self.reserved = self.basic_reserved.keys() + self.tokens = self.tokens_collection + tuple(self.basic_reserved.values()) + self.lexer = lex.lex(module = self) + \ No newline at end of file From c6663a7ca0d6c1010eee8d77619650f1d5b8b7d2 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 29 Feb 2020 20:03:30 -0500 Subject: [PATCH 08/96] I think that the lexer analyzer is ready for test --- src/compiler/components/lexer_analyzer.py | 36 ++++++--- src/compiler/utils/compiler_containers.py | 14 +++- src/compiler/utils/container.py | 15 ---- src/compiler/utils/lexer_definitions.py | 99 ++++++++++++++--------- src/main.py | 12 ++- 5 files changed, 98 insertions(+), 78 deletions(-) delete mode 100644 src/compiler/utils/container.py diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 31362b32..06b9efc8 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -3,20 +3,32 @@ from ply import lex class lexer_analyzer(Component): - def __init__(self, *args, **kwargs): + def __init__(self, + tokens_collection, + basic_keywords, + simple_rules, + complex_rules, + *args, + **kwargs): + self.inject_complex_rules(complex_rules) + self.tokens_collection = tokens_collection + self.basic_keywords = basic_keywords super().__init__(*args, **kwargs) - - @property - def tokens_collection(self): - return injector.tokens_collection_cool - - @property - def basic_reserved(self): - return injector.reserved_keywords_cool + def inject_complex_rules(self, complex_rules): + for x in complex_rules: + super().__setattr__(x.__name__, x) + def build_component(self): - self.reserved = self.basic_reserved.keys() - self.tokens = self.tokens_collection + tuple(self.basic_reserved.values()) + self.reserved = self.basic_keywords.keys() + self.tokens = self.tokens_collection + tuple(self.basic_keywords.values()) self.lexer = lex.lex(module = self) - \ No newline at end of file + + def input_lexer(self, cool_program_source_code): + self.lexer.input(cool_program_source_code) + + + def token(self): + self.last_token = self.lexer.token() + return self.last_token diff --git a/src/compiler/utils/compiler_containers.py b/src/compiler/utils/compiler_containers.py index 7fe71041..a9162f38 100644 --- a/src/compiler/utils/compiler_containers.py +++ b/src/compiler/utils/compiler_containers.py @@ -1,10 +1,11 @@ from dependency_injector import containers, providers from compiler.components.dummy_component import dummy_component import lexer_definitions - +from compiler.components.lexer_analyzer import lexer_analyzer class component_container (containers.DeclarativeContainer): dummy_lexer = providers.Factory(dummy_component, "Lexer") + cool_lexer = providers.Factory(lexer_analyzer) dummy_parser = providers.Factory(dummy_component, "Parser") @@ -14,8 +15,13 @@ class component_container (containers.DeclarativeContainer): } class lexer_analyzer_dependency_container (containers.DeclarativeContainer): - reserved_keywords_cool = providers.Callable(lambda value: value, lexer_definitions.basic_keywords) - tokens_collection_cool = providers.Callable(lambda value: value, lexer_definitions.tokens_collection) - simple_rules_cool = providers.Callable(lambda value: value, lexer_definitions.simple_rules_cool) + #This is just readonly properties + reserved_keywords_cool = lexer_definitions.basic_keywords + tokens_collection_cool = lexer_definitions.tokens_collection + simple_rules_cool = lexer_definitions.simple_rules + complex_rules_cool = lexer_definitions.complex_rules + error_handlers_cool = lexer_definitions.error_handlers + #---------------- + diff --git a/src/compiler/utils/container.py b/src/compiler/utils/container.py deleted file mode 100644 index 01730e0c..00000000 --- a/src/compiler/utils/container.py +++ /dev/null @@ -1,15 +0,0 @@ -from dependency_injector import containers, providers -from compiler.components.dummy_component import dummy_component - - - -class component_container (containers.DeclarativeContainer): - dummy_lexer = providers.Factory(dummy_component, "Lexer") - dummy_parser = providers.Factory(dummy_component, "Parser") - - - - - - - diff --git a/src/compiler/utils/lexer_definitions.py b/src/compiler/utils/lexer_definitions.py index 240ae8fd..2b29f0f2 100644 --- a/src/compiler/utils/lexer_definitions.py +++ b/src/compiler/utils/lexer_definitions.py @@ -48,29 +48,7 @@ def __eq__(self, other: str): } #Simple rules for cool -simple_rules = { - "t_LPAREN" : r'\(', - "t_RPAREN" : r'\)', - "t_LBRACE" : r'\{', - "t_RBRACE" : r'\}', - "t_COLON" : r'\:' , - "t_COMMA" : r'\,' , - "t_DOT" : r'\.' , - "t_SEMICOLON" : r'\;', - "t_AT" : r'\@', - "t_PLUS" : r'\+', - "t_MINUS" : r'\-', - "t_MULTIPLY" : r'\*', - "t_DIVIDE" : r'\/', - "t_EQ" : r'\=', - "t_LT" : r'\<', - "t_LTEQ" : r'\<\=', - "t_ASSIGN" : r'\<\-', - "t_INT_COMP" : r'~', - "t_NOT" : r'not', - "t_ignore" : ' \t\r\f' -} -""" t_LPAREN = r'\(' # ( +t_LPAREN = r'\(' # ( t_RPAREN = r'\)' # ) t_LBRACE = r'\{' # { t_RBRACE = r'\}' # } @@ -91,7 +69,30 @@ def __eq__(self, other: str): t_NOT = r'not' # not #ignore spaces -t_ignore = ' \t\r\f' """ +t_ignore = ' \t\r\f' + +simple_rules = [ + t_LPAREN, + t_RPAREN, + t_LBRACE, + t_RBRACE, + t_COLON, + t_COMMA, + t_DOT, + t_SEMICOLON, + t_AT, + t_PLUS, + t_MINUS, + t_MULTIPLY, + t_DIVIDE, + t_EQ, + t_LT, + t_LTEQ, + t_ASSIGN, + t_INT_COMP, + t_NOT +] + #Complex rules for cool @@ -182,25 +183,12 @@ def t_STRING_anything(self, token): token.lexer.string_backslashed = True +# STRING ignored characters +t_STRING_ignore = '' + -complex_rules = [ - t_BOOLEAN, - t_INTEGER, - t_TYPE, - t_newline, - t_ID, - #---------- - #String states rules - t_STRING_start, - t_STRING_newline, - t_STRING_anything, - t_STRING_end - #---------- - ] -# STRING ignored characters -t_STRING_ignore = '' # The comment states @@ -245,3 +233,34 @@ def t_error(self, token): print("Illegal character! Line: {0}, character: {1}".format(token.lineno, token.value[0])) token.lexer.skip(1) + + +#Complex rules list +complex_rules = [ + t_BOOLEAN, + t_INTEGER, + t_TYPE, + t_newline, + t_ID, + #---------- + #String states rules + t_STRING_start, + t_STRING_newline, + t_STRING_anything, + t_STRING_end, + t_STRING_ignore, + #---------- + #Comment states rules + t_COMMENT_start, + t_COMMENT_startanother, + t_COMMENT_end, + t_COMMENT_ignore + ] + +#Error handlers +error_handlers = [ + t_STRING_error, + t_COMMENT_error, + t_error +] + diff --git a/src/main.py b/src/main.py index 3c3f8db3..7d21f021 100644 --- a/src/main.py +++ b/src/main.py @@ -1,14 +1,12 @@ import sys, fileinput from argparse import ArgumentParser - +from compiler.utils.compiler_containers import container_dict parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') -parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '*') -parser_input.add_argument("--lex", '-l', help = 'Output the lexer for the .cl file', action = 'store_true') -parser_input.add_argument("--ast", help = 'Output the abstract syntax tree (AST) for the .cl file', action = 'store_true') -parser_input.add_argument("--outputFile", '-oF', help = 'Put the info of the output options in the specified file.\n If no output option is specified the file creates empty.') +parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') +parser_input.add_argument("--lexer", help = 'Select the lexer that you could use from avialable options', choices= container_dict['lexer_options'].keys()) +parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices= container_dict['parser_options'].keys()) +parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices= ['l','p','t']) args = parser_input.parse_args() working_input = fileinput.input(files = args.files_for_compile) -if args.outputFile: - fd = open(mode= 'x', file = './output_files' + args.outputFile) From a5b8569903bfc879c31bf2770746aec7b81e9c8e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 29 Feb 2020 20:46:39 -0500 Subject: [PATCH 09/96] The moment for test is near. I can feel it. --- src/compiler/components/lexer_analyzer.py | 45 +++++++++++++++++++++-- src/main.py | 8 ++-- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 06b9efc8..c95c372a 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -8,22 +8,25 @@ def __init__(self, basic_keywords, simple_rules, complex_rules, + error_handlers, *args, **kwargs): - self.inject_complex_rules(complex_rules) + self.inject(complex_rules) + self.inject(error_handlers) self.tokens_collection = tokens_collection self.basic_keywords = basic_keywords super().__init__(*args, **kwargs) - def inject_complex_rules(self, complex_rules): - for x in complex_rules: - super().__setattr__(x.__name__, x) + def inject(self, function_group): + for function in function_group: + super().__setattr__(function.__name__, function) def build_component(self): self.reserved = self.basic_keywords.keys() self.tokens = self.tokens_collection + tuple(self.basic_keywords.values()) self.lexer = lex.lex(module = self) + def input_lexer(self, cool_program_source_code): self.lexer.input(cool_program_source_code) @@ -32,3 +35,37 @@ def input_lexer(self, cool_program_source_code): def token(self): self.last_token = self.lexer.token() return self.last_token + + + # A funny iterator here + def __iter__(self): + return self + + def __next__(self): + t = self.token() + if t is None: + raise StopIteration + return t + + def next(self): + return self.__next__() + # End of fun + + + +if __name__ == "__main__": + import sys + + input_info = sys.argv[1] + with open(input_info, encoding = 'utf-8') as file: + cool_program_source_code = file.read() + + lexer = lexer_analyzer(tokens_collection = injector.tokens_collection_cool, + basic_keywords = injector.reserved_keywords_cool, + simple_rules = injector.simple_rules_cool, + complex_rules = injector.complex_rules_cool, + error_handlers = injector.error_handlers_cool) + lexer.input_lexer(cool_program_source_code) + + for token in lexer: + print(token) \ No newline at end of file diff --git a/src/main.py b/src/main.py index 7d21f021..1afa790c 100644 --- a/src/main.py +++ b/src/main.py @@ -4,9 +4,11 @@ parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') -parser_input.add_argument("--lexer", help = 'Select the lexer that you could use from avialable options', choices= container_dict['lexer_options'].keys()) -parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices= container_dict['parser_options'].keys()) -parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices= ['l','p','t']) +parser_input.add_argument("--lexer", help = 'Select the lexer that you could use from avialable options', choices = container_dict['lexer_options'].keys()) +parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices = container_dict['parser_options'].keys()) +parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices = ['l','p','t']) + args = parser_input.parse_args() working_input = fileinput.input(files = args.files_for_compile) + From facd09d7fb6fd35d94695848dd55f22aa260b2a2 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 20 May 2020 16:25:53 -0400 Subject: [PATCH 10/96] 10 of 13 test passed --- src/compiler/components/lexer_analyzer.py | 257 +++++++++++++++++----- src/coolc.sh | 6 +- src/main.py | 22 +- 3 files changed, 218 insertions(+), 67 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index c95c372a..d8d1b974 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -1,71 +1,210 @@ -from .abstract_component import Component -from ..utils.compiler_containers import lexer_analyzer_dependency_container as injector -from ply import lex - -class lexer_analyzer(Component): - def __init__(self, - tokens_collection, - basic_keywords, - simple_rules, - complex_rules, - error_handlers, - *args, - **kwargs): - self.inject(complex_rules) - self.inject(error_handlers) - self.tokens_collection = tokens_collection - self.basic_keywords = basic_keywords - super().__init__(*args, **kwargs) - - def inject(self, function_group): - for function in function_group: - super().__setattr__(function.__name__, function) +import ply.lex as lex +from ply.lex import Token +from ply.lex import TOKEN +from ..utils.errors import lexicographicError - - def build_component(self): - self.reserved = self.basic_keywords.keys() - self.tokens = self.tokens_collection + tuple(self.basic_keywords.values()) - self.lexer = lex.lex(module = self) +tokens = [ + # Identifiers + "ID", "TYPE", + + # Primitive Types + "INTEGER", "STRING", "BOOLEAN", + + # Literals + "LPAREN", "RPAREN", "LBRACE", "RBRACE", "COLON", "COMMA", "DOT", "SEMICOLON", "AT", + + # Operators + "PLUS", "MINUS", "MULTIPLY", "DIVIDE", "EQ", "LT", "LTEQ", "ASSIGN", "INT_COMP", "NOT", + + # Special Operators + "ARROW" +] + +reserved = { + 'new':'NEW', + 'of':'OF', + 'if' : 'IF', + 'let':'LET', + 'in' : 'IN', + 'fi':'FI', + 'else' : 'ELSE', + 'while':'WHILE', + 'case':'CASE', + 'then' : 'THEN', + 'esac':'ESAC', + 'pool':'POOL', + 'class':'CLASS', + 'loop':'LOOP', + 'true':'TRUE', + 'inherits':'INHERITS', + 'isvoid':'ISVOID', + 'false':'FALSE' +} + +tokens += list(reserved.values()) + +#Simple rules +t_PLUS = r'\+' +t_MINUS = r'\-' +t_MULTIPLY = r'\*' +t_DIVIDE = r'\/' +t_LPAREN = r'\(' +t_RPAREN = r'\)' +t_EQ = r'\=' +t_LT = r'\<' +t_LTEQ = r'\<\=' +t_ASSIGN = r'\<\-' +t_INT_COMP = r'~' +t_NOT = r'not' +t_LBRACE = r'\{' +t_RBRACE = r'\}' +t_COLON = r'\:' +t_COMMA = r'\,' +t_DOT = r'\.' +t_SEMICOLON = r'\;' +t_AT = r'\@' +t_ARROW = r'\=\>' +#complex rules + +@TOKEN(r"(true|false)") +def t_BOOLEAN(token): + token.value = True if token.value == "true" else False + return token + +@TOKEN(r"\d+") +def t_INTEGER(token): + token.value = int(token.value) + return token + +@TOKEN(r"[A-Z][A-Za-z0-9_]*") +def t_TYPE(token): + token.type = reserved.get(token.value, 'TYPE') + return token + +@TOKEN(r"[a-z][A-Za-z0-9_]*") +def t_ID(token): + token.type = reserved.get(token.value, "ID") + return token + +# Utility definitions +@TOKEN(r'\n+') +def t_ANY_newline(t): + global readjust_col + readjust_col = t.lexpos + len(t.value) + t.lexer.lineno += len(t.value) - - def input_lexer(self, cool_program_source_code): - self.lexer.input(cool_program_source_code) - +def t_error(token): + errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) + token.lexer.skip(1) - def token(self): - self.last_token = self.lexer.token() - return self.last_token +t_ignore = ' \t' +t_ignore_COMMENTLINE = r"\-\-[^\n]*" - # A funny iterator here - def __iter__(self): - return self +#Global states +states = ( + ("STRING", "exclusive"), + ("COMMENT", "exclusive") +) - def __next__(self): - t = self.token() - if t is None: - raise StopIteration - return t +#The string states +@TOKEN(r'\"') +def t_start_string(token): + token.lexer.push_state("STRING") + token.lexer.string_backslashed = False + token.lexer.stringbuf = "" - def next(self): - return self.__next__() - # End of fun +@TOKEN(r"\n") +def t_STRING_newline(token): + token.lexer.lineno += 1 + if not token.lexer.string_backslashed: + errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "Unterminated string constant")) + token.lexer.pop_state() + else: + token.lexer.string_backslashed = False +@TOKEN("\0") +def t_STRING_null(token): + errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) + token.lexer.skip(1) +@TOKEN(r"\"") +def t_STRING_end(token): + if not token.lexer.string_backslashed: + token.lexer.pop_state() + token.value = token.lexer.stringbuf + token.type = "STRING" + return token + else: + token.lexer.stringbuf += '"' + token.lexer.string_backslashed = False -if __name__ == "__main__": - import sys +@TOKEN(r"[^\n]") +def t_STRING_anything(token): + if token.lexer.string_backslashed: + if token.value == 'b': + token.lexer.stringbuf += '\b' + elif token.value == 't': + token.lexer.stringbuf += '\t' + elif token.value == 'n': + token.lexer.stringbuf += '\n' + elif token.value == 'f': + token.lexer.stringbuf += '\f' + elif token.value == '\\': + token.lexer.stringbuf += '\\' + else: + token.lexer.stringbuf += token.value + token.lexer.string_backslashed = False + else: + if token.value != '\\': + token.lexer.stringbuf += token.value + else: + token.lexer.string_backslashed = True - input_info = sys.argv[1] - with open(input_info, encoding = 'utf-8') as file: - cool_program_source_code = file.read() +def t_STRING_error(token): + token.lexer.skip(1) + errors.append(lexicographicError( + row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + message= 'ERROR at or near ')) + +t_STRING_ignore = '' + +# The comment state + +@TOKEN(r"\(\*") +def t_start_comment(token): + token.lexer.push_state("COMMENT") + token.lexer.comment_count = 0 + +@TOKEN(r"\(\*") +def t_COMMENT_startanother(token): + token.lexer.comment_count += 1 + +@TOKEN(r"\*\)") +def t_COMMENT_end(token): + if token.lexer.comment_count == 0: + token.lexer.pop_state() + else: + token.lexer.comment_count -= 1 + + +def t_COMMENT_error(token): + token.lexer.skip(1) - lexer = lexer_analyzer(tokens_collection = injector.tokens_collection_cool, - basic_keywords = injector.reserved_keywords_cool, - simple_rules = injector.simple_rules_cool, - complex_rules = injector.complex_rules_cool, - error_handlers = injector.error_handlers_cool) - lexer.input_lexer(cool_program_source_code) - - for token in lexer: - print(token) \ No newline at end of file +def t_COMMENT_eof(token): + errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) + token.lexer.pop_state() + +t_COMMENT_ignore = '' +errors = [] + + +def tokenizer(stream_input): + lexer = lex.lex() + lexer.input(stream_input) + token_list = [] + for tok in lexer: + token_list.append(tok) + + return errors, token_list + diff --git a/src/coolc.sh b/src/coolc.sh index f3613a9e..b6e7d50d 100755 --- a/src/coolc.sh +++ b/src/coolc.sh @@ -1,6 +1,6 @@ # Incluya aquí las instrucciones necesarias para ejecutar su compilador - + INPUT_FILE=$1 OUTPUT_FILE=${INPUT_FILE:0: -2}mips @@ -15,6 +15,6 @@ echo "LINEA_CON_NOMBRE_Y_VERSION_DEL_COMPILADOR" # TODO: Recuerde cambiar echo "CopyLeft (L) 2020: Alejandro Díaz Roque, Rafael Horrach" # Llamar al compilador -python3 main.py $@ -echo "Compiling $INPUT_FILE into $OUTPUT_FILE" +python main.py "$@" +#echo "Compiling $INPUT_FILE into $OUTPUT_FILE" diff --git a/src/main.py b/src/main.py index 1afa790c..82d313d1 100644 --- a/src/main.py +++ b/src/main.py @@ -1,14 +1,26 @@ import sys, fileinput from argparse import ArgumentParser -from compiler.utils.compiler_containers import container_dict +from compiler.components.lexer_analyzer import tokenizer parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') -parser_input.add_argument("--lexer", help = 'Select the lexer that you could use from avialable options', choices = container_dict['lexer_options'].keys()) -parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices = container_dict['parser_options'].keys()) +""" parser_input.add_argument("--lexer", help = 'Select the lexer that you could use from avialable options', choices = component_injector['lexer_options'].keys(), + default='cool') +parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices = component_injector['parser_options'].keys()) parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices = ['l','p','t']) - + """ args = parser_input.parse_args() -working_input = fileinput.input(files = args.files_for_compile) +#print(args.files_for_compile) +file = open(args.files_for_compile[0]) +working_input = file.read() + +errors, tokens = tokenizer(working_input) + +if errors: + for error in errors: + print(error) + exit(1) +print(tokens) +exit(0) From ab5d06ec5095a999e20d9e39ed19bfabbbf4d862 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 20 May 2020 21:48:23 -0400 Subject: [PATCH 11/96] 100% of test case passed --- src/compiler/components/lexer_analyzer.py | 25 +++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index d8d1b974..2febfa91 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -88,8 +88,8 @@ def t_ID(token): # Utility definitions @TOKEN(r'\n+') -def t_ANY_newline(t): - global readjust_col +def t_newline(t): + global readjust_col readjust_col = t.lexpos + len(t.value) t.lexer.lineno += len(t.value) @@ -114,21 +114,24 @@ def t_start_string(token): token.lexer.string_backslashed = False token.lexer.stringbuf = "" -@TOKEN(r"\n") +@TOKEN(r'\n') def t_STRING_newline(token): + global readjust_col token.lexer.lineno += 1 if not token.lexer.string_backslashed: - errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "Unterminated string constant")) + errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + message= "Unterminated string constant")) token.lexer.pop_state() else: token.lexer.string_backslashed = False + readjust_col = token.lexpos + len(token.value) -@TOKEN("\0") +@TOKEN('\0') def t_STRING_null(token): errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) token.lexer.skip(1) -@TOKEN(r"\"") +@TOKEN(r'\"') def t_STRING_end(token): if not token.lexer.string_backslashed: token.lexer.pop_state() @@ -167,6 +170,10 @@ def t_STRING_error(token): row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= 'ERROR at or near ')) +def t_STRING_eof(token): + errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) + token.lexer.pop_state() + t_STRING_ignore = '' # The comment state @@ -180,6 +187,12 @@ def t_start_comment(token): def t_COMMENT_startanother(token): token.lexer.comment_count += 1 +@TOKEN(r"\n+") +def t_COMMENT_newline(token): + global readjust_col + readjust_col = token.lexpos + len(token.value) + token.lexer.lineno += len(token.value) + @TOKEN(r"\*\)") def t_COMMENT_end(token): if token.lexer.comment_count == 0: From 5fdaea5b43fc9a30977a54df71db5557d8f1b552 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 27 May 2020 16:03:41 -0400 Subject: [PATCH 12/96] A bug in the error column tracker --- src/compiler/components/syntax_analyzer.py | 377 +++++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 src/compiler/components/syntax_analyzer.py diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py new file mode 100644 index 00000000..bfec609a --- /dev/null +++ b/src/compiler/components/syntax_analyzer.py @@ -0,0 +1,377 @@ +import ply.yacc as yacc +from ply.yacc import YaccProduction, YaccSymbol +from ..utils.errors import error +from ..components.lexer_analyzer import lexer + +class pyCoolParser: + def __init__(self, tokens): + self.tokens = tokens + self.errors_parser = [] + self.parser = yacc.yacc(module=self) + self.row_tracker = 0 + self.column_corrector = 0 + + # precedence rules + precedence = ( + ('right', 'ASSIGN'), + ('right', 'NOT'), + ('nonassoc', 'LTEQ', 'LT', 'EQ'), + ('left', 'PLUS', 'MINUS'), + ('left', 'MULTIPLY', 'DIVIDE'), + ('right', 'ISVOID'), + ('right', 'INT_COMP'), + ('left', 'AT'), + ('left', 'DOT') + ) + + + def positionTrack(self, + p : YaccProduction, + functionName, + indexLinespan = 0, + indexLexspan = 0): + """ print('%%%%%%%%%%%%%%%%%') + if type(p.stack[-1]) != YaccSymbol: + if self.row_tracker != p.stack[-1].lineno: + print('--------------') + print('Inside the if') + print('before lineno %d' %(self.row_tracker)) + self.column_corrector = p.stack[-1].lexpos + self.row_tracker = p.stack[-1].lineno + print (p.stack[-1]) + print('new lineno %d' %self.row_tracker) + print('and col corrector %d' %self.column_corrector) + print('--------------') + else: + print('--------------') + print('Outside before lineno %s' %self.row_tracker) + print('Outside current lineno %s' %p.lineno(indexLinespan)) + print('--------------') + print('the real col %d' %(p.lexpos(indexLinespan)- self.column_corrector)) + print('the fucked col %d' %(p.lexpos(indexLinespan))) + print(p.stack) + print('In the function %s' %functionName) + print('%%%%%%%%%%%%%%%%%')""" + pass + def p_program(self, p): + """ + program : class_list + """ + self.positionTrack(p, functionName='p_program') + + + def p_class_list(self, p): + """ + class_list : class_list class SEMICOLON + | class SEMICOLON + """ + self.positionTrack(p, functionName='p_class_list') + + def p_class(self, p): + """ + class : CLASS TYPE LBRACE features_list_opt RBRACE + """ + self.positionTrack(p, functionName='p_class') + + def p_class_inherits(self, p): + """ + class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE + """ + self.positionTrack(p, functionName='p_class_inherits') + + def p_feature_list_opt(self, p): + """ + features_list_opt : features_list + | empty + """ + self.positionTrack(p, functionName='p_feature_list_opt') + + def p_feature_list(self, p): + """ + features_list : features_list feature SEMICOLON + | feature SEMICOLON + """ + self.positionTrack(p, functionName='p_feature_list') + + def p_feature_method(self, p): + """ + feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE + """ + self.positionTrack(p, functionName='p_feature_method') + + def p_feature_method_no_formals(self, p): + """ + feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE + """ + self.positionTrack(p, functionName='p_feature_method_no_formals') + + def p_feature_attr_initialized(self, p): + """ + feature : ID COLON TYPE ASSIGN expression + """ + self.positionTrack(p, functionName='p_feature_attr_initialized') + + def p_feature_attr(self, p): + """ + feature : ID COLON TYPE + """ + self.positionTrack(p, functionName='p_feature_attr') + + def p_formal_list_many(self, p): + """ + formal_params_list : formal_params_list COMMA formal_param + | formal_param + """ + self.positionTrack(p, functionName='p_formal_list_many') + + def p_formal(self, p): + """ + formal_param : ID COLON TYPE + """ + self.positionTrack(p, functionName='p_formal') + + def p_expression_object_identifier(self, p): + """ + expression : ID + """ + self.positionTrack(p, functionName='p_expression_object_identifier') + + def p_expression_integer_constant(self, p): + """ + expression : INTEGER + """ + self.positionTrack(p, functionName='p_expression_integer_constant') + + def p_expression_boolean_constant(self, p): + """ + expression : BOOLEAN + """ + self.positionTrack(p, functionName='p_expression_boolean_constant') + + def p_expression_string_constant(self, p): + """ + expression : STRING + """ + self.positionTrack(p, functionName='p_expression_string_constant') + + def p_expr_self(self, p): + """ + expression : SELF + """ + self.positionTrack(p, functionName='p_expr_self') + + def p_expression_block(self, p): + """ + expression : LBRACE block_list RBRACE + """ + self.positionTrack(p, functionName='p_expression_block') + + def p_block_list(self, p): + """ + block_list : block_list expression SEMICOLON + | expression SEMICOLON + """ + self.positionTrack(p, functionName='p_block_list') + + def p_expression_assignment(self, p): + """ + expression : ID ASSIGN expression + """ + self.positionTrack(p, functionName='p_expression_assignment') + +# ######################### UNARY OPERATIONS ####################################### + + def p_expression_new(self, p): + """ + expression : NEW TYPE + """ + self.positionTrack(p, functionName='p_expression_new') + + def p_expression_isvoid(self, p): + """ + expression : ISVOID expression + """ + self.positionTrack(p, functionName='p_expression_isvoid') + + def p_expression_integer_complement(self, p): + """ + expression : INT_COMP expression + """ + self.positionTrack(p, functionName='p_expression_integer_complement') + + def p_expression_boolean_complement(self, p): + """ + expression : NOT expression + """ + self.positionTrack(p, functionName='p_expression_boolean_complement') + + # ######################### PARENTHESIZED, MATH & COMPARISONS ##################### + + def p_expression_math_operations(self, p): + """ + expression : expression PLUS expression + | expression MINUS expression + | expression MULTIPLY expression + | expression DIVIDE expression + """ + self.positionTrack(p, functionName='p_expression_math_operations') + + def p_expression_math_comparisons(self, p): + """ + expression : expression LT expression + | expression LTEQ expression + | expression EQ expression + """ + self.positionTrack(p, functionName='p_expression_math_comparisons') + + def p_expression_with_parenthesis(self, p): + """ + expression : LPAREN expression RPAREN + """ + self.positionTrack(p, functionName='p_expression_with_parenthesis') + + # ######################### CONTROL FLOW EXPRESSIONS ############################## + + def p_expression_if_conditional(self, p): + """ + expression : IF expression THEN expression ELSE expression FI + """ + self.positionTrack(p, functionName='p_expression_if_conditional') + + def p_expression_while_loop(self, p): + """ + expression : WHILE expression LOOP expression POOL + """ + self.positionTrack(p, functionName='p_expression_while_loop') + + ## ######################### LET EXPRESSIONS ######################################## + + def p_expression_let(self, p): + """ + expression : let_expression + """ + self.positionTrack(p, functionName='p_expression_let') + + def p_expression_let_simple(self, p): + """ + let_expression : LET ID COLON TYPE IN expression + | nested_lets COMMA LET ID COLON TYPE + """ + self.positionTrack(p, functionName='p_expression_let_simple') + + def p_expression_let_initialized(self, p): + """ + let_expression : LET ID COLON TYPE ASSIGN expression IN expression + | nested_lets COMMA LET ID COLON TYPE ASSIGN expression + """ + self.positionTrack(p, functionName='p_expression_let_initialized') + + def p_inner_lets_simple(self, p): + """ + nested_lets : ID COLON TYPE IN expression + | nested_lets COMMA ID COLON TYPE + """ + self.positionTrack(p, functionName='p_inner_lets_simple') + + def p_inner_lets_initialized(self, p): + """ + nested_lets : ID COLON TYPE ASSIGN expression IN expression + | nested_lets COMMA ID COLON TYPE ASSIGN expression + """ + self.positionTrack(p, functionName='p_inner_lets_initialized') + + # ######################### CASE EXPRESSION ######################################## + + def p_expression_case(self, p): + """ + expression : CASE expression OF actions_list ESAC + """ + self.positionTrack(p, functionName='p_expression_case') + + def p_actions_list(self, p): + """ + actions_list : actions_list action + | action + """ + self.positionTrack(p, functionName='p_actions_list') + + def p_action_expr(self, p): + """ + action : ID COLON TYPE ARROW expression SEMICOLON + """ + self.positionTrack(p, functionName='p_action_expr') + + + # ######################### METHODS DISPATCH ###################################### + + def p_expression_dispatch(self, p): + """ + expression : expression DOT ID LPAREN arguments_list_opt RPAREN + """ + self.positionTrack(p, functionName='p_expression_dispatch') + + def p_arguments_list_opt(self, p): + """ + arguments_list_opt : arguments_list + | empty + """ + self.positionTrack(p, functionName='p_arguments_list_opt') + + + def p_arguments_list(self, p): + """ + arguments_list : arguments_list COMMA expression + | expression + """ + self.positionTrack(p, functionName='p_arguments_list') + + def p_expression_static_dispatch(self, p): + """ + expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN + """ + self.positionTrack(p, functionName='p_expression_static_dispatch') + + + def p_expression_self_dispatch(self, p): + """ + expression : ID LPAREN arguments_list_opt RPAREN + """ + self.positionTrack(p, functionName='p_expression_self_dispatch') + + + + # ######################### ################## ################################### + + def p_empty(self, p): + """ + empty : + """ + self.positionTrack(p, functionName='p_empty') + + def findColumn(self, trackedRow): + for i in range(len(self.parser.symstack) -1, 1, -1): + if self.parser.symstack[i].lineno != trackedRow: + return self.parser.symstack[i].lexpos + return 0 + + def p_error(self, p): + """ + Error rule for Syntax Errors handling and reporting. + """ + error_message = "EOF in string" if p is None else "Error at or near %s" %p.value + column_corrector = 0 if p is None else self.findColumn(p.lineno) + self.errors_parser.append( + error(message= error_message, + error_type="SyntacticError", + row_and_col= (0,0) if p is None else (p.lineno, p.lexpos - column_corrector - 1))) + print("Aquí ando") + self.parser.errok() + self.parser.token() + + +def run_parser(tokens, source_program): + parserCool = pyCoolParser(tokens) + lexer.lineno = 1 + parserCool.parser.parse(source_program, tracking=True, lexer=lexer) + return parserCool.errors_parser + From 4fb1f7d00e8d813f602e159e78617b3373366b94 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 5 Jun 2020 13:06:36 -0400 Subject: [PATCH 13/96] Passed more tests --- src/compiler/components/lexer_analyzer.py | 27 +-- src/compiler/components/syntax_analyzer.py | 192 +++++++-------------- 2 files changed, 80 insertions(+), 139 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 2febfa91..5fce84c6 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -1,7 +1,7 @@ import ply.lex as lex from ply.lex import Token from ply.lex import TOKEN -from ..utils.errors import lexicographicError +from ..utils.errors import error tokens = [ # Identifiers @@ -38,7 +38,8 @@ 'true':'TRUE', 'inherits':'INHERITS', 'isvoid':'ISVOID', - 'false':'FALSE' + 'false':'FALSE', + "self": "SELF", } tokens += list(reserved.values()) @@ -94,7 +95,8 @@ def t_newline(t): t.lexer.lineno += len(t.value) def t_error(token): - errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) + global readjust_col + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) token.lexer.skip(1) t_ignore = ' \t' @@ -119,7 +121,7 @@ def t_STRING_newline(token): global readjust_col token.lexer.lineno += 1 if not token.lexer.string_backslashed: - errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "Unterminated string constant")) token.lexer.pop_state() else: @@ -128,7 +130,7 @@ def t_STRING_newline(token): @TOKEN('\0') def t_STRING_null(token): - errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) token.lexer.skip(1) @TOKEN(r'\"') @@ -166,12 +168,12 @@ def t_STRING_anything(token): def t_STRING_error(token): token.lexer.skip(1) - errors.append(lexicographicError( + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= 'ERROR at or near ')) def t_STRING_eof(token): - errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) token.lexer.pop_state() t_STRING_ignore = '' @@ -205,19 +207,24 @@ def t_COMMENT_error(token): token.lexer.skip(1) def t_COMMENT_eof(token): - errors.append(lexicographicError(row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) + global readjust_col + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) token.lexer.pop_state() t_COMMENT_ignore = '' errors = [] +lexer = lex.lex() def tokenizer(stream_input): - lexer = lex.lex() + global readjust_col + readjust_col = 0 lexer.input(stream_input) token_list = [] + real_col = {} for tok in lexer: + real_col.update({ str(tok): tok.lexpos - readjust_col + 1 }) token_list.append(tok) - return errors, token_list + return errors, token_list, real_col diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index bfec609a..dfd04f4c 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -4,12 +4,13 @@ from ..components.lexer_analyzer import lexer class pyCoolParser: - def __init__(self, tokens): + def __init__(self, tokens, real_col): self.tokens = tokens self.errors_parser = [] self.parser = yacc.yacc(module=self) self.row_tracker = 0 self.column_corrector = 0 + self.real_col = real_col # precedence rules precedence = ( @@ -23,187 +24,134 @@ def __init__(self, tokens): ('left', 'AT'), ('left', 'DOT') ) - - - def positionTrack(self, - p : YaccProduction, - functionName, - indexLinespan = 0, - indexLexspan = 0): - """ print('%%%%%%%%%%%%%%%%%') - if type(p.stack[-1]) != YaccSymbol: - if self.row_tracker != p.stack[-1].lineno: - print('--------------') - print('Inside the if') - print('before lineno %d' %(self.row_tracker)) - self.column_corrector = p.stack[-1].lexpos - self.row_tracker = p.stack[-1].lineno - print (p.stack[-1]) - print('new lineno %d' %self.row_tracker) - print('and col corrector %d' %self.column_corrector) - print('--------------') - else: - print('--------------') - print('Outside before lineno %s' %self.row_tracker) - print('Outside current lineno %s' %p.lineno(indexLinespan)) - print('--------------') - print('the real col %d' %(p.lexpos(indexLinespan)- self.column_corrector)) - print('the fucked col %d' %(p.lexpos(indexLinespan))) - print(p.stack) - print('In the function %s' %functionName) - print('%%%%%%%%%%%%%%%%%')""" - pass + def p_program(self, p): """ program : class_list - """ - self.positionTrack(p, functionName='p_program') + """ def p_class_list(self, p): """ class_list : class_list class SEMICOLON | class SEMICOLON - """ - self.positionTrack(p, functionName='p_class_list') + """ def p_class(self, p): """ class : CLASS TYPE LBRACE features_list_opt RBRACE - """ - self.positionTrack(p, functionName='p_class') + """ def p_class_inherits(self, p): """ class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE - """ - self.positionTrack(p, functionName='p_class_inherits') + """ def p_feature_list_opt(self, p): """ features_list_opt : features_list | empty - """ - self.positionTrack(p, functionName='p_feature_list_opt') + """ def p_feature_list(self, p): """ features_list : features_list feature SEMICOLON | feature SEMICOLON - """ - self.positionTrack(p, functionName='p_feature_list') + """ def p_feature_method(self, p): """ feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE - """ - self.positionTrack(p, functionName='p_feature_method') + """ def p_feature_method_no_formals(self, p): """ feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE - """ - self.positionTrack(p, functionName='p_feature_method_no_formals') + """ def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression - """ - self.positionTrack(p, functionName='p_feature_attr_initialized') + """ def p_feature_attr(self, p): """ feature : ID COLON TYPE - """ - self.positionTrack(p, functionName='p_feature_attr') + """ def p_formal_list_many(self, p): """ formal_params_list : formal_params_list COMMA formal_param | formal_param - """ - self.positionTrack(p, functionName='p_formal_list_many') + """ def p_formal(self, p): """ formal_param : ID COLON TYPE - """ - self.positionTrack(p, functionName='p_formal') + """ def p_expression_object_identifier(self, p): """ expression : ID - """ - self.positionTrack(p, functionName='p_expression_object_identifier') + """ def p_expression_integer_constant(self, p): """ expression : INTEGER - """ - self.positionTrack(p, functionName='p_expression_integer_constant') + """ def p_expression_boolean_constant(self, p): """ expression : BOOLEAN - """ - self.positionTrack(p, functionName='p_expression_boolean_constant') + """ def p_expression_string_constant(self, p): """ expression : STRING - """ - self.positionTrack(p, functionName='p_expression_string_constant') + """ def p_expr_self(self, p): """ expression : SELF - """ - self.positionTrack(p, functionName='p_expr_self') + """ def p_expression_block(self, p): """ expression : LBRACE block_list RBRACE - """ - self.positionTrack(p, functionName='p_expression_block') + """ def p_block_list(self, p): """ block_list : block_list expression SEMICOLON | expression SEMICOLON - """ - self.positionTrack(p, functionName='p_block_list') + """ def p_expression_assignment(self, p): """ expression : ID ASSIGN expression - """ - self.positionTrack(p, functionName='p_expression_assignment') + """ # ######################### UNARY OPERATIONS ####################################### def p_expression_new(self, p): """ expression : NEW TYPE - """ - self.positionTrack(p, functionName='p_expression_new') + """ def p_expression_isvoid(self, p): """ expression : ISVOID expression - """ - self.positionTrack(p, functionName='p_expression_isvoid') + """ def p_expression_integer_complement(self, p): """ expression : INT_COMP expression - """ - self.positionTrack(p, functionName='p_expression_integer_complement') + """ def p_expression_boolean_complement(self, p): """ expression : NOT expression - """ - self.positionTrack(p, functionName='p_expression_boolean_complement') + """ # ######################### PARENTHESIZED, MATH & COMPARISONS ##################### @@ -213,93 +161,80 @@ def p_expression_math_operations(self, p): | expression MINUS expression | expression MULTIPLY expression | expression DIVIDE expression - """ - self.positionTrack(p, functionName='p_expression_math_operations') + """ def p_expression_math_comparisons(self, p): """ expression : expression LT expression | expression LTEQ expression | expression EQ expression - """ - self.positionTrack(p, functionName='p_expression_math_comparisons') + """ def p_expression_with_parenthesis(self, p): """ expression : LPAREN expression RPAREN - """ - self.positionTrack(p, functionName='p_expression_with_parenthesis') + """ # ######################### CONTROL FLOW EXPRESSIONS ############################## def p_expression_if_conditional(self, p): """ expression : IF expression THEN expression ELSE expression FI - """ - self.positionTrack(p, functionName='p_expression_if_conditional') + """ def p_expression_while_loop(self, p): """ expression : WHILE expression LOOP expression POOL - """ - self.positionTrack(p, functionName='p_expression_while_loop') + """ ## ######################### LET EXPRESSIONS ######################################## def p_expression_let(self, p): """ expression : let_expression - """ - self.positionTrack(p, functionName='p_expression_let') + """ def p_expression_let_simple(self, p): """ let_expression : LET ID COLON TYPE IN expression | nested_lets COMMA LET ID COLON TYPE - """ - self.positionTrack(p, functionName='p_expression_let_simple') + """ def p_expression_let_initialized(self, p): """ let_expression : LET ID COLON TYPE ASSIGN expression IN expression | nested_lets COMMA LET ID COLON TYPE ASSIGN expression - """ - self.positionTrack(p, functionName='p_expression_let_initialized') + """ def p_inner_lets_simple(self, p): """ nested_lets : ID COLON TYPE IN expression | nested_lets COMMA ID COLON TYPE - """ - self.positionTrack(p, functionName='p_inner_lets_simple') + """ def p_inner_lets_initialized(self, p): """ nested_lets : ID COLON TYPE ASSIGN expression IN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression - """ - self.positionTrack(p, functionName='p_inner_lets_initialized') + """ # ######################### CASE EXPRESSION ######################################## def p_expression_case(self, p): """ expression : CASE expression OF actions_list ESAC - """ - self.positionTrack(p, functionName='p_expression_case') + """ def p_actions_list(self, p): """ actions_list : actions_list action | action - """ - self.positionTrack(p, functionName='p_actions_list') + """ def p_action_expr(self, p): """ action : ID COLON TYPE ARROW expression SEMICOLON - """ - self.positionTrack(p, functionName='p_action_expr') + """ # ######################### METHODS DISPATCH ###################################### @@ -307,36 +242,31 @@ def p_action_expr(self, p): def p_expression_dispatch(self, p): """ expression : expression DOT ID LPAREN arguments_list_opt RPAREN - """ - self.positionTrack(p, functionName='p_expression_dispatch') + """ def p_arguments_list_opt(self, p): """ arguments_list_opt : arguments_list | empty - """ - self.positionTrack(p, functionName='p_arguments_list_opt') + """ def p_arguments_list(self, p): """ arguments_list : arguments_list COMMA expression | expression - """ - self.positionTrack(p, functionName='p_arguments_list') + """ def p_expression_static_dispatch(self, p): """ expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN - """ - self.positionTrack(p, functionName='p_expression_static_dispatch') + """ def p_expression_self_dispatch(self, p): """ expression : ID LPAREN arguments_list_opt RPAREN - """ - self.positionTrack(p, functionName='p_expression_self_dispatch') + """ @@ -345,8 +275,7 @@ def p_expression_self_dispatch(self, p): def p_empty(self, p): """ empty : - """ - self.positionTrack(p, functionName='p_empty') + """ def findColumn(self, trackedRow): for i in range(len(self.parser.symstack) -1, 1, -1): @@ -358,20 +287,25 @@ def p_error(self, p): """ Error rule for Syntax Errors handling and reporting. """ - error_message = "EOF in string" if p is None else "Error at or near %s" %p.value - column_corrector = 0 if p is None else self.findColumn(p.lineno) - self.errors_parser.append( - error(message= error_message, - error_type="SyntacticError", - row_and_col= (0,0) if p is None else (p.lineno, p.lexpos - column_corrector - 1))) - print("Aquí ando") - self.parser.errok() - self.parser.token() + if p: + self.errors_parser.append( + error(message= "Error at or near %s" %p.value, + error_type="SyntacticError", + row_and_col= (p.lineno, self.real_col[str(p)] ))) + + else: + self.errors_parser.append( + error(message= "EOF in string", + error_type="SyntacticError", + row_and_col= (0, 0 ))) + + -def run_parser(tokens, source_program): - parserCool = pyCoolParser(tokens) +def run_parser(tokens, source_program, real_col): + #print(source_program) + parserCool = pyCoolParser(tokens, real_col) lexer.lineno = 1 - parserCool.parser.parse(source_program, tracking=True, lexer=lexer) + parserCool.parser.parse(source_program, lexer=lexer) return parserCool.errors_parser From 156089bb4a0bb177fe92c087e06cbf06e2b38b27 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 5 Jun 2020 21:42:15 -0400 Subject: [PATCH 14/96] three errors and 9 shit/reduce conflicts --- src/compiler/components/syntax_analyzer.py | 28 ++++++++-------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index dfd04f4c..804919b0 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -188,7 +188,6 @@ def p_expression_while_loop(self, p): """ ## ######################### LET EXPRESSIONS ######################################## - def p_expression_let(self, p): """ expression : let_expression @@ -196,28 +195,21 @@ def p_expression_let(self, p): def p_expression_let_simple(self, p): """ - let_expression : LET ID COLON TYPE IN expression - | nested_lets COMMA LET ID COLON TYPE - """ - - def p_expression_let_initialized(self, p): + let_expression : LET nested_lets IN expression """ - let_expression : LET ID COLON TYPE ASSIGN expression IN expression - | nested_lets COMMA LET ID COLON TYPE ASSIGN expression - """ - - def p_inner_lets_simple(self, p): + + def p_nested_lets_simple(self, p): """ - nested_lets : ID COLON TYPE IN expression + nested_lets : ID COLON TYPE | nested_lets COMMA ID COLON TYPE - """ - - def p_inner_lets_initialized(self, p): """ - nested_lets : ID COLON TYPE ASSIGN expression IN expression + + def p_nested_lets_initialize(self, p): + """ + nested_lets : ID COLON TYPE ASSIGN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression - """ - + """ + # ######################### CASE EXPRESSION ######################################## def p_expression_case(self, p): From a1e2abb18a4107481e9356ba1f90b9798cf68a69 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 5 Jun 2020 23:30:09 -0400 Subject: [PATCH 15/96] The insensitive case in keywords --- src/compiler/components/lexer_analyzer.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 5fce84c6..5f954ac3 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -35,10 +35,8 @@ 'pool':'POOL', 'class':'CLASS', 'loop':'LOOP', - 'true':'TRUE', 'inherits':'INHERITS', 'isvoid':'ISVOID', - 'false':'FALSE', "self": "SELF", } @@ -67,9 +65,9 @@ t_ARROW = r'\=\>' #complex rules -@TOKEN(r"(true|false)") +@TOKEN(r"(t[R|r][U|u][e|E]|f[a|A][l|L][s|S][e|E])") def t_BOOLEAN(token): - token.value = True if token.value == "true" else False + token.value = token.value.lower() return token @TOKEN(r"\d+") @@ -79,12 +77,12 @@ def t_INTEGER(token): @TOKEN(r"[A-Z][A-Za-z0-9_]*") def t_TYPE(token): - token.type = reserved.get(token.value, 'TYPE') + token.type = reserved.get(token.value.lower(), 'TYPE') return token @TOKEN(r"[a-z][A-Za-z0-9_]*") def t_ID(token): - token.type = reserved.get(token.value, "ID") + token.type = reserved.get(token.value.lower(), "ID") return token # Utility definitions From 9e23612b2d305dd0650ef55b81b053478a06afad Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 5 Jun 2020 23:33:00 -0400 Subject: [PATCH 16/96] Passed all test :) --- src/compiler/components/lexer_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 5f954ac3..8ef53622 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -38,6 +38,7 @@ 'inherits':'INHERITS', 'isvoid':'ISVOID', "self": "SELF", + "not" : "NOT" } tokens += list(reserved.values()) @@ -54,7 +55,6 @@ t_LTEQ = r'\<\=' t_ASSIGN = r'\<\-' t_INT_COMP = r'~' -t_NOT = r'not' t_LBRACE = r'\{' t_RBRACE = r'\}' t_COLON = r'\:' From 467240d3afa00e51117524abc23a55bd13538c31 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 8 Jun 2020 09:12:13 -0400 Subject: [PATCH 17/96] Passed all test for 'entrega-parser' --- src/main.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main.py b/src/main.py index 82d313d1..0b246ae6 100644 --- a/src/main.py +++ b/src/main.py @@ -1,6 +1,7 @@ import sys, fileinput from argparse import ArgumentParser -from compiler.components.lexer_analyzer import tokenizer +from compiler.components.lexer_analyzer import tokenizer, tokens +from compiler.components.syntax_analyzer import run_parser parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') @@ -14,13 +15,22 @@ file = open(args.files_for_compile[0]) working_input = file.read() -errors, tokens = tokenizer(working_input) +all_errors = [] +token_errors, tokens_for_input, real_col = tokenizer(working_input) +#print(tokens_for_input) -if errors: - for error in errors: +parser_errors = run_parser(tokens, working_input, real_col) + +all_errors += token_errors + parser_errors + +""" print('tokens for _input \n') +print(tokens_for_input) +print('---------------') """ +if all_errors: + for error in all_errors: print(error) exit(1) -print(tokens) + exit(0) From a48d4c9ce30d2870756840489eda8c8a189b12c9 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 8 Jun 2020 09:15:36 -0400 Subject: [PATCH 18/96] Some definitions for a better code. Useless right now --- src/compiler/components/abstract_component.py | 1 + src/compiler/components/dummy_component.py | 5 +- src/compiler/initialize.py | 4 +- src/compiler/utils/compiler_containers.py | 42 +++---- src/compiler/utils/lexer_definitions.py | 115 +++++++++--------- 5 files changed, 80 insertions(+), 87 deletions(-) diff --git a/src/compiler/components/abstract_component.py b/src/compiler/components/abstract_component.py index 30b7ed07..a5c09476 100644 --- a/src/compiler/components/abstract_component.py +++ b/src/compiler/components/abstract_component.py @@ -10,6 +10,7 @@ def __init__(self, self.component_name = component_name self.debug_session = debug_session self.error_log_file = error_log_file + if build_after_initialize: self.build_component() diff --git a/src/compiler/components/dummy_component.py b/src/compiler/components/dummy_component.py index 36e261eb..d462f321 100644 --- a/src/compiler/components/dummy_component.py +++ b/src/compiler/components/dummy_component.py @@ -3,8 +3,8 @@ class dummy_component (Component): def __init__(self, component_name, *args, **kwargs): - component_name = component_name + "dummy_" - super().__init__(*args, component_name = component_name + "dummy_", **kwargs) + component_name = "dummy_" + component_name + super().__init__(*args, component_name = "dummy_" + component_name, **kwargs) @@ -12,4 +12,3 @@ def build_component(self): super().build_component() return "Sorry, this is just a %s component" %(self.component_name) - diff --git a/src/compiler/initialize.py b/src/compiler/initialize.py index 317c53dc..7ebf2a62 100644 --- a/src/compiler/initialize.py +++ b/src/compiler/initialize.py @@ -1,10 +1,8 @@ -from .utils.compiler_containers import component_container - +from utils import compiler_containers class compiler: def __init__(self, lexer, parser): self.symbolTable = {} - self.lexer = lexer self.parser = parser pass \ No newline at end of file diff --git a/src/compiler/utils/compiler_containers.py b/src/compiler/utils/compiler_containers.py index a9162f38..9484d1a7 100644 --- a/src/compiler/utils/compiler_containers.py +++ b/src/compiler/utils/compiler_containers.py @@ -1,27 +1,21 @@ from dependency_injector import containers, providers -from compiler.components.dummy_component import dummy_component -import lexer_definitions -from compiler.components.lexer_analyzer import lexer_analyzer +from ..components import dummy_component, lexer_analyzer +from ..utils import lexer_definitions -class component_container (containers.DeclarativeContainer): - dummy_lexer = providers.Factory(dummy_component, "Lexer") - cool_lexer = providers.Factory(lexer_analyzer) - dummy_parser = providers.Factory(dummy_component, "Parser") - - -container_dict = { - 'lexer_options': { 'd': component_container.dummy_lexer }, - 'parser_options': {'d' : component_container.dummy_parser} - } - -class lexer_analyzer_dependency_container (containers.DeclarativeContainer): - #This is just readonly properties - reserved_keywords_cool = lexer_definitions.basic_keywords - tokens_collection_cool = lexer_definitions.tokens_collection - simple_rules_cool = lexer_definitions.simple_rules - complex_rules_cool = lexer_definitions.complex_rules - error_handlers_cool = lexer_definitions.error_handlers - #---------------- - - +component_injector = { + 'lexer_options': { 'dummy': dummy_component, + 'cool' : lexer_analyzer }, + 'parser_options': {'dummy' : dummy_component} + } +params_for_component = { + 'lexer' : { + 'cool' : { + 'basic_keywords': lexer_definitions.basic_keywords, + 'simple_rules' : lexer_definitions.simple_rules, + 'complex_rules' : lexer_definitions.complex_rules, + 'tokens_collection' : lexer_definitions.tokens_collection, + 'error_handlers' : lexer_definitions.error_handlers + } + } +} \ No newline at end of file diff --git a/src/compiler/utils/lexer_definitions.py b/src/compiler/utils/lexer_definitions.py index 2b29f0f2..77c27e4e 100644 --- a/src/compiler/utils/lexer_definitions.py +++ b/src/compiler/utils/lexer_definitions.py @@ -23,6 +23,8 @@ def __eq__(self, other: str): if val != 'true' and val != 'false': return val == other.lower() return val[0] == other[0] and val[1:] == other.lower()[1:] + def __hash__(self): + return super().__hash__() basic_keywords = { "case": keyword("case"), @@ -71,27 +73,28 @@ def __eq__(self, other: str): #ignore spaces t_ignore = ' \t\r\f' -simple_rules = [ - t_LPAREN, - t_RPAREN, - t_LBRACE, - t_RBRACE, - t_COLON, - t_COMMA, - t_DOT, - t_SEMICOLON, - t_AT, - t_PLUS, - t_MINUS, - t_MULTIPLY, - t_DIVIDE, - t_EQ, - t_LT, - t_LTEQ, - t_ASSIGN, - t_INT_COMP, - t_NOT -] +simple_rules = { + 't_LPAREN': t_LPAREN, + 't_RPAREN': t_RPAREN, + 't_LBRACE': t_LBRACE, + 't_RBRACE': t_RBRACE, + 't_COLON': t_COLON, + 't_COMMA': t_COMMA, + 't_DOT': t_DOT, + 't_SEMICOLON': t_SEMICOLON, + 't_AT': t_AT, + 't_PLUS': t_PLUS, + 't_MINUS': t_MINUS, + 't_MULTIPLY': t_MULTIPLY, + 't_DIVIDE': t_DIVIDE, + 't_EQ': t_EQ, + 't_LT': t_LT, + 't_LTEQ': t_LTEQ, + 't_ASSIGN': t_ASSIGN, + 't_INT_COMP': t_INT_COMP, + 't_NOT': t_NOT, + 't_ignore' : t_ignore +} #Complex rules for cool @@ -150,7 +153,7 @@ def t_STRING_newline(token): @TOKEN(r"\"") -def t_STRING_end(self, token): +def t_STRING_end(token): if not token.lexer.string_backslashed: token.lexer.pop_state() token.value = token.lexer.stringbuf @@ -161,7 +164,7 @@ def t_STRING_end(self, token): token.lexer.string_backslashed = False @TOKEN(r"[^\n]") -def t_STRING_anything(self, token): +def t_STRING_anything( token): if token.lexer.string_backslashed: if token.value == 'b': token.lexer.stringbuf += '\b' @@ -193,74 +196,72 @@ def t_STRING_anything(self, token): # The comment states @TOKEN(r"\(\*") -def t_COMMENT_start(self, token): +def t_COMMENT_start(token): token.lexer.push_state("COMMENT") token.lexer.comment_count = 0 #Comments can be recursive @TOKEN(r"\(\*") -def t_COMMENT_startanother(self, t): +def t_COMMENT_startanother(t): t.lexer.comment_count += 1 @TOKEN(r"\*\)") -def t_COMMENT_end(self, token): +def t_COMMENT_end(token): if token.lexer.comment_count == 0: token.lexer.pop_state() else: token.lexer.comment_count -= 1 -# COMMENT ignored characters -t_COMMENT_ignore = '' +t_ignore_SINGLE_LINE_COMMENT = r"\-\-[^\n]*" #Error handlers - +#(4, 2) - LexicographicError: ERROR "!" # STRING error handler -def t_STRING_error(self, token): - print("Illegal character! Line: {0}, character: {1}".format(token.lineno, token.value[0])) +def t_STRING_error( token): + print('({0}, {1}) - LexicographicError: ERROR "{2}"'.format(token.lineno, token.lexpos, token.value[0])) token.lexer.skip(1) - +#(55, 46) - LexicographicError: EOF in comment # COMMENT error handler -def t_COMMENT_error(self, token): +def t_COMMENT_error( token): + print("({0}, {1}) - LexicographicError: EOF in comment".format(token.lineno, token.lexpos)) token.lexer.skip(1) -def t_error(self, token): - print("Illegal character! Line: {0}, character: {1}".format(token.lineno, token.value[0])) + +def t_error( token): + print('({0}, {1}) - LexicographicError: ERROR "{2}"'.format(token.lineno, token.lexpos, token.value[0])) token.lexer.skip(1) #Complex rules list -complex_rules = [ - t_BOOLEAN, - t_INTEGER, - t_TYPE, - t_newline, - t_ID, +complex_rules = { + 't_BOOLEAN': t_BOOLEAN, + 't_INTEGER': t_INTEGER, + 't_TYPE': t_TYPE, + 't_newline': t_newline, + 't_ID': t_ID, #---------- #String states rules - t_STRING_start, - t_STRING_newline, - t_STRING_anything, - t_STRING_end, - t_STRING_ignore, + 't_STRING_start': t_STRING_start, + 't_STRING_newline': t_STRING_newline, + 't_STRING_anything': t_STRING_anything, + 't_STRING_end': t_STRING_end, #---------- #Comment states rules - t_COMMENT_start, - t_COMMENT_startanother, - t_COMMENT_end, - t_COMMENT_ignore - ] - + 't_COMMENT_start': t_COMMENT_start, + 't_COMMENT_startanother': t_COMMENT_startanother, + 't_COMMENT_end': t_COMMENT_end, +} #Error handlers -error_handlers = [ - t_STRING_error, - t_COMMENT_error, - t_error -] +error_handlers = { + 't_STRING_error': t_STRING_error, + 't_COMMENT_error': t_COMMENT_error, + 't_error': t_error +} From e12d646636a48bcdae62cf6479cb6f8626090900 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 15 Jun 2020 14:14:48 -0400 Subject: [PATCH 19/96] Classes an attr for the COOL class context --- src/compiler/components/syntax_analyzer.py | 21 +++--- src/compiler/utils/AST_definitions.py | 79 ++++++++++++++++++++++ 2 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 src/compiler/utils/AST_definitions.py diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 804919b0..9c831818 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -1,6 +1,7 @@ import ply.yacc as yacc from ply.yacc import YaccProduction, YaccSymbol from ..utils.errors import error +from ..utils.AST_definitions import * from ..components.lexer_analyzer import lexer class pyCoolParser: @@ -29,30 +30,33 @@ def p_program(self, p): """ program : class_list """ - + p[0] = NodeProgram(p[1]) def p_class_list(self, p): """ class_list : class_list class SEMICOLON | class SEMICOLON """ - + p[0] = NodeClassTuple((p[1],) if len(p) == 3 else p[1] + (p[2], )) + def p_class(self, p): """ class : CLASS TYPE LBRACE features_list_opt RBRACE """ - + p[0] = NodeClass(idName = p[2], body = p[4], parent = "Object") + def p_class_inherits(self, p): """ class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE """ - + p[0] = NodeClass(idName = p[2], body = p[6], parent = p[4] ) + def p_feature_list_opt(self, p): """ features_list_opt : features_list | empty - """ - + """ + def p_feature_list(self, p): """ features_list : features_list feature SEMICOLON @@ -298,6 +302,7 @@ def run_parser(tokens, source_program, real_col): #print(source_program) parserCool = pyCoolParser(tokens, real_col) lexer.lineno = 1 - parserCool.parser.parse(source_program, lexer=lexer) - return parserCool.errors_parser + ast_result = parserCool.parser.parse(source_program, lexer=lexer) + print(ast_result) + return ast_result, parserCool.errors_parser diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py new file mode 100644 index 00000000..a4de74a7 --- /dev/null +++ b/src/compiler/utils/AST_definitions.py @@ -0,0 +1,79 @@ +class Node: + @property + def clsname(self): + return str(self.__class__.__name__) + + def to_tuple(self): + return tuple([ + ("node_class_name", self.clsname) + ]) + + def to_readable(self): + return "{}".format(self.clsname) + + def __repr__(self): + return self.__str__() + + def __str__(self): + return str(self.to_readable()) + + +class NodeProgram(Node): + def __init__(self, class_list): + self.class_list = class_list + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("classes", self.class_list) + ]) + + def to_readable(self): + return "{}(classes={})".format(self.clsname, self.class_list) + + +class NodeClassTuple(Node, tuple): + def __init__(self, classes): + self.classes = classes + + + +class NodeClass(Node): + def __init__(self, idName, body, parent): + self.idName = idName + self.body = body + self.parent = parent + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("name", self.idName), + ("parent", self.parent), + ("features", self.body) + ]) + + def to_readable(self): + return "{}(name='{}', parent={}, features={})".format( + self.clsname, self.idName, self.parent, self.body) + + + +#No se si poner aqui una clase para heredar , que sea feature_class. +#Tengo que ver si a futuro necesito iterar por los elementos de una clase +#de manera abstracta. +class NodeClassMethod(Node): + def __init__(self, idName, formal_params, return_type, body): + self.idName = idName + self.formal_params = formal_params + self.return_type = return_type + self.body = body + +#Yo puedo crear un bosquejo inicial, +# y después reutilizarlo en lo subsiguiente? +class NodeAttr(Node): + def __init__(self, idName, attr_type, expr): + self.idName = idName + self.attr_type = attr_type + self.expr = expr + + From c1b0ab2055e8c3211b53108de2d689fab91a1df9 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 16 Jun 2020 10:31:48 -0400 Subject: [PATCH 20/96] The errors definitions --- src/compiler/utils/errors.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/compiler/utils/errors.py diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py new file mode 100644 index 00000000..fcb6af92 --- /dev/null +++ b/src/compiler/utils/errors.py @@ -0,0 +1,10 @@ +class error: + def __init__(self, error_type, row_and_col, message): + self.error_type = error_type + self.row_and_col = row_and_col + self.message = message + + def __str__(self): + return '(%d, %d) - %s: %s' %(self.row_and_col[0], self.row_and_col[1], self.error_type, self.message) + + __repr__ = __str__ \ No newline at end of file From 72ce4b484032f59bbab8ec36a1820155126b3b64 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 16 Jun 2020 15:44:10 -0400 Subject: [PATCH 21/96] visitor definitions --- src/compiler/utils/visitors_definitions.py | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/compiler/utils/visitors_definitions.py diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py new file mode 100644 index 00000000..bd020a6e --- /dev/null +++ b/src/compiler/utils/visitors_definitions.py @@ -0,0 +1,24 @@ +from ..utils.AST_definitions import * + + +#Necesito en ejecución definir nuevos tipos. +#Tal como hacen las interfaces en C#. +class NodeVisitor: + def visit(self, node: Node): + visitor_method_name = 'visit_' + node.clsname + visitor = getattr(self, visitor_method_name, self.not_implemented) + return visitor(node) # Return the new context result from the visit + + def not_implemented(self, node: Node): + raise Exception('Not implemented visit_{} method'.format(node.clsname)) + + + +class TypeCheckVisitor(NodeVisitor): + + def visit_NodeProgram(self): + self.context = {} + pass + pass + + \ No newline at end of file From 847cf2c6ad3e6a875e70d789fec4c27b95e65098 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 17 Jun 2020 09:55:52 -0400 Subject: [PATCH 22/96] Context and visitor for types --- src/compiler/utils/context.py | 25 ++++++++++++++++++++++ src/compiler/utils/visitors_definitions.py | 15 +++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 src/compiler/utils/context.py diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py new file mode 100644 index 00000000..75700f1b --- /dev/null +++ b/src/compiler/utils/context.py @@ -0,0 +1,25 @@ +from ..utils.AST_definitions import * + + +class globalContex: + def __init__ (self): + self.types = {} + + def createType(self, node: NodeClass): + currentClassContext = classContext(node) + currentClassContext.initialize() + self.types.update({node.idName : currentClassContext.contextDir}) + + pass + + def initialize(self): + pass + + +class classContext: + def __init__(self, node: NodeClass): + self.contextDir = {} + self.node = node + + def initialize(self): + pass \ No newline at end of file diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index bd020a6e..296a5ce8 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -1,5 +1,5 @@ from ..utils.AST_definitions import * - +from ..utils.context import globalContex #Necesito en ejecución definir nuevos tipos. #Tal como hacen las interfaces en C#. @@ -13,12 +13,13 @@ def not_implemented(self, node: Node): raise Exception('Not implemented visit_{} method'.format(node.clsname)) - class TypeCheckVisitor(NodeVisitor): - def visit_NodeProgram(self): - self.context = {} - pass - pass + def visit_NodeProgram(self, node: NodeProgram): + self.programContext = globalContex() + self.programContext.initialize() + for classNode in node.class_list: + self.visit(classNode) - \ No newline at end of file + def visit_NodeClass(self, node: NodeClass): + self.programContext.createType(node) \ No newline at end of file From 2837dc9d3d8743f9590640b4bba15ceaf229bc6d Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 17 Jun 2020 13:06:14 -0400 Subject: [PATCH 23/96] More Code --- src/compiler/utils/AST_definitions.py | 8 ----- src/compiler/utils/context.py | 35 ++++++++++++++++++---- src/compiler/utils/visitors_definitions.py | 8 +++-- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index a4de74a7..1b43e744 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -44,14 +44,6 @@ def __init__(self, idName, body, parent): self.body = body self.parent = parent - def to_tuple(self): - return tuple([ - ("class_name", self.clsname), - ("name", self.idName), - ("parent", self.parent), - ("features", self.body) - ]) - def to_readable(self): return "{}(name='{}', parent={}, features={})".format( self.clsname, self.idName, self.parent, self.body) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 75700f1b..69c980d8 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -1,25 +1,48 @@ from ..utils.AST_definitions import * +class context: + def __init__(self, dictionaries): + self.dictionaries = dictionaries + pass + + def __repr__(self): + return self.__str__() + + def __str__(self): + toReturn= "" + for dictio in self.dictionaries: + toReturn += "%s: {\n" %(dictio.__name__) + for key in dictio: + toReturn += "\t%s: %s\n" %(key, dictio[key]) + toReturn +="\n}" + return toReturn -class globalContex: +class globalContex(context): def __init__ (self): self.types = {} + super().__init__(dictionaries = [self.types]) def createType(self, node: NodeClass): currentClassContext = classContext(node) currentClassContext.initialize() - self.types.update({node.idName : currentClassContext.contextDir}) + self.types.update({node.idName : currentClassContext}) - pass def initialize(self): pass -class classContext: +class classContext(context): def __init__(self, node: NodeClass): - self.contextDir = {} + self.classInfo = {} + self.methods = {} + self.attrs ={} self.node = node + super().__init__(dictionaries = [self.classInfo, + self.methods, self.attrs]) def initialize(self): - pass \ No newline at end of file + self.classInfo.update({"idName": self.node.idName, + "parent": self.node.parent}) + + diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 296a5ce8..b28e812c 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -1,8 +1,7 @@ from ..utils.AST_definitions import * from ..utils.context import globalContex -#Necesito en ejecución definir nuevos tipos. -#Tal como hacen las interfaces en C#. + class NodeVisitor: def visit(self, node: Node): visitor_method_name = 'visit_' + node.clsname @@ -20,6 +19,9 @@ def visit_NodeProgram(self, node: NodeProgram): self.programContext.initialize() for classNode in node.class_list: self.visit(classNode) + + return self.programContext def visit_NodeClass(self, node: NodeClass): - self.programContext.createType(node) \ No newline at end of file + self.programContext.createType(node) + return self.programContext \ No newline at end of file From 86e1f53891e1f98ff0f4b2b3b7899c88acc3c111 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 17 Jun 2020 13:07:37 -0400 Subject: [PATCH 24/96] The errors definitions --- src/compiler/utils/errors.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/compiler/utils/errors.py diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py new file mode 100644 index 00000000..fcb6af92 --- /dev/null +++ b/src/compiler/utils/errors.py @@ -0,0 +1,10 @@ +class error: + def __init__(self, error_type, row_and_col, message): + self.error_type = error_type + self.row_and_col = row_and_col + self.message = message + + def __str__(self): + return '(%d, %d) - %s: %s' %(self.row_and_col[0], self.row_and_col[1], self.error_type, self.message) + + __repr__ = __str__ \ No newline at end of file From affca5c37578ab841a670445c18f55191c51eb4c Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 21 Jul 2020 11:40:31 -0400 Subject: [PATCH 25/96] Added an error message --- src/compiler/components/abstract_component.py | 20 ---------------- src/compiler/components/dummy_component.py | 14 ----------- src/compiler/utils/visitors_definitions.py | 24 +++++++++++++------ 3 files changed, 17 insertions(+), 41 deletions(-) delete mode 100644 src/compiler/components/abstract_component.py delete mode 100644 src/compiler/components/dummy_component.py diff --git a/src/compiler/components/abstract_component.py b/src/compiler/components/abstract_component.py deleted file mode 100644 index a5c09476..00000000 --- a/src/compiler/components/abstract_component.py +++ /dev/null @@ -1,20 +0,0 @@ - -class Component: - def __init__(self, - input_info, - component_name, - debug_session = False, - error_log_file = None, - build_after_initialize = True): - self.input_info = input_info - self.component_name = component_name - self.debug_session = debug_session - self.error_log_file = error_log_file - - if build_after_initialize: self.build_component() - - - def build_component (self): - if self.debug_session: - print('Building %s component' %self.component_name) - diff --git a/src/compiler/components/dummy_component.py b/src/compiler/components/dummy_component.py deleted file mode 100644 index d462f321..00000000 --- a/src/compiler/components/dummy_component.py +++ /dev/null @@ -1,14 +0,0 @@ -from .abstract_component import Component - - -class dummy_component (Component): - def __init__(self, component_name, *args, **kwargs): - component_name = "dummy_" + component_name - super().__init__(*args, component_name = "dummy_" + component_name, **kwargs) - - - - def build_component(self): - super().build_component() - return "Sorry, this is just a %s component" %(self.component_name) - diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index b28e812c..0eb6935c 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -1,5 +1,6 @@ from ..utils.AST_definitions import * from ..utils.context import globalContex +from ..utils.errors import error class NodeVisitor: @@ -11,17 +12,26 @@ def visit(self, node: Node): def not_implemented(self, node: Node): raise Exception('Not implemented visit_{} method'.format(node.clsname)) - +# We need to highlight here the inheritance relations between classes class TypeCheckVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): - self.programContext = globalContex() + self.programContext = globalContex() self.programContext.initialize() - for classNode in node.class_list: - self.visit(classNode) - - return self.programContext + errors = [] + for nodeClass in node.class_list: + if nodeClass.idName in self.programContext.types: + errors.append( + error(error_type="Semantic error", + row_and_col=(0, 0), + message="The class %s is already declared" %nodeClass.idName )) + #If I get an error in type declaration, I pass its declaration + else: + self.visit(nodeClass) + return self.programContext, errors def visit_NodeClass(self, node: NodeClass): + # When we create a type, we store it in the programContext self.programContext.createType(node) - return self.programContext \ No newline at end of file + return self.programContext + From 3a4c3cfd0df247c2ebd92db603f8270da8ea0356 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 21 Jul 2020 13:34:15 -0400 Subject: [PATCH 26/96] Added the opertations for the methodClass node --- src/compiler/components/syntax_analyzer.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 9c831818..1c039844 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -62,21 +62,24 @@ def p_feature_list(self, p): features_list : features_list feature SEMICOLON | feature SEMICOLON """ - + p[0] = (p[1], ) if len(p) == 3 else p[1] + (p[2], ) + def p_feature_method(self, p): """ feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE """ - + p[0] = NodeClassMethod(idName=p[1], formal_params=p[3], return_type=p[6], body=p[8]) + def p_feature_method_no_formals(self, p): """ feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE - """ + """ + p[0] = NodeClassMethod(idName=p[1], formal_params=[], return_type=p[5], body=p[7]) def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression - """ + """ def p_feature_attr(self, p): """ From d04dab8eeb912a6fdd88ea77bcef234985417192 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 21 Jul 2020 13:42:03 -0400 Subject: [PATCH 27/96] Added the opertations for the AttrNode --- src/compiler/components/syntax_analyzer.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 1c039844..b7c46431 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -80,23 +80,26 @@ def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression """ - + p[0] = NodeAttr(idName= p[1], attr_type= p[3], expr= p[5]) + def p_feature_attr(self, p): """ feature : ID COLON TYPE """ - + p[0] = NodeAttr(idName= p[1], attr_type= p[3], expr= None) + def p_formal_list_many(self, p): """ formal_params_list : formal_params_list COMMA formal_param | formal_param - """ + """ + def p_formal(self, p): """ formal_param : ID COLON TYPE """ - + def p_expression_object_identifier(self, p): """ expression : ID From 6c17eeda450029fb3bd52bcfdc9534053e6705d5 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 28 Jul 2020 15:51:12 -0400 Subject: [PATCH 28/96] The semantic analyzer --- src/compiler/components/semantic_analyzer.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/compiler/components/semantic_analyzer.py diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic_analyzer.py new file mode 100644 index 00000000..53101432 --- /dev/null +++ b/src/compiler/components/semantic_analyzer.py @@ -0,0 +1,12 @@ +from ..utils.visitors_definitions import TypeCheckVisitor +from ..utils.AST_definitions import NodeProgram + + +class semanticAnalyzer: + def __init__(self, ast: NodeProgram): + self.ast = ast + self.typeChecker = TypeCheckVisitor() + + def run_visits(self : NodeProgram): + self.programContext, self.programErrors = self.typeChecker.visit(self.ast) + From 3e8b4a2299caa4b8a5b93ae45eedea1bf235fd7a Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 28 Jul 2020 15:52:29 -0400 Subject: [PATCH 29/96] The context as a class with a dictionary --- src/compiler/utils/context.py | 78 ++++++++++------------ src/compiler/utils/visitors_definitions.py | 37 +++++----- 2 files changed, 56 insertions(+), 59 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 69c980d8..85bcd0e2 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -1,48 +1,44 @@ from ..utils.AST_definitions import * +from ..utils.errors import error class context: - def __init__(self, dictionaries): - self.dictionaries = dictionaries - pass - - def __repr__(self): - return self.__str__() - - def __str__(self): - toReturn= "" - for dictio in self.dictionaries: - toReturn += "%s: {\n" %(dictio.__name__) - for key in dictio: - toReturn += "\t%s: %s\n" %(key, dictio[key]) - toReturn +="\n}" - return toReturn - -class globalContex(context): - def __init__ (self): - self.types = {} - super().__init__(dictionaries = [self.types]) + def __init__(self, dictionaries ={}): + self.types = { } def createType(self, node: NodeClass): - currentClassContext = classContext(node) - currentClassContext.initialize() - self.types.update({node.idName : currentClassContext}) - - - def initialize(self): - pass - - -class classContext(context): - def __init__(self, node: NodeClass): - self.classInfo = {} - self.methods = {} - self.attrs ={} - self.node = node - super().__init__(dictionaries = [self.classInfo, - self.methods, self.attrs]) - - def initialize(self): - self.classInfo.update({"idName": self.node.idName, - "parent": self.node.parent}) + if node.idName in self.types: + return [error( + error_type='Semantic error', + row_and_col=(0,0), + message='Class %s already exist' %node.idName + )] + self.types.update({ + node.idName: { + 'parent': node.parent, + 'attrs': {}, + 'methods': {} } + } ) + return self.attachFeaturesToType(node) or 'Success' + + def attachFeaturesToType (self, node: NodeClass): + errors = [] + featureType = { NodeAttr: 'attrs', NodeClassMethod: 'methods' } + classContext = self.types[node.idName] + for feature in node.feature_list: + if feature in self.types: + errors.append(error( + error_type= 'Semantic error', row_and_col= (0, 0), + message='Feature %s already exist as a %s in the current scope' %(feature.idName, featureType[type(feature)][ :-1] ) ) ) + else: + classContext[featureType[type(feature)]].update({ + feature.idName: feature + }) + return errors + + def getType(self, idName: str): + return self.types.get(idName, False) + def __repr__(self): + return self.__str__() +programContext = context() diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 0eb6935c..4662f821 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -1,9 +1,12 @@ from ..utils.AST_definitions import * -from ..utils.context import globalContex +from ..utils.context import programContext from ..utils.errors import error - class NodeVisitor: + + def __init__(self): + self.errors = [] + def visit(self, node: Node): visitor_method_name = 'visit_' + node.clsname visitor = getattr(self, visitor_method_name, self.not_implemented) @@ -16,22 +19,20 @@ def not_implemented(self, node: Node): class TypeCheckVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): - self.programContext = globalContex() - self.programContext.initialize() - errors = [] for nodeClass in node.class_list: - if nodeClass.idName in self.programContext.types: - errors.append( - error(error_type="Semantic error", - row_and_col=(0, 0), - message="The class %s is already declared" %nodeClass.idName )) - #If I get an error in type declaration, I pass its declaration - else: - self.visit(nodeClass) - return self.programContext, errors + self.visit(nodeClass) + + def visit_NodeClass(self, node: NodeClass): + # When we create a type, we store it in the context + result = programContext.createType(node) + if not result is 'Success': + self.errors += result + +class TypeBuilderVisitor(NodeVisitor): def visit_NodeClass(self, node: NodeClass): - # When we create a type, we store it in the programContext - self.programContext.createType(node) - return self.programContext - + currentClassContext = programContext.types[node.idName] + for attr in currentClassContext.attrs: + self.visit(attr) + for method in currentClassContext.methods: + self.visit(method) From 7205eaa5bb8eb6a46ee7b9c30cd1b922d4c8d2a9 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 28 Jul 2020 15:54:34 -0400 Subject: [PATCH 30/96] Commented the attachFeaturesToType method --- src/compiler/utils/context.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 85bcd0e2..66510f68 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -18,9 +18,9 @@ def createType(self, node: NodeClass): 'attrs': {}, 'methods': {} } } ) - return self.attachFeaturesToType(node) or 'Success' + return 'Success' - def attachFeaturesToType (self, node: NodeClass): + """ def attachFeaturesToType (self, node: NodeClass): errors = [] featureType = { NodeAttr: 'attrs', NodeClassMethod: 'methods' } classContext = self.types[node.idName] @@ -33,7 +33,7 @@ def attachFeaturesToType (self, node: NodeClass): classContext[featureType[type(feature)]].update({ feature.idName: feature }) - return errors + return errors """ def getType(self, idName: str): return self.types.get(idName, False) From 268cf93c32eb5c0ce0a823a36d9d3775e6520a76 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 28 Jul 2020 16:36:45 -0400 Subject: [PATCH 31/96] Identifying the class attrs and mehtods in the AST. Not tested yet --- src/compiler/components/syntax_analyzer.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index b7c46431..de8265ef 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -43,13 +43,13 @@ def p_class(self, p): """ class : CLASS TYPE LBRACE features_list_opt RBRACE """ - p[0] = NodeClass(idName = p[2], body = p[4], parent = "Object") + p[0] = NodeClass(idName = p[2], feature_list= p[4], parent = "Object") def p_class_inherits(self, p): """ class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE """ - p[0] = NodeClass(idName = p[2], body = p[6], parent = p[4] ) + p[0] = NodeClass(idName = p[2], feature_list = p[6], parent = p[4] ) def p_feature_list_opt(self, p): """ @@ -61,8 +61,14 @@ def p_feature_list(self, p): """ features_list : features_list feature SEMICOLON | feature SEMICOLON - """ - p[0] = (p[1], ) if len(p) == 3 else p[1] + (p[2], ) + """ + p[0] = { 'methods': (), 'attributes': () } + if len(p) == 3: + key = 'methods' if type(p[1]) is NodeClassMethod else 'attributes' + p[0][key] += (p[1], ) + else: + p[0]['methods'] = p[1]['methods'] + p[2]['methods'] + p[0]['attributes'] = p[1]['attributes'] + p[2]['attributes'] def p_feature_method(self, p): """ @@ -75,7 +81,7 @@ def p_feature_method_no_formals(self, p): feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE """ p[0] = NodeClassMethod(idName=p[1], formal_params=[], return_type=p[5], body=p[7]) - + def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression @@ -93,7 +99,6 @@ def p_formal_list_many(self, p): formal_params_list : formal_params_list COMMA formal_param | formal_param """ - def p_formal(self, p): """ From 1dadfac4256424238114098e067fe344c9f05887 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 2 Aug 2020 15:26:08 -0400 Subject: [PATCH 32/96] Added the intercept error function --- src/compiler/utils/errors.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index fcb6af92..e7886609 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -7,4 +7,29 @@ def __init__(self, error_type, row_and_col, message): def __str__(self): return '(%d, %d) - %s: %s' %(self.row_and_col[0], self.row_and_col[1], self.error_type, self.message) - __repr__ = __str__ \ No newline at end of file + __repr__ = __str__ + + +errorSelector = {'repeated class': lambda idName, row_and_col=(0,0):error( + error_type= 'Semantic error', + row_and_col= row_and_col, + message= 'Class %s already exist' %idName + ), + 'undefined type': lambda idName, row_and_col=(0,0):error( + error_type='Semantic error', + row_and_col= row_and_col, + message= "The type %s doesn't exist in the current context" %idName, + ), + 'repeated attr': lambda idName, row_and_col=(0,0):error( + error_type='Semantic error', + row_and_col=row_and_col, + message="The attribute %s is already defined in the current context" %idName + ), + 'repeated method': lambda idName, row_and_col=(0,0):error( + error_type='Semantic error', + row_and_col=row_and_col, + message="The method %s is already defined in the current context" %idName + )} + +def interceptError(validationFunc, errorType: str, **argumentsConstructor): + return (not validationFunc()) and errorSelector[errorType](**argumentsConstructor) From dab08b79cd643850454b6d8ccafd99b34a0dd59f Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 2 Aug 2020 15:27:03 -0400 Subject: [PATCH 33/96] The context is now a class with a dictionary with all the subcontext inside --- src/compiler/utils/context.py | 70 ++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 66510f68..3e8fc3e7 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -1,42 +1,52 @@ from ..utils.AST_definitions import * -from ..utils.errors import error +from ..utils.errors import error, interceptError class context: def __init__(self, dictionaries ={}): self.types = { } def createType(self, node: NodeClass): - if node.idName in self.types: - return [error( - error_type='Semantic error', - row_and_col=(0,0), - message='Class %s already exist' %node.idName - )] - self.types.update({ - node.idName: { - 'parent': node.parent, - 'attrs': {}, - 'methods': {} } - } ) - return 'Success' - - """ def attachFeaturesToType (self, node: NodeClass): - errors = [] - featureType = { NodeAttr: 'attrs', NodeClassMethod: 'methods' } - classContext = self.types[node.idName] - for feature in node.feature_list: - if feature in self.types: - errors.append(error( - error_type= 'Semantic error', row_and_col= (0, 0), - message='Feature %s already exist as a %s in the current scope' %(feature.idName, featureType[type(feature)][ :-1] ) ) ) - else: - classContext[featureType[type(feature)]].update({ - feature.idName: feature - }) - return errors """ + return interceptError( + validationFunc= lambda: not node.idName in self.types, + errorType= 'repeated class', + idName= node.idName) or self.types.update({ + node.idName: { + 'parent': node.parent, + 'attributes': {}, + 'methods': {} } + } ) def getType(self, idName: str): - return self.types.get(idName, False) + return interceptError( + validationFunc= lambda: idName in self.types, + errorType= 'undefined type', + idName= idName + ) or self.types.get(idName) + + def defineAttrInType(self, typeName: str, attr: NodeAttr): + return interceptError( + validationFunc= lambda : not attr.idName in self.types[typeName], + errorType= 'repeated attr', + idName= attr.idName + ) or not self.types[typeName]['attributes'].update({ attr.idName: + { 'type': attr.attrType } }) + + def defineMethod(self, typeNameForAttach: str, + methodName: str, + returnType, + argNames, + argTypes): + return interceptError( + validationFunc= lambda: not methodName in + programContext.types[typeNameForAttach]['methods'], + errorType= 'repeated method', + idName= methodName + ) and not programContext.types[typeNameForAttach]['methods'].update( + { methodName: { + 'returnType': returnType, + 'argNames': argNames, + 'argTypesNames':argTypes + } }) def __repr__(self): return self.__str__() From 7e699807f354f603543c72f812fb7e183427f61e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 2 Aug 2020 15:27:38 -0400 Subject: [PATCH 34/96] Some testing --- src/main.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main.py b/src/main.py index 0b246ae6..8d3d6301 100644 --- a/src/main.py +++ b/src/main.py @@ -2,6 +2,9 @@ from argparse import ArgumentParser from compiler.components.lexer_analyzer import tokenizer, tokens from compiler.components.syntax_analyzer import run_parser +from compiler.components.semantic_analyzer import semanticAnalyzer +from compiler.utils.context import programContext + parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') @@ -10,27 +13,27 @@ parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices = component_injector['parser_options'].keys()) parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices = ['l','p','t']) """ + args = parser_input.parse_args() -#print(args.files_for_compile) file = open(args.files_for_compile[0]) working_input = file.read() all_errors = [] token_errors, tokens_for_input, real_col = tokenizer(working_input) -#print(tokens_for_input) -parser_errors = run_parser(tokens, working_input, real_col) + +ast_result, parser_errors = run_parser(tokens, working_input, real_col) all_errors += token_errors + parser_errors -""" print('tokens for _input \n') -print(tokens_for_input) -print('---------------') """ +sa = semanticAnalyzer(ast_result) + +sa.run_visits() +print('context of the input %s' %programContext.types) +print('errors %s' %sa.errors) + if all_errors: for error in all_errors: print(error) exit(1) - -exit(0) - From a3d414c1a817054f1d4a4bc23927d8cbfdc2aa56 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 2 Aug 2020 15:28:36 -0400 Subject: [PATCH 35/96] Definitions for the program context and the class context of each type --- src/compiler/utils/visitors_definitions.py | 57 ++++++++++++++++------ 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 4662f821..9ee6fe68 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -4,9 +4,6 @@ class NodeVisitor: - def __init__(self): - self.errors = [] - def visit(self, node: Node): visitor_method_name = 'visit_' + node.clsname visitor = getattr(self, visitor_method_name, self.not_implemented) @@ -16,23 +13,55 @@ def not_implemented(self, node: Node): raise Exception('Not implemented visit_{} method'.format(node.clsname)) # We need to highlight here the inheritance relations between classes -class TypeCheckVisitor(NodeVisitor): +class TypeCollectorVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): + errors = [] for nodeClass in node.class_list: - self.visit(nodeClass) + result= self.visit(nodeClass) + if result: + errors.append (result) + return errors def visit_NodeClass(self, node: NodeClass): - # When we create a type, we store it in the context - result = programContext.createType(node) - if not result is 'Success': - self.errors += result + # When we create a type, we store it in the context, if there is no errors + return programContext.createType(node) class TypeBuilderVisitor(NodeVisitor): + def __init__(self): + self.currentTypeName = '' + + def visit_NodeProgram(self, node: NodeProgram): + errors = [] + for nodeClass in node.class_list: + errors += self.visit(nodeClass) + return errors def visit_NodeClass(self, node: NodeClass): - currentClassContext = programContext.types[node.idName] - for attr in currentClassContext.attrs: - self.visit(attr) - for method in currentClassContext.methods: - self.visit(method) + errors = [] + self.currentTypeName = node.idName + for nodeAttr in node.attributes: + errors += self.visit(nodeAttr) + for nodeClassMethod in node.methods: + errors += self.visit(nodeClassMethod) + return errors + + def visit_NodeAttr(self, node:NodeAttr): + resultOp = programContext.defineAttrInType(self.currentTypeName, node) + if type (resultOp) is error: + return [resultOp] + return [] + + def visit_NodeClassMethod(self, node: NodeClassMethod): + return [definition for definition in + [programContext.getType(node.returnType)] + + [programContext.getType(idName = arg) for arg in node.argTypesNames] + + [programContext.defineMethod( + self.currentTypeName, + node.idName, + node.returnType, + node.argNames, + node.argTypesNames + )] + if type(definition) is error + ] From 40c49d3db7b8d1b33370d1c10bb6f948a9738dde Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 26 Nov 2020 14:47:46 -0500 Subject: [PATCH 36/96] Changed the Let In parser part. Is more intuitive in this way --- src/compiler/components/syntax_analyzer.py | 155 ++++++++++++++------- 1 file changed, 102 insertions(+), 53 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index de8265ef..e33ad29d 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -25,62 +25,66 @@ def __init__(self, tokens, real_col): ('left', 'AT'), ('left', 'DOT') ) - def p_program(self, p): """ program : class_list - """ + """ p[0] = NodeProgram(p[1]) def p_class_list(self, p): """ class_list : class_list class SEMICOLON | class SEMICOLON - """ + """ p[0] = NodeClassTuple((p[1],) if len(p) == 3 else p[1] + (p[2], )) def p_class(self, p): """ class : CLASS TYPE LBRACE features_list_opt RBRACE - """ - p[0] = NodeClass(idName = p[2], feature_list= p[4], parent = "Object") + """ + p[0] = NodeClass(idName = p[2], methods= p[4]['methods'], attributes= p[4]['attributes'], parent = "Object") def p_class_inherits(self, p): """ class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE - """ - p[0] = NodeClass(idName = p[2], feature_list = p[6], parent = p[4] ) + """ + p[0] = NodeClass(idName = p[2], + methods= p[6]['methods'], + attributes= p[6]['attributes'], + parent = p[4]) def p_feature_list_opt(self, p): """ features_list_opt : features_list | empty """ + p[0] = p[1] if p[1] else { 'methods': (), 'attributes': () } def p_feature_list(self, p): """ features_list : features_list feature SEMICOLON | feature SEMICOLON """ - p[0] = { 'methods': (), 'attributes': () } if len(p) == 3: + p[0] = { 'methods': (), 'attributes': () } key = 'methods' if type(p[1]) is NodeClassMethod else 'attributes' p[0][key] += (p[1], ) else: - p[0]['methods'] = p[1]['methods'] + p[2]['methods'] - p[0]['attributes'] = p[1]['attributes'] + p[2]['attributes'] + key = 'methods' if type(p[2]) is NodeClassMethod else 'attributes' + p[1][key] += (p[2], ) + p[0] = p[1] def p_feature_method(self, p): """ feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE - """ - p[0] = NodeClassMethod(idName=p[1], formal_params=p[3], return_type=p[6], body=p[8]) + """ + p[0] = NodeClassMethod(idName=p[1], argNames = [ x[0] for x in p[3] ], argTypesNames = [ x[1] for x in p[3] ], return_type=p[6], body=p[8]) def p_feature_method_no_formals(self, p): """ feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE """ - p[0] = NodeClassMethod(idName=p[1], formal_params=[], return_type=p[5], body=p[7]) + p[0] = NodeClassMethod(idName=p[1], argNames = [], argTypesNames = [], return_type=p[5], body=p[7]) def p_feature_attr_initialized(self, p): """ @@ -91,7 +95,7 @@ def p_feature_attr_initialized(self, p): def p_feature_attr(self, p): """ feature : ID COLON TYPE - """ + """ p[0] = NodeAttr(idName= p[1], attr_type= p[3], expr= None) def p_formal_list_many(self, p): @@ -99,74 +103,90 @@ def p_formal_list_many(self, p): formal_params_list : formal_params_list COMMA formal_param | formal_param """ + p[0] = (p[1], ) if len(p) == 2 else p[1] + (p[3], ) def p_formal(self, p): """ formal_param : ID COLON TYPE - """ + """ + p[0] = NodeFormalParam(idName=p[1], param_type=p[3]) def p_expression_object_identifier(self, p): """ expression : ID - """ + """ + p[0]= NodeObject(idName= p[1]) def p_expression_integer_constant(self, p): """ expression : INTEGER - """ - + """ + p[0]= NodeInteger(content= p[1]) + def p_expression_boolean_constant(self, p): """ expression : BOOLEAN - """ - + """ + p[0]= NodeBoolean(content= p[1]) + def p_expression_string_constant(self, p): """ expression : STRING - """ - + """ + p[0]= NodeString(content= p[1]) + def p_expr_self(self, p): """ expression : SELF - """ - + """ + p[0]= NodeSelf() + def p_expression_block(self, p): """ expression : LBRACE block_list RBRACE """ - + p[0]= NodeBlock(expr_list= p[2]) + def p_block_list(self, p): """ block_list : block_list expression SEMICOLON | expression SEMICOLON """ - + p[0]= (p[1], ) if len(p) == 3 else p[1] + (p[2], ) + def p_expression_assignment(self, p): """ expression : ID ASSIGN expression """ + p[0] = NodeAssignment(instance= NodeObject(idName= p[1]), expr= p[3]) # ######################### UNARY OPERATIONS ####################################### def p_expression_new(self, p): """ expression : NEW TYPE - """ - + """ + p[0] = NodeNewObject(new_type= p[2]) + + def p_expression_isvoid(self, p): """ expression : ISVOID expression - """ + """ + p[0] = NodeIsVoid(expr= p[2]) def p_expression_integer_complement(self, p): """ expression : INT_COMP expression - """ + """ + p[0] = NodeIntegerComplement(p[2]) + def p_expression_boolean_complement(self, p): """ expression : NOT expression - """ + """ + p[0] = NodeBooleanComplement(p[2]) # ######################### PARENTHESIZED, MATH & COMPARISONS ##################### @@ -177,53 +197,86 @@ def p_expression_math_operations(self, p): | expression MULTIPLY expression | expression DIVIDE expression """ - + if p[2] == '+': + p[0] = NodeAddition(first=p[1], second=p[3]) + elif p[2] == '-': + p[0] = NodeSubtraction(first=p[1], second=p[3]) + elif p[2] == '*': + p[0] = NodeMultiplication(first=p[1], second=p[3]) + elif p[2] == '/': + p[0] = NodeDivision(first=p[1], second=p[3]) + def p_expression_math_comparisons(self, p): """ expression : expression LT expression | expression LTEQ expression | expression EQ expression - """ + """ + if p[2] == '<': + p[0] = NodeLessThan(first=p[1], second=p[3]) + elif p[2] == '<=': + p[0] = NodeLessThanOrEqual(first=p[1], second=p[3]) + elif p[2] == '=': + p[0] = NodeEqual(first=p[1], second=p[3]) def p_expression_with_parenthesis(self, p): """ expression : LPAREN expression RPAREN """ - + p[0] = p[2] + # ######################### CONTROL FLOW EXPRESSIONS ############################## def p_expression_if_conditional(self, p): """ expression : IF expression THEN expression ELSE expression FI """ - + p[0]= NodeIf(predicate=p[2], then_body=p[4], else_body=p[6]) + def p_expression_while_loop(self, p): """ expression : WHILE expression LOOP expression POOL """ - + p[0] = NodeWhileLoop(predicate=p[2], body=p[4]) + ## ######################### LET EXPRESSIONS ######################################## - def p_expression_let(self, p): + def p_expression_let(self, parse): """ expression : let_expression - """ - - def p_expression_let_simple(self, p): """ - let_expression : LET nested_lets IN expression + parse[0] = parse[1] + + def p_expression_let_simple(self, parse): + """ + let_expression : LET ID COLON TYPE IN expression + | nested_lets COMMA LET ID COLON TYPE + """ + parse[0] = AST.Let(instance=parse[2], + return_type=parse[4], init_expr=None, body=parse[6]) + + def p_expression_let_initialized(self, parse): + """ + let_expression : LET ID COLON TYPE ASSIGN expression IN expression + | nested_lets COMMA LET ID COLON TYPE ASSIGN expression """ + parse[0] = AST.Let(instance=parse[2], + return_type=parse[4], init_expr=parse[6], body=parse[8]) - def p_nested_lets_simple(self, p): + def p_inner_lets_simple(self, parse): """ - nested_lets : ID COLON TYPE + nested_lets : ID COLON TYPE IN expression | nested_lets COMMA ID COLON TYPE """ + parse[0] = AST.Let(instance=parse[1], + return_type=parse[3], init_expr=None, body=parse[5]) - def p_nested_lets_initialize(self, p): + def p_inner_lets_initialized(self, parse): """ - nested_lets : ID COLON TYPE ASSIGN expression + nested_lets : ID COLON TYPE ASSIGN expression IN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression """ + parse[0] = AST.Let(instance=parse[1], + return_type=parse[3], init_expr=parse[5], body=parse[7]) # ######################### CASE EXPRESSION ######################################## @@ -282,7 +335,7 @@ def p_expression_self_dispatch(self, p): def p_empty(self, p): """ empty : - """ + """ def findColumn(self, trackedRow): for i in range(len(self.parser.symstack) -1, 1, -1): @@ -299,21 +352,17 @@ def p_error(self, p): error(message= "Error at or near %s" %p.value, error_type="SyntacticError", row_and_col= (p.lineno, self.real_col[str(p)] ))) - + else: self.errors_parser.append( error(message= "EOF in string", error_type="SyntacticError", row_and_col= (0, 0 ))) - - - def run_parser(tokens, source_program, real_col): - #print(source_program) + #print("The source_program ", source_program) parserCool = pyCoolParser(tokens, real_col) lexer.lineno = 1 ast_result = parserCool.parser.parse(source_program, lexer=lexer) - print(ast_result) + #print("The ast_result ", ast_result) return ast_result, parserCool.errors_parser - From 4a80af46dbf47f04972122a9e5df2a78b47faa4d Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 26 Nov 2020 14:49:56 -0500 Subject: [PATCH 37/96] More changed the let part, and also added more constructions to the ast in all the parser --- src/compiler/components/syntax_analyzer.py | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index e33ad29d..7105a0f0 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -240,43 +240,43 @@ def p_expression_while_loop(self, p): p[0] = NodeWhileLoop(predicate=p[2], body=p[4]) ## ######################### LET EXPRESSIONS ######################################## - def p_expression_let(self, parse): + def p_expression_let(self, p): """ expression : let_expression """ - parse[0] = parse[1] + p[0] = p[1] - def p_expression_let_simple(self, parse): + def p_expression_let_simple(self, p): """ let_expression : LET ID COLON TYPE IN expression | nested_lets COMMA LET ID COLON TYPE """ - parse[0] = AST.Let(instance=parse[2], - return_type=parse[4], init_expr=None, body=parse[6]) + p[0] = NodeLet(instance=p[2], + return_type=p[4], init_expr=None, body=p[6]) - def p_expression_let_initialized(self, parse): + def p_expression_let_initialized(self, p): """ let_expression : LET ID COLON TYPE ASSIGN expression IN expression | nested_lets COMMA LET ID COLON TYPE ASSIGN expression """ - parse[0] = AST.Let(instance=parse[2], - return_type=parse[4], init_expr=parse[6], body=parse[8]) + p[0] = NodeLet(instance=p[2], + return_type=p[4], init_expr=p[6], body=p[8]) - def p_inner_lets_simple(self, parse): + def p_inner_lets_simple(self, p): """ nested_lets : ID COLON TYPE IN expression | nested_lets COMMA ID COLON TYPE """ - parse[0] = AST.Let(instance=parse[1], - return_type=parse[3], init_expr=None, body=parse[5]) + p[0] = NodeLet(instance=p[1], + return_type=p[3], init_expr=None, body=p[5]) - def p_inner_lets_initialized(self, parse): + def p_inner_lets_initialized(self, p): """ nested_lets : ID COLON TYPE ASSIGN expression IN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression """ - parse[0] = AST.Let(instance=parse[1], - return_type=parse[3], init_expr=parse[5], body=parse[7]) + p[0] = NodeLet(instance=p[1], + return_type=p[3], init_expr=p[5], body=p[7]) # ######################### CASE EXPRESSION ######################################## From 7b49c5722f049bb081b00bc645523aa08bee762d Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 26 Nov 2020 15:02:03 -0500 Subject: [PATCH 38/96] Completed all node and operations for build the AST. Not tested yet --- src/compiler/components/syntax_analyzer.py | 26 +- src/compiler/utils/AST_definitions.py | 485 ++++++++++++++++++++- 2 files changed, 486 insertions(+), 25 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 7105a0f0..4e9e8880 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -284,18 +284,20 @@ def p_expression_case(self, p): """ expression : CASE expression OF actions_list ESAC """ - + p[0]= NodeCase(expr=p[2], actions=p[4]) + def p_actions_list(self, p): """ actions_list : actions_list action | action """ - + p[0]= (p[1],) if len(p) == 2 else p[1] + (p[2],) + def p_action_expr(self, p): """ action : ID COLON TYPE ARROW expression SEMICOLON - """ - + """ + p[0] = (p[1], p[3], p[5]) # ######################### METHODS DISPATCH ###################################### @@ -303,31 +305,36 @@ def p_expression_dispatch(self, p): """ expression : expression DOT ID LPAREN arguments_list_opt RPAREN """ - + p[0] = NodeDynamicDispatch(instance=p[1], + method=p[3], arguments=p[5]) + def p_arguments_list_opt(self, p): """ arguments_list_opt : arguments_list | empty """ - + p[0] = tuple() if p.slice[1].type == "empty" else p[1] def p_arguments_list(self, p): """ arguments_list : arguments_list COMMA expression | expression """ - + p[0]= (p[1], ) if len(p) == 2 else p[1] + (p[2], ) + def p_expression_static_dispatch(self, p): """ expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN """ - + p[0] = NodeStaticDispatch(instance=p[1], + dispatch_type=p[3], method=p[5], arguments=p[7]) def p_expression_self_dispatch(self, p): """ expression : ID LPAREN arguments_list_opt RPAREN """ - + p[0] = NodeDynamicDispatch(instance=NodeSelf(), + method=p[1], arguments=p[3]) # ######################### ################## ################################### @@ -336,6 +343,7 @@ def p_empty(self, p): """ empty : """ + p[0]= None def findColumn(self, trackedRow): for i in range(len(self.parser.symstack) -1, 1, -1): diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 1b43e744..b0664716 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -31,41 +31,494 @@ def to_tuple(self): def to_readable(self): return "{}(classes={})".format(self.clsname, self.class_list) - class NodeClassTuple(Node, tuple): def __init__(self, classes): self.classes = classes - - class NodeClass(Node): - def __init__(self, idName, body, parent): + def __init__(self, idName: str, methods, attributes, parent): self.idName = idName - self.body = body + self.methods = methods + self.attributes = attributes self.parent = parent def to_readable(self): - return "{}(name='{}', parent={}, features={})".format( - self.clsname, self.idName, self.parent, self.body) - + return "{}(name='{}', parent={}, methods={}, attributes={})".format( + self.clsname, self.idName, self.parent, self.methods, self.attributes) +class NodeFeature(Node): + def __init__(self): + super(NodeFeature, self).__init__() #No se si poner aqui una clase para heredar , que sea feature_class. #Tengo que ver si a futuro necesito iterar por los elementos de una clase #de manera abstracta. -class NodeClassMethod(Node): - def __init__(self, idName, formal_params, return_type, body): +class NodeClassMethod(NodeFeature): + def __init__(self, + idName: str, + argNames, + argTypesNames, + return_type: str, + body): self.idName = idName - self.formal_params = formal_params - self.return_type = return_type + self.argNames = argNames + self.returnType = return_type + self.argTypesNames = argTypesNames self.body = body -#Yo puedo crear un bosquejo inicial, -# y después reutilizarlo en lo subsiguiente? -class NodeAttr(Node): + def to_readable(self): + return "{}(name='{}', argNames={}, returnType={}, argTypesNames={}, body={})".format( + self.clsname, self.idName, self.argNames, self.returnType, self.argTypesNames, self.body + ) + +class NodeAttr(NodeFeature): def __init__(self, idName, attr_type, expr): self.idName = idName - self.attr_type = attr_type + self.attrType = attr_type + self.expr = expr + +class NodeFormalParam(NodeFeature): + def __init__(self, idName, param_type): + super().__init__() + self.idName = idName + self.paramType = param_type + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("name", self.idNme), + ("param_type", self.param_type) + ]) + + def to_readable(self): + return "{}(name='{}', param_type={})".format(self.clsname, self.idName, self.param_type) + +class NodeObject(Node): + def __init__(self, idName): + super().__init__() + self.idName = idName + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("name", self.idName) + ]) + + def to_readable(self): + return "{}(name='{}')".format(self.clsname, self.idName) + +class NodeSelf(NodeObject): + def __init__(self): + super(Self, self).__init__("SELF") + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname) + ]) + + def to_readable(self): + return "{}".format(self.clsname) + + +class NodeConstant(Node): + def __init__(self): + super().__init__() + + +class NodeInteger(NodeConstant): + def __init__(self, content): + super().__init__() + self.content = content + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("content", self.content) + ]) + + def to_readable(self): + return "{}(content={})".format(self.clsname, self.content) + + +class NodeBoolean(NodeConstant): + def __init__(self, content): + super().__init__() + self.content = content + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("content", self.content) + ]) + + def to_readable(self): + return "{}(content={})".format(self.clsname, self.content) + +class NodeString(NodeConstant): + def __init__(self, content): + super(String, self).__init__() + self.content = content + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("content", self.content) + ]) + + def to_readable(self): + return "{}(content={})".format(self.clsname, repr(self.content)) + + +class NodeExpr(Node): + def __init__(self): + super().__init__() + +class NodeNewObject(NodeExpr): + def __init__(self, new_type): + super().__init__() + self.type = new_type + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("type", self.type) + ]) + + def to_readable(self): + return "{}(type={})".format(self.clsname, self.type) + + +class NodeIsVoid(NodeExpr): + def __init__(self, expr): + super().__init__() self.expr = expr + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("expr", self.expr) + ]) + + def to_readable(self): + return "{}(expr={})".format(self.clsname, self.expr) + + +class NodeAssignment(NodeExpr): + def __init__(self, instance, expr): + super().__init__() + self.instance = instance + self.expr = expr + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("instance", self.instance), + ("expr", self.expr) + ]) + + def to_readable(self): + return "{}(instance={}, expr={})".format(self.clsname, self.instance, self.expr) + + +class NodeBlock(NodeExpr): + def __init__(self, expr_list): + super(Block, self).__init__() + self.expr_list = expr_list + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("expr_list", self.expr_list) + ]) + + def to_readable(self): + return "{}(expr_list={})".format(self.clsname, self.expr_list) + + +class NodeDynamicDispatch(NodeExpr): + def __init__(self, instance, method, arguments): + super().__init__() + self.instance = instance + self.method = method + self.arguments = arguments if arguments is not None else tuple() + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("instance", self.instance), + ("method", self.method), + ("arguments", self.arguments) + ]) + + def to_readable(self): + return "{}(instance={}, method={}, arguments={})".format( + self.clsname, self.instance, self.method, self.arguments) + + +class NodeStaticDispatch(NodeExpr): + def __init__(self, instance, dispatch_type, method, arguments): + super().__init__() + self.instance = instance + self.dispatch_type = dispatch_type + self.method = method + self.arguments = arguments if arguments is not None else tuple() + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("instance", self.instance), + ("dispatch_type", self.dispatch_type), + ("method", self.method), + ("arguments", self.arguments) + ]) + + def to_readable(self): + return "{}(instance={}, dispatch_type={}, method={}, arguments={})".format( + self.clsname, self.instance, self.dispatch_type, self.method, self.arguments) + + +class NodeLet(NodeExpr): + def __init__(self, instance, return_type, init_expr, body): + super().__init__() + self.instance = instance + self.return_type = return_type + self.init_expr = init_expr + self.body = body + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("instance", self.instance), + ("return_type", self.return_type), + ("init_expr", self.init_expr), + ("body", self.body) + ]) + + def to_readable(self): + return "{}(instance={}, return_type={}, init_expr={}, body={})".format( + self.clsname, self.instance, self.return_type, self.init_expr, self.body) + + +class NodeIf(NodeExpr): + def __init__(self, predicate, then_body, else_body): + super().__init__() + self.predicate = predicate + self.then_body = then_body + self.else_body = else_body + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("predicate", self.predicate), + ("then_body", self.then_body), + ("else_body", self.else_body) + ]) + + def to_readable(self): + return "{}(predicate={}, then_body={}, else_body={})".format( + self.clsname, self.predicate, self.then_body, self.else_body) + + +class NodeWhileLoop(NodeExpr): + def __init__(self, predicate, body): + super().__init__() + self.predicate = predicate + self.body = body + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("predicate", self.predicate), + ("body", self.body) + ]) + + def to_readable(self): + return "{}(predicate={}, body={})".format(self.clsname, self.predicate, self.body) + + +class NodeCase(NodeExpr): + def __init__(self, expr, actions): + super().__init__() + self.expr = expr + self.actions = actions + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("expr", self.expr), + ("actions", self.actions) + ]) + + def to_readable(self): + return "{}(expr={}, actions={})".format(self.clsname, self.expr, self.actions) + + +# ############################## UNARY OPERATIONS ################################## + + +class NodeNodeUnaryOperation(NodeExpr): + def __init__(self): + super().__init__() + +class NodeIntegerComplement(NodeUnaryOperation): + def __init__(self, integer_expr): + super().__init__() + self.symbol = "~" + self.integer_expr = integer_expr + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("integer_expr", self.integer_expr) + ]) + + def to_readable(self): + return "{}(expr={})".format(self.clsname, self.integer_expr) + + +class NodeBooleanComplement(NodeUnaryOperation): + def __init__(self, boolean_expr): + super(BooleanComplement, self).__init__() + self.symbol = "!" + self.boolean_expr = boolean_expr + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("boolean_expr", self.boolean_expr) + ]) + + def to_readable(self): + return "{}(expr={})".format(self.clsname, self.boolean_expr) + +# ############################## BINARY OPERATIONS ################################## + +class NodeBinaryOperation(NodeExpr): + def __init__(self): + super().__init__() + +class NodeAddition(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "+" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + + +class NodeSubtraction(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "-" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + + +class NodeMultiplication(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "*" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + + +class NodeDivision(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "/" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + + +class NodeEqual(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "=" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + + +class NodeLessThan(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "<" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + + +class NodeLessThanOrEqual(NodeBinaryOperation): + def __init__(self, first, second): + super().__init__() + self.symbol = "<=" + self.first = first + self.second = second + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("first", self.first), + ("second", self.second) + ]) + + def to_readable(self): + return "{}(first={}, second={})".format(self.clsname, self.first, self.second) From 2e6a6afef65208fad419ec18632dcaa76c042231 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 26 Nov 2020 18:33:46 -0500 Subject: [PATCH 39/96] All test of the parse phase works with the AST instructions --- src/compiler/components/lexer_analyzer.py | 2 +- src/compiler/components/syntax_analyzer.py | 41 ++++++++++------------ 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index 8ef53622..b102f13e 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -14,7 +14,7 @@ "LPAREN", "RPAREN", "LBRACE", "RBRACE", "COLON", "COMMA", "DOT", "SEMICOLON", "AT", # Operators - "PLUS", "MINUS", "MULTIPLY", "DIVIDE", "EQ", "LT", "LTEQ", "ASSIGN", "INT_COMP", "NOT", + "PLUS", "MINUS", "MULTIPLY", "DIVIDE", "EQ", "LT", "LTEQ", "ASSIGN", "INT_COMP", # Special Operators "ARROW" diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 4e9e8880..c0ad752c 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -78,7 +78,11 @@ def p_feature_method(self, p): """ feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE """ - p[0] = NodeClassMethod(idName=p[1], argNames = [ x[0] for x in p[3] ], argTypesNames = [ x[1] for x in p[3] ], return_type=p[6], body=p[8]) + p[0] = NodeClassMethod(idName=p[1], + argNames = [ x.idName for x in p[3] ], + argTypesNames = [ x.paramType for x in p[3] ], + return_type=p[6], + body=p[8]) def p_feature_method_no_formals(self, p): """ @@ -243,40 +247,31 @@ def p_expression_while_loop(self, p): def p_expression_let(self, p): """ expression : let_expression - """ - p[0] = p[1] + """ + p[0]= p[1] def p_expression_let_simple(self, p): """ - let_expression : LET ID COLON TYPE IN expression - | nested_lets COMMA LET ID COLON TYPE - """ - p[0] = NodeLet(instance=p[2], - return_type=p[4], init_expr=None, body=p[6]) - - def p_expression_let_initialized(self, p): - """ - let_expression : LET ID COLON TYPE ASSIGN expression IN expression - | nested_lets COMMA LET ID COLON TYPE ASSIGN expression + let_expression : LET nested_lets IN expression """ - p[0] = NodeLet(instance=p[2], - return_type=p[4], init_expr=p[6], body=p[8]) + p[0]= NodeLetComplex(nested_lets= p[2], body= p[4]) - def p_inner_lets_simple(self, p): + def p_nested_lets_simple(self, p): """ - nested_lets : ID COLON TYPE IN expression + nested_lets : ID COLON TYPE | nested_lets COMMA ID COLON TYPE """ - p[0] = NodeLet(instance=p[1], - return_type=p[3], init_expr=None, body=p[5]) + p[0]= NodeLet(instance= p[1], return_type= p[3], + body = None) - def p_inner_lets_initialized(self, p): + def p_nested_lets_initialize(self, p): """ - nested_lets : ID COLON TYPE ASSIGN expression IN expression + nested_lets : ID COLON TYPE ASSIGN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression """ - p[0] = NodeLet(instance=p[1], - return_type=p[3], init_expr=p[5], body=p[7]) + p[0]= NodeLet(instance= p[1], + return_type= p[3], + body= p[5]) # ######################### CASE EXPRESSION ######################################## From 6c9bb2344ea6683f988e8bc6a69d0bfba8331a25 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 26 Nov 2020 18:34:49 -0500 Subject: [PATCH 40/96] All ok with the AST instructions in the parse phase --- src/main.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main.py b/src/main.py index 8d3d6301..b49c0bf8 100644 --- a/src/main.py +++ b/src/main.py @@ -14,26 +14,26 @@ parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices = ['l','p','t']) """ -args = parser_input.parse_args() -file = open(args.files_for_compile[0]) -working_input = file.read() +args= parser_input.parse_args() +file= open(args.files_for_compile[0]) +working_input= file.read() -all_errors = [] -token_errors, tokens_for_input, real_col = tokenizer(working_input) +all_errors= [] +token_errors, tokens_for_input, real_col= tokenizer(working_input) -ast_result, parser_errors = run_parser(tokens, working_input, real_col) +ast_result, parser_errors= run_parser(tokens, working_input, real_col) +#if parser_errors: print("In the parser_errors ", parser_errors) -all_errors += token_errors + parser_errors - -sa = semanticAnalyzer(ast_result) +#sa = semanticAnalyzer(ast_result) -sa.run_visits() -print('context of the input %s' %programContext.types) -print('errors %s' %sa.errors) +#sa.run_visits() +#print('context of the input %s' %programContext) +#print('errors %s' %sa.errors) +all_errors += token_errors + parser_errors +#+ sa.errors if all_errors: for error in all_errors: print(error) exit(1) - From 5ef862d003131f5d53d4296ceb575a7cb6da0b16 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 1 Dec 2020 14:37:35 -0500 Subject: [PATCH 41/96] Changed word instance by idName --- src/compiler/components/syntax_analyzer.py | 12 +- src/compiler/utils/AST_definitions.py | 135 ++++++++++++++------- 2 files changed, 97 insertions(+), 50 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index c0ad752c..a41d229b 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -162,7 +162,7 @@ def p_expression_assignment(self, p): """ expression : ID ASSIGN expression """ - p[0] = NodeAssignment(instance= NodeObject(idName= p[1]), expr= p[3]) + p[0] = NodeAssignment(idName= NodeObject(idName= p[1]), expr= p[3]) # ######################### UNARY OPERATIONS ####################################### @@ -261,7 +261,7 @@ def p_nested_lets_simple(self, p): nested_lets : ID COLON TYPE | nested_lets COMMA ID COLON TYPE """ - p[0]= NodeLet(instance= p[1], return_type= p[3], + p[0]= NodeLet(idName= p[1], return_type= p[3], body = None) def p_nested_lets_initialize(self, p): @@ -269,7 +269,7 @@ def p_nested_lets_initialize(self, p): nested_lets : ID COLON TYPE ASSIGN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression """ - p[0]= NodeLet(instance= p[1], + p[0]= NodeLet(idName= p[1], return_type= p[3], body= p[5]) @@ -300,7 +300,7 @@ def p_expression_dispatch(self, p): """ expression : expression DOT ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeDynamicDispatch(instance=p[1], + p[0] = NodeDynamicDispatch(idName=p[1], method=p[3], arguments=p[5]) def p_arguments_list_opt(self, p): @@ -321,14 +321,14 @@ def p_expression_static_dispatch(self, p): """ expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeStaticDispatch(instance=p[1], + p[0] = NodeStaticDispatch(idName=p[1], dispatch_type=p[3], method=p[5], arguments=p[7]) def p_expression_self_dispatch(self, p): """ expression : ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeDynamicDispatch(instance=NodeSelf(), + p[0] = NodeDynamicDispatch(idName=NodeSelf(), method=p[1], arguments=p[3]) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index b0664716..5353f10c 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -1,3 +1,4 @@ +from json import dumps class Node: @property def clsname(self): @@ -12,11 +13,21 @@ def to_readable(self): return "{}".format(self.clsname) def __repr__(self): - return self.__str__() + return self.toJSON() def __str__(self): return str(self.to_readable()) + def __getitem__(self, x): + return self.__dict__[x] + + def __setitem__(self, x, y): + self.__dict__[x]= y + + def toJSON(self): + return dumps(self, default=lambda o: o.__dict__, + sort_keys=True, indent=4, separators=(',', ': ')) + class NodeProgram(Node): def __init__(self, class_list): @@ -44,7 +55,8 @@ def __init__(self, idName: str, methods, attributes, parent): def to_readable(self): return "{}(name='{}', parent={}, methods={}, attributes={})".format( - self.clsname, self.idName, self.parent, self.methods, self.attributes) + self.clsname, self.idName, self.parent, + self.methods, self.attributes) class NodeFeature(Node): def __init__(self): @@ -68,7 +80,8 @@ def __init__(self, def to_readable(self): return "{}(name='{}', argNames={}, returnType={}, argTypesNames={}, body={})".format( - self.clsname, self.idName, self.argNames, self.returnType, self.argTypesNames, self.body + self.clsname, self.idName, self.argNames, + self.returnType, self.argTypesNames, self.body ) class NodeAttr(NodeFeature): @@ -87,11 +100,12 @@ def to_tuple(self): return tuple([ ("class_name", self.clsname), ("name", self.idNme), - ("param_type", self.param_type) + ("param_type", self.paramType) ]) def to_readable(self): - return "{}(name='{}', param_type={})".format(self.clsname, self.idName, self.param_type) + return "{}(name='{}', param_type={})".format(self.clsname, + self.idName, self.paramType) class NodeObject(Node): def __init__(self, idName): @@ -109,7 +123,7 @@ def to_readable(self): class NodeSelf(NodeObject): def __init__(self): - super(Self, self).__init__("SELF") + super().__init__("SELF") def to_tuple(self): return tuple([ @@ -156,7 +170,7 @@ def to_readable(self): class NodeString(NodeConstant): def __init__(self, content): - super(String, self).__init__() + super().__init__() self.content = content def to_tuple(self): @@ -171,6 +185,7 @@ def to_readable(self): class NodeExpr(Node): def __init__(self): + self.value= None super().__init__() class NodeNewObject(NodeExpr): @@ -204,25 +219,26 @@ def to_readable(self): class NodeAssignment(NodeExpr): - def __init__(self, instance, expr): + def __init__(self, idName, expr): super().__init__() - self.instance = instance + self.idName = idName self.expr = expr def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("instance", self.instance), + ("idName", self.idName), ("expr", self.expr) ]) def to_readable(self): - return "{}(instance={}, expr={})".format(self.clsname, self.instance, self.expr) + return "{}(idName={}, expr={})".format(self.clsname, + self.idName, self.expr) class NodeBlock(NodeExpr): def __init__(self, expr_list): - super(Block, self).__init__() + super().__init__() self.expr_list = expr_list def to_tuple(self): @@ -236,29 +252,29 @@ def to_readable(self): class NodeDynamicDispatch(NodeExpr): - def __init__(self, instance, method, arguments): + def __init__(self, idName, method, arguments): super().__init__() - self.instance = instance + self.idName = idName self.method = method self.arguments = arguments if arguments is not None else tuple() def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("instance", self.instance), + ("idName", self.idName), ("method", self.method), ("arguments", self.arguments) ]) def to_readable(self): - return "{}(instance={}, method={}, arguments={})".format( - self.clsname, self.instance, self.method, self.arguments) + return "{}(idName={}, method={}, arguments={})".format( + self.clsname, self.idName, self.method, self.arguments) class NodeStaticDispatch(NodeExpr): - def __init__(self, instance, dispatch_type, method, arguments): + def __init__(self, idName, dispatch_type, method, arguments): super().__init__() - self.instance = instance + self.idName = idName self.dispatch_type = dispatch_type self.method = method self.arguments = arguments if arguments is not None else tuple() @@ -266,37 +282,57 @@ def __init__(self, instance, dispatch_type, method, arguments): def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("instance", self.instance), + ("idName", self.idName), ("dispatch_type", self.dispatch_type), ("method", self.method), ("arguments", self.arguments) ]) def to_readable(self): - return "{}(instance={}, dispatch_type={}, method={}, arguments={})".format( - self.clsname, self.instance, self.dispatch_type, self.method, self.arguments) + return "{}(idName={}, dispatch_type={}, method={}, arguments={})".format( + self.clsname, self.idName, self.dispatch_type, + self.method, self.arguments) -class NodeLet(NodeExpr): - def __init__(self, instance, return_type, init_expr, body): +class NodeLetComplex(NodeExpr): + def __init__(self, nested_lets, body): super().__init__() - self.instance = instance - self.return_type = return_type - self.init_expr = init_expr - self.body = body + self.nestedLets= nested_lets if type(nested_lets) is list else [nested_lets] + self.body= body def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("instance", self.instance), - ("return_type", self.return_type), - ("init_expr", self.init_expr), + ("nested_lets", self.nestedLets), ("body", self.body) ]) def to_readable(self): - return "{}(instance={}, return_type={}, init_expr={}, body={})".format( - self.clsname, self.instance, self.return_type, self.init_expr, self.body) + return "{}(nested_lets={}, body={})".format( + self.clsname, self.nestedLets, self.body) + + +class NodeLet(NodeExpr): + def __init__(self, idName, return_type, body): + super().__init__() + self.idName= idName + self.type= return_type + self.body= body + + + def to_tuple(self): + return tuple([ + ("class_name", self.clsname), + ("idName", self.idName), + ("return_type", self.type), + ("body", self.body), + ("value", self.value), + ]) + + def to_readable(self): + return "{}(idName={}, return_type={}, body={}, value={})".format( + self.clsname, self.idName, self.type, + self.body, self.value) class NodeIf(NodeExpr): @@ -333,7 +369,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(predicate={}, body={})".format(self.clsname, self.predicate, self.body) + return "{}(predicate={}, body={})".format(self.clsname, + self.predicate, self.body) class NodeCase(NodeExpr): @@ -350,13 +387,14 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(expr={}, actions={})".format(self.clsname, self.expr, self.actions) + return "{}(expr={}, actions={})".format(self.clsname, + self.expr, self.actions) # ############################## UNARY OPERATIONS ################################## -class NodeNodeUnaryOperation(NodeExpr): +class NodeUnaryOperation(NodeExpr): def __init__(self): super().__init__() @@ -378,7 +416,7 @@ def to_readable(self): class NodeBooleanComplement(NodeUnaryOperation): def __init__(self, boolean_expr): - super(BooleanComplement, self).__init__() + super().__init__() self.symbol = "!" self.boolean_expr = boolean_expr @@ -412,7 +450,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) class NodeSubtraction(NodeBinaryOperation): @@ -430,7 +469,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) class NodeMultiplication(NodeBinaryOperation): @@ -448,7 +488,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) class NodeDivision(NodeBinaryOperation): @@ -466,7 +507,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) class NodeEqual(NodeBinaryOperation): @@ -484,7 +526,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) class NodeLessThan(NodeBinaryOperation): @@ -502,7 +545,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) class NodeLessThanOrEqual(NodeBinaryOperation): @@ -520,5 +564,8 @@ def to_tuple(self): ]) def to_readable(self): - return "{}(first={}, second={})".format(self.clsname, self.first, self.second) + return "{}(first={}, second={})".format(self.clsname, + self.first, self.second) + +#### A special class for instantiation From 3da3ba147857385751e8f35b0172108dc77f96ec Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 7 Dec 2020 14:42:59 -0500 Subject: [PATCH 42/96] More Semantics --- src/compiler/components/semantic_analyzer.py | 14 +- src/compiler/components/syntax_analyzer.py | 29 +- src/compiler/utils/AST_definitions.py | 38 ++- src/compiler/utils/context.py | 304 +++++++++++++++++-- src/compiler/utils/errors.py | 38 ++- src/compiler/utils/functions_for_classes.py | 53 ++++ src/compiler/utils/visitors_definitions.py | 183 ++++++++++- 7 files changed, 581 insertions(+), 78 deletions(-) create mode 100644 src/compiler/utils/functions_for_classes.py diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic_analyzer.py index 53101432..ba090afc 100644 --- a/src/compiler/components/semantic_analyzer.py +++ b/src/compiler/components/semantic_analyzer.py @@ -1,12 +1,16 @@ -from ..utils.visitors_definitions import TypeCheckVisitor +from ..utils.visitors_definitions import TypeCollectorVisitor, TypeBuilderVisitor, TypeInheritanceVisitor, TypeCheckerVisitor from ..utils.AST_definitions import NodeProgram +from ..utils.context import programContext class semanticAnalyzer: def __init__(self, ast: NodeProgram): self.ast = ast - self.typeChecker = TypeCheckVisitor() + self.errors = [] - def run_visits(self : NodeProgram): - self.programContext, self.programErrors = self.typeChecker.visit(self.ast) - + def run_visits(self: NodeProgram): + typeCollectorResult= TypeCollectorVisitor().visit(self.ast) + typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast) + typeBuilderResult= TypeBuilderVisitor().visit(self.ast) + typeCheckerResult= TypeCheckerVisitor().visit(self.ast) + self.errors+= typeCollectorResult + typeBuilderResult + typeInheritanceResult + typeCheckerResult diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index a41d229b..7e68ada0 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -36,13 +36,16 @@ def p_class_list(self, p): class_list : class_list class SEMICOLON | class SEMICOLON """ - p[0] = NodeClassTuple((p[1],) if len(p) == 3 else p[1] + (p[2], )) + p[0] = (p[1],) if len(p) == 3 else p[1] + (p[2], ) def p_class(self, p): """ class : CLASS TYPE LBRACE features_list_opt RBRACE """ - p[0] = NodeClass(idName = p[2], methods= p[4]['methods'], attributes= p[4]['attributes'], parent = "Object") + p[0] = NodeClass(idName = p[2], + methods= p[4]['methods'], + attributes= p[4]['attributes'], + parent = "Object") def p_class_inherits(self, p): """ @@ -58,7 +61,7 @@ def p_feature_list_opt(self, p): features_list_opt : features_list | empty """ - p[0] = p[1] if p[1] else { 'methods': (), 'attributes': () } + p[0] = p[1] if p[1] else { 'methods': [], 'attributes': [] } def p_feature_list(self, p): """ @@ -66,12 +69,12 @@ def p_feature_list(self, p): | feature SEMICOLON """ if len(p) == 3: - p[0] = { 'methods': (), 'attributes': () } + p[0] = { 'methods': [], 'attributes': [] } key = 'methods' if type(p[1]) is NodeClassMethod else 'attributes' - p[0][key] += (p[1], ) + p[0][key] += [p[1]] else: key = 'methods' if type(p[2]) is NodeClassMethod else 'attributes' - p[1][key] += (p[2], ) + p[1][key] += [p[2]] p[0] = p[1] def p_feature_method(self, p): @@ -80,27 +83,27 @@ def p_feature_method(self, p): """ p[0] = NodeClassMethod(idName=p[1], argNames = [ x.idName for x in p[3] ], - argTypesNames = [ x.paramType for x in p[3] ], - return_type=p[6], + argTypes = [ x.paramType for x in p[3] ], + returnType=p[6], body=p[8]) def p_feature_method_no_formals(self, p): """ feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE """ - p[0] = NodeClassMethod(idName=p[1], argNames = [], argTypesNames = [], return_type=p[5], body=p[7]) + p[0] = NodeClassMethod(idName=p[1], argNames = [], argTypes = [], returnType=p[5], body=p[7]) def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression """ - p[0] = NodeAttr(idName= p[1], attr_type= p[3], expr= p[5]) + p[0] = NodeAttr(idName= p[1], attrType= p[3], expr= p[5]) def p_feature_attr(self, p): """ feature : ID COLON TYPE """ - p[0] = NodeAttr(idName= p[1], attr_type= p[3], expr= None) + p[0] = NodeAttr(idName= p[1], attrType= p[3], expr= None) def p_formal_list_many(self, p): """ @@ -261,7 +264,7 @@ def p_nested_lets_simple(self, p): nested_lets : ID COLON TYPE | nested_lets COMMA ID COLON TYPE """ - p[0]= NodeLet(idName= p[1], return_type= p[3], + p[0]= NodeLet(idName= p[1], returnType= p[3], body = None) def p_nested_lets_initialize(self, p): @@ -270,7 +273,7 @@ def p_nested_lets_initialize(self, p): | nested_lets COMMA ID COLON TYPE ASSIGN expression """ p[0]= NodeLet(idName= p[1], - return_type= p[3], + returnType= p[3], body= p[5]) # ######################### CASE EXPRESSION ######################################## diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 5353f10c..b0f3f41a 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -24,6 +24,12 @@ def __getitem__(self, x): def __setitem__(self, x, y): self.__dict__[x]= y + def __iter__(self): + return self.__dict__.__iter__() + + def __eq__(self, other): + return type(self) == type(other) and self.idName == other.idName + def toJSON(self): return dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4, separators=(',', ': ')) @@ -52,7 +58,11 @@ def __init__(self, idName: str, methods, attributes, parent): self.methods = methods self.attributes = attributes self.parent = parent - + self.builtIn = idName in {'Int', 'Bool', 'SELF_TYPE'} + self.inheritsAttr = {} + self.inheritsMethods= {} + + def to_readable(self): return "{}(name='{}', parent={}, methods={}, attributes={})".format( self.clsname, self.idName, self.parent, @@ -61,6 +71,7 @@ def to_readable(self): class NodeFeature(Node): def __init__(self): super(NodeFeature, self).__init__() + self.readed = False #No se si poner aqui una clase para heredar , que sea feature_class. #Tengo que ver si a futuro necesito iterar por los elementos de una clase @@ -69,13 +80,14 @@ class NodeClassMethod(NodeFeature): def __init__(self, idName: str, argNames, - argTypesNames, - return_type: str, + argTypes, + returnType: str, body): + super().__init__() self.idName = idName self.argNames = argNames - self.returnType = return_type - self.argTypesNames = argTypesNames + self.returnType = returnType + self.argTypes = argTypes self.body = body def to_readable(self): @@ -85,10 +97,12 @@ def to_readable(self): ) class NodeAttr(NodeFeature): - def __init__(self, idName, attr_type, expr): + def __init__(self, idName, attrType, expr= None, value= None): + super().__init__() self.idName = idName - self.attrType = attr_type + self.type = attrType self.expr = expr + self.value = value class NodeFormalParam(NodeFeature): def __init__(self, idName, param_type): @@ -185,7 +199,6 @@ def to_readable(self): class NodeExpr(Node): def __init__(self): - self.value= None super().__init__() class NodeNewObject(NodeExpr): @@ -313,10 +326,10 @@ def to_readable(self): class NodeLet(NodeExpr): - def __init__(self, idName, return_type, body): + def __init__(self, idName, returnType, body): super().__init__() self.idName= idName - self.type= return_type + self.type= returnType self.body= body @@ -324,13 +337,13 @@ def to_tuple(self): return tuple([ ("class_name", self.clsname), ("idName", self.idName), - ("return_type", self.type), + ("returnType", self.type), ("body", self.body), ("value", self.value), ]) def to_readable(self): - return "{}(idName={}, return_type={}, body={}, value={})".format( + return "{}(idName={}, returnType={}, body={}, value={})".format( self.clsname, self.idName, self.type, self.body, self.value) @@ -434,6 +447,7 @@ def to_readable(self): class NodeBinaryOperation(NodeExpr): def __init__(self): super().__init__() + self.type= '' class NodeAddition(NodeBinaryOperation): def __init__(self, first, second): diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 3e8fc3e7..ef7cb7a0 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -1,20 +1,171 @@ from ..utils.AST_definitions import * from ..utils.errors import error, interceptError +from ..utils.functions_for_classes import funcs, functionSerializable +import json +import sys -class context: + +class Context: def __init__(self, dictionaries ={}): - self.types = { } + self.types= { + 'Object': NodeClass (idName= 'Object', + methods= [ + NodeClassMethod(idName = 'abort', + argNames='', + argTypes='', + returnType='Object', + body= funcs.abortFunc), + NodeClassMethod(idName= 'type_name', + returnType= 'Object', + argTypes= [], + argNames= [], + body= funcs.typeNameFunc), + NodeClassMethod(idName= 'copy', + returnType= 'SELF_TYPE', + argNames= [], + argTypes= [], + body= funcs.copyFunc) + ], + attributes= [ + ], + parent= None), + 'Int': NodeClass (idName= 'Int', + methods= [ + + ], + attributes= [ + NodeAttr( + idName= 'default', + attrType= 'Int', + value= 0 + ) + ], + parent= 'Object'), + 'IO': NodeClass (idName= 'IO', + methods= [ + NodeClassMethod( idName= "out_string", + returnType="SELF_TYPE", + argTypes= [], + argNames= [], + body= funcs.outStringFunc + ), + NodeClassMethod( idName= "out_int", + returnType="SELF_TYPE", + argNames= ['x'], + argTypes= ['Int'], + body= funcs.outIntFunc), + NodeClassMethod( idName= 'in_string', + returnType='String', + argTypes= [], + argNames= [], + body= funcs.readFromInputFunc), + NodeClassMethod (idName='in_int', + returnType='Int', + argTypes= [], + argNames= [], + body= funcs.readFromInputFunc) + ], + attributes= [], + parent= 'Object'), + 'SELF_TYPE': NodeClass(idName='SELF_TYPE', + parent= 'Object', + attributes= [], + methods=[]), + 'String': NodeClass(idName= 'String', + methods= [ + NodeClassMethod( + idName='length', + returnType='String', + argTypes= [], + argNames= [], + body= funcs.readFromInputFunc + ), + NodeClassMethod ( + idName= 'concat', + returnType= 'Int', + argTypes= ['String'], + argNames= ['x'], + body= funcs.concatFunc + ), + NodeClassMethod ( + idName= 'substr', + returnType='String', + argNames= ['i', 'l'], + argTypes=['Int', 'Int'], + body= funcs.substrFunc + ) + ], + attributes= [NodeAttr(idName= 'default', + attrType='String', + value= '')], + parent= 'Object' + + ) + } + def createType(self, node: NodeClass): return interceptError( - validationFunc= lambda: not node.idName in self.types, - errorType= 'repeated class', - idName= node.idName) or self.types.update({ - node.idName: { - 'parent': node.parent, - 'attributes': {}, - 'methods': {} } - } ) + validationFunc= lambda: not node.idName in self.types, + errorType= 'repeated class', + idName= node.idName + ) or interceptError ( + validationFunc= lambda: node.idName != node.parent, + errorType= 'Inherit from itself', + idName= node.idName + )or self.types.update({ + node.idName: + node + }) + + def relateInheritance(self, node: NodeClass): + return interceptError( + validationFunc= lambda: node.idName in self.types, + errorType= 'undefined type', + idName= node.idName + ) or interceptError ( + validationFunc= lambda: self.types[node.idName].parent in self.types, + errorType= 'undefined type', + idName = self.types[node.idName].parent + ) or interceptError( + validationFunc= lambda: not self.types[node.parent].builtIn, + errorType= 'built-in inheritance', + idName= node.idName + ) or interceptError( + validationFunc= lambda: not self.isAncestor ( + idChild= node.idName, idParent= node.parent), + errorType= 'inheritance from child', + idParent= node.parent, + idChild= node.idName + ) or not self.actualizeInherits(node.idName, node.parent) + + def actualizeInherits (self, idName, parent): + + self.types[idName].inheritsAttr.update({attr.idName: attr for attr in self.types[parent].attributes + if not attr in self.types[idName].attributes}) + self.types[idName].inheritsAttr.update({attrName: self.types[parent].inheritsAttr[attrName] + for attrName in self.types[parent].inheritsAttr + if self.types[parent].inheritsAttr[attrName] not + in self.types[idName].attributes }) + self.types[idName].inheritsMethods.update({method.idName: method for method in self.types[parent].methods + if not method in self.types[idName].methods + }) + self.types[idName].inheritsMethods.update({methodName: self.types[parent].inheritsMethods[methodName] + for methodName in self.types[parent].inheritsMethods + if not self.types[parent].inheritsMethods[methodName] + in self.types[idName].methods + }) + + + def isAncestor(self, idChild: str, idParent: str): + + currentName = self.types[idParent].parent + while currentName != 'Object' and currentName != idChild and currentName != idParent: + try: + currentName = self.types[currentName].parent + except KeyError: + break + return currentName == idChild def getType(self, idName: str): return interceptError( @@ -24,31 +175,118 @@ def getType(self, idName: str): ) or self.types.get(idName) def defineAttrInType(self, typeName: str, attr: NodeAttr): - return interceptError( - validationFunc= lambda : not attr.idName in self.types[typeName], - errorType= 'repeated attr', - idName= attr.idName - ) or not self.types[typeName]['attributes'].update({ attr.idName: - { 'type': attr.attrType } }) - - def defineMethod(self, typeNameForAttach: str, - methodName: str, - returnType, - argNames, - argTypes): - return interceptError( - validationFunc= lambda: not methodName in - programContext.types[typeNameForAttach]['methods'], + + err= interceptError( + validationFunc= lambda : not attr in + [a for a in self.types[typeName].attributes if a.readed ], + errorType= 'repeated attr', + idName= attr.idName + ) + if type(err) is error: + return err + attr.readed= True + + def defineMethod(self, typeName: str, + node: NodeClassMethod): + err= interceptError( + validationFunc= lambda: not node in + [m for m in self.types[typeName].methods if m.readed], errorType= 'repeated method', - idName= methodName - ) and not programContext.types[typeNameForAttach]['methods'].update( - { methodName: { - 'returnType': returnType, - 'argNames': argNames, - 'argTypesNames':argTypes - } }) + idName= node.idName + ) + if type(err) is error: + return err + node.readed= True + + def checkEqualTypes(self, attrType, returnType): + + pass + + def checkInheritedInfo(self, idName: str): + + pass + + def isUndefined(self, arg): + + pass + + def createContextForLetExpr(self, node: NodeLet, chainOfNames): + return not self.letsExpr.update({ + chainOfNames: + ContextLet(chainBefore= chainOfNames, + objectId= node.idName, + typeObject= node.type, + value= None) + }) + + + def checkDynamicDispatch(self, typeName, method, arguments): + methodInfo= self.methodInNodeOrParent(typeName, method) + undefinedArgs= [ arg for arg in arguments if self.isUndefined(arg)] + + return interceptError( + validationFunc= lambda : not methodInfo is None, + errorType= 'undefined method in class', + idName= method, + className= typeName + ) or interceptError( + validationFunc= lambda: undefinedArgs is [], + errorType= 'undefined arguments for method in class', + idName= method, + className= typeName, + undefinedArgs = undefined + ) + + def methodInNodeOrParent(self, typeName, method): + currentName= typeName + + while currentName and not method in self.types[currentName]['methods']: + currentName = self.types[currentName]['parent'] + + if not currentName: return None + return self.types[currentName]['methods'][method] + def __repr__(self): return self.__str__() -programContext = context() + def __str__(self): + return json.dumps(self.types, indent = 4, cls= MyEncoder) + + def buildEnv (self, typeName): + typeInfo= self.types[typeName] + d= { o.idName: {'value': o.value, 'type': o.type } for o in typeInfo.attributes } + d.update( {o.idName: {'value': o.value, 'type': o.type} for o in typeInfo.inheritsAttr}) + return d + + def assignValue(self, node, exprResult): + return interceptError( + validationFunc= lambda : node.type == exprResult['type'], + errorType='uncompatible types', + type1= node.type, + type2= exprResult['type'] + ) or not self.assign(node, exprResult) + + def assign(self, node, exprResult): + node.value= exprResult['value'] + + + def searchValue(self, node: NodeObject, environment): + return interceptError( + validationFunc= lambda: node.idName + in environment and environment[node.idName], + errorType='undefined symbol', + symbolName= node.idName) or environment[node.idName] + + def executeArithmetic(self, func, type1, type2): + return interceptError(validationFunc= lambda: type1 == type2, + errorType= 'uncompatible types', + type1= type1, + type2= type2) or func() + +class MyEncoder(json.JSONEncoder): + def default(self, obj): + return obj.toJSON() + +programContext = Context() + diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index e7886609..2f3cd016 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -29,7 +29,43 @@ def __str__(self): error_type='Semantic error', row_and_col=row_and_col, message="The method %s is already defined in the current context" %idName - )} + ), + 'built-in inheritance': lambda idName, row_and_col=(0,0): error ( + error_type='Semantic error', + row_and_col=row_and_col, + message="The class %s is sealed. You can't inherit from it" %idName + ), + 'inheritance from child': lambda idChild, idParent, row_and_col=(0,0): error ( + error_type='Semantic error', + row_and_col=row_and_col, + message="The class %s is an ancestor of %s class" %(idParent, idChild) + ), + 'Inherit from itself': lambda idName, row_and_col=(0,0): error ( + error_type='Semantic error', + row_and_col=row_and_col, + message="The class %s can't inherit from itself" %(idName) + ), + 'undefined method in class': lambda idName, className, row_and_col=(0,0): error ( + error_type= 'Semantic error', + row_and_col= row_and_col, + message="The class %s has no method called %s" %(idName, className) + ), + 'undefined arguments for method in class': lambda idName, className, undefinedArgs, row_and_col=(0,0): error ( + error_type= 'Semantic error', + row_and_col= row_and_col, + message="The arguments %s does not exists in method %s in class %s " %(undefinedArgs, idName, className) + ), + 'uncompatible types': lambda type1, type2, row_and_col=(0,0): error ( + error_type= 'Semantic error', + row_and_col= row_and_col, + message="Uncompatible types %s and %s in %s " %(type1, type2, row_and_col) + ), + 'undefined symbol': lambda symbolName, row_and_col=(0,0): error ( + error_type= 'Semantic error', + row_and_col= row_and_col, + message="Undefined symbol %s at %s" %(symbolName, row_and_col) + ) + } def interceptError(validationFunc, errorType: str, **argumentsConstructor): return (not validationFunc()) and errorSelector[errorType](**argumentsConstructor) diff --git a/src/compiler/utils/functions_for_classes.py b/src/compiler/utils/functions_for_classes.py new file mode 100644 index 00000000..4c765f8f --- /dev/null +++ b/src/compiler/utils/functions_for_classes.py @@ -0,0 +1,53 @@ +from json import dumps + +class functionSerializable: + def __init__(self, func, + funcName, + params ): + self.func= func + self.funcName= funcName + self.params= params + + def __repr__(self): + return self.toJSON() + + def toJSON(self): + return dumps(self, default=lambda o: o.__dict__, + sort_keys=True, indent=4, separators=(',', ': ')) + + +class funcs: + abortFunc= functionSerializable ( + func= lambda: sys.exit('Error in program execution'), + funcName= "abortFunc", + params= []) + typeNameFunc= functionSerializable ( + func= lambda className: className, + funcName= "typeNameFunc", + params= ['className']) + copyFunc= functionSerializable ( + func= lambda className: self.types[className], + funcName= "copyFunc", + params= ["className"]) + outStringFunc= functionSerializable ( + func= lambda argument: print(argument) or 'SELF_TYPE', + funcName= "outStringFunc", + params= []) + outIntFunc= functionSerializable ( + func= lambda argument: print(argument) or 'SELF_TYPE', + funcName= "outIntFunc", + params= []) + readFromInputFunc= functionSerializable( + func= lambda: input(), + funcName= "readFromInputFunc", + params= []) + concatFunc= functionSerializable( + func= lambda selfVal, otherVal : selfVal + otherVal, + funcName= "concatFunc", + params= ["selfVal", "otherVal"]) + substrFunc= functionSerializable ( + func= lambda selfVal, i1, i2: selfVal[i1:i2], + funcName= "substrFunc", + params= ["selfVal", 'i1', "i2"]) + + diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 9ee6fe68..d5087429 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -4,13 +4,16 @@ class NodeVisitor: - def visit(self, node: Node): + def visit(self, node: Node, **args): + if node.__class__.__bases__[0] is NodeBinaryOperation: + return self.visit_NodeBinaryOperation(node, **args) visitor_method_name = 'visit_' + node.clsname visitor = getattr(self, visitor_method_name, self.not_implemented) - return visitor(node) # Return the new context result from the visit + + return visitor(node, **args) # Return the new context result from the visit def not_implemented(self, node: Node): - raise Exception('Not implemented visit_{} method'.format(node.clsname)) + raise Exception('Not implemented visit_{} method'.format(node.clsname)) # We need to highlight here the inheritance relations between classes class TypeCollectorVisitor(NodeVisitor): @@ -18,15 +21,28 @@ class TypeCollectorVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): errors = [] for nodeClass in node.class_list: + result= self.visit(nodeClass) if result: - errors.append (result) + errors.append(result) return errors def visit_NodeClass(self, node: NodeClass): # When we create a type, we store it in the context, if there is no errors return programContext.createType(node) +class TypeInheritanceVisitor(NodeVisitor): + def visit_NodeProgram(self, node: NodeProgram): + errors = [] + for nodeClass in node.class_list: + result = self.visit(nodeClass) + if type (result) is error: + errors.append(result) + return errors + + def visit_NodeClass(self, node: NodeClass): + return programContext.relateInheritance(node) + class TypeBuilderVisitor(NodeVisitor): def __init__(self): self.currentTypeName = '' @@ -38,8 +54,9 @@ def visit_NodeProgram(self, node: NodeProgram): return errors def visit_NodeClass(self, node: NodeClass): - errors = [] - self.currentTypeName = node.idName + errors= [] + self.currentTypeName= node.idName + for nodeAttr in node.attributes: errors += self.visit(nodeAttr) for nodeClassMethod in node.methods: @@ -47,21 +64,159 @@ def visit_NodeClass(self, node: NodeClass): return errors def visit_NodeAttr(self, node:NodeAttr): - resultOp = programContext.defineAttrInType(self.currentTypeName, node) + resultOp = programContext.defineAttrInType(self.currentTypeName, + node) + if type (resultOp) is error: return [resultOp] + return [] def visit_NodeClassMethod(self, node: NodeClassMethod): return [definition for definition in [programContext.getType(node.returnType)] + - [programContext.getType(idName = arg) for arg in node.argTypesNames] + + [programContext.getType(idName = arg) for arg in node.argTypes] + [programContext.defineMethod( - self.currentTypeName, - node.idName, - node.returnType, - node.argNames, - node.argTypesNames + typeName = self.currentTypeName, + node= node )] - if type(definition) is error + if type(definition) is error ] + + +class TypeCheckerVisitor(NodeVisitor): + def __init__(self): + pass + + + def visit_NodeProgram(self, node: NodeProgram): + errors = [] + for nodeClass in node.class_list: + environment = programContext.buildEnv (typeName= nodeClass.idName) + errors += self.visit(nodeClass, environment= environment) + + return errors + + def visit_NodeClass(self, node: NodeClass, environment): + errors = [] + for nodeAttr in node.attributes: + result= self.visit(nodeAttr, environment= environment) + if type(result) is error: + errors.append(result) + environment.update({ + nodeAttr.idName: result + }) + + for nodeClassMethod in node.methods: + result= self.visit(nodeClassMethod, environment= environment) + if type(result) is error: + errors.append(result) + + programContext.checkInheritedInfo(node.idName) + return errors + + def visit_NodeClassMethod(self, node: NodeClassMethod, environment): + pass + + def visit_NodeAttr(self, node: NodeAttr, environment): + exprResult= self.visit(node.expr, + environment= environment) + + if type(exprResult) is error: + return exprResult + assignResult= programContext.assignValue(node, exprResult) + if type(assignResult) is error: + return assignResult + return exprResult + + + + # Esto es un let complex, calcula todos los inner lets y a partir de ellos + # obtiene el valor de la expresión de la derecha del IN + def visit_NodeLetComplex(self, + node: NodeLetComplex, + environment): + + for nodeLet in node.nestedLets: + result= self.visit(nodeLet, + environment= environment) + if type(result) is error: + return result + environment.update({ + nodeLet.idName: result + }) + + return self.visit( node.body, + environment= environment) + + def visit_NodeLet(self, node: NodeLet, environment): + errors= [] + exprResult= self.visit(node.body, + environment= environment) + if type(exprResult) is error: + return exprResult + assingResult = programContext.assignValue(node, + exprResult) + if type(assingResult) is error: + return assingResult + return exprResult + + + def visit_NodeBinaryOperation(self, + node: NodeBinaryOperation, + environment): + + exprResultFirst= self.visit(node.first, + environment= environment) + + exprResultSecond= self.visit(node.second, + environment= environment) + + if type (exprResultFirst) is error: + return exprResultFirst + + if type (exprResultSecond) is error: + return exprResultSecond + + func= None + if type(node) is NodeAddition: + func= lambda : {'value': exprResultFirst['value'] + exprResultSecond['value'], 'type': 'Int'} + + if type(node) is NodeSubtraction: + func= lambda : {'value': exprResultFirst['value'] - exprResultSecond['value'], 'type': 'Int'} + + if type(node) is NodeMultiplication: + func= lambda : {'value': exprResultFirst['value'] * exprResultSecond['value'], 'type': 'Int'} + + if type(node) is NodeDivision: + func= lambda : {'value': exprResultFirst['value'] / exprResultSecond['value'], 'type': 'Int'} + + result= programContext.executeArithmetic(func, exprResultFirst['type'], + exprResultSecond['type']) + return result + + def visit_NodeNewObject(self, node: NodeNewObject): + return programContext.getType(node.type) + + def visit_NodeExpr(self, + node: NodeExpr, + environment): + return self.visit(node, environment= environment) + + def visit_NodeInteger(self, + node: NodeInteger, + **args): + return {"type": 'Int', "value": node.content} + + def visit_NodeObject(self, + node: NodeObject, + environment): + + return programContext.searchValue(node, + environment) + + def visit_NodeDynamicDispatch(self, node: NodeDynamicDispatch): + exprVal= self.visit_NodeExpr(node.instance) + return programContext.checkDynamicDispatch(exprVal, + node.method, node.arguments) + \ No newline at end of file From 95c25fdf00c20b93b8f491226c8e703273171c23 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 15 Dec 2020 20:27:48 -0500 Subject: [PATCH 43/96] Just tiny changes for semantic --- src/compiler/components/syntax_analyzer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 7e68ada0..9ab03b70 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -97,13 +97,13 @@ def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression """ - p[0] = NodeAttr(idName= p[1], attrType= p[3], expr= p[5]) + p[0] = NodeAttr(idName= p[1], _type= p[3], expr= p[5]) def p_feature_attr(self, p): """ feature : ID COLON TYPE """ - p[0] = NodeAttr(idName= p[1], attrType= p[3], expr= None) + p[0] = NodeAttr(idName= p[1], _type= p[3], expr= None) def p_formal_list_many(self, p): """ From 6d30fde40b76a340d8e80d5fbde8c30eddd40f9c Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 15 Dec 2020 20:28:19 -0500 Subject: [PATCH 44/96] Some changes for semantic --- src/compiler/utils/AST_definitions.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index b0f3f41a..b2efb725 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -58,9 +58,7 @@ def __init__(self, idName: str, methods, attributes, parent): self.methods = methods self.attributes = attributes self.parent = parent - self.builtIn = idName in {'Int', 'Bool', 'SELF_TYPE'} - self.inheritsAttr = {} - self.inheritsMethods= {} + def to_readable(self): @@ -71,7 +69,6 @@ def to_readable(self): class NodeFeature(Node): def __init__(self): super(NodeFeature, self).__init__() - self.readed = False #No se si poner aqui una clase para heredar , que sea feature_class. #Tengo que ver si a futuro necesito iterar por los elementos de una clase @@ -97,12 +94,11 @@ def to_readable(self): ) class NodeAttr(NodeFeature): - def __init__(self, idName, attrType, expr= None, value= None): + def __init__(self, idName, _type, expr= None): super().__init__() self.idName = idName - self.type = attrType + self._type = _type self.expr = expr - self.value = value class NodeFormalParam(NodeFeature): def __init__(self, idName, param_type): @@ -196,11 +192,13 @@ def to_tuple(self): def to_readable(self): return "{}(content={})".format(self.clsname, repr(self.content)) - +# Cada expresión debe tener una función de evaluación asociada. +# Con un valor de retorno x. class NodeExpr(Node): def __init__(self): super().__init__() + class NodeNewObject(NodeExpr): def __init__(self, new_type): super().__init__() @@ -219,7 +217,7 @@ def to_readable(self): class NodeIsVoid(NodeExpr): def __init__(self, expr): super().__init__() - self.expr = expr + def to_tuple(self): return tuple([ @@ -338,14 +336,13 @@ def to_tuple(self): ("class_name", self.clsname), ("idName", self.idName), ("returnType", self.type), - ("body", self.body), - ("value", self.value), + ("body", self.body) ]) def to_readable(self): - return "{}(idName={}, returnType={}, body={}, value={})".format( + return "{}(idName={}, returnType={}, body={})".format( self.clsname, self.idName, self.type, - self.body, self.value) + self.body) class NodeIf(NodeExpr): From 9d921379b00c1135b7509a434c5a5f005130a731 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 15 Dec 2020 20:29:05 -0500 Subject: [PATCH 45/96] Error definitions for arithmetics and let expr --- src/compiler/utils/errors.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 2f3cd016..dfd09471 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -64,6 +64,11 @@ def __str__(self): error_type= 'Semantic error', row_and_col= row_and_col, message="Undefined symbol %s at %s" %(symbolName, row_and_col) + ), + 'not ancestor in dispatch': lambda idName, returnType, row_and_col=(0,0): error ( + error_type= 'Semantic error', + row_and_col= row_and_col, + message= 'Type %s is not subtype of %s at %s' %(idName, returnType, row_and_col) ) } From c6b6a39fd57b684052e6675f5cec1c742809aaff Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 15 Dec 2020 20:30:40 -0500 Subject: [PATCH 46/96] For arithmetic attr works fine --- src/compiler/utils/context.py | 454 +++++++++++++-------- src/compiler/utils/visitors_definitions.py | 130 +++--- 2 files changed, 361 insertions(+), 223 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index ef7cb7a0..7fe12bfc 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -1,107 +1,144 @@ from ..utils.AST_definitions import * from ..utils.errors import error, interceptError -from ..utils.functions_for_classes import funcs, functionSerializable import json import sys +class jsonable: + def toJSON(self): + return dumps(self, default=lambda o: o.__dict__, + sort_keys=True, indent=4, separators=(',', ': ')) -class Context: + def __repr__(self): + return self.toJSON() +class Type(jsonable): + def __init__(self, idName, attributes, + methods, builtIn= False, parent=None): + + self.idName= idName + self.parent= parent + self.attributes= attributes + self.methods= methods + self.builtIn= builtIn + self.inheritsAttr= {} + self.inheritsMethods= {} + +class feature(jsonable): + def __eq__(self, other): + if type(self) == type(other): + for f in self.__dict__: + if not self.__dict__[f] == other.__dict__[f]: + return False + return True + return False + +class Attribute(feature): + def __init__(self, idName: str, _type: str): + self.idName = idName + self._type = _type + + +class Method(feature): + def __init__(self, idName: str, + returnType: str, + argNames, + argTypes): + + self.idName = idName + self.returnType = returnType + self.argNames = argNames + self.argTypes= argTypes + + +class globalContext: def __init__(self, dictionaries ={}): self.types= { - 'Object': NodeClass (idName= 'Object', - methods= [ - NodeClassMethod(idName = 'abort', - argNames='', - argTypes='', - returnType='Object', - body= funcs.abortFunc), - NodeClassMethod(idName= 'type_name', - returnType= 'Object', - argTypes= [], - argNames= [], - body= funcs.typeNameFunc), - NodeClassMethod(idName= 'copy', - returnType= 'SELF_TYPE', - argNames= [], + 'Object': Type( idName= 'Object', + methods= { + 'abort': Method(idName= 'abort', + argNames=[], + argTypes=[], + returnType='Object'), + 'type_name': Method(idName= 'type_name', + returnType= 'String', argTypes= [], - body= funcs.copyFunc) - ], - attributes= [ - ], - parent= None), - 'Int': NodeClass (idName= 'Int', - methods= [ - - ], - attributes= [ - NodeAttr( - idName= 'default', - attrType= 'Int', - value= 0 - ) - ], - parent= 'Object'), - 'IO': NodeClass (idName= 'IO', - methods= [ - NodeClassMethod( idName= "out_string", - returnType="SELF_TYPE", - argTypes= [], - argNames= [], - body= funcs.outStringFunc - ), - NodeClassMethod( idName= "out_int", - returnType="SELF_TYPE", - argNames= ['x'], - argTypes= ['Int'], - body= funcs.outIntFunc), - NodeClassMethod( idName= 'in_string', - returnType='String', - argTypes= [], - argNames= [], - body= funcs.readFromInputFunc), - NodeClassMethod (idName='in_int', - returnType='Int', - argTypes= [], - argNames= [], - body= funcs.readFromInputFunc) - ], - attributes= [], - parent= 'Object'), - 'SELF_TYPE': NodeClass(idName='SELF_TYPE', + argNames= []), + 'copy': Method(idName= 'copy', + returnType= 'SELF_TYPE', + argNames= [], + argTypes= []) + }, + attributes= {}, + parent= None), + 'Int': Type(idName= 'Int', + methods= {}, + attributes= { + 'default': Attribute( + idName= 'default', + _type= 'Int' + ) + }, + parent= 'Object'), + 'IO': Type( idName= 'IO', + methods= { + "out_string": Method( idName= "out_string", + returnType="SELF_TYPE", + argTypes= ['x'], + argNames= ['String'] + ), + "out_int": Method( idName= "out_int", + returnType="SELF_TYPE", + argNames= ['x'], + argTypes= ['Int']), + 'in_string': Method( idName= 'in_string', + returnType='String', + argTypes= [], + argNames= []), + 'in_int': Method (idName='in_int', + returnType='Int', + argTypes= [], + argNames= []) + }, + attributes= {}, + parent= 'Object'), + 'SELF_TYPE': Type(idName='SELF_TYPE', parent= 'Object', - attributes= [], - methods=[]), - 'String': NodeClass(idName= 'String', - methods= [ - NodeClassMethod( - idName='length', - returnType='String', - argTypes= [], - argNames= [], - body= funcs.readFromInputFunc - ), - NodeClassMethod ( - idName= 'concat', - returnType= 'Int', - argTypes= ['String'], - argNames= ['x'], - body= funcs.concatFunc - ), - NodeClassMethod ( - idName= 'substr', - returnType='String', - argNames= ['i', 'l'], - argTypes=['Int', 'Int'], - body= funcs.substrFunc - ) - ], - attributes= [NodeAttr(idName= 'default', - attrType='String', - value= '')], - parent= 'Object' + attributes= {}, + methods={}), + 'String': Type( idName= 'String', + methods= { + 'length': Method( + idName='length', + returnType='Int', + argTypes= [], + argNames= [] + ), + 'concat': Method ( + idName= 'concat', + returnType= 'String', + argTypes= ['String'], + argNames= ['x'] + ), + 'substr': Method ( + idName= 'substr', + returnType='String', + argNames= ['i', 'l'], + argTypes=['Int', 'Int'] + ) + }, + attributes= { + 'default': Attribute( + idName= 'default', + _type='String') + }, + parent= 'Object' - ) + ), + 'Bool': Type (idName= 'Bool', + attributes= {}, + methods= {}, + builtIn= True, + parent= 'Object') } def createType(self, node: NodeClass): @@ -115,46 +152,102 @@ def createType(self, node: NodeClass): idName= node.idName )or self.types.update({ node.idName: - node + Type (idName= node.idName, + attributes= {}, + methods= {}, + parent= node.parent if node else 'Object') }) - def relateInheritance(self, node: NodeClass): + def relateInheritance(self, idName : str, parent: str): return interceptError( - validationFunc= lambda: node.idName in self.types, + validationFunc= lambda: idName in self.types, errorType= 'undefined type', - idName= node.idName + idName= idName ) or interceptError ( - validationFunc= lambda: self.types[node.idName].parent in self.types, + validationFunc= lambda: self.types[idName].parent in + self.types, errorType= 'undefined type', - idName = self.types[node.idName].parent + idName = self.types[idName].parent ) or interceptError( - validationFunc= lambda: not self.types[node.parent].builtIn, + validationFunc= lambda: not self.types[parent].builtIn, errorType= 'built-in inheritance', - idName= node.idName + idName= idName ) or interceptError( validationFunc= lambda: not self.isAncestor ( - idChild= node.idName, idParent= node.parent), + idChild= idName, idParent= parent), errorType= 'inheritance from child', - idParent= node.parent, - idChild= node.idName - ) or not self.actualizeInherits(node.idName, node.parent) + idParent= parent, + idChild= idName + ) or not self.actualizeInherits(idName, parent) - def actualizeInherits (self, idName, parent): + def actualizeInherits (self, idName, parentName): + for attr in self.types[parentName].attributes: + result= self.actualizeInheritAttr( + idName= idName, + childInfoAttr = self.types[idName].attributes.get(attr, None), + parentInfoAttr= self.types[parentName].attributes[attr]) + if type(result) is error: + return error + + for attr in self.types[parentName].inheritsAttr: + result = self.actualizeInheritAttr( + idName= idName, + childInfoAttr= self.types[idName].attributes.get(attr, None), + parentInfoAttr= self.types[parentName].inheritsAttr[attr] + ) + if type(result) is error: + return error + for method in self.types[parentName].methods: + result = self.actualizeInheritMethod( + idName= idName, + childInfoMethod= self.types[idName].methods.get(method, None), + parentInfoMethod= self.types[parentName].methods[method] + ) + if type(result) is error: + return result - self.types[idName].inheritsAttr.update({attr.idName: attr for attr in self.types[parent].attributes - if not attr in self.types[idName].attributes}) - self.types[idName].inheritsAttr.update({attrName: self.types[parent].inheritsAttr[attrName] - for attrName in self.types[parent].inheritsAttr - if self.types[parent].inheritsAttr[attrName] not - in self.types[idName].attributes }) - self.types[idName].inheritsMethods.update({method.idName: method for method in self.types[parent].methods - if not method in self.types[idName].methods - }) - self.types[idName].inheritsMethods.update({methodName: self.types[parent].inheritsMethods[methodName] - for methodName in self.types[parent].inheritsMethods - if not self.types[parent].inheritsMethods[methodName] - in self.types[idName].methods - }) + + for method in self.types[parentName].inheritsMethods: + result = self.actualizeInheritMethod( + idName= idName, + childInfoMethod= self.types[idName].methods.get(method, None), + parentInfoMethod= self.types[parentName].inheritsMethods[method] + ) + if type(result) is error: + return result + + + + def actualizeInheritMethod(self, + idName, + childInfoMethod: Method, + parentInfoMethod: Method): + return interceptError( + validationFunc= lambda: not childInfoMethod or + childInfoMethod.returnType == parentInfoMethod.returnType and + len(childInfoMethod.argNames) == len(parentInfoMethod.argNames) and + childInfoMethod.argTypes == parentInfoMethod.argTypes, + errorType= 'bad redefine method', + nameClass= idName, + methodName = childInfoMethod.idName if childInfoMethod else None + )or self.types[idName].inheritsMethods.update({ + parentInfoMethod.idName: parentInfoMethod + }) + + def actualizeInheritAttr(self, + idName, + childInfoAttr: Attribute, + parentInfoAttr: Attribute): + + return interceptError( + validationFunc= lambda: not (childInfoAttr and childInfoAttr._type != parentInfoAttr._type), + errorType= "bad redefine attr", + nameClass= idName, + attrName= childInfoAttr.idName if childInfoAttr else None, + attrType= childInfoAttr._type if childInfoAttr else None + ) or childInfoAttr or self.types[idName].inheritsAttr.update({ + parentInfoAttr.idName: parentInfoAttr + }) def isAncestor(self, idChild: str, idParent: str): @@ -176,29 +269,31 @@ def getType(self, idName: str): def defineAttrInType(self, typeName: str, attr: NodeAttr): - err= interceptError( - validationFunc= lambda : not attr in - [a for a in self.types[typeName].attributes if a.readed ], + return interceptError( + validationFunc= lambda : not attr.idName in + self.types[typeName].attributes, errorType= 'repeated attr', idName= attr.idName - ) - if type(err) is error: - return err - attr.readed= True + ) or self.types[typeName].attributes.update({ + attr.idName: Attribute(idName= attr.idName, + _type= attr._type ) + }) def defineMethod(self, typeName: str, node: NodeClassMethod): - err= interceptError( - validationFunc= lambda: not node in - [m for m in self.types[typeName].methods if m.readed], + return interceptError( + validationFunc= lambda: not node.idName in + self.types[typeName].methods, errorType= 'repeated method', idName= node.idName - ) - if type(err) is error: - return err - node.readed= True + ) or self.types[typeName].methods.update({ + node.idName: Method(idName= node.idName, + returnType= node.returnType, + argNames= node.argNames, + argTypes= node.argTypes) + }) - def checkEqualTypes(self, attrType, returnType): + def checkEqualTypes(self, _type, returnType): pass @@ -220,32 +315,32 @@ def createContextForLetExpr(self, node: NodeLet, chainOfNames): }) - def checkDynamicDispatch(self, typeName, method, arguments): - methodInfo= self.methodInNodeOrParent(typeName, method) - undefinedArgs= [ arg for arg in arguments if self.isUndefined(arg)] - + def checkDynamicDispatch(self, + typeName, method, arguments): + + + methodInfo = self.types[typeName].methods.get(method, None) + if not methodInfo: + methodInfo= self.types[typeName].inheritsMethods.get(method, None) + notAncestorArgs= [arguments[i] for i in range (len(arguments)) + if arguments[i] != methodInfo.argTypes[i] + and not self.isAncestor(arguments[i], + methodInfo.argTypes[i])] + + return interceptError( validationFunc= lambda : not methodInfo is None, errorType= 'undefined method in class', idName= method, className= typeName - ) or interceptError( - validationFunc= lambda: undefinedArgs is [], - errorType= 'undefined arguments for method in class', + ) or interceptError ( + validationFunc= lambda : notAncestorArgs == [], + errorType= 'argument types in dispatch are not subtypes', idName= method, - className= typeName, - undefinedArgs = undefined - ) - - def methodInNodeOrParent(self, typeName, method): - currentName= typeName - - while currentName and not method in self.types[currentName]['methods']: - currentName = self.types[currentName]['parent'] + badArgs= notAncestorArgs + ) or methodInfo.returnType - if not currentName: return None - return self.types[currentName]['methods'][method] - + def __repr__(self): return self.__str__() @@ -255,20 +350,28 @@ def __str__(self): def buildEnv (self, typeName): typeInfo= self.types[typeName] - d= { o.idName: {'value': o.value, 'type': o.type } for o in typeInfo.attributes } - d.update( {o.idName: {'value': o.value, 'type': o.type} for o in typeInfo.inheritsAttr}) + d = {typeInfo.attributes[attr].idName: + {'type': typeInfo.attributes[attr]._type } + for attr in typeInfo.attributes } + d.update({ typeInfo.inheritsAttr[attr].idName: + {'type': typeInfo.inheritsAttr[attr]._type} + for attr in typeInfo.inheritsAttr } ) return d - def assignValue(self, node, exprResult): + def checkAssign(self, node, _type, environment): + return interceptError( - validationFunc= lambda : node.type == exprResult['type'], + validationFunc= lambda : node.idName in environment, + errorType='undefined symbol', + symbol= node.idName + ) or interceptError( + validationFunc= lambda : nodeType == _type + or self.isAncestor(idChild=_type, + idParent= nodeType), errorType='uncompatible types', type1= node.type, type2= exprResult['type'] - ) or not self.assign(node, exprResult) - - def assign(self, node, exprResult): - node.value= exprResult['value'] + ) or nodeType def searchValue(self, node: NodeObject, environment): @@ -278,15 +381,38 @@ def searchValue(self, node: NodeObject, environment): errorType='undefined symbol', symbolName= node.idName) or environment[node.idName] - def executeArithmetic(self, func, type1, type2): + def checkArithmetic(self, type1, type2): return interceptError(validationFunc= lambda: type1 == type2, errorType= 'uncompatible types', type1= type1, - type2= type2) or func() + type2= type2) or type1 + + def LCA(self, idName1, idName2): + path1 = self.pathToObject( idName1) + path2 = self.pathToObject( idName2) + possibleAncestor = '' + while path1 and path2: + anc1 = path1.pop() + anc2 = path2.pop() + if anc1 == anc2: + possibleAncestor= anc1 + else: + break + + return possibleAncestor + + + def pathToObject(self, idName): + path = [] + currentIdName= idName + while currentIdName != 'Object': + path.append(currentIdName) + currentIdName = self.types[currentIdName].parent + return path + ['Object'] class MyEncoder(json.JSONEncoder): def default(self, obj): return obj.toJSON() -programContext = Context() +programContext = globalContext() diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index d5087429..9891a480 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -2,6 +2,7 @@ from ..utils.context import programContext from ..utils.errors import error + class NodeVisitor: def visit(self, node: Node, **args): @@ -34,14 +35,16 @@ def visit_NodeClass(self, node: NodeClass): class TypeInheritanceVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): errors = [] - for nodeClass in node.class_list: - result = self.visit(nodeClass) - if type (result) is error: - errors.append(result) + for _type in programContext.types: + if _type != 'Object': + result = self.visitForInherit(_type) + if type (result) is error: + errors.append(result) return errors - def visit_NodeClass(self, node: NodeClass): - return programContext.relateInheritance(node) + def visitForInherit(self, _type: str): + return programContext.relateInheritance(_type, + programContext.types[_type].parent) class TypeBuilderVisitor(NodeVisitor): def __init__(self): @@ -64,7 +67,7 @@ def visit_NodeClass(self, node: NodeClass): return errors def visit_NodeAttr(self, node:NodeAttr): - resultOp = programContext.defineAttrInType(self.currentTypeName, + resultOp= programContext.defineAttrInType(self.currentTypeName, node) if type (resultOp) is error: @@ -103,36 +106,37 @@ def visit_NodeClass(self, node: NodeClass, environment): result= self.visit(nodeAttr, environment= environment) if type(result) is error: errors.append(result) - environment.update({ - nodeAttr.idName: result - }) + for nodeClassMethod in node.methods: result= self.visit(nodeClassMethod, environment= environment) if type(result) is error: errors.append(result) - programContext.checkInheritedInfo(node.idName) return errors def visit_NodeClassMethod(self, node: NodeClassMethod, environment): - pass + for i in range(len(node.argNames)): + environment.update( { + node.argNames[i]: node.argTypes[i] + }) + typeResult = self.visit(node.body, environment= environment) + + for i in range(len(node.argNames)): + environment.popitem() + + if type(typeResult) is error: + return typeResult + def visit_NodeAttr(self, node: NodeAttr, environment): - exprResult= self.visit(node.expr, + return self.visit(node.expr, environment= environment) - if type(exprResult) is error: - return exprResult - assignResult= programContext.assignValue(node, exprResult) - if type(assignResult) is error: - return assignResult - return exprResult + - # Esto es un let complex, calcula todos los inner lets y a partir de ellos - # obtiene el valor de la expresión de la derecha del IN def visit_NodeLetComplex(self, node: NodeLetComplex, environment): @@ -146,67 +150,62 @@ def visit_NodeLetComplex(self, nodeLet.idName: result }) - return self.visit( node.body, + result= self.visit( node.body, environment= environment) + for i in range(len(node.nestedLets)): + environment.popitem() + return result def visit_NodeLet(self, node: NodeLet, environment): errors= [] - exprResult= self.visit(node.body, + return self.visit(node.body, environment= environment) - if type(exprResult) is error: - return exprResult - assingResult = programContext.assignValue(node, - exprResult) - if type(assingResult) is error: - return assingResult - return exprResult + def visit_NodeAssignment(self, node: NodeAssignment, + environment): + result = self.visit(node.expr, environment= environment) + + if type(result) is error: + return result + return programContext.checkAssign(node, result, environment) def visit_NodeBinaryOperation(self, node: NodeBinaryOperation, environment): - exprResultFirst= self.visit(node.first, + + typeFirstExpr= self.visit(node.first, environment= environment) - exprResultSecond= self.visit(node.second, + typeSecondExpr= self.visit(node.second, environment= environment) - if type (exprResultFirst) is error: - return exprResultFirst + if type (typeFirstExpr) is error: + return typeFirstExpr - if type (exprResultSecond) is error: - return exprResultSecond + if type (typeSecondExpr) is error: + return typeSecondExpr - func= None - if type(node) is NodeAddition: - func= lambda : {'value': exprResultFirst['value'] + exprResultSecond['value'], 'type': 'Int'} + return programContext.checkArithmetic(typeFirstExpr, + typeSecondExpr) - if type(node) is NodeSubtraction: - func= lambda : {'value': exprResultFirst['value'] - exprResultSecond['value'], 'type': 'Int'} - - if type(node) is NodeMultiplication: - func= lambda : {'value': exprResultFirst['value'] * exprResultSecond['value'], 'type': 'Int'} - - if type(node) is NodeDivision: - func= lambda : {'value': exprResultFirst['value'] / exprResultSecond['value'], 'type': 'Int'} - - result= programContext.executeArithmetic(func, exprResultFirst['type'], - exprResultSecond['type']) - return result - def visit_NodeNewObject(self, node: NodeNewObject): - return programContext.getType(node.type) + def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): + result = programContext.getType(node.type) + if type(result) is error: + return result + return node.type def visit_NodeExpr(self, node: NodeExpr, environment): return self.visit(node, environment= environment) + def visit_NodeInteger(self, node: NodeInteger, **args): - return {"type": 'Int', "value": node.content} + return 'Int' def visit_NodeObject(self, node: NodeObject, @@ -215,8 +214,21 @@ def visit_NodeObject(self, return programContext.searchValue(node, environment) - def visit_NodeDynamicDispatch(self, node: NodeDynamicDispatch): - exprVal= self.visit_NodeExpr(node.instance) - return programContext.checkDynamicDispatch(exprVal, - node.method, node.arguments) - \ No newline at end of file + def visit_NodeDynamicDispatch(self, + node: NodeDynamicDispatch, + environment): + + typeExpr= self.visit_NodeExpr(node.idName, + environment= environment) + if type (typeExpr) is error: + return typeExpr + argTypes = [] + for arg in node.arguments: + currenttypeExpr= self.visit(arg, + environment= environment) + if type (currenttypeExpr) is error: + return currenttypeExpr + argTypes.append(currenttypeExpr) + + return programContext.checkDynamicDispatch(typeExpr, + node.method, argTypes) From 4c9b7bb4a2210bf088bb9071bc1d0c6d5f432a6a Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 16 Dec 2020 12:02:50 -0500 Subject: [PATCH 47/96] Changed idName in Dispatch's to expr --- src/compiler/components/syntax_analyzer.py | 6 +++--- src/compiler/utils/AST_definitions.py | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 9ab03b70..4110c41e 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -303,7 +303,7 @@ def p_expression_dispatch(self, p): """ expression : expression DOT ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeDynamicDispatch(idName=p[1], + p[0] = NodeDynamicDispatch(expr=p[1], method=p[3], arguments=p[5]) def p_arguments_list_opt(self, p): @@ -324,14 +324,14 @@ def p_expression_static_dispatch(self, p): """ expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeStaticDispatch(idName=p[1], + p[0] = NodeStaticDispatch(expr=p[1], dispatch_type=p[3], method=p[5], arguments=p[7]) def p_expression_self_dispatch(self, p): """ expression : ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeDynamicDispatch(idName=NodeSelf(), + p[0] = NodeDynamicDispatch(expr=NodeSelf(), method=p[1], arguments=p[3]) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index b2efb725..1246ccba 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -263,29 +263,29 @@ def to_readable(self): class NodeDynamicDispatch(NodeExpr): - def __init__(self, idName, method, arguments): + def __init__(self, expr, method, arguments): super().__init__() - self.idName = idName + self.expr = expr self.method = method self.arguments = arguments if arguments is not None else tuple() def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("idName", self.idName), + ("expr", self.expr), ("method", self.method), ("arguments", self.arguments) ]) def to_readable(self): - return "{}(idName={}, method={}, arguments={})".format( - self.clsname, self.idName, self.method, self.arguments) + return "{}(expr={}, method={}, arguments={})".format( + self.clsname, self.expr, self.method, self.arguments) class NodeStaticDispatch(NodeExpr): - def __init__(self, idName, dispatch_type, method, arguments): + def __init__(self, expr, dispatch_type, method, arguments): super().__init__() - self.idName = idName + self.expr = expr self.dispatch_type = dispatch_type self.method = method self.arguments = arguments if arguments is not None else tuple() @@ -293,15 +293,15 @@ def __init__(self, idName, dispatch_type, method, arguments): def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("idName", self.idName), + ("expr", self.expr), ("dispatch_type", self.dispatch_type), ("method", self.method), ("arguments", self.arguments) ]) def to_readable(self): - return "{}(idName={}, dispatch_type={}, method={}, arguments={})".format( - self.clsname, self.idName, self.dispatch_type, + return "{}(expr={}, dispatch_type={}, method={}, arguments={})".format( + self.clsname, self.expr, self.dispatch_type, self.method, self.arguments) From ef50e65a6c366e2365b35f02b45254f47f07dc6e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 16 Dec 2020 12:04:14 -0500 Subject: [PATCH 48/96] Some primary features declarations. Needs the column and row --- src/compiler/utils/context.py | 41 +++++++++++----------- src/compiler/utils/errors.py | 24 ++++++------- src/compiler/utils/visitors_definitions.py | 19 ++++++---- 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 7fe12bfc..4d7327d9 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -64,7 +64,7 @@ def __init__(self, dictionaries ={}): argTypes= [], argNames= []), 'copy': Method(idName= 'copy', - returnType= 'SELF_TYPE', + returnType= 'Object', argNames= [], argTypes= []) }, @@ -82,12 +82,12 @@ def __init__(self, dictionaries ={}): 'IO': Type( idName= 'IO', methods= { "out_string": Method( idName= "out_string", - returnType="SELF_TYPE", - argTypes= ['x'], - argNames= ['String'] + returnType="IO", + argNames= ['x'], + argTypes= ['String'] ), "out_int": Method( idName= "out_int", - returnType="SELF_TYPE", + returnType="IO", argNames= ['x'], argTypes= ['Int']), 'in_string': Method( idName= 'in_string', @@ -293,17 +293,7 @@ def defineMethod(self, typeName: str, argTypes= node.argTypes) }) - def checkEqualTypes(self, _type, returnType): - - pass - - def checkInheritedInfo(self, idName: str): - - pass - - def isUndefined(self, arg): - - pass + def createContextForLetExpr(self, node: NodeLet, chainOfNames): return not self.letsExpr.update({ @@ -356,6 +346,7 @@ def buildEnv (self, typeName): d.update({ typeInfo.inheritsAttr[attr].idName: {'type': typeInfo.inheritsAttr[attr]._type} for attr in typeInfo.inheritsAttr } ) + d.update({'wrapperType': typeName}) return d def checkAssign(self, node, _type, environment): @@ -365,14 +356,22 @@ def checkAssign(self, node, _type, environment): errorType='undefined symbol', symbol= node.idName ) or interceptError( - validationFunc= lambda : nodeType == _type + validationFunc= lambda : environment[node.idName]['type'] == _type or self.isAncestor(idChild=_type, - idParent= nodeType), + idParent= environment[node.idName]['type']), errorType='uncompatible types', - type1= node.type, - type2= exprResult['type'] - ) or nodeType + type1= environment[node.idName]['type'], + type2= _type + ) or environment[node.idName]['type'] + def checkReturnType(self, node: NodeClassMethod, typeExpr): + return interceptError( + validationFunc= lambda : node.returnType == typeExpr + or self.isAncestor(idChild= typeExpr, idParent= node.returnType), + errorType= 'uncompatible types', + type1= node.returnType, + type2= typeExpr + ) or typeExpr def searchValue(self, node: NodeObject, environment): return interceptError( diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index dfd09471..046140d6 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -11,62 +11,62 @@ def __str__(self): errorSelector = {'repeated class': lambda idName, row_and_col=(0,0):error( - error_type= 'Semantic error', + error_type= 'TypeError', row_and_col= row_and_col, message= 'Class %s already exist' %idName ), 'undefined type': lambda idName, row_and_col=(0,0):error( - error_type='Semantic error', + error_type='TypeError', row_and_col= row_and_col, message= "The type %s doesn't exist in the current context" %idName, ), 'repeated attr': lambda idName, row_and_col=(0,0):error( - error_type='Semantic error', + error_type='TypeError', row_and_col=row_and_col, message="The attribute %s is already defined in the current context" %idName ), 'repeated method': lambda idName, row_and_col=(0,0):error( - error_type='Semantic error', + error_type='TypeError', row_and_col=row_and_col, message="The method %s is already defined in the current context" %idName ), 'built-in inheritance': lambda idName, row_and_col=(0,0): error ( - error_type='Semantic error', + error_type='TypeError', row_and_col=row_and_col, message="The class %s is sealed. You can't inherit from it" %idName ), 'inheritance from child': lambda idChild, idParent, row_and_col=(0,0): error ( - error_type='Semantic error', + error_type='TypeError', row_and_col=row_and_col, message="The class %s is an ancestor of %s class" %(idParent, idChild) ), 'Inherit from itself': lambda idName, row_and_col=(0,0): error ( - error_type='Semantic error', + error_type='TypeError', row_and_col=row_and_col, message="The class %s can't inherit from itself" %(idName) ), 'undefined method in class': lambda idName, className, row_and_col=(0,0): error ( - error_type= 'Semantic error', + error_type= 'TypeError', row_and_col= row_and_col, message="The class %s has no method called %s" %(idName, className) ), 'undefined arguments for method in class': lambda idName, className, undefinedArgs, row_and_col=(0,0): error ( - error_type= 'Semantic error', + error_type= 'TypeError', row_and_col= row_and_col, message="The arguments %s does not exists in method %s in class %s " %(undefinedArgs, idName, className) ), 'uncompatible types': lambda type1, type2, row_and_col=(0,0): error ( - error_type= 'Semantic error', + error_type= 'TypeError', row_and_col= row_and_col, message="Uncompatible types %s and %s in %s " %(type1, type2, row_and_col) ), 'undefined symbol': lambda symbolName, row_and_col=(0,0): error ( - error_type= 'Semantic error', + error_type= 'TypeError', row_and_col= row_and_col, message="Undefined symbol %s at %s" %(symbolName, row_and_col) ), 'not ancestor in dispatch': lambda idName, returnType, row_and_col=(0,0): error ( - error_type= 'Semantic error', + error_type= 'TypeError', row_and_col= row_and_col, message= 'Type %s is not subtype of %s at %s' %(idName, returnType, row_and_col) ) diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 9891a480..f1f2b8e8 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -120,6 +120,7 @@ def visit_NodeClassMethod(self, node: NodeClassMethod, environment): environment.update( { node.argNames[i]: node.argTypes[i] }) + typeResult = self.visit(node.body, environment= environment) for i in range(len(node.argNames)): @@ -127,16 +128,16 @@ def visit_NodeClassMethod(self, node: NodeClassMethod, environment): if type(typeResult) is error: return typeResult - + + return programContext.checkReturnType(node, typeResult) + def visit_NodeString(self, node: NodeString, **kwargs): + return 'String' + def visit_NodeAttr(self, node: NodeAttr, environment): return self.visit(node.expr, environment= environment) - - - - def visit_NodeLetComplex(self, node: NodeLetComplex, environment): @@ -218,8 +219,8 @@ def visit_NodeDynamicDispatch(self, node: NodeDynamicDispatch, environment): - typeExpr= self.visit_NodeExpr(node.idName, - environment= environment) + typeExpr= self.visit(node.expr, + environment= environment) if type (typeExpr) is error: return typeExpr argTypes = [] @@ -232,3 +233,7 @@ def visit_NodeDynamicDispatch(self, return programContext.checkDynamicDispatch(typeExpr, node.method, argTypes) + + def visit_NodeSelf(self, node: NodeSelf, environment): + return environment['wrapperType'] + \ No newline at end of file From cb05fe9d5f2576b797164a239cdc5d5577e61a35 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 16 Dec 2020 19:48:58 -0500 Subject: [PATCH 49/96] Changed the way in what we store the linepos and the lexpos --- src/compiler/components/lexer_analyzer.py | 76 ++++++++++++++++------- 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index b102f13e..cab4db3d 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -67,34 +67,45 @@ @TOKEN(r"(t[R|r][U|u][e|E]|f[a|A][l|L][s|S][e|E])") def t_BOOLEAN(token): + global start_line + token.lexpos -= start_line token.value = token.value.lower() return token @TOKEN(r"\d+") def t_INTEGER(token): + global start_line + token.lexpos -= start_line token.value = int(token.value) return token @TOKEN(r"[A-Z][A-Za-z0-9_]*") def t_TYPE(token): + global start_line + token.lexpos -= start_line token.type = reserved.get(token.value.lower(), 'TYPE') return token @TOKEN(r"[a-z][A-Za-z0-9_]*") def t_ID(token): + global start_line + token.lexpos -= start_line token.type = reserved.get(token.value.lower(), "ID") return token # Utility definitions @TOKEN(r'\n+') def t_newline(t): - global readjust_col - readjust_col = t.lexpos + len(t.value) + global start_line + start_line = t.lexpos + len(t.value) -1 t.lexer.lineno += len(t.value) def t_error(token): - global readjust_col - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) + global start_line + token.lexpos -= start_line + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos), + message='ERROR "%s"' % (token.value[:1]))) token.lexer.skip(1) t_ignore = ' \t' @@ -110,25 +121,35 @@ def t_error(token): #The string states @TOKEN(r'\"') def t_start_string(token): + global start_line token.lexer.push_state("STRING") token.lexer.string_backslashed = False token.lexer.stringbuf = "" + @TOKEN(r'\n') def t_STRING_newline(token): - global readjust_col + global start_line token.lexer.lineno += 1 + new_start_line = token.lexpos + len(token.value) -1 if not token.lexer.string_backslashed: - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), - message= "Unterminated string constant")) + token.lexpos -= start_line + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, + token.lexpos ), + message= "Unterminated string constant")) token.lexer.pop_state() else: token.lexer.string_backslashed = False - readjust_col = token.lexpos + len(token.value) + start_line = new_start_line @TOKEN('\0') def t_STRING_null(token): - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) + global start_line + token.lexpos -= start_line + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos), + message='Null character in string')) token.lexer.skip(1) @TOKEN(r'\"') @@ -165,13 +186,19 @@ def t_STRING_anything(token): token.lexer.string_backslashed = True def t_STRING_error(token): + global start_line + token.lexpos -= start_line token.lexer.skip(1) - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos), message= 'ERROR at or near ')) def t_STRING_eof(token): - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) + global start_line + token.lexpos -= start_line + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos), + message='EOF in string constant')) token.lexer.pop_state() t_STRING_ignore = '' @@ -189,12 +216,14 @@ def t_COMMENT_startanother(token): @TOKEN(r"\n+") def t_COMMENT_newline(token): - global readjust_col - readjust_col = token.lexpos + len(token.value) + global start_line + start_line = token.lexpos + len(token.value) - 1 token.lexer.lineno += len(token.value) @TOKEN(r"\*\)") def t_COMMENT_end(token): + global start_line + token.lexpos -= start_line if token.lexer.comment_count == 0: token.lexer.pop_state() else: @@ -202,11 +231,16 @@ def t_COMMENT_end(token): def t_COMMENT_error(token): + global start_line + token.lexpos -= start_line token.lexer.skip(1) def t_COMMENT_eof(token): - global readjust_col - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) + global start_line + token.lexpos -= start_line + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos), + message= "EOF in comment")) token.lexer.pop_state() t_COMMENT_ignore = '' @@ -215,14 +249,12 @@ def t_COMMENT_eof(token): lexer = lex.lex() def tokenizer(stream_input): - global readjust_col - readjust_col = 0 + global start_line + start_line = -1 lexer.input(stream_input) token_list = [] - real_col = {} - for tok in lexer: - real_col.update({ str(tok): tok.lexpos - readjust_col + 1 }) + for tok in lexer: token_list.append(tok) - return errors, token_list, real_col + return errors, token_list From 236ef6da2fcd2131b6ca2e12e874a8fc3c1201f6 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 17 Dec 2020 15:03:27 -0500 Subject: [PATCH 50/96] Added some thing for a better semantic analysis --- src/compiler/components/lexer_analyzer.py | 82 +++------ src/compiler/components/syntax_analyzer.py | 193 +++++++++++++++------ 2 files changed, 166 insertions(+), 109 deletions(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index cab4db3d..b4a52170 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -38,7 +38,7 @@ 'inherits':'INHERITS', 'isvoid':'ISVOID', "self": "SELF", - "not" : "NOT" + "not": "NOT" } tokens += list(reserved.values()) @@ -67,45 +67,34 @@ @TOKEN(r"(t[R|r][U|u][e|E]|f[a|A][l|L][s|S][e|E])") def t_BOOLEAN(token): - global start_line - token.lexpos -= start_line token.value = token.value.lower() return token @TOKEN(r"\d+") def t_INTEGER(token): - global start_line - token.lexpos -= start_line token.value = int(token.value) return token @TOKEN(r"[A-Z][A-Za-z0-9_]*") def t_TYPE(token): - global start_line - token.lexpos -= start_line token.type = reserved.get(token.value.lower(), 'TYPE') return token @TOKEN(r"[a-z][A-Za-z0-9_]*") def t_ID(token): - global start_line - token.lexpos -= start_line token.type = reserved.get(token.value.lower(), "ID") return token # Utility definitions @TOKEN(r'\n+') def t_newline(t): - global start_line - start_line = t.lexpos + len(t.value) -1 + global readjust_col + readjust_col = t.lexpos + len(t.value) t.lexer.lineno += len(t.value) def t_error(token): - global start_line - token.lexpos -= start_line - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos), - message='ERROR "%s"' % (token.value[:1]))) + global readjust_col + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) token.lexer.skip(1) t_ignore = ' \t' @@ -121,35 +110,25 @@ def t_error(token): #The string states @TOKEN(r'\"') def t_start_string(token): - global start_line token.lexer.push_state("STRING") token.lexer.string_backslashed = False token.lexer.stringbuf = "" - @TOKEN(r'\n') def t_STRING_newline(token): - global start_line + global readjust_col token.lexer.lineno += 1 - new_start_line = token.lexpos + len(token.value) -1 if not token.lexer.string_backslashed: - token.lexpos -= start_line - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, - token.lexpos ), - message= "Unterminated string constant")) + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + message= "Unterminated string constant")) token.lexer.pop_state() else: token.lexer.string_backslashed = False - start_line = new_start_line + readjust_col = token.lexpos + len(token.value) @TOKEN('\0') def t_STRING_null(token): - global start_line - token.lexpos -= start_line - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos), - message='Null character in string')) + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) token.lexer.skip(1) @TOKEN(r'\"') @@ -186,19 +165,13 @@ def t_STRING_anything(token): token.lexer.string_backslashed = True def t_STRING_error(token): - global start_line - token.lexpos -= start_line token.lexer.skip(1) - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos), + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= 'ERROR at or near ')) def t_STRING_eof(token): - global start_line - token.lexpos -= start_line - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos), - message='EOF in string constant')) + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) token.lexer.pop_state() t_STRING_ignore = '' @@ -216,14 +189,12 @@ def t_COMMENT_startanother(token): @TOKEN(r"\n+") def t_COMMENT_newline(token): - global start_line - start_line = token.lexpos + len(token.value) - 1 + global readjust_col + readjust_col = token.lexpos + len(token.value) token.lexer.lineno += len(token.value) @TOKEN(r"\*\)") def t_COMMENT_end(token): - global start_line - token.lexpos -= start_line if token.lexer.comment_count == 0: token.lexer.pop_state() else: @@ -231,30 +202,31 @@ def t_COMMENT_end(token): def t_COMMENT_error(token): - global start_line - token.lexpos -= start_line token.lexer.skip(1) def t_COMMENT_eof(token): - global start_line - token.lexpos -= start_line - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos), - message= "EOF in comment")) + global readjust_col + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) token.lexer.pop_state() t_COMMENT_ignore = '' errors = [] +def find_column(_input, token): + line_start = _input.rfind('\n', 0, token.lexpos) + 1 + return (token.lexpos - line_start) + 1 lexer = lex.lex() def tokenizer(stream_input): - global start_line - start_line = -1 + global readjust_col + readjust_col = 0 lexer.input(stream_input) token_list = [] - for tok in lexer: + real_col = {} + for tok in lexer: + real_col.update({ str(tok): find_column(stream_input, tok) }) token_list.append(tok) - return errors, token_list + + return errors, token_list, real_col diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 4110c41e..73644700 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -5,13 +5,12 @@ from ..components.lexer_analyzer import lexer class pyCoolParser: - def __init__(self, tokens, real_col): + def __init__(self, tokens, source_program, real_col): self.tokens = tokens self.errors_parser = [] + self.source_program= source_program + self.real_col= real_col self.parser = yacc.yacc(module=self) - self.row_tracker = 0 - self.column_corrector = 0 - self.real_col = real_col # precedence rules precedence = ( @@ -45,16 +44,20 @@ class : CLASS TYPE LBRACE features_list_opt RBRACE p[0] = NodeClass(idName = p[2], methods= p[4]['methods'], attributes= p[4]['attributes'], - parent = "Object") + parent = "Object", + line= p.slice[1].lineno, + column=(self.real_col[ str(p.slice[1]) ] ) ) def p_class_inherits(self, p): """ class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE """ p[0] = NodeClass(idName = p[2], - methods= p[6]['methods'], - attributes= p[6]['attributes'], - parent = p[4]) + methods= p[6]['methods'], + attributes= p[6]['attributes'], + parent = p[4], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_feature_list_opt(self, p): """ @@ -85,25 +88,39 @@ def p_feature_method(self, p): argNames = [ x.idName for x in p[3] ], argTypes = [ x.paramType for x in p[3] ], returnType=p[6], - body=p[8]) + body=p[8], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_feature_method_no_formals(self, p): """ feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE """ - p[0] = NodeClassMethod(idName=p[1], argNames = [], argTypes = [], returnType=p[5], body=p[7]) + p[0] = NodeClassMethod(idName=p[1], + argNames = [], + argTypes = [], + returnType=p[5], + body=p[7], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_feature_attr_initialized(self, p): """ feature : ID COLON TYPE ASSIGN expression """ - p[0] = NodeAttr(idName= p[1], _type= p[3], expr= p[5]) + p[0] = NodeAttr(idName= p[1], + _type= p[3], + expr= p[5], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_feature_attr(self, p): """ feature : ID COLON TYPE """ - p[0] = NodeAttr(idName= p[1], _type= p[3], expr= None) + p[0] = NodeAttr(idName= p[1], _type= p[3], expr= None , + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_formal_list_many(self, p): """ @@ -116,43 +133,56 @@ def p_formal(self, p): """ formal_param : ID COLON TYPE """ - p[0] = NodeFormalParam(idName=p[1], param_type=p[3]) + p[0] = NodeFormalParam(idName=p[1], param_type=p[3] , + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_object_identifier(self, p): """ expression : ID """ - p[0]= NodeObject(idName= p[1]) + p[0]= NodeObject(idName= p[1] , + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_integer_constant(self, p): """ expression : INTEGER """ - p[0]= NodeInteger(content= p[1]) + p[0]= NodeInteger(content= p[1], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_boolean_constant(self, p): """ expression : BOOLEAN """ - p[0]= NodeBoolean(content= p[1]) + p[0]= NodeBoolean(content= p[1], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_string_constant(self, p): """ expression : STRING """ - p[0]= NodeString(content= p[1]) + p[0]= NodeString(content= p[1], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expr_self(self, p): """ expression : SELF """ - p[0]= NodeSelf() + p[0]= NodeSelf(line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_block(self, p): """ expression : LBRACE block_list RBRACE """ - p[0]= NodeBlock(expr_list= p[2]) + p[0]= NodeBlock(expr_list= p[2], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_block_list(self, p): """ @@ -165,7 +195,12 @@ def p_expression_assignment(self, p): """ expression : ID ASSIGN expression """ - p[0] = NodeAssignment(idName= NodeObject(idName= p[1]), expr= p[3]) + p[0] = NodeAssignment(idName= NodeObject(idName= p[1], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]), + expr= p[3], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) # ######################### UNARY OPERATIONS ####################################### @@ -173,27 +208,35 @@ def p_expression_new(self, p): """ expression : NEW TYPE """ - p[0] = NodeNewObject(new_type= p[2]) + p[0] = NodeNewObject(new_type= p[2], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_isvoid(self, p): """ expression : ISVOID expression """ - p[0] = NodeIsVoid(expr= p[2]) + p[0] = NodeIsVoid(expr= p[2], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_integer_complement(self, p): """ expression : INT_COMP expression """ - p[0] = NodeIntegerComplement(p[2]) + p[0] = NodeIntegerComplement(p[2], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_boolean_complement(self, p): """ expression : NOT expression """ - p[0] = NodeBooleanComplement(p[2]) + p[0] = NodeBooleanComplement(p[2], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) # ######################### PARENTHESIZED, MATH & COMPARISONS ##################### @@ -205,13 +248,21 @@ def p_expression_math_operations(self, p): | expression DIVIDE expression """ if p[2] == '+': - p[0] = NodeAddition(first=p[1], second=p[3]) + p[0] = NodeAddition(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) elif p[2] == '-': - p[0] = NodeSubtraction(first=p[1], second=p[3]) + p[0] = NodeSubtraction(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) elif p[2] == '*': - p[0] = NodeMultiplication(first=p[1], second=p[3]) + p[0] = NodeMultiplication(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) elif p[2] == '/': - p[0] = NodeDivision(first=p[1], second=p[3]) + p[0] = NodeDivision(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) def p_expression_math_comparisons(self, p): """ @@ -220,11 +271,17 @@ def p_expression_math_comparisons(self, p): | expression EQ expression """ if p[2] == '<': - p[0] = NodeLessThan(first=p[1], second=p[3]) + p[0] = NodeLessThan(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) elif p[2] == '<=': - p[0] = NodeLessThanOrEqual(first=p[1], second=p[3]) + p[0] = NodeLessThanOrEqual(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) elif p[2] == '=': - p[0] = NodeEqual(first=p[1], second=p[3]) + p[0] = NodeEqual(first=p[1], second=p[3], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) def p_expression_with_parenthesis(self, p): """ @@ -238,13 +295,17 @@ def p_expression_if_conditional(self, p): """ expression : IF expression THEN expression ELSE expression FI """ - p[0]= NodeIf(predicate=p[2], then_body=p[4], else_body=p[6]) + p[0]= NodeIf(predicate=p[2], then_body=p[4], else_body=p[6], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_expression_while_loop(self, p): """ expression : WHILE expression LOOP expression POOL """ - p[0] = NodeWhileLoop(predicate=p[2], body=p[4]) + p[0] = NodeWhileLoop(predicate=p[2], body=p[4], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) ## ######################### LET EXPRESSIONS ######################################## def p_expression_let(self, p): @@ -257,32 +318,53 @@ def p_expression_let_simple(self, p): """ let_expression : LET nested_lets IN expression """ - p[0]= NodeLetComplex(nested_lets= p[2], body= p[4]) + p[0]= NodeLetComplex(nested_lets= p[2], body= p[4], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_nested_lets_simple(self, p): """ nested_lets : ID COLON TYPE | nested_lets COMMA ID COLON TYPE """ - p[0]= NodeLet(idName= p[1], returnType= p[3], - body = None) + if p[1] == "ID": + p[0]= NodeLet(idName= p[1], returnType= p[3], body = None, + line= p.slice[1].lineno, + column= self.real_col[ str(p.slice[1]) ]) + else: + p[0]= NodeLet(idName= p[3], + returnType= p[-1], + body= None, + line= p.slice[2].lineno, + column= self.real_col[str(p.slice[2])]) def p_nested_lets_initialize(self, p): """ nested_lets : ID COLON TYPE ASSIGN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression """ - p[0]= NodeLet(idName= p[1], - returnType= p[3], - body= p[5]) - + if p[1] == "ID": + p[0] = NodeLet(idName= p[1], + returnType= p[3], + body = p[5], + line = p.slice[1].lineno, + column= self.real_col[ str(p.slice[1]) ]) + else: + p[0]= NodeLet(idName= p[3], + returnType= p[5], + body= p[7], + line= p.slice[2].lineno, + column= self.real_col[ str(p.slice[2]) ]) + # ######################### CASE EXPRESSION ######################################## def p_expression_case(self, p): """ expression : CASE expression OF actions_list ESAC """ - p[0]= NodeCase(expr=p[2], actions=p[4]) + p[0]= NodeCase(expr=p[2], actions=p[4], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) def p_actions_list(self, p): """ @@ -304,7 +386,9 @@ def p_expression_dispatch(self, p): expression : expression DOT ID LPAREN arguments_list_opt RPAREN """ p[0] = NodeDynamicDispatch(expr=p[1], - method=p[3], arguments=p[5]) + method=p[3], arguments=p[5], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) def p_arguments_list_opt(self, p): """ @@ -325,14 +409,19 @@ def p_expression_static_dispatch(self, p): expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN """ p[0] = NodeStaticDispatch(expr=p[1], - dispatch_type=p[3], method=p[5], arguments=p[7]) + dispatch_type=p[3], method=p[5], arguments=p[7], + line= p.slice[2].lineno, + column=self.real_col[ str(p.slice[2]) ]) def p_expression_self_dispatch(self, p): """ expression : ID LPAREN arguments_list_opt RPAREN """ - p[0] = NodeDynamicDispatch(expr=NodeSelf(), - method=p[1], arguments=p[3]) + p[0] = NodeDynamicDispatch(expr=NodeSelf(line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]), + method=p[1], arguments=p[3], + line= p.slice[1].lineno, + column=self.real_col[ str(p.slice[1]) ]) # ######################### ################## ################################### @@ -343,32 +432,28 @@ def p_empty(self, p): """ p[0]= None - def findColumn(self, trackedRow): - for i in range(len(self.parser.symstack) -1, 1, -1): - if self.parser.symstack[i].lineno != trackedRow: - return self.parser.symstack[i].lexpos - return 0 def p_error(self, p): """ Error rule for Syntax Errors handling and reporting. """ if p: + self.errors_parser.append( error(message= "Error at or near %s" %p.value, error_type="SyntacticError", - row_and_col= (p.lineno, self.real_col[str(p)] ))) + row_and_col= (p.lineno, self.real_col[ str(p) ] ))) else: self.errors_parser.append( error(message= "EOF in string", error_type="SyntacticError", row_and_col= (0, 0 ))) - + + def run_parser(tokens, source_program, real_col): #print("The source_program ", source_program) - parserCool = pyCoolParser(tokens, real_col) + parserCool = pyCoolParser(tokens, source_program, real_col) lexer.lineno = 1 ast_result = parserCool.parser.parse(source_program, lexer=lexer) - #print("The ast_result ", ast_result) return ast_result, parserCool.errors_parser From 69ec0955dcd6525f077638a61dec200f5de57107 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 17 Dec 2020 15:07:33 -0500 Subject: [PATCH 51/96] Environment bug, when popped --- src/compiler/components/semantic_analyzer.py | 4 +- src/compiler/utils/AST_definitions.py | 148 ++++++++++--------- src/compiler/utils/context.py | 92 +++++++----- src/compiler/utils/visitors_definitions.py | 53 +++++-- 4 files changed, 180 insertions(+), 117 deletions(-) diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic_analyzer.py index ba090afc..83982e8d 100644 --- a/src/compiler/components/semantic_analyzer.py +++ b/src/compiler/components/semantic_analyzer.py @@ -9,8 +9,8 @@ def __init__(self, ast: NodeProgram): self.errors = [] def run_visits(self: NodeProgram): - typeCollectorResult= TypeCollectorVisitor().visit(self.ast) - typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast) + typeCollectorResult, line_and_col_dict= TypeCollectorVisitor().visit(self.ast) + typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast, line_and_col_dict= line_and_col_dict) typeBuilderResult= TypeBuilderVisitor().visit(self.ast) typeCheckerResult= TypeCheckerVisitor().visit(self.ast) self.errors+= typeCollectorResult + typeBuilderResult + typeInheritanceResult + typeCheckerResult diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 1246ccba..1b2d6f17 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -1,5 +1,9 @@ from json import dumps class Node: + def __init__(self, line = 0, column = 0): + self.line = line + self.column = column + @property def clsname(self): return str(self.__class__.__name__) @@ -37,6 +41,7 @@ def toJSON(self): class NodeProgram(Node): def __init__(self, class_list): + super().__init__() self.class_list = class_list def to_tuple(self): @@ -53,7 +58,9 @@ def __init__(self, classes): self.classes = classes class NodeClass(Node): - def __init__(self, idName: str, methods, attributes, parent): + def __init__(self, idName: str, methods, attributes, parent, + line, column): + super().__init__(line= line, column= column) self.idName = idName self.methods = methods self.attributes = attributes @@ -67,8 +74,8 @@ def to_readable(self): self.methods, self.attributes) class NodeFeature(Node): - def __init__(self): - super(NodeFeature, self).__init__() + def __init__(self, line, column): + super(NodeFeature, self).__init__(line= line, column= column) #No se si poner aqui una clase para heredar , que sea feature_class. #Tengo que ver si a futuro necesito iterar por los elementos de una clase @@ -79,8 +86,10 @@ def __init__(self, argNames, argTypes, returnType: str, - body): - super().__init__() + body, + line, + column): + super().__init__(line= line, column= column) self.idName = idName self.argNames = argNames self.returnType = returnType @@ -94,15 +103,16 @@ def to_readable(self): ) class NodeAttr(NodeFeature): - def __init__(self, idName, _type, expr= None): - super().__init__() + def __init__(self, idName, _type, + line, column, expr= None): + super().__init__(line= line, column= column) self.idName = idName self._type = _type self.expr = expr class NodeFormalParam(NodeFeature): - def __init__(self, idName, param_type): - super().__init__() + def __init__(self, idName, param_type, line, column): + super().__init__(line= line, column= column) self.idName = idName self.paramType = param_type @@ -118,8 +128,8 @@ def to_readable(self): self.idName, self.paramType) class NodeObject(Node): - def __init__(self, idName): - super().__init__() + def __init__(self, idName, line, column): + super().__init__(line= line, column= column) self.idName = idName def to_tuple(self): @@ -132,8 +142,8 @@ def to_readable(self): return "{}(name='{}')".format(self.clsname, self.idName) class NodeSelf(NodeObject): - def __init__(self): - super().__init__("SELF") + def __init__(self, line, column): + super().__init__(idName= "SELF", line= line, column= column) def to_tuple(self): return tuple([ @@ -145,13 +155,13 @@ def to_readable(self): class NodeConstant(Node): - def __init__(self): - super().__init__() + def __init__(self, line, column): + super().__init__(line= line, column= column) class NodeInteger(NodeConstant): - def __init__(self, content): - super().__init__() + def __init__(self, content, line, column): + super().__init__(line= line, column= column) self.content = content def to_tuple(self): @@ -165,8 +175,8 @@ def to_readable(self): class NodeBoolean(NodeConstant): - def __init__(self, content): - super().__init__() + def __init__(self, content, line, column): + super().__init__(line= line, column= column) self.content = content def to_tuple(self): @@ -179,8 +189,8 @@ def to_readable(self): return "{}(content={})".format(self.clsname, self.content) class NodeString(NodeConstant): - def __init__(self, content): - super().__init__() + def __init__(self, content, line, column): + super().__init__(line= line, column= column) self.content = content def to_tuple(self): @@ -195,13 +205,13 @@ def to_readable(self): # Cada expresión debe tener una función de evaluación asociada. # Con un valor de retorno x. class NodeExpr(Node): - def __init__(self): - super().__init__() + def __init__(self, line, column): + super().__init__(line= line, column= column) class NodeNewObject(NodeExpr): - def __init__(self, new_type): - super().__init__() + def __init__(self, new_type, line, column): + super().__init__(line= line, column= column) self.type = new_type def to_tuple(self): @@ -215,8 +225,8 @@ def to_readable(self): class NodeIsVoid(NodeExpr): - def __init__(self, expr): - super().__init__() + def __init__(self, expr, line, column): + super().__init__(line= line, column= column) def to_tuple(self): @@ -230,8 +240,8 @@ def to_readable(self): class NodeAssignment(NodeExpr): - def __init__(self, idName, expr): - super().__init__() + def __init__(self, idName, expr, line, column): + super().__init__(line= line, column= column) self.idName = idName self.expr = expr @@ -248,8 +258,8 @@ def to_readable(self): class NodeBlock(NodeExpr): - def __init__(self, expr_list): - super().__init__() + def __init__(self, expr_list, line, column): + super().__init__(line = line, column = column) self.expr_list = expr_list def to_tuple(self): @@ -263,8 +273,8 @@ def to_readable(self): class NodeDynamicDispatch(NodeExpr): - def __init__(self, expr, method, arguments): - super().__init__() + def __init__(self, expr, method, arguments, line, column): + super().__init__(line= line, column= column) self.expr = expr self.method = method self.arguments = arguments if arguments is not None else tuple() @@ -283,8 +293,10 @@ def to_readable(self): class NodeStaticDispatch(NodeExpr): - def __init__(self, expr, dispatch_type, method, arguments): - super().__init__() + def __init__(self, + expr, + dispatch_type, method, arguments, line, column): + super().__init__(line= line, column= column) self.expr = expr self.dispatch_type = dispatch_type self.method = method @@ -306,8 +318,8 @@ def to_readable(self): class NodeLetComplex(NodeExpr): - def __init__(self, nested_lets, body): - super().__init__() + def __init__(self, nested_lets, body, line, column): + super().__init__(line= line, column= column) self.nestedLets= nested_lets if type(nested_lets) is list else [nested_lets] self.body= body @@ -324,8 +336,8 @@ def to_readable(self): class NodeLet(NodeExpr): - def __init__(self, idName, returnType, body): - super().__init__() + def __init__(self, idName, returnType, body, line, column): + super().__init__(line= line, column= column) self.idName= idName self.type= returnType self.body= body @@ -346,8 +358,8 @@ def to_readable(self): class NodeIf(NodeExpr): - def __init__(self, predicate, then_body, else_body): - super().__init__() + def __init__(self, predicate, then_body, else_body, line, column): + super().__init__(line= line, column= column) self.predicate = predicate self.then_body = then_body self.else_body = else_body @@ -366,8 +378,8 @@ def to_readable(self): class NodeWhileLoop(NodeExpr): - def __init__(self, predicate, body): - super().__init__() + def __init__(self, predicate, body, line, column): + super().__init__(line= line, column= column) self.predicate = predicate self.body = body @@ -384,8 +396,8 @@ def to_readable(self): class NodeCase(NodeExpr): - def __init__(self, expr, actions): - super().__init__() + def __init__(self, expr, actions, line, column): + super().__init__(line= line, column= column) self.expr = expr self.actions = actions @@ -405,12 +417,12 @@ def to_readable(self): class NodeUnaryOperation(NodeExpr): - def __init__(self): - super().__init__() + def __init__(self, line, column): + super().__init__(line= line, column= column) class NodeIntegerComplement(NodeUnaryOperation): - def __init__(self, integer_expr): - super().__init__() + def __init__(self, integer_expr, line, column): + super().__init__(line= line, column= column) self.symbol = "~" self.integer_expr = integer_expr @@ -425,8 +437,8 @@ def to_readable(self): class NodeBooleanComplement(NodeUnaryOperation): - def __init__(self, boolean_expr): - super().__init__() + def __init__(self, boolean_expr, line, column): + super().__init__(line= line, column= column) self.symbol = "!" self.boolean_expr = boolean_expr @@ -442,13 +454,13 @@ def to_readable(self): # ############################## BINARY OPERATIONS ################################## class NodeBinaryOperation(NodeExpr): - def __init__(self): - super().__init__() + def __init__(self, line, column): + super().__init__(line= line, column= column) self.type= '' class NodeAddition(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "+" self.first = first self.second = second @@ -466,8 +478,8 @@ def to_readable(self): class NodeSubtraction(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "-" self.first = first self.second = second @@ -485,8 +497,8 @@ def to_readable(self): class NodeMultiplication(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "*" self.first = first self.second = second @@ -504,8 +516,8 @@ def to_readable(self): class NodeDivision(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "/" self.first = first self.second = second @@ -523,8 +535,8 @@ def to_readable(self): class NodeEqual(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "=" self.first = first self.second = second @@ -542,8 +554,8 @@ def to_readable(self): class NodeLessThan(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "<" self.first = first self.second = second @@ -561,8 +573,8 @@ def to_readable(self): class NodeLessThanOrEqual(NodeBinaryOperation): - def __init__(self, first, second): - super().__init__() + def __init__(self, first, second, line, column): + super().__init__(line= line, column= column) self.symbol = "<=" self.first = first self.second = second @@ -579,4 +591,4 @@ def to_readable(self): self.first, self.second) -#### A special class for instantiation + diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 4d7327d9..fd7baa66 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -145,11 +145,13 @@ def createType(self, node: NodeClass): return interceptError( validationFunc= lambda: not node.idName in self.types, errorType= 'repeated class', - idName= node.idName + idName= node.idName, + row_and_col = (node.line, node.column) ) or interceptError ( validationFunc= lambda: node.idName != node.parent, errorType= 'Inherit from itself', - idName= node.idName + idName= node.idName, + row_and_col = (node.line, node.column) )or self.types.update({ node.idName: Type (idName= node.idName, @@ -158,34 +160,39 @@ def createType(self, node: NodeClass): parent= node.parent if node else 'Object') }) - def relateInheritance(self, idName : str, parent: str): + def relateInheritance(self, idName : str, parent: str, row_and_col): return interceptError( validationFunc= lambda: idName in self.types, errorType= 'undefined type', - idName= idName + idName= idName, + row_and_col= row_and_col ) or interceptError ( validationFunc= lambda: self.types[idName].parent in self.types, errorType= 'undefined type', - idName = self.types[idName].parent + idName= self.types[idName].parent, + row_and_col= row_and_col ) or interceptError( validationFunc= lambda: not self.types[parent].builtIn, errorType= 'built-in inheritance', - idName= idName + idName= idName, + row_and_col= row_and_col ) or interceptError( validationFunc= lambda: not self.isAncestor ( idChild= idName, idParent= parent), errorType= 'inheritance from child', idParent= parent, - idChild= idName - ) or not self.actualizeInherits(idName, parent) + idChild= idName, + row_and_col= row_and_col + ) or not self.actualizeInherits(idName, parent, row_and_col) - def actualizeInherits (self, idName, parentName): + def actualizeInherits (self, idName, parentName, row_and_col): for attr in self.types[parentName].attributes: result= self.actualizeInheritAttr( idName= idName, childInfoAttr = self.types[idName].attributes.get(attr, None), - parentInfoAttr= self.types[parentName].attributes[attr]) + parentInfoAttr= self.types[parentName].attributes[attr], + row_and_col = row_and_col) if type(result) is error: return error @@ -193,7 +200,8 @@ def actualizeInherits (self, idName, parentName): result = self.actualizeInheritAttr( idName= idName, childInfoAttr= self.types[idName].attributes.get(attr, None), - parentInfoAttr= self.types[parentName].inheritsAttr[attr] + parentInfoAttr= self.types[parentName].inheritsAttr[attr], + row_and_col = row_and_col ) if type(result) is error: return error @@ -201,7 +209,8 @@ def actualizeInherits (self, idName, parentName): result = self.actualizeInheritMethod( idName= idName, childInfoMethod= self.types[idName].methods.get(method, None), - parentInfoMethod= self.types[parentName].methods[method] + parentInfoMethod= self.types[parentName].methods[method], + row_and_col = row_and_col ) if type(result) is error: return result @@ -211,7 +220,8 @@ def actualizeInherits (self, idName, parentName): result = self.actualizeInheritMethod( idName= idName, childInfoMethod= self.types[idName].methods.get(method, None), - parentInfoMethod= self.types[parentName].inheritsMethods[method] + parentInfoMethod= self.types[parentName].inheritsMethods[method], + row_and_col = row_and_col ) if type(result) is error: return result @@ -221,7 +231,8 @@ def actualizeInherits (self, idName, parentName): def actualizeInheritMethod(self, idName, childInfoMethod: Method, - parentInfoMethod: Method): + parentInfoMethod: Method, + row_and_col): return interceptError( validationFunc= lambda: not childInfoMethod or childInfoMethod.returnType == parentInfoMethod.returnType and @@ -229,7 +240,8 @@ def actualizeInheritMethod(self, childInfoMethod.argTypes == parentInfoMethod.argTypes, errorType= 'bad redefine method', nameClass= idName, - methodName = childInfoMethod.idName if childInfoMethod else None + methodName = childInfoMethod.idName if childInfoMethod else None, + row_and_col= row_and_col )or self.types[idName].inheritsMethods.update({ parentInfoMethod.idName: parentInfoMethod }) @@ -237,18 +249,19 @@ def actualizeInheritMethod(self, def actualizeInheritAttr(self, idName, childInfoAttr: Attribute, - parentInfoAttr: Attribute): + parentInfoAttr: Attribute, + row_and_col): return interceptError( validationFunc= lambda: not (childInfoAttr and childInfoAttr._type != parentInfoAttr._type), errorType= "bad redefine attr", nameClass= idName, attrName= childInfoAttr.idName if childInfoAttr else None, - attrType= childInfoAttr._type if childInfoAttr else None + attrType= childInfoAttr._type if childInfoAttr else None, + row_and_col= row_and_col ) or childInfoAttr or self.types[idName].inheritsAttr.update({ parentInfoAttr.idName: parentInfoAttr }) - def isAncestor(self, idChild: str, idParent: str): @@ -260,11 +273,12 @@ def isAncestor(self, idChild: str, idParent: str): break return currentName == idChild - def getType(self, idName: str): + def getType(self, idName: str, row_and_col): return interceptError( validationFunc= lambda: idName in self.types, errorType= 'undefined type', - idName= idName + idName= idName, + row_and_col= row_and_col ) or self.types.get(idName) def defineAttrInType(self, typeName: str, attr: NodeAttr): @@ -273,7 +287,8 @@ def defineAttrInType(self, typeName: str, attr: NodeAttr): validationFunc= lambda : not attr.idName in self.types[typeName].attributes, errorType= 'repeated attr', - idName= attr.idName + idName= attr.idName, + row_and_col= (attr.line, attr.column) ) or self.types[typeName].attributes.update({ attr.idName: Attribute(idName= attr.idName, _type= attr._type ) @@ -285,7 +300,8 @@ def defineMethod(self, typeName: str, validationFunc= lambda: not node.idName in self.types[typeName].methods, errorType= 'repeated method', - idName= node.idName + idName= node.idName, + row_and_col= (node.line, node.column) ) or self.types[typeName].methods.update({ node.idName: Method(idName= node.idName, returnType= node.returnType, @@ -306,8 +322,7 @@ def createContextForLetExpr(self, node: NodeLet, chainOfNames): def checkDynamicDispatch(self, - typeName, method, arguments): - + typeName, method, arguments, row_and_col): methodInfo = self.types[typeName].methods.get(method, None) if not methodInfo: @@ -317,17 +332,18 @@ def checkDynamicDispatch(self, and not self.isAncestor(arguments[i], methodInfo.argTypes[i])] - return interceptError( validationFunc= lambda : not methodInfo is None, errorType= 'undefined method in class', idName= method, - className= typeName + className= typeName, + row_and_col= row_and_col ) or interceptError ( validationFunc= lambda : notAncestorArgs == [], errorType= 'argument types in dispatch are not subtypes', idName= method, - badArgs= notAncestorArgs + badArgs= notAncestorArgs, + row_and_col= row_and_col ) or methodInfo.returnType @@ -354,14 +370,16 @@ def checkAssign(self, node, _type, environment): return interceptError( validationFunc= lambda : node.idName in environment, errorType='undefined symbol', - symbol= node.idName + symbol= node.idName, + row_and_col= (node.line, node.column) ) or interceptError( validationFunc= lambda : environment[node.idName]['type'] == _type or self.isAncestor(idChild=_type, idParent= environment[node.idName]['type']), errorType='uncompatible types', type1= environment[node.idName]['type'], - type2= _type + type2= _type, + row_and_col= (node.line, node.column) ) or environment[node.idName]['type'] def checkReturnType(self, node: NodeClassMethod, typeExpr): @@ -370,7 +388,8 @@ def checkReturnType(self, node: NodeClassMethod, typeExpr): or self.isAncestor(idChild= typeExpr, idParent= node.returnType), errorType= 'uncompatible types', type1= node.returnType, - type2= typeExpr + type2= typeExpr, + row_and_col= (node.line, node.column) ) or typeExpr def searchValue(self, node: NodeObject, environment): @@ -380,12 +399,19 @@ def searchValue(self, node: NodeObject, environment): errorType='undefined symbol', symbolName= node.idName) or environment[node.idName] - def checkArithmetic(self, type1, type2): + def checkArithmetic(self, type1, type2, row_and_col): return interceptError(validationFunc= lambda: type1 == type2, - errorType= 'uncompatible types', + errorType= 'arithmetic fail', type1= type1, - type2= type2) or type1 + type2= type2, + row_and_col= row_and_col) or type1 + def checkEqualOp(self, type1, type2, row_and_col): + return interceptError(validationFunc= lambda: not (type1 or type2) + in {'Int', 'Bool', 'String'} or type1 == type2, + errorType= 'comparison fail', + row_and_col = row_and_col) or self.types['Bool'].idName + def LCA(self, idName1, idName2): path1 = self.pathToObject( idName1) path2 = self.pathToObject( idName2) diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index f1f2b8e8..87843c0f 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -13,7 +13,7 @@ def visit(self, node: Node, **args): return visitor(node, **args) # Return the new context result from the visit - def not_implemented(self, node: Node): + def not_implemented(self, node: Node, **args): raise Exception('Not implemented visit_{} method'.format(node.clsname)) # We need to highlight here the inheritance relations between classes @@ -21,30 +21,34 @@ class TypeCollectorVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): errors = [] + line_and_col = {} for nodeClass in node.class_list: - + line_and_col.update({ + nodeClass.idName: (nodeClass.line, nodeClass.column) + }) result= self.visit(nodeClass) if result: errors.append(result) - return errors + return errors, line_and_col def visit_NodeClass(self, node: NodeClass): # When we create a type, we store it in the context, if there is no errors return programContext.createType(node) class TypeInheritanceVisitor(NodeVisitor): - def visit_NodeProgram(self, node: NodeProgram): + def visit_NodeProgram(self, node: NodeProgram, line_and_col_dict): errors = [] for _type in programContext.types: if _type != 'Object': - result = self.visitForInherit(_type) + result = self.visitForInherit(_type, + line_and_col_dict.get(_type, (0,0))) if type (result) is error: errors.append(result) return errors - def visitForInherit(self, _type: str): + def visitForInherit(self, _type: str, line_and_col): return programContext.relateInheritance(_type, - programContext.types[_type].parent) + programContext.types[_type].parent, line_and_col) class TypeBuilderVisitor(NodeVisitor): def __init__(self): @@ -77,7 +81,7 @@ def visit_NodeAttr(self, node:NodeAttr): def visit_NodeClassMethod(self, node: NodeClassMethod): return [definition for definition in - [programContext.getType(node.returnType)] + + [programContext.getType(node.returnType, (node.line, node.column))] + [programContext.getType(idName = arg) for arg in node.argTypes] + [programContext.defineMethod( typeName = self.currentTypeName, @@ -187,14 +191,25 @@ def visit_NodeBinaryOperation(self, if type (typeSecondExpr) is error: return typeSecondExpr - return programContext.checkArithmetic(typeFirstExpr, - typeSecondExpr) + if type(node) in {NodeAddition, + NodeSubtraction, + NodeDivision, + NodeMultiplication}: + + return programContext.checkArithmetic(typeFirstExpr, + typeSecondExpr, + (node.line, node.column)) + if type(node) is NodeEqual: + return programContext.checkEqualOp(typeFirstExpr, + typeSecondExpr, + (node.line, node.column)) def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): - result = programContext.getType(node.type) + result = programContext.getType(node.type, + row_and_col=(node.line, node.column)) if type(result) is error: - return result + return result return node.type def visit_NodeExpr(self, @@ -205,9 +220,19 @@ def visit_NodeExpr(self, def visit_NodeInteger(self, node: NodeInteger, - **args): + **kwargs): return 'Int' + def visit_NodeBoolean(self, + node: NodeBoolean, + **kwargs): + return 'Bool' + + def visit_NodeBooleanComplement(self, + node: NodeBooleanComplement, + **kwargs): + return 'Bool' + def visit_NodeObject(self, node: NodeObject, environment): @@ -232,7 +257,7 @@ def visit_NodeDynamicDispatch(self, argTypes.append(currenttypeExpr) return programContext.checkDynamicDispatch(typeExpr, - node.method, argTypes) + node.method, argTypes, (node.line, node.column)) def visit_NodeSelf(self, node: NodeSelf, environment): return environment['wrapperType'] From 798f7aaa29273e9b04a5a9ced66678745d14dbde Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 18 Dec 2020 16:06:44 -0500 Subject: [PATCH 52/96] Deleted the self as a token --- src/compiler/components/lexer_analyzer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py index b4a52170..78e7eda4 100644 --- a/src/compiler/components/lexer_analyzer.py +++ b/src/compiler/components/lexer_analyzer.py @@ -37,7 +37,6 @@ 'loop':'LOOP', 'inherits':'INHERITS', 'isvoid':'ISVOID', - "self": "SELF", "not": "NOT" } From ad103402109cc0484d9f9a6508ea9d347632abc1 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 18 Dec 2020 16:16:53 -0500 Subject: [PATCH 53/96] Deleted the SELF production --- src/compiler/components/syntax_analyzer.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 73644700..d6eb2855 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -133,7 +133,7 @@ def p_formal(self, p): """ formal_param : ID COLON TYPE """ - p[0] = NodeFormalParam(idName=p[1], param_type=p[3] , + p[0] = NodeFormalParam(idName=p[1], param_type=p[3], line= p.slice[1].lineno, column=self.real_col[ str(p.slice[1]) ]) @@ -169,12 +169,12 @@ def p_expression_string_constant(self, p): line= p.slice[1].lineno, column=self.real_col[ str(p.slice[1]) ]) - def p_expr_self(self, p): - """ - expression : SELF - """ - p[0]= NodeSelf(line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + #def p_expr_self(self, p): + # """ + # expression : SELF + # """ + # p[0]= NodeSelf(line= p.slice[1].lineno, + # column=self.real_col[ str(p.slice[1]) ]) def p_expression_block(self, p): """ From b743952ad2c0e97f8985b351151097ee51bbbe39 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 18 Dec 2020 17:33:03 -0500 Subject: [PATCH 54/96] Using formal params of methods as node objects --- src/compiler/components/syntax_analyzer.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index d6eb2855..4c4b5cf1 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -85,8 +85,7 @@ def p_feature_method(self, p): feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE """ p[0] = NodeClassMethod(idName=p[1], - argNames = [ x.idName for x in p[3] ], - argTypes = [ x.paramType for x in p[3] ], + formal_param_list= p[3], returnType=p[6], body=p[8], line= p.slice[1].lineno, @@ -97,8 +96,7 @@ def p_feature_method_no_formals(self, p): feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE """ p[0] = NodeClassMethod(idName=p[1], - argNames = [], - argTypes = [], + formal_param_list= [], returnType=p[5], body=p[7], line= p.slice[1].lineno, From b8eb0d541f90ab9c160b0fd2196cd473fd77f016 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 18 Dec 2020 17:34:01 -0500 Subject: [PATCH 55/96] In NodeClassMethod the formal params are a list of NodeFormalParam --- src/compiler/utils/AST_definitions.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 1b2d6f17..d3c9c50e 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -83,23 +83,21 @@ def __init__(self, line, column): class NodeClassMethod(NodeFeature): def __init__(self, idName: str, - argNames, - argTypes, + formal_param_list, returnType: str, body, line, column): super().__init__(line= line, column= column) self.idName = idName - self.argNames = argNames + self.formal_param_list= formal_param_list self.returnType = returnType - self.argTypes = argTypes self.body = body def to_readable(self): - return "{}(name='{}', argNames={}, returnType={}, argTypesNames={}, body={})".format( - self.clsname, self.idName, self.argNames, - self.returnType, self.argTypesNames, self.body + return "{}(name='{}', formal_param_list={}, returnType={}, body={})".format( + self.clsname, self.idName, self.formal_param_list, + self.returnType, self.body ) class NodeAttr(NodeFeature): @@ -114,18 +112,18 @@ class NodeFormalParam(NodeFeature): def __init__(self, idName, param_type, line, column): super().__init__(line= line, column= column) self.idName = idName - self.paramType = param_type + self._type = param_type def to_tuple(self): return tuple([ ("class_name", self.clsname), ("name", self.idNme), - ("param_type", self.paramType) + ("param_type", self._type) ]) def to_readable(self): return "{}(name='{}', param_type={})".format(self.clsname, - self.idName, self.paramType) + self.idName, self._type) class NodeObject(Node): def __init__(self, idName, line, column): From aecd4a05ec8d5699a4002d7138a7e0c7dbfd2d58 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Fri, 18 Dec 2020 17:35:31 -0500 Subject: [PATCH 56/96] The self test works now --- src/compiler/utils/context.py | 52 ++++++------- src/compiler/utils/visitors_definitions.py | 87 ++++++++++++---------- 2 files changed, 71 insertions(+), 68 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index fd7baa66..97155484 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -305,21 +305,9 @@ def defineMethod(self, typeName: str, ) or self.types[typeName].methods.update({ node.idName: Method(idName= node.idName, returnType= node.returnType, - argNames= node.argNames, - argTypes= node.argTypes) + argNames= [f.idName for f in node.formal_param_list] , + argTypes= [f._type for f in node.formal_param_list]) }) - - - - def createContextForLetExpr(self, node: NodeLet, chainOfNames): - return not self.letsExpr.update({ - chainOfNames: - ContextLet(chainBefore= chainOfNames, - objectId= node.idName, - typeObject= node.type, - value= None) - }) - def checkDynamicDispatch(self, typeName, method, arguments, row_and_col): @@ -365,22 +353,30 @@ def buildEnv (self, typeName): d.update({'wrapperType': typeName}) return d - def checkAssign(self, node, _type, environment): - + def buildEnvForMethod(self, node: NodeClassMethod, previousEnv): + newEnv = previousEnv.copy() + newEnv.update({ f.idName: f._type + for f in node.formal_param_list }) + badFormalParam = next((f for f in node.formal_param_list + if f.idName == 'self'), None) return interceptError( - validationFunc= lambda : node.idName in environment, - errorType='undefined symbol', - symbol= node.idName, - row_and_col= (node.line, node.column) - ) or interceptError( - validationFunc= lambda : environment[node.idName]['type'] == _type - or self.isAncestor(idChild=_type, - idParent= environment[node.idName]['type']), - errorType='uncompatible types', - type1= environment[node.idName]['type'], + validationFunc= lambda : not badFormalParam, + errorType='self parameter', + row_and_col= (badFormalParam.line, badFormalParam.column) if badFormalParam else (0,0) + )or newEnv + + def checkAssign(self, nameObject, node_type, _type, row_and_col): + + return interceptError( + validationFunc= lambda : node_type == _type + or self.isAncestor(idChild= node_type, + idParent= _type), + errorType='uncompatible assing', + idName= nameObject, + type1= node_type, type2= _type, - row_and_col= (node.line, node.column) - ) or environment[node.idName]['type'] + row_and_col= row_and_col + ) or node_type def checkReturnType(self, node: NodeClassMethod, typeExpr): return interceptError( diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 87843c0f..a05bba44 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -82,7 +82,7 @@ def visit_NodeAttr(self, node:NodeAttr): def visit_NodeClassMethod(self, node: NodeClassMethod): return [definition for definition in [programContext.getType(node.returnType, (node.line, node.column))] + - [programContext.getType(idName = arg) for arg in node.argTypes] + + [programContext.getType(idName = formal_param._type, row_and_col= (formal_param.line, formal_param.column)) for formal_param in node.formal_param_list] + [programContext.defineMethod( typeName = self.currentTypeName, node= node @@ -100,35 +100,31 @@ def visit_NodeProgram(self, node: NodeProgram): errors = [] for nodeClass in node.class_list: environment = programContext.buildEnv (typeName= nodeClass.idName) - errors += self.visit(nodeClass, environment= environment) + errors += self.visit(nodeClass, previousEnv= environment) return errors - def visit_NodeClass(self, node: NodeClass, environment): + def visit_NodeClass(self, node: NodeClass, previousEnv): errors = [] for nodeAttr in node.attributes: - result= self.visit(nodeAttr, environment= environment) + result= self.visit(nodeAttr, previousEnv= previousEnv) if type(result) is error: errors.append(result) for nodeClassMethod in node.methods: - result= self.visit(nodeClassMethod, environment= environment) + result= self.visit(nodeClassMethod, previousEnv= previousEnv) if type(result) is error: errors.append(result) return errors - def visit_NodeClassMethod(self, node: NodeClassMethod, environment): - for i in range(len(node.argNames)): - environment.update( { - node.argNames[i]: node.argTypes[i] - }) + def visit_NodeClassMethod(self, node: NodeClassMethod, previousEnv): + newEnv = programContext.buildEnvForMethod(node, previousEnv) + if type(newEnv) is error: + return newEnv - typeResult = self.visit(node.body, environment= environment) - - for i in range(len(node.argNames)): - environment.popitem() + typeResult = self.visit(node.body, previousEnv= newEnv) if type(typeResult) is error: return typeResult @@ -138,52 +134,63 @@ def visit_NodeClassMethod(self, node: NodeClassMethod, environment): def visit_NodeString(self, node: NodeString, **kwargs): return 'String' - def visit_NodeAttr(self, node: NodeAttr, environment): + def visit_NodeAttr(self, node: NodeAttr, previousEnv): return self.visit(node.expr, - environment= environment) + previousEnv= previousEnv) def visit_NodeLetComplex(self, node: NodeLetComplex, - environment): + previousEnv: dict): for nodeLet in node.nestedLets: + newEnv= previousEnv.copy() result= self.visit(nodeLet, - environment= environment) + previousEnv= newEnv) if type(result) is error: return result - environment.update({ + newEnv.update({ nodeLet.idName: result }) result= self.visit( node.body, - environment= environment) - for i in range(len(node.nestedLets)): - environment.popitem() + previousEnv= newEnv) + return result - def visit_NodeLet(self, node: NodeLet, environment): + def visit_NodeLet(self, node: NodeLet, previousEnv): errors= [] - return self.visit(node.body, - environment= environment) + exprType= self.visit(node.body, + previousEnv= previousEnv) + if type(exprType) is error: + return exprType + previousEnv.update( { + node.idName: node.type + }) + return programContext.checkAssign(node.idName, + previousEnv[node.idName], + exprType, + (node.body.line, node.body.column)) + def visit_NodeAssignment(self, node: NodeAssignment, - environment): - result = self.visit(node.expr, environment= environment) + previousEnv): + + result = self.visit(node.expr, previousEnv= previousEnv) if type(result) is error: return result - return programContext.checkAssign(node, result, environment) + return programContext.checkAssign(node, result, previousEnv) def visit_NodeBinaryOperation(self, node: NodeBinaryOperation, - environment): + previousEnv): typeFirstExpr= self.visit(node.first, - environment= environment) + previousEnv= previousEnv) typeSecondExpr= self.visit(node.second, - environment= environment) + previousEnv= previousEnv) if type (typeFirstExpr) is error: return typeFirstExpr @@ -214,8 +221,8 @@ def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): def visit_NodeExpr(self, node: NodeExpr, - environment): - return self.visit(node, environment= environment) + previousEnv): + return self.visit(node, previousEnv= previousEnv) def visit_NodeInteger(self, @@ -235,23 +242,23 @@ def visit_NodeBooleanComplement(self, def visit_NodeObject(self, node: NodeObject, - environment): + previousEnv): return programContext.searchValue(node, - environment) + previousEnv) def visit_NodeDynamicDispatch(self, node: NodeDynamicDispatch, - environment): + previousEnv): typeExpr= self.visit(node.expr, - environment= environment) + previousEnv= previousEnv) if type (typeExpr) is error: return typeExpr argTypes = [] for arg in node.arguments: currenttypeExpr= self.visit(arg, - environment= environment) + previousEnv= previousEnv) if type (currenttypeExpr) is error: return currenttypeExpr argTypes.append(currenttypeExpr) @@ -259,6 +266,6 @@ def visit_NodeDynamicDispatch(self, return programContext.checkDynamicDispatch(typeExpr, node.method, argTypes, (node.line, node.column)) - def visit_NodeSelf(self, node: NodeSelf, environment): - return environment['wrapperType'] + def visit_NodeSelf(self, node: NodeSelf, previousEnv): + return previousEnv['wrapperType'] \ No newline at end of file From 0f7cf4dc1e05515b83044201b3c067145239c8a5 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 19 Dec 2020 22:13:35 -0500 Subject: [PATCH 57/96] Changed the order of visits. Now Build goes first than Inheritance --- src/compiler/components/syntax_analyzer.py | 26 +++++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 4c4b5cf1..ef9c3046 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -193,12 +193,12 @@ def p_expression_assignment(self, p): """ expression : ID ASSIGN expression """ - p[0] = NodeAssignment(idName= NodeObject(idName= p[1], + p[0] = NodeAssignment(nodeObject= NodeObject(idName= p[1], line= p.slice[1].lineno, column=self.real_col[ str(p.slice[1]) ]), expr= p[3], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[2]) ]) # ######################### UNARY OPERATIONS ####################################### @@ -325,34 +325,38 @@ def p_nested_lets_simple(self, p): nested_lets : ID COLON TYPE | nested_lets COMMA ID COLON TYPE """ - if p[1] == "ID": - p[0]= NodeLet(idName= p[1], returnType= p[3], body = None, + if p[2] == ":": + p[0]= [NodeLet(idName= p[1], returnType= p[3], body = None, line= p.slice[1].lineno, - column= self.real_col[ str(p.slice[1]) ]) + column= self.real_col[ str(p.slice[1]) ])] else: - p[0]= NodeLet(idName= p[3], + p[1].append(NodeLet(idName= p[3], returnType= p[-1], body= None, line= p.slice[2].lineno, - column= self.real_col[str(p.slice[2])]) + column= self.real_col[str(p.slice[2])])) + p[0]= p[1] def p_nested_lets_initialize(self, p): """ nested_lets : ID COLON TYPE ASSIGN expression | nested_lets COMMA ID COLON TYPE ASSIGN expression """ - if p[1] == "ID": - p[0] = NodeLet(idName= p[1], + if p[2] == ":": + p[0] = [NodeLet(idName= p[1], returnType= p[3], body = p[5], line = p.slice[1].lineno, - column= self.real_col[ str(p.slice[1]) ]) + column= self.real_col[ str(p.slice[1]) ] )] else: - p[0]= NodeLet(idName= p[3], + p[1].append( + NodeLet(idName= p[3], returnType= p[5], body= p[7], line= p.slice[2].lineno, column= self.real_col[ str(p.slice[2]) ]) + ) + p[0]= p[1] # ######################### CASE EXPRESSION ######################################## From f77808cf86441d0d7de0dffefa7e3882d311fd42 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 19 Dec 2020 22:13:55 -0500 Subject: [PATCH 58/96] Changed the order of visits. Now Build goes first than Inheritance --- src/compiler/components/semantic_analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic_analyzer.py index 83982e8d..b36ff43a 100644 --- a/src/compiler/components/semantic_analyzer.py +++ b/src/compiler/components/semantic_analyzer.py @@ -10,7 +10,7 @@ def __init__(self, ast: NodeProgram): def run_visits(self: NodeProgram): typeCollectorResult, line_and_col_dict= TypeCollectorVisitor().visit(self.ast) - typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast, line_and_col_dict= line_and_col_dict) typeBuilderResult= TypeBuilderVisitor().visit(self.ast) + typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast, line_and_col_dict= line_and_col_dict) typeCheckerResult= TypeCheckerVisitor().visit(self.ast) self.errors+= typeCollectorResult + typeBuilderResult + typeInheritanceResult + typeCheckerResult From b947841651210f552ee6c518faf651abcfb05642 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 19 Dec 2020 22:16:00 -0500 Subject: [PATCH 59/96] Attributes and arithemtic works --- src/compiler/utils/AST_definitions.py | 10 +- src/compiler/utils/context.py | 92 +++++++++------- src/compiler/utils/errors.py | 49 +++++++-- src/compiler/utils/visitors_definitions.py | 118 +++++++++++++++++---- src/main.py | 28 +++-- 5 files changed, 216 insertions(+), 81 deletions(-) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index d3c9c50e..8f3c582f 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -238,21 +238,21 @@ def to_readable(self): class NodeAssignment(NodeExpr): - def __init__(self, idName, expr, line, column): + def __init__(self, nodeObject, expr, line, column): super().__init__(line= line, column= column) - self.idName = idName + self.nodeObject = nodeObject self.expr = expr def to_tuple(self): return tuple([ ("class_name", self.clsname), - ("idName", self.idName), + ("nodeObject", self.nodeObject), ("expr", self.expr) ]) def to_readable(self): - return "{}(idName={}, expr={})".format(self.clsname, - self.idName, self.expr) + return "{}(nodeObject={}, expr={})".format(self.clsname, + self.nodeObject, self.expr) class NodeBlock(NodeExpr): diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 97155484..d6f19b03 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -144,12 +144,12 @@ def __init__(self, dictionaries ={}): def createType(self, node: NodeClass): return interceptError( validationFunc= lambda: not node.idName in self.types, - errorType= 'repeated class', + errorOption= 'repeated class', idName= node.idName, row_and_col = (node.line, node.column) ) or interceptError ( validationFunc= lambda: node.idName != node.parent, - errorType= 'Inherit from itself', + errorOption= 'Inherit from itself', idName= node.idName, row_and_col = (node.line, node.column) )or self.types.update({ @@ -163,24 +163,24 @@ def createType(self, node: NodeClass): def relateInheritance(self, idName : str, parent: str, row_and_col): return interceptError( validationFunc= lambda: idName in self.types, - errorType= 'undefined type', + errorOption= 'undefined type', idName= idName, row_and_col= row_and_col ) or interceptError ( validationFunc= lambda: self.types[idName].parent in self.types, - errorType= 'undefined type', + errorOption= 'undefined type', idName= self.types[idName].parent, row_and_col= row_and_col ) or interceptError( validationFunc= lambda: not self.types[parent].builtIn, - errorType= 'built-in inheritance', + errorOption= 'built-in inheritance', idName= idName, row_and_col= row_and_col ) or interceptError( validationFunc= lambda: not self.isAncestor ( idChild= idName, idParent= parent), - errorType= 'inheritance from child', + errorOption= 'inheritance from child', idParent= parent, idChild= idName, row_and_col= row_and_col @@ -238,7 +238,7 @@ def actualizeInheritMethod(self, childInfoMethod.returnType == parentInfoMethod.returnType and len(childInfoMethod.argNames) == len(parentInfoMethod.argNames) and childInfoMethod.argTypes == parentInfoMethod.argTypes, - errorType= 'bad redefine method', + errorOption= 'bad redefine method', nameClass= idName, methodName = childInfoMethod.idName if childInfoMethod else None, row_and_col= row_and_col @@ -254,7 +254,7 @@ def actualizeInheritAttr(self, return interceptError( validationFunc= lambda: not (childInfoAttr and childInfoAttr._type != parentInfoAttr._type), - errorType= "bad redefine attr", + errorOption= "bad redefine attr", nameClass= idName, attrName= childInfoAttr.idName if childInfoAttr else None, attrType= childInfoAttr._type if childInfoAttr else None, @@ -276,7 +276,7 @@ def isAncestor(self, idChild: str, idParent: str): def getType(self, idName: str, row_and_col): return interceptError( validationFunc= lambda: idName in self.types, - errorType= 'undefined type', + errorOption= 'undefined type', idName= idName, row_and_col= row_and_col ) or self.types.get(idName) @@ -286,7 +286,7 @@ def defineAttrInType(self, typeName: str, attr: NodeAttr): return interceptError( validationFunc= lambda : not attr.idName in self.types[typeName].attributes, - errorType= 'repeated attr', + errorOption= 'repeated attr', idName= attr.idName, row_and_col= (attr.line, attr.column) ) or self.types[typeName].attributes.update({ @@ -299,7 +299,7 @@ def defineMethod(self, typeName: str, return interceptError( validationFunc= lambda: not node.idName in self.types[typeName].methods, - errorType= 'repeated method', + errorOption= 'repeated method', idName= node.idName, row_and_col= (node.line, node.column) ) or self.types[typeName].methods.update({ @@ -322,13 +322,13 @@ def checkDynamicDispatch(self, return interceptError( validationFunc= lambda : not methodInfo is None, - errorType= 'undefined method in class', + errorOption= 'undefined method in class', idName= method, className= typeName, row_and_col= row_and_col ) or interceptError ( validationFunc= lambda : notAncestorArgs == [], - errorType= 'argument types in dispatch are not subtypes', + errorOption= 'argument types in dispatch are not subtypes', idName= method, badArgs= notAncestorArgs, row_and_col= row_and_col @@ -345,11 +345,11 @@ def __str__(self): def buildEnv (self, typeName): typeInfo= self.types[typeName] d = {typeInfo.attributes[attr].idName: - {'type': typeInfo.attributes[attr]._type } - for attr in typeInfo.attributes } + typeInfo.attributes[attr]._type + for attr in typeInfo.attributes } d.update({ typeInfo.inheritsAttr[attr].idName: - {'type': typeInfo.inheritsAttr[attr]._type} - for attr in typeInfo.inheritsAttr } ) + typeInfo.inheritsAttr[attr]._type + for attr in typeInfo.inheritsAttr } ) d.update({'wrapperType': typeName}) return d @@ -361,51 +361,61 @@ def buildEnvForMethod(self, node: NodeClassMethod, previousEnv): if f.idName == 'self'), None) return interceptError( validationFunc= lambda : not badFormalParam, - errorType='self parameter', + errorOption='self parameter', row_and_col= (badFormalParam.line, badFormalParam.column) if badFormalParam else (0,0) )or newEnv - def checkAssign(self, nameObject, node_type, _type, row_and_col): + def isSubtype(self, subType, superType): + while subType: + if subType == superType: + return True + subType = self.types[subType].parent + return False + + def checkAssign(self, nameObject, + nodeType, returnType, + row_and_col, errorOption): return interceptError( - validationFunc= lambda : node_type == _type - or self.isAncestor(idChild= node_type, - idParent= _type), - errorType='uncompatible assing', + validationFunc= lambda : self.isSubtype(subType= returnType, + superType= nodeType), + errorOption= errorOption, idName= nameObject, - type1= node_type, - type2= _type, + type1= returnType, + type2= nodeType, row_and_col= row_and_col - ) or node_type + ) or nodeType - def checkReturnType(self, node: NodeClassMethod, typeExpr): + def checkReturnType(self, nodeType , returnType, row_and_col, errorOption): return interceptError( - validationFunc= lambda : node.returnType == typeExpr - or self.isAncestor(idChild= typeExpr, idParent= node.returnType), - errorType= 'uncompatible types', - type1= node.returnType, - type2= typeExpr, - row_and_col= (node.line, node.column) - ) or typeExpr + validationFunc= lambda : self.isSubtype(subType= returnType, + superType= nodeType), + errorOption= errorOption, + type1= nodeType, + type2= returnType, + row_and_col= row_and_col + ) or returnType - def searchValue(self, node: NodeObject, environment): + def searchValue(self, node: NodeObject, row_and_col, environment): return interceptError( validationFunc= lambda: node.idName - in environment and environment[node.idName], - errorType='undefined symbol', + in environment, + errorOption='undefined symbol', + row_and_col= row_and_col, symbolName= node.idName) or environment[node.idName] - def checkArithmetic(self, type1, type2, row_and_col): + def checkArithmetic(self, type1, type2, row_and_col, symbolOp, arithmeticOp): return interceptError(validationFunc= lambda: type1 == type2, - errorType= 'arithmetic fail', + errorOption= 'arithmetic fail', type1= type1, type2= type2, - row_and_col= row_and_col) or type1 + symbolOp= symbolOp, + row_and_col= row_and_col) or ('Int' * arithmeticOp) or 'Bool' def checkEqualOp(self, type1, type2, row_and_col): return interceptError(validationFunc= lambda: not (type1 or type2) in {'Int', 'Bool', 'String'} or type1 == type2, - errorType= 'comparison fail', + errorOption= 'comparison fail', row_and_col = row_and_col) or self.types['Bool'].idName def LCA(self, idName1, idName2): diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 046140d6..693302e3 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -55,22 +55,57 @@ def __str__(self): row_and_col= row_and_col, message="The arguments %s does not exists in method %s in class %s " %(undefinedArgs, idName, className) ), - 'uncompatible types': lambda type1, type2, row_and_col=(0,0): error ( + 'arithmetic fail': lambda type1, type2, symbolOp, row_and_col=(0,0): error ( error_type= 'TypeError', row_and_col= row_and_col, - message="Uncompatible types %s and %s in %s " %(type1, type2, row_and_col) + message="non-Int arguments: %s %s %s." %(type1, symbolOp, type2) ), 'undefined symbol': lambda symbolName, row_and_col=(0,0): error ( - error_type= 'TypeError', + error_type= 'NameError', row_and_col= row_and_col, - message="Undefined symbol %s at %s" %(symbolName, row_and_col) + message="Undeclared identifier %s." %symbolName ), 'not ancestor in dispatch': lambda idName, returnType, row_and_col=(0,0): error ( error_type= 'TypeError', row_and_col= row_and_col, - message= 'Type %s is not subtype of %s at %s' %(idName, returnType, row_and_col) + message= 'Type %s is not subtype of %s at %s.' %(idName, returnType, row_and_col) + ), + 'comparison fail': lambda row_and_col= (0,0): error( + error_type= 'TypeError', + row_and_col=row_and_col, + message= 'Illegal comparison with a basic type.' + ), + 'uncompatible assing object': lambda idName, type1, type2, row_and_col = (0,0) : error ( + error_type='TypeError', + row_and_col= row_and_col, + message= "Inferred type %s of initialization of %s does not conform to identifier's declared type %s." %(type1, idName, type2) + ), + 'self parameter': lambda row_and_col = (0,0) : error ( + error_type= 'SemanticError', + row_and_col= row_and_col, + message= "'self' cannot be the name of a formal parameter." + ), + 'boolean fail': lambda type1, type2, row_and_col=(0,0): error ( + error_type= 'TypeError', + row_and_col= row_and_col, + message="non-Bool arguments: %s + %s." %(type1, type2) + ), + 'uncompatible assign attr': lambda idName, type1, type2, row_and_col = (0,0): error ( + error_type='TypeError', + row_and_col= row_and_col, + message="Inferred type %s of initialization of attribute %s does not conform to declared type %s" %( type1, idName, type2) + ), + 'bad ~': lambda type1, type2, row_and_col = (0,0): error ( + error_type='TypeError', + row_and_col= row_and_col, + message="Argument of '~' has type %s instead of %s." %( type1, type2) + ), + 'bad not': lambda type1, type2, row_and_col = (0,0): error ( + error_type='TypeError', + row_and_col= row_and_col, + message="Argument of 'not' has type %s instead of %s." %( type1, type2) ) } -def interceptError(validationFunc, errorType: str, **argumentsConstructor): - return (not validationFunc()) and errorSelector[errorType](**argumentsConstructor) +def interceptError(validationFunc, errorOption: str, **argumentsConstructor): + return (not validationFunc()) and errorSelector[errorOption](**argumentsConstructor) diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index a05bba44..ace09947 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -129,21 +129,32 @@ def visit_NodeClassMethod(self, node: NodeClassMethod, previousEnv): if type(typeResult) is error: return typeResult - return programContext.checkReturnType(node, typeResult) + return programContext.checkReturnType(node.returnType, + typeResult, + (node.line, node.column), + 'uncompatible types') def visit_NodeString(self, node: NodeString, **kwargs): return 'String' def visit_NodeAttr(self, node: NodeAttr, previousEnv): - return self.visit(node.expr, + typeExpr= self.visit(node.expr, previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + + return programContext.checkAssign(nameObject= node.idName, + nodeType= node._type, + returnType= typeExpr, + row_and_col= (node.expr.line, node.expr.column) + if node.expr else (node.line, node.column), + errorOption= 'uncompatible assign attr') def visit_NodeLetComplex(self, node: NodeLetComplex, previousEnv: dict): - + newEnv= previousEnv.copy() for nodeLet in node.nestedLets: - newEnv= previousEnv.copy() result= self.visit(nodeLet, previousEnv= newEnv) if type(result) is error: @@ -170,16 +181,28 @@ def visit_NodeLet(self, node: NodeLet, previousEnv): return programContext.checkAssign(node.idName, previousEnv[node.idName], exprType, - (node.body.line, node.body.column)) + (node.body.line, node.body.column), + 'uncompatible assing object') def visit_NodeAssignment(self, node: NodeAssignment, previousEnv): - result = self.visit(node.expr, previousEnv= previousEnv) + resultObj = self.visit(node.nodeObject, previousEnv= previousEnv) - if type(result) is error: - return result - return programContext.checkAssign(node, result, previousEnv) + if type(resultObj) is error: + return resultObj + + resultExpr = self.visit(node.expr, previousEnv= previousEnv) + + if type(resultExpr) is error: + return resultExpr + + + return programContext.checkAssign(nameObject= node.nodeObject.idName, + nodeType= resultObj, + returnType= resultExpr, + row_and_col= (node.line, node.column ), + errorOption= 'uncompatible assing object') def visit_NodeBinaryOperation(self, node: NodeBinaryOperation, @@ -198,20 +221,26 @@ def visit_NodeBinaryOperation(self, if type (typeSecondExpr) is error: return typeSecondExpr - if type(node) in {NodeAddition, - NodeSubtraction, - NodeDivision, - NodeMultiplication}: - - return programContext.checkArithmetic(typeFirstExpr, - typeSecondExpr, - (node.line, node.column)) - if type(node) is NodeEqual: return programContext.checkEqualOp(typeFirstExpr, typeSecondExpr, (node.line, node.column)) + + arithmeticOp = type(node) in {NodeAddition, + NodeSubtraction, + NodeDivision, + NodeMultiplication} + + + return programContext.checkArithmetic(typeFirstExpr, + typeSecondExpr, + (node.line, node.column), + node.symbol, + arithmeticOp) + + + def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): result = programContext.getType(node.type, row_and_col=(node.line, node.column)) @@ -237,14 +266,23 @@ def visit_NodeBoolean(self, def visit_NodeBooleanComplement(self, node: NodeBooleanComplement, - **kwargs): - return 'Bool' + previousEnv): + typeExpr = self.visit(node.boolean_expr, previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + return programContext.checkReturnType(nodeType= "Bool", returnType= typeExpr, + row_and_col= (node.line, node.boolean_expr.column -2), + errorOption= 'bad not') + + + def visit_NodeObject(self, node: NodeObject, previousEnv): return programContext.searchValue(node, + (node.line, node.column), previousEnv) def visit_NodeDynamicDispatch(self, @@ -268,4 +306,42 @@ def visit_NodeDynamicDispatch(self, def visit_NodeSelf(self, node: NodeSelf, previousEnv): return previousEnv['wrapperType'] - \ No newline at end of file + + def visit_NodeIntegerComplement(self, node: NodeIntegerComplement, + previousEnv): + typeExpr = self.visit(node.integer_expr, previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + return programContext.checkReturnType(nodeType= "Int", returnType= typeExpr, + row_and_col= (node.line, node.column + 1), + errorOption= 'bad ~') + + def visit_NodeBlock(self, node: NodeBlock, previousEnv): + blockType = None + for expr in node.expr_list: + blockType = self.visit(expr, previousEnv= previousEnv) + if type(blockType) is error: + return blockType + return blockType + + def visit_NodeIf(self, node: NodeIf, previousEnv): + predType = self.visit(node.predicate, previousEnv = previousEnv) + if type(predType) is error: + return predType + + resultCheck = programContext.checkReturnType(nodeType= 'Bool', returnType= predType, + row_and_col= (node.line, node.column), + errorOption= 'uncompatible types') + + if type(resultCheck) is error: + return resultCheck + + thenType = self.visit(node.then_body, previousEnv= previousEnv) + if type(thenType) is error: + return thenType + + elseType = self.visit(node.else_body, previousEnv= previousEnv) + if type(elseType) is error: + return elseType + + return programContext.LCA(idName1 = thenType, idName2= elseType) \ No newline at end of file diff --git a/src/main.py b/src/main.py index b49c0bf8..8da1d36d 100644 --- a/src/main.py +++ b/src/main.py @@ -4,6 +4,7 @@ from compiler.components.syntax_analyzer import run_parser from compiler.components.semantic_analyzer import semanticAnalyzer from compiler.utils.context import programContext +from compiler.utils.preprocess_input import replace_tabs parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') @@ -17,21 +18,34 @@ args= parser_input.parse_args() file= open(args.files_for_compile[0]) working_input= file.read() +working_input_with_no_tabs = replace_tabs(working_input) + all_errors= [] -token_errors, tokens_for_input, real_col= tokenizer(working_input) +token_errors, tokens_for_input, real_col= tokenizer(working_input_with_no_tabs) + +if token_errors: + for error in token_errors: + print(error) + exit(1) -ast_result, parser_errors= run_parser(tokens, working_input, real_col) +ast_result, parser_errors= run_parser(tokens, + working_input_with_no_tabs, + real_col) + +if parser_errors: + for error in parser_errors: + print(error) + exit(1) #if parser_errors: print("In the parser_errors ", parser_errors) -#sa = semanticAnalyzer(ast_result) +sa = semanticAnalyzer(ast_result) +sa.run_visits() + -#sa.run_visits() -#print('context of the input %s' %programContext) #print('errors %s' %sa.errors) -all_errors += token_errors + parser_errors -#+ sa.errors +all_errors += token_errors + parser_errors + sa.errors if all_errors: for error in all_errors: From a721dae5ba327fdf7976ced720983ab21ee0db21 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 19 Dec 2020 23:43:31 -0500 Subject: [PATCH 60/96] The let tests works --- src/compiler/components/syntax_analyzer.py | 2 +- src/compiler/utils/context.py | 7 ++++++- src/compiler/utils/visitors_definitions.py | 14 +++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index ef9c3046..3aec8254 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -331,7 +331,7 @@ def p_nested_lets_simple(self, p): column= self.real_col[ str(p.slice[1]) ])] else: p[1].append(NodeLet(idName= p[3], - returnType= p[-1], + returnType= p[5], body= None, line= p.slice[2].lineno, column= self.real_col[str(p.slice[2])])) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index d6f19b03..32fec746 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -376,7 +376,12 @@ def checkAssign(self, nameObject, nodeType, returnType, row_and_col, errorOption): - return interceptError( + return interceptError ( + validationFunc= lambda : nodeType in self.types, + errorOption= 'undefined type', + idName= nodeType, + row_and_col= row_and_col + ) or interceptError( validationFunc= lambda : self.isSubtype(subType= returnType, superType= nodeType), errorOption= errorOption, diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index ace09947..397afeee 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -155,7 +155,8 @@ def visit_NodeLetComplex(self, previousEnv: dict): newEnv= previousEnv.copy() for nodeLet in node.nestedLets: - result= self.visit(nodeLet, + + result= self.visit(nodeLet, previousEnv= newEnv) if type(result) is error: return result @@ -171,17 +172,16 @@ def visit_NodeLetComplex(self, def visit_NodeLet(self, node: NodeLet, previousEnv): errors= [] exprType= self.visit(node.body, - previousEnv= previousEnv) + previousEnv= previousEnv) if node.body else node.type if type(exprType) is error: return exprType - previousEnv.update( { - node.idName: node.type - }) + row_and_col = (node.body.line, node.body.column) if node.body else (node.line, node.column) + return programContext.checkAssign(node.idName, - previousEnv[node.idName], + node.type, exprType, - (node.body.line, node.body.column), + row_and_col, 'uncompatible assing object') def visit_NodeAssignment(self, node: NodeAssignment, From e65432cabcfb50986702f1c46f6902c062641e8e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 20 Dec 2020 08:49:13 -0500 Subject: [PATCH 61/96] For switch tabas by spaces and things like that --- src/compiler/utils/preprocess_input.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/compiler/utils/preprocess_input.py diff --git a/src/compiler/utils/preprocess_input.py b/src/compiler/utils/preprocess_input.py new file mode 100644 index 00000000..7a167149 --- /dev/null +++ b/src/compiler/utils/preprocess_input.py @@ -0,0 +1,8 @@ +def replace_tabs(_input, tabstop= 4): + result = '' + for c in _input: + if c =='\t': + result += ' ' * 4 + else: + result += c + return result \ No newline at end of file From 288679b362da8e0e3d269568c84798101956e3aa Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 20 Dec 2020 08:51:40 -0500 Subject: [PATCH 62/96] We passed almost 31 test! --- src/compiler/utils/AST_definitions.py | 2 +- src/compiler/utils/visitors_definitions.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 8f3c582f..c5f35d00 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -225,7 +225,7 @@ def to_readable(self): class NodeIsVoid(NodeExpr): def __init__(self, expr, line, column): super().__init__(line= line, column= column) - + self.expr= expr def to_tuple(self): return tuple([ diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 397afeee..81875059 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -344,4 +344,12 @@ def visit_NodeIf(self, node: NodeIf, previousEnv): if type(elseType) is error: return elseType - return programContext.LCA(idName1 = thenType, idName2= elseType) \ No newline at end of file + return programContext.LCA(idName1 = thenType, idName2= elseType) + + + def visit_NodeIsVoid(self, node: NodeIsVoid, previousEnv): + typeExpr= self.visit(node.expr, previousEnv = previousEnv) + if type(typeExpr) is error: + return typeExpr + return 'Bool' + \ No newline at end of file From 129b1049e37690e6c4d488e1788b96681695823f Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 20 Dec 2020 10:10:37 -0500 Subject: [PATCH 63/96] 39 test. Most of the basic test --- src/compiler/components/semantic_analyzer.py | 6 ++++-- src/compiler/components/syntax_analyzer.py | 5 +++-- src/compiler/utils/AST_definitions.py | 3 ++- src/compiler/utils/context.py | 18 +++++++++------- src/compiler/utils/errors.py | 17 +++++++++------ src/compiler/utils/visitors_definitions.py | 22 ++++++++++++-------- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic_analyzer.py index b36ff43a..a0ffb7c2 100644 --- a/src/compiler/components/semantic_analyzer.py +++ b/src/compiler/components/semantic_analyzer.py @@ -9,8 +9,10 @@ def __init__(self, ast: NodeProgram): self.errors = [] def run_visits(self: NodeProgram): - typeCollectorResult, line_and_col_dict= TypeCollectorVisitor().visit(self.ast) + typeCollectorResult, line_and_col_dict, parent_col_dict= TypeCollectorVisitor().visit(self.ast) typeBuilderResult= TypeBuilderVisitor().visit(self.ast) - typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast, line_and_col_dict= line_and_col_dict) + typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast, + line_and_col_dict= line_and_col_dict, + parent_col_dict = parent_col_dict) typeCheckerResult= TypeCheckerVisitor().visit(self.ast) self.errors+= typeCollectorResult + typeBuilderResult + typeInheritanceResult + typeCheckerResult diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 3aec8254..1e966c73 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -46,7 +46,7 @@ class : CLASS TYPE LBRACE features_list_opt RBRACE attributes= p[4]['attributes'], parent = "Object", line= p.slice[1].lineno, - column=(self.real_col[ str(p.slice[1]) ] ) ) + column=(self.real_col[ str(p.slice[2]) ] ) ) def p_class_inherits(self, p): """ @@ -57,7 +57,8 @@ class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE attributes= p[6]['attributes'], parent = p[4], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[2]) ], + parent_col= self.real_col[str(p.slice[4] )]) def p_feature_list_opt(self, p): """ diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index c5f35d00..dd7d498c 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -59,12 +59,13 @@ def __init__(self, classes): class NodeClass(Node): def __init__(self, idName: str, methods, attributes, parent, - line, column): + line, column, parent_col = -1): super().__init__(line= line, column= column) self.idName = idName self.methods = methods self.attributes = attributes self.parent = parent + self.parent_col = parent_col diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 32fec746..31f67f18 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -78,7 +78,8 @@ def __init__(self, dictionaries ={}): _type= 'Int' ) }, - parent= 'Object'), + parent= 'Object', + builtIn= True), 'IO': Type( idName= 'IO', methods= { "out_string": Method( idName= "out_string", @@ -141,10 +142,12 @@ def __init__(self, dictionaries ={}): parent= 'Object') } + self.basics = [node.idName for node in self.types.values()] + def createType(self, node: NodeClass): return interceptError( validationFunc= lambda: not node.idName in self.types, - errorOption= 'repeated class', + errorOption= 'repeated class' if not node.idName in self.basics else 'repeated class basic', idName= node.idName, row_and_col = (node.line, node.column) ) or interceptError ( @@ -160,8 +163,8 @@ def createType(self, node: NodeClass): parent= node.parent if node else 'Object') }) - def relateInheritance(self, idName : str, parent: str, row_and_col): - return interceptError( + def relateInheritance(self, idName : str, parent: str, row_and_col, parent_col): + return idName == 'Object' or interceptError( validationFunc= lambda: idName in self.types, errorOption= 'undefined type', idName= idName, @@ -171,19 +174,20 @@ def relateInheritance(self, idName : str, parent: str, row_and_col): self.types, errorOption= 'undefined type', idName= self.types[idName].parent, - row_and_col= row_and_col + row_and_col= (row_and_col[0], parent_col) ) or interceptError( validationFunc= lambda: not self.types[parent].builtIn, errorOption= 'built-in inheritance', idName= idName, - row_and_col= row_and_col + idParent= parent, + row_and_col= (row_and_col[0], parent_col) ) or interceptError( validationFunc= lambda: not self.isAncestor ( idChild= idName, idParent= parent), errorOption= 'inheritance from child', idParent= parent, idChild= idName, - row_and_col= row_and_col + row_and_col= (row_and_col[0], parent_col) ) or not self.actualizeInherits(idName, parent, row_and_col) def actualizeInherits (self, idName, parentName, row_and_col): diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 693302e3..9ce2dc61 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -10,10 +10,15 @@ def __str__(self): __repr__ = __str__ -errorSelector = {'repeated class': lambda idName, row_and_col=(0,0):error( - error_type= 'TypeError', +errorSelector = {'repeated class basic': lambda idName, row_and_col=(0,0):error( + error_type= 'SemanticError', row_and_col= row_and_col, - message= 'Class %s already exist' %idName + message= 'Redefinition of basic class %s' %idName + ), + 'repeated class': lambda idName, row_and_col=(0,0):error( + error_type= 'SemanticError', + row_and_col= row_and_col, + message= 'Redefinition of basic class %s' %idName ), 'undefined type': lambda idName, row_and_col=(0,0):error( error_type='TypeError', @@ -30,10 +35,10 @@ def __str__(self): row_and_col=row_and_col, message="The method %s is already defined in the current context" %idName ), - 'built-in inheritance': lambda idName, row_and_col=(0,0): error ( - error_type='TypeError', + 'built-in inheritance': lambda idName, idParent, row_and_col=(0,0): error ( + error_type='SemanticError', row_and_col=row_and_col, - message="The class %s is sealed. You can't inherit from it" %idName + message="Class %s cannot inherit class %s." %(idName, idParent) ), 'inheritance from child': lambda idChild, idParent, row_and_col=(0,0): error ( error_type='TypeError', diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 81875059..94e7febd 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -22,33 +22,37 @@ class TypeCollectorVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): errors = [] line_and_col = {} + parent_col_dict = {} for nodeClass in node.class_list: line_and_col.update({ nodeClass.idName: (nodeClass.line, nodeClass.column) }) + parent_col_dict.update({ + nodeClass.idName: nodeClass.parent_col + }) result= self.visit(nodeClass) if result: errors.append(result) - return errors, line_and_col + return errors, line_and_col, parent_col_dict def visit_NodeClass(self, node: NodeClass): # When we create a type, we store it in the context, if there is no errors return programContext.createType(node) class TypeInheritanceVisitor(NodeVisitor): - def visit_NodeProgram(self, node: NodeProgram, line_and_col_dict): + def visit_NodeProgram(self, node: NodeProgram, line_and_col_dict, parent_col_dict): errors = [] for _type in programContext.types: - if _type != 'Object': - result = self.visitForInherit(_type, - line_and_col_dict.get(_type, (0,0))) - if type (result) is error: - errors.append(result) + result = self.visitForInherit(_type, + line_and_col_dict.get(_type, (0,0)), + parent_col_dict.get(_type, 0)) + if type (result) is error: + errors.append(result) return errors - def visitForInherit(self, _type: str, line_and_col): + def visitForInherit(self, _type: str, line_and_col, parent_col): return programContext.relateInheritance(_type, - programContext.types[_type].parent, line_and_col) + programContext.types[_type].parent, line_and_col, parent_col) class TypeBuilderVisitor(NodeVisitor): def __init__(self): From 209909dcd38d1d9cf59376eb484482374371755f Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 20 Dec 2020 17:35:23 -0500 Subject: [PATCH 64/96] Added semantic for Case expressions. Tests fine --- src/compiler/components/syntax_analyzer.py | 7 ++- src/compiler/utils/AST_definitions.py | 10 +++- src/compiler/utils/context.py | 15 +++++- src/compiler/utils/errors.py | 5 ++ src/compiler/utils/visitors_definitions.py | 59 ++++++++++++++++++++++ 5 files changed, 92 insertions(+), 4 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 1e966c73..683bcb78 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -380,7 +380,12 @@ def p_action_expr(self, p): """ action : ID COLON TYPE ARROW expression SEMICOLON """ - p[0] = (p[1], p[3], p[5]) + p[0] = NodeCaseAction(idName= p[1], + _type= p[3], + expr= p[5], + line= p.slice[1].lineno, + column= self.real_col[ str(p.slice[1]) ], + typeColumn= self.real_col[ str(p.slice[3]) ]) # ######################### METHODS DISPATCH ###################################### diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index dd7d498c..d1b4b1b1 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -411,7 +411,15 @@ def to_readable(self): return "{}(expr={}, actions={})".format(self.clsname, self.expr, self.actions) - + +class NodeCaseAction(NodeExpr): + def __init__(self, idName, expr, _type, line, column, typeColumn): + super().__init__(line= line, column= column) + self.idName= idName + self.expr= expr + self.type= _type + self.typeColumn= typeColumn + # ############################## UNARY OPERATIONS ################################## diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 31f67f18..5d1856d1 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -132,8 +132,8 @@ def __init__(self, dictionaries ={}): idName= 'default', _type='String') }, - parent= 'Object' - + parent= 'Object', + builtIn= True ), 'Bool': Type (idName= 'Bool', attributes= {}, @@ -405,6 +405,17 @@ def checkReturnType(self, nodeType , returnType, row_and_col, errorOption): row_and_col= row_and_col ) or returnType + def checkNonRepetition(self, nodeActions): + repetitionList = [] + for action in nodeActions: + if not action.type in repetitionList: + repetitionList.append(action.type) + else: + return error(error_type= 'SemanticError', + row_and_col= (action.line, action.typeColumn), + message = 'Duplicate branch %s in case statement.' %action.type) + + def searchValue(self, node: NodeObject, row_and_col, environment): return interceptError( validationFunc= lambda: node.idName diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 9ce2dc61..9b24da67 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -25,6 +25,11 @@ def __str__(self): row_and_col= row_and_col, message= "The type %s doesn't exist in the current context" %idName, ), + 'uncompatible types': lambda type1, type2, row_and_col= (0,0): error ( + error_type='TypeError', + row_and_col= row_and_col, + message= 'Bad assign %s to %s' %(type1, type2) + ), 'repeated attr': lambda idName, row_and_col=(0,0):error( error_type='TypeError', row_and_col=row_and_col, diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 94e7febd..d4a36578 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -350,6 +350,65 @@ def visit_NodeIf(self, node: NodeIf, previousEnv): return programContext.LCA(idName1 = thenType, idName2= elseType) + def visit_NodeCase(self, node: NodeCase, previousEnv): + resultTypeInit= self.visit(node.expr) + if type(resultTypeInit) is error: + return resultTypeInit + + return self.visit_NodeCaseActions(node.actions, + previousEnv, + resultTypeInit) + + def visit_NodeCaseActions(self, nodeActions, previousEnv, resultTypeInit): + + action, returnTypesExpressions= self.searchLessActionCaseAndReturnTypes(nodeActions, + previousEnv, + resultTypeInit) + if type(action) is error: + return action + + lca = returnTypesExpressions[0] + for typeExpr in returnTypesExpressions: + lca= programContext.LCA(idName1= lca, idName2= typeExpr) + + return lca + + def searchLessActionCaseAndReturnTypes(self, nodeActions, + previousEnv, resultTypeInit): + actionToReturn = None + currentTypeCase= 'Object' + returnTypesExpressions = [] + + resultCheckNonRepetition= programContext.checkNonRepetition(nodeActions) + if type(resultCheckNonRepetition) is error: + return resultCheckNonRepetition, None + + for action in nodeActions: + actionType= programContext.getType(idName= action.type, + row_and_col= (action.line, + action.column)) + if type(actionType) is error: + return actionType, None + + newEnv= previousEnv.copy() + newEnv.update({ + action.idName: action.type + }) + returnTypeAction= self.visit(action.expr, previousEnv= newEnv) + if type(returnTypeAction) is error: + return returnTypeAction, None + + returnTypesExpressions.append(returnTypeAction) + + if programContext.isSubtype(subType= resultTypeInit, + superType= action.type) and programContext.isSubtype( + subType= action.type, + superType= currentTypeCase): + actionToReturn= action + currentTypeCase= action.type + + return actionToReturn, returnTypesExpressions + def visit_NodeIsVoid(self, node: NodeIsVoid, previousEnv): typeExpr= self.visit(node.expr, previousEnv = previousEnv) From a266f33945ecd038574c58f292f4578da85b890e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 22 Dec 2020 00:45:37 -0500 Subject: [PATCH 65/96] Semantic for static dispatch --- src/compiler/components/syntax_analyzer.py | 8 ++- src/compiler/utils/AST_definitions.py | 10 +++- src/compiler/utils/context.py | 30 +++++++++- src/compiler/utils/errors.py | 15 +++++ src/compiler/utils/visitors_definitions.py | 68 +++++++++++++++++----- 5 files changed, 112 insertions(+), 19 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 683bcb78..7f0e5487 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -199,7 +199,7 @@ def p_expression_assignment(self, p): column=self.real_col[ str(p.slice[1]) ]), expr= p[3], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[2]) ]) + column=self.real_col[ str(p.slice[1]) ]) # ######################### UNARY OPERATIONS ####################################### @@ -410,7 +410,7 @@ def p_arguments_list(self, p): arguments_list : arguments_list COMMA expression | expression """ - p[0]= (p[1], ) if len(p) == 2 else p[1] + (p[2], ) + p[0]= (p[1], ) if len(p) == 2 else p[1] + (p[3], ) def p_expression_static_dispatch(self, p): """ @@ -419,7 +419,9 @@ def p_expression_static_dispatch(self, p): p[0] = NodeStaticDispatch(expr=p[1], dispatch_type=p[3], method=p[5], arguments=p[7], line= p.slice[2].lineno, - column=self.real_col[ str(p.slice[2]) ]) + column=self.real_col[ str(p.slice[2]) ], + columnType = self.real_col[str(p.slice[3])], + columnIdMethod= self.real_col[str(p.slice[5])]) def p_expression_self_dispatch(self, p): """ diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index d1b4b1b1..7b324797 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -294,12 +294,20 @@ def to_readable(self): class NodeStaticDispatch(NodeExpr): def __init__(self, expr, - dispatch_type, method, arguments, line, column): + dispatch_type, + method, + arguments, + line, + column, + columnType, + columnIdMethod): super().__init__(line= line, column= column) self.expr = expr self.dispatch_type = dispatch_type self.method = method self.arguments = arguments if arguments is not None else tuple() + self.columnType= columnType + self.columnIdMethod= columnIdMethod def to_tuple(self): return tuple([ diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 5d1856d1..b1a36c76 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -393,8 +393,25 @@ def checkAssign(self, nameObject, type1= returnType, type2= nodeType, row_and_col= row_and_col - ) or nodeType + ) or returnType + + def checkDispatchTypes(self, typeLeftMost, typeRight, returnType, row_and_col): + return interceptError(validationFunc= lambda: self.isSubtype(subType= typeLeftMost, + superType= typeRight), + errorOption= 'bad static dispatch', + typeLef = typeLeftMost, + typeRight= typeRight, + row_and_col= row_and_col) or returnType + + + def checkMethodInType (self, idType, idMethod, row_and_col): + return interceptError(validationFunc= lambda: idMethod in self.types[idType].methods, + errorOption= 'not method in class', + idType= idType, + idMethod= idMethod, + row_and_col= row_and_col) or self.types[idType].methods[idMethod] + def checkReturnType(self, nodeType , returnType, row_and_col, errorOption): return interceptError( validationFunc= lambda : self.isSubtype(subType= returnType, @@ -438,6 +455,17 @@ def checkEqualOp(self, type1, type2, row_and_col): errorOption= 'comparison fail', row_and_col = row_and_col) or self.types['Bool'].idName + def checkArgumentsInDispatch(self, typeExprOfArgsAndPosition, argTypes): + badIndex = next((i for i in range(len( typeExprOfArgsAndPosition)) + if not self.isSubtype(subType=typeExprOfArgsAndPosition[i][0], + superType= argTypes[i])), None) + return interceptError(validationFunc= lambda: not badIndex, + errorOption= 'bad dispatch', + badArg= typeExprOfArgsAndPosition[badIndex][0] if badIndex else None, + realType= argTypes[badIndex] if badIndex else None, + row_and_col= typeExprOfArgsAndPosition[badIndex][1] if badIndex else None) + + def LCA(self, idName1, idName2): path1 = self.pathToObject( idName1) path2 = self.pathToObject( idName2) diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 9b24da67..8131c492 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -114,6 +114,21 @@ def __str__(self): error_type='TypeError', row_and_col= row_and_col, message="Argument of 'not' has type %s instead of %s." %( type1, type2) + ), + 'not method in class': lambda idType, idMethod, row_and_col= (0,0): error ( + error_type='SemanticError', + row_and_col= row_and_col, + message= "Method %s not found in type %s" %(idMethod, idType) + ), + 'bad dispatch': lambda badArg, realType, row_and_col= (0,0): error( + error_type='SemanticError', + row_and_col= row_and_col, + message= "Argument %s is not subtype of %s" %(badArg, realType) + ), + 'bad static dispatch': lambda typeLef, typeRight, row_and_col= (0,0): error( + error_type='TypeError', + row_and_col= row_and_col, + message="Expression type %s does not conform to declared static dispatch type %s." %(typeLef, typeRight) ) } diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index d4a36578..17838492 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -142,18 +142,19 @@ def visit_NodeString(self, node: NodeString, **kwargs): return 'String' def visit_NodeAttr(self, node: NodeAttr, previousEnv): - typeExpr= self.visit(node.expr, - previousEnv= previousEnv) - if type(typeExpr) is error: - return typeExpr - - return programContext.checkAssign(nameObject= node.idName, - nodeType= node._type, - returnType= typeExpr, - row_and_col= (node.expr.line, node.expr.column) - if node.expr else (node.line, node.column), - errorOption= 'uncompatible assign attr') - + if node.expr: + typeExpr= self.visit(node.expr, + previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + + return programContext.checkAssign(nameObject= node.idName, + nodeType= node._type, + returnType= typeExpr, + row_and_col= (node.expr.line, node.expr.column) + if node.expr else (node.line, node.column), + errorOption= 'uncompatible assign attr') + def visit_NodeLetComplex(self, node: NodeLetComplex, previousEnv: dict): @@ -205,7 +206,7 @@ def visit_NodeAssignment(self, node: NodeAssignment, return programContext.checkAssign(nameObject= node.nodeObject.idName, nodeType= resultObj, returnType= resultExpr, - row_and_col= (node.line, node.column ), + row_and_col= (node.nodeObject.line, node.nodeObject.column ), errorOption= 'uncompatible assing object') def visit_NodeBinaryOperation(self, @@ -415,4 +416,43 @@ def visit_NodeIsVoid(self, node: NodeIsVoid, previousEnv): if type(typeExpr) is error: return typeExpr return 'Bool' - \ No newline at end of file + + def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): + typeLeftMost= self.visit(node.expr, previousEnv= previousEnv) + if type(typeLeftMost) is error: + return typeLeftMost + + dispatchType= programContext.getType(idName= node.dispatch_type, + row_and_col= (node.line, node.columnType)) + if type(dispatchType) is error: + return dispatchType + + methodInfo= programContext.checkMethodInType(idType= node.dispatch_type, + idMethod= node.method, + row_and_col= (node.line, node.columnIdMethod)) + if type(methodInfo) is error: + return methodInfo + + typeExprOfArgsAndPosition = [] + for arg in node.arguments: + resultType= self.visit(node= arg, + environment = previousEnv) + + if type(resultType) is error: + return resultType + + typeExprOfArgsAndPosition.append((resultType, (arg.line, arg.column))) + + + checkingArgumentsResult= programContext.checkArgumentsInDispatch(typeExprOfArgsAndPosition, + methodInfo.argTypes) + + if type(checkingArgumentsResult) is error: + return checkingArgumentsResult + + + + return programContext.checkDispatchTypes(typeLeftMost= typeLeftMost, + typeRight= dispatchType.idName, + returnType= methodInfo.returnType, + row_and_col= (node.expr.line, node.expr.column)) From d6461fac0d3402c6c4b7774a4f6d961c4a1d3416 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 22 Dec 2020 18:07:15 -0500 Subject: [PATCH 66/96] Dispatch tests in semantic works --- src/compiler/utils/context.py | 36 +++++++++++++++------ src/compiler/utils/errors.py | 12 +++---- src/compiler/utils/visitors_definitions.py | 37 ++++++++++++++++------ src/coolc.sh | 2 +- src/makefile | 1 + 5 files changed, 62 insertions(+), 26 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index b1a36c76..e27d133a 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -246,7 +246,7 @@ def actualizeInheritMethod(self, nameClass= idName, methodName = childInfoMethod.idName if childInfoMethod else None, row_and_col= row_and_col - )or self.types[idName].inheritsMethods.update({ + )or (childInfoMethod and childInfoMethod.idName == parentInfoMethod.idName) or self.types[idName].inheritsMethods.update({ parentInfoMethod.idName: parentInfoMethod }) @@ -405,11 +405,10 @@ def checkDispatchTypes(self, typeLeftMost, typeRight, returnType, row_and_col): def checkMethodInType (self, idType, idMethod, row_and_col): - return interceptError(validationFunc= lambda: idMethod in self.types[idType].methods, + return interceptError(validationFunc= lambda: idMethod in self.types[idType].methods or idMethod in self.types[idType].inheritsMethods, errorOption= 'not method in class', - idType= idType, idMethod= idMethod, - row_and_col= row_and_col) or self.types[idType].methods[idMethod] + row_and_col= row_and_col) or self.types[idType].methods.get(idMethod, None) or self.types[idType].inheritsMethods.get(idMethod, None) def checkReturnType(self, nodeType , returnType, row_and_col, errorOption): @@ -455,15 +454,32 @@ def checkEqualOp(self, type1, type2, row_and_col): errorOption= 'comparison fail', row_and_col = row_and_col) or self.types['Bool'].idName - def checkArgumentsInDispatch(self, typeExprOfArgsAndPosition, argTypes): - badIndex = next((i for i in range(len( typeExprOfArgsAndPosition)) - if not self.isSubtype(subType=typeExprOfArgsAndPosition[i][0], + def checkArgumentsInDispatch(self, + node, + argNames, + typeExprOfArgs, + argTypes): + if len(typeExprOfArgs) != len(argTypes): + return error(error_type= 'SemanticError', + row_and_col= (node.line, node.column + 1), # I don't like this +1. It looks like a patch. + message= "Method %s called with wrong number of arguments." %(node.method)) + + badIndex = next((i for i in range(len( typeExprOfArgs)) + if not self.isSubtype(subType=typeExprOfArgs[i], superType= argTypes[i])), None) + (badArg, badType, realType, row_and_col)= (argNames[badIndex], + typeExprOfArgs[badIndex], + argTypes[badIndex], + (node.arguments[badIndex].expr.line, node.arguments[badIndex].expr.column)) if badIndex else (None, None, None, None) + return interceptError(validationFunc= lambda: not badIndex, errorOption= 'bad dispatch', - badArg= typeExprOfArgsAndPosition[badIndex][0] if badIndex else None, - realType= argTypes[badIndex] if badIndex else None, - row_and_col= typeExprOfArgsAndPosition[badIndex][1] if badIndex else None) + idMethod= node.method, + badArg= badArg, + badType= badType, + realType= realType, + row_and_col= row_and_col) + def LCA(self, idName1, idName2): diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 8131c492..4b9ff8c1 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -115,15 +115,15 @@ def __str__(self): row_and_col= row_and_col, message="Argument of 'not' has type %s instead of %s." %( type1, type2) ), - 'not method in class': lambda idType, idMethod, row_and_col= (0,0): error ( - error_type='SemanticError', + 'not method in class': lambda idMethod, row_and_col= (0,0): error ( + error_type='AttributeError', row_and_col= row_and_col, - message= "Method %s not found in type %s" %(idMethod, idType) + message= "Dispatch to undefined method %s." %(idMethod) ), - 'bad dispatch': lambda badArg, realType, row_and_col= (0,0): error( - error_type='SemanticError', + 'bad dispatch': lambda idMethod, badType, badArg, realType, row_and_col= (0,0): error( + error_type='TypeError', row_and_col= row_and_col, - message= "Argument %s is not subtype of %s" %(badArg, realType) + message= "In call of method %s, type %s of parameter %s does not conform to declared type %s." %(idMethod, badType, badArg, realType) ), 'bad static dispatch': lambda typeLef, typeRight, row_and_col= (0,0): error( error_type='TypeError', diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 17838492..dc967747 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -285,7 +285,8 @@ def visit_NodeBooleanComplement(self, def visit_NodeObject(self, node: NodeObject, previousEnv): - + if node.idName == 'self': + return previousEnv['wrapperType'] return programContext.searchValue(node, (node.line, node.column), previousEnv) @@ -298,6 +299,13 @@ def visit_NodeDynamicDispatch(self, previousEnv= previousEnv) if type (typeExpr) is error: return typeExpr + + methodInfo= programContext.checkMethodInType(idType= typeExpr, + idMethod = node.method, + row_and_col= (node.line, node.column + 1)) + if type(methodInfo) is error: + return methodInfo + argTypes = [] for arg in node.arguments: currenttypeExpr= self.visit(arg, @@ -306,8 +314,17 @@ def visit_NodeDynamicDispatch(self, return currenttypeExpr argTypes.append(currenttypeExpr) - return programContext.checkDynamicDispatch(typeExpr, - node.method, argTypes, (node.line, node.column)) + resultCheck= programContext.checkArgumentsInDispatch( + node, + methodInfo.argNames, + argTypes, + methodInfo.argTypes) + + if type(resultCheck) is error: + return resultCheck + + return methodInfo.returnType + def visit_NodeSelf(self, node: NodeSelf, previousEnv): return previousEnv['wrapperType'] @@ -324,6 +341,7 @@ def visit_NodeIntegerComplement(self, node: NodeIntegerComplement, def visit_NodeBlock(self, node: NodeBlock, previousEnv): blockType = None for expr in node.expr_list: + blockType = self.visit(expr, previousEnv= previousEnv) if type(blockType) is error: return blockType @@ -433,7 +451,7 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): if type(methodInfo) is error: return methodInfo - typeExprOfArgsAndPosition = [] + typeExprOfArgs = [] for arg in node.arguments: resultType= self.visit(node= arg, environment = previousEnv) @@ -441,17 +459,18 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): if type(resultType) is error: return resultType - typeExprOfArgsAndPosition.append((resultType, (arg.line, arg.column))) + typeExprOfArgs.append(resultType) - checkingArgumentsResult= programContext.checkArgumentsInDispatch(typeExprOfArgsAndPosition, - methodInfo.argTypes) + checkingArgumentsResult= programContext.checkArgumentsInDispatch( + node, + methodInfo.argNames, + typeExprOfArgs, + methodInfo.argTypes,) if type(checkingArgumentsResult) is error: return checkingArgumentsResult - - return programContext.checkDispatchTypes(typeLeftMost= typeLeftMost, typeRight= dispatchType.idName, returnType= methodInfo.returnType, diff --git a/src/coolc.sh b/src/coolc.sh index b6e7d50d..2c010d0e 100755 --- a/src/coolc.sh +++ b/src/coolc.sh @@ -15,6 +15,6 @@ echo "LINEA_CON_NOMBRE_Y_VERSION_DEL_COMPILADOR" # TODO: Recuerde cambiar echo "CopyLeft (L) 2020: Alejandro Díaz Roque, Rafael Horrach" # Llamar al compilador -python main.py "$@" +python3 main.py "$@" #echo "Compiling $INPUT_FILE into $OUTPUT_FILE" diff --git a/src/makefile b/src/makefile index 021189d6..0ef24e5c 100644 --- a/src/makefile +++ b/src/makefile @@ -9,3 +9,4 @@ clean: test: pytest ../tests -v --tb=short -m=${TAG} + From e69a2b3f924a227ec19b807ff8dbbd3e042f2a27 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 22 Dec 2020 19:06:38 -0500 Subject: [PATCH 67/96] All self tests works. All of them. Not just one. --- src/compiler/components/syntax_analyzer.py | 3 ++- src/compiler/utils/AST_definitions.py | 3 ++- src/compiler/utils/context.py | 6 +++++- src/compiler/utils/errors.py | 5 +++++ src/compiler/utils/visitors_definitions.py | 6 ++++-- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 7f0e5487..3a8409e4 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -199,7 +199,8 @@ def p_expression_assignment(self, p): column=self.real_col[ str(p.slice[1]) ]), expr= p[3], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[1]) ], + columnAssign= self.real_col[ str(p.slice[2]) ]) # ######################### UNARY OPERATIONS ####################################### diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 7b324797..45aee229 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -239,10 +239,11 @@ def to_readable(self): class NodeAssignment(NodeExpr): - def __init__(self, nodeObject, expr, line, column): + def __init__(self, nodeObject, expr, line, column, columnAssign): super().__init__(line= line, column= column) self.nodeObject = nodeObject self.expr = expr + self.columnAssign= columnAssign def to_tuple(self): return tuple([ diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index e27d133a..7e3bd9e7 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -378,9 +378,13 @@ def isSubtype(self, subType, superType): def checkAssign(self, nameObject, nodeType, returnType, - row_and_col, errorOption): + row_and_col, errorOption, columnAssign = 0): return interceptError ( + validationFunc= lambda: nameObject != 'self', + errorOption='self assign', + row_and_col= (row_and_col[0], columnAssign) + ) or interceptError ( validationFunc= lambda : nodeType in self.types, errorOption= 'undefined type', idName= nodeType, diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 4b9ff8c1..544c3bc7 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -129,6 +129,11 @@ def __str__(self): error_type='TypeError', row_and_col= row_and_col, message="Expression type %s does not conform to declared static dispatch type %s." %(typeLef, typeRight) + ), + 'self assign': lambda row_and_col= (0,0): error ( + error_type= 'SemanticError', + row_and_col= row_and_col, + message= "Cannot assign to 'self'." ) } diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index dc967747..49a6feef 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -187,7 +187,8 @@ def visit_NodeLet(self, node: NodeLet, previousEnv): node.type, exprType, row_and_col, - 'uncompatible assing object') + 'uncompatible assing object', + node.column) def visit_NodeAssignment(self, node: NodeAssignment, previousEnv): @@ -207,7 +208,8 @@ def visit_NodeAssignment(self, node: NodeAssignment, nodeType= resultObj, returnType= resultExpr, row_and_col= (node.nodeObject.line, node.nodeObject.column ), - errorOption= 'uncompatible assing object') + errorOption= 'uncompatible assing object', + columnAssign= node.columnAssign) def visit_NodeBinaryOperation(self, node: NodeBinaryOperation, From acadff62c3604d9edf977b67ddd366c37951d7a1 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 22 Dec 2020 20:16:33 -0500 Subject: [PATCH 68/96] Loops tests works --- src/compiler/components/syntax_analyzer.py | 2 +- src/compiler/utils/context.py | 7 +++++++ src/compiler/utils/errors.py | 5 +++++ src/compiler/utils/visitors_definitions.py | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 3a8409e4..2b17e5f5 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -166,7 +166,7 @@ def p_expression_string_constant(self, p): """ p[0]= NodeString(content= p[1], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[1]) ] - len(p[1]) - 1) #def p_expr_self(self, p): # """ diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 7e3bd9e7..af77a22e 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -425,6 +425,13 @@ def checkReturnType(self, nodeType , returnType, row_and_col, errorOption): row_and_col= row_and_col ) or returnType + def checkBoolInPredicate(self, node: NodeWhileLoop, resultExpr): + return interceptError( + validationFunc= lambda : resultExpr == 'Bool', + errorOption= 'bad predicate', + row_and_col= (node.line, node.predicate.column) + ) or 'Bool' + def checkNonRepetition(self, nodeActions): repetitionList = [] for action in nodeActions: diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 544c3bc7..6cf216a2 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -134,6 +134,11 @@ def __str__(self): error_type= 'SemanticError', row_and_col= row_and_col, message= "Cannot assign to 'self'." + ), + 'bad predicate': lambda row_and_col= (0,0): error ( + error_type= 'TypeError', + row_and_col= row_and_col, + message= 'Loop condition does not have type Bool.' ) } diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 49a6feef..261c3d20 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -477,3 +477,18 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): typeRight= dispatchType.idName, returnType= methodInfo.returnType, row_and_col= (node.expr.line, node.expr.column)) + + def visit_NodeWhileLoop(self, node: NodeWhileLoop, previousEnv): + resultExprPred = self.visit(node.predicate, previousEnv= previousEnv) + if type(resultExprPred) is error: + return resultExprPred + resultCheck = programContext.checkBoolInPredicate(node, resultExprPred) + if type(resultCheck) is error: + return resultCheck + + resultExpr = self.visit(node.body, previousEnv= previousEnv) + if type(resultExpr) is error: + return resultExpr + + return 'Object' + \ No newline at end of file From 1de9e65fa414b931e11d85f41afa417d6c70ae67 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 22 Dec 2020 21:00:21 -0500 Subject: [PATCH 69/96] 10 tests remain to be solved --- src/compiler/utils/context.py | 2 +- src/compiler/utils/errors.py | 4 ++-- src/compiler/utils/visitors_definitions.py | 18 +++++++++++++++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index af77a22e..6448f5e4 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -397,7 +397,7 @@ def checkAssign(self, nameObject, type1= returnType, type2= nodeType, row_and_col= row_and_col - ) or returnType + ) def checkDispatchTypes(self, typeLeftMost, typeRight, returnType, row_and_col): return interceptError(validationFunc= lambda: self.isSubtype(subType= typeLeftMost, diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 6cf216a2..0f3b6469 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -31,9 +31,9 @@ def __str__(self): message= 'Bad assign %s to %s' %(type1, type2) ), 'repeated attr': lambda idName, row_and_col=(0,0):error( - error_type='TypeError', + error_type='SemanticError', row_and_col=row_and_col, - message="The attribute %s is already defined in the current context" %idName + message="Attribute %s is multiply defined in class." %idName ), 'repeated method': lambda idName, row_and_col=(0,0):error( error_type='TypeError', diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index 261c3d20..ac4e2215 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -148,12 +148,16 @@ def visit_NodeAttr(self, node: NodeAttr, previousEnv): if type(typeExpr) is error: return typeExpr - return programContext.checkAssign(nameObject= node.idName, + resultCheckAssign= programContext.checkAssign(nameObject= node.idName, nodeType= node._type, returnType= typeExpr, row_and_col= (node.expr.line, node.expr.column) if node.expr else (node.line, node.column), errorOption= 'uncompatible assign attr') + if type(resultCheckAssign) is error: + return resultCheckAssign + + return node._type def visit_NodeLetComplex(self, node: NodeLetComplex, @@ -183,12 +187,16 @@ def visit_NodeLet(self, node: NodeLet, previousEnv): row_and_col = (node.body.line, node.body.column) if node.body else (node.line, node.column) - return programContext.checkAssign(node.idName, + resultCheckAssign= programContext.checkAssign(node.idName, node.type, exprType, row_and_col, 'uncompatible assing object', node.column) + if type(resultCheckAssign) is error: + return resultCheckAssign + + return node.type def visit_NodeAssignment(self, node: NodeAssignment, previousEnv): @@ -204,12 +212,16 @@ def visit_NodeAssignment(self, node: NodeAssignment, return resultExpr - return programContext.checkAssign(nameObject= node.nodeObject.idName, + resultCheckAssign= programContext.checkAssign(nameObject= node.nodeObject.idName, nodeType= resultObj, returnType= resultExpr, row_and_col= (node.nodeObject.line, node.nodeObject.column ), errorOption= 'uncompatible assing object', columnAssign= node.columnAssign) + if type(resultCheckAssign) is error: + return resultCheckAssign + + return resultExpr def visit_NodeBinaryOperation(self, node: NodeBinaryOperation, From e8e1527a9fd020b8c332d7bfc75df75cdc5024ed Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 22 Dec 2020 21:27:46 -0500 Subject: [PATCH 70/96] Feature tests works --- src/compiler/components/syntax_analyzer.py | 8 +++++--- src/compiler/utils/AST_definitions.py | 9 +++++---- src/compiler/utils/context.py | 8 +++++++- src/compiler/utils/errors.py | 9 +++++++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 2b17e5f5..5a90736e 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -111,15 +111,17 @@ def p_feature_attr_initialized(self, p): _type= p[3], expr= p[5], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[1]) ], + columnTypeAttr= self.real_col[ str(p.slice[3]) ]) def p_feature_attr(self, p): """ feature : ID COLON TYPE """ - p[0] = NodeAttr(idName= p[1], _type= p[3], expr= None , + p[0] = NodeAttr(idName= p[1], _type= p[3], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[1]) ], + columnTypeAttr= self.real_col[ str(p.slice[3]) ]) def p_formal_list_many(self, p): """ diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index 45aee229..b03614a0 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -103,11 +103,12 @@ def to_readable(self): class NodeAttr(NodeFeature): def __init__(self, idName, _type, - line, column, expr= None): + line, column, expr= None, columnTypeAttr= None): super().__init__(line= line, column= column) - self.idName = idName - self._type = _type - self.expr = expr + self.idName= idName + self._type= _type + self.expr= expr + self.columnTypeAttr= columnTypeAttr class NodeFormalParam(NodeFeature): def __init__(self, idName, param_type, line, column): diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 6448f5e4..e784a93b 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -293,7 +293,13 @@ def defineAttrInType(self, typeName: str, attr: NodeAttr): errorOption= 'repeated attr', idName= attr.idName, row_and_col= (attr.line, attr.column) - ) or self.types[typeName].attributes.update({ + ) or interceptError( + validationFunc= lambda: attr._type in self.types, + errorOption= 'undefined type in attr', + idAttr= attr.idName, + idBadType= attr._type, + row_and_col= (attr.line, attr.columnTypeAttr ) + ) or self.types[typeName].attributes.update({ attr.idName: Attribute(idName= attr.idName, _type= attr._type ) }) diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 0f3b6469..26530a73 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -25,6 +25,11 @@ def __str__(self): row_and_col= row_and_col, message= "The type %s doesn't exist in the current context" %idName, ), + 'undefined type in attr': lambda idAttr, idBadType, row_and_col= (0,0): error ( + error_type='TypeError', + row_and_col= row_and_col, + message= 'Class %s of attribute %s is undefined.' %(idBadType, idAttr) + ), 'uncompatible types': lambda type1, type2, row_and_col= (0,0): error ( error_type='TypeError', row_and_col= row_and_col, @@ -36,9 +41,9 @@ def __str__(self): message="Attribute %s is multiply defined in class." %idName ), 'repeated method': lambda idName, row_and_col=(0,0):error( - error_type='TypeError', + error_type='SemanticError', row_and_col=row_and_col, - message="The method %s is already defined in the current context" %idName + message="Method %s is multiply defined." %idName ), 'built-in inheritance': lambda idName, idParent, row_and_col=(0,0): error ( error_type='SemanticError', From 95ecc5cce72a1375f0402c2bc53dd49887f4b834 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 23 Dec 2020 16:37:39 -0500 Subject: [PATCH 71/96] It remains 5 test to pass. Only 5clear --- src/compiler/components/semantic_analyzer.py | 21 +- src/compiler/components/syntax_analyzer.py | 6 +- src/compiler/utils/AST_definitions.py | 4 +- src/compiler/utils/context.py | 249 +++++++++++-------- src/compiler/utils/errors.py | 10 + src/compiler/utils/visitors_definitions.py | 50 ++-- 6 files changed, 213 insertions(+), 127 deletions(-) diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic_analyzer.py index a0ffb7c2..62dd8f4d 100644 --- a/src/compiler/components/semantic_analyzer.py +++ b/src/compiler/components/semantic_analyzer.py @@ -9,10 +9,21 @@ def __init__(self, ast: NodeProgram): self.errors = [] def run_visits(self: NodeProgram): - typeCollectorResult, line_and_col_dict, parent_col_dict= TypeCollectorVisitor().visit(self.ast) + typeCollectorResult= TypeCollectorVisitor().visit(self.ast) + if typeCollectorResult: + self.errors += typeCollectorResult + return typeBuilderResult= TypeBuilderVisitor().visit(self.ast) - typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast, - line_and_col_dict= line_and_col_dict, - parent_col_dict = parent_col_dict) + if typeBuilderResult: + self.errors += typeBuilderResult + return + typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast) + if typeInheritanceResult: + self.errors += typeInheritanceResult + return typeCheckerResult= TypeCheckerVisitor().visit(self.ast) - self.errors+= typeCollectorResult + typeBuilderResult + typeInheritanceResult + typeCheckerResult + if typeCheckerResult: + self.errors += typeCheckerResult + return + + diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/syntax_analyzer.py index 5a90736e..cc5de3f7 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/syntax_analyzer.py @@ -90,7 +90,8 @@ def p_feature_method(self, p): returnType=p[6], body=p[8], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[1]) ], + columnType= self.real_col[ str(p.slice[6]) ]) def p_feature_method_no_formals(self, p): """ @@ -101,7 +102,8 @@ def p_feature_method_no_formals(self, p): returnType=p[5], body=p[7], line= p.slice[1].lineno, - column=self.real_col[ str(p.slice[1]) ]) + column=self.real_col[ str(p.slice[1]) ], + columnType= self.real_col[ str(p.slice[5]) ]) def p_feature_attr_initialized(self, p): """ diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/utils/AST_definitions.py index b03614a0..ac619438 100644 --- a/src/compiler/utils/AST_definitions.py +++ b/src/compiler/utils/AST_definitions.py @@ -88,12 +88,14 @@ def __init__(self, returnType: str, body, line, - column): + column, + columnType): super().__init__(line= line, column= column) self.idName = idName self.formal_param_list= formal_param_list self.returnType = returnType self.body = body + self.columnType= columnType def to_readable(self): return "{}(name='{}', formal_param_list={}, returnType={}, body={})".format( diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index e784a93b..4bd27915 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -21,6 +21,7 @@ def __init__(self, idName, attributes, self.builtIn= builtIn self.inheritsAttr= {} self.inheritsMethods= {} + self.children= {} class feature(jsonable): def __eq__(self, other): @@ -142,7 +143,16 @@ def __init__(self, dictionaries ={}): parent= 'Object') } - self.basics = [node.idName for node in self.types.values()] + for _type in self.types: + if _type != 'Object': + idParent= self.types[_type].parent + self.types[_type].inheritsAttr.update({ + attr.idName: attr for attr in self.types[idParent].attributes.values() + }) + self.types[_type].inheritsMethods.update({ + method.idName: method for method in self.types[idParent].methods.values() + }) + self.basics = [i for i in self.types] def createType(self, node: NodeClass): return interceptError( @@ -163,119 +173,146 @@ def createType(self, node: NodeClass): parent= node.parent if node else 'Object') }) - def relateInheritance(self, idName : str, parent: str, row_and_col, parent_col): - return idName == 'Object' or interceptError( - validationFunc= lambda: idName in self.types, + def checkGoodInheritance(self, node: NodeClass): + return interceptError( + validationFunc= lambda: node.idName in self.types, errorOption= 'undefined type', - idName= idName, - row_and_col= row_and_col + idName= node.idName, + row_and_col= (node.line, node.column) ) or interceptError ( - validationFunc= lambda: self.types[idName].parent in + validationFunc= lambda: node.parent in self.types, errorOption= 'undefined type', - idName= self.types[idName].parent, - row_and_col= (row_and_col[0], parent_col) + idName= node.parent, + row_and_col= (node.line, node.parent_col) ) or interceptError( - validationFunc= lambda: not self.types[parent].builtIn, + validationFunc= lambda: not self.types[node.parent].builtIn, errorOption= 'built-in inheritance', - idName= idName, - idParent= parent, - row_and_col= (row_and_col[0], parent_col) - ) or interceptError( - validationFunc= lambda: not self.isAncestor ( - idChild= idName, idParent= parent), + idName= node.idName, + idParent= node.parent, + row_and_col= (node.line, node.parent_col) + ) or interceptError ( + validationFunc= lambda: not node.idName == node.parent, + errorOption= 'inherit from itself', + idName= node.idName, + row_and_col= (node.line, node.column) + ) or interceptError( + validationFunc= lambda: not self.isSubtype ( + superType= node.idName, subType= node.parent), errorOption= 'inheritance from child', - idParent= parent, - idChild= idName, - row_and_col= (row_and_col[0], parent_col) - ) or not self.actualizeInherits(idName, parent, row_and_col) - - def actualizeInherits (self, idName, parentName, row_and_col): - for attr in self.types[parentName].attributes: - result= self.actualizeInheritAttr( - idName= idName, - childInfoAttr = self.types[idName].attributes.get(attr, None), - parentInfoAttr= self.types[parentName].attributes[attr], - row_and_col = row_and_col) - if type(result) is error: - return error - - for attr in self.types[parentName].inheritsAttr: - result = self.actualizeInheritAttr( - idName= idName, - childInfoAttr= self.types[idName].attributes.get(attr, None), - parentInfoAttr= self.types[parentName].inheritsAttr[attr], - row_and_col = row_and_col - ) - if type(result) is error: - return error - for method in self.types[parentName].methods: - result = self.actualizeInheritMethod( - idName= idName, - childInfoMethod= self.types[idName].methods.get(method, None), - parentInfoMethod= self.types[parentName].methods[method], - row_and_col = row_and_col - ) - if type(result) is error: - return result + idParent= node.parent, + idChild= node.idName, + row_and_col= (node.line, node.parent_col) + ) + + def checkGoodOverwriteMethod(self, node: NodeClassMethod, idType): + idParent= self.types[idType].parent + childInfoMethod= self.types[idType].methods.get(node.idName) + badIndexParam = lambda: next((i for i in range (len( childInfoMethod.argTypes)) + if childInfoMethod.argTypes[i] != parentInfoMethod.argTypes[i]), False) - for method in self.types[parentName].inheritsMethods: - result = self.actualizeInheritMethod( - idName= idName, - childInfoMethod= self.types[idName].methods.get(method, None), - parentInfoMethod= self.types[parentName].inheritsMethods[method], - row_and_col = row_and_col + parentInfoMethod= self.types[idParent].methods.get(node.idName, None) or self.types[idParent].inheritsMethods.get(node.idName, None) + if parentInfoMethod: + return interceptError( + validationFunc= lambda: len(node.formal_param_list) == len(parentInfoMethod.argTypes) , + errorOption= 'bad length in redefine', + row_and_col= (node.line, node.column) + ) or interceptError ( + validationFunc= lambda: not badIndexParam(), + errorOption= 'bad redefine method', + methodName= node.idName, + badType= node.formal_param_list[badIndexParam()]._type, + goodType= parentInfoMethod.argTypes[badIndexParam()], + row_and_col= (node.formal_param_list[badIndexParam()].line, + node.formal_param_list[badIndexParam()].column) + ) or interceptError ( + validationFunc = lambda: node.returnType == parentInfoMethod.returnType, + errorOption= 'bad returnType in redefine method', + methodName= node.idName, + badType= node.returnType, + goodType= parentInfoMethod.returnType, + row_and_col= (node.line, node.columnType) + ) + + def checkGoodOverwriteAttr(self, node: NodeAttr, idType): + idParent= self.types[idType].parent + parentInfoAttr= self.types[idParent].attributes.get(node.idName, None) or self.types[idParent].inheritsAttr.get(node.idName, None) + if parentInfoAttr: + return interceptError( + validationFunc= lambda : node._type == parentInfoAttr._type, + errorOption= 'bad redefine attr', + badAttr= node.idName, + badType= node._type, + goodType= parentInfoAttr._type, + row_and_col= (node.line, node.column) ) - if type(result) is error: - return result + def actualizeInherits(self, node: NodeClass): + idParent= self.types[node.idName].parent + self.actualizeFeatures(dictChild= self.types[node.idName].attributes, + dictToActualize= self.types[node.idName].inheritsAttr, + dictParent= self.types[idParent].inheritsAttr) + self.actualizeFeatures(dictChild= self.types[node.idName].attributes, + dictToActualize= self.types[node.idName].inheritsAttr, + dictParent= self.types[idParent].attributes) + self.actualizeFeatures(dictChild= self.types[node.idName].methods, + dictToActualize= self.types[node.idName].inheritsMethods, + dictParent= self.types[idParent].inheritsMethods) + self.actualizeFeatures(dictChild= self.types[node.idName].methods, + dictToActualize= self.types[node.idName].inheritsMethods, + dictParent= self.types[idParent].methods) - - def actualizeInheritMethod(self, - idName, - childInfoMethod: Method, - parentInfoMethod: Method, - row_and_col): - return interceptError( - validationFunc= lambda: not childInfoMethod or - childInfoMethod.returnType == parentInfoMethod.returnType and - len(childInfoMethod.argNames) == len(parentInfoMethod.argNames) and - childInfoMethod.argTypes == parentInfoMethod.argTypes, - errorOption= 'bad redefine method', - nameClass= idName, - methodName = childInfoMethod.idName if childInfoMethod else None, - row_and_col= row_and_col - )or (childInfoMethod and childInfoMethod.idName == parentInfoMethod.idName) or self.types[idName].inheritsMethods.update({ - parentInfoMethod.idName: parentInfoMethod - }) - def actualizeInheritAttr(self, - idName, - childInfoAttr: Attribute, - parentInfoAttr: Attribute, - row_and_col): - - return interceptError( - validationFunc= lambda: not (childInfoAttr and childInfoAttr._type != parentInfoAttr._type), - errorOption= "bad redefine attr", - nameClass= idName, - attrName= childInfoAttr.idName if childInfoAttr else None, - attrType= childInfoAttr._type if childInfoAttr else None, - row_and_col= row_and_col - ) or childInfoAttr or self.types[idName].inheritsAttr.update({ - parentInfoAttr.idName: parentInfoAttr + def actualizeFeatures(self, dictChild, dictToActualize, dictParent ): + dictToActualize.update({ + f.idName: f for f in dictParent.values() if not f.idName in dictChild }) - - def isAncestor(self, idChild: str, idParent: str): - - currentName = self.types[idParent].parent - while currentName != 'Object' and currentName != idChild and currentName != idParent: - try: - currentName = self.types[currentName].parent - except KeyError: - break - return currentName == idChild + +# def actualizeInheritMethod(self, +# idName, +# childInfoMethod: Method, +# parentInfoMethod: Method, +# row_and_col): +# badIndexParam= not childInfoMethod or next((i for i in range (len( childInfoMethod.argTypes)) +# if childInfoMethod.argTypes[i] != parentInfoMethod.argTypes[i]), False) +# return interceptError( +# validationFunc= lambda: not badIndexParam, +# errorOption= 'bad redefine method', +# nameClass= idName, +# badType = childInfoMethod.argTypes[badIndexParam] if badIndexParam else None, +# goodType = parentInfoMethod.argTypes[badIndexParam] if badIndexParam else None, +# row_and_col= row_and_col +# )or (childInfoMethod and childInfoMethod.idName == parentInfoMethod.idName) or self.types[idName].inheritsMethods.update({ +# parentInfoMethod.idName: parentInfoMethod +# }) +# +# def actualizeInheritAttr(self, +# idName, +# childInfoAttr: Attribute, +# parentInfoAttr: Attribute, +# row_and_col): +# +# return interceptError( +# validationFunc= lambda: not (childInfoAttr and childInfoAttr._type != parentInfoAttr._type), +# errorOption= "bad redefine attr", +# nameClass= idName, +# attrName= childInfoAttr.idName if childInfoAttr else None, +# attrType= childInfoAttr._type if childInfoAttr else None, +# row_and_col= row_and_col +# ) or childInfoAttr or self.types[idName].inheritsAttr.update({ +# parentInfoAttr.idName: parentInfoAttr +# }) +# +# def isAncestor(self, idChild: str, idParent: str): +# +# currentName = self.types[idParent].parent +# while currentName != 'Object' and currentName != idChild and currentName != idParent: +# try: +# currentName = self.types[currentName].parent +# except KeyError: +# break +# return currentName == idChild def getType(self, idName: str, row_and_col): return interceptError( @@ -306,6 +343,18 @@ def defineAttrInType(self, typeName: str, attr: NodeAttr): def defineMethod(self, typeName: str, node: NodeClassMethod): + appears = {} + for f in node.formal_param_list: + info = appears.get(f.idName, None) + if not info: + appears.update({f.idName: f}) + else: + return error( + error_type='SemanticError', + row_and_col= (f.line, f.column), + message= 'Formal parameter %s is multiply defined.' %f.idName + ) + return interceptError( validationFunc= lambda: not node.idName in self.types[typeName].methods, diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 26530a73..6aef07c9 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -144,6 +144,16 @@ def __str__(self): error_type= 'TypeError', row_and_col= row_and_col, message= 'Loop condition does not have type Bool.' + ), + 'bad redefine method': lambda methodName, badType, goodType, row_and_col= (0,0): error( + error_type= 'SemanticError', + row_and_col= row_and_col, + message ='In redefined method %s, parameter type %s is different from original type %s.' %(methodName, badType, goodType) + ), + 'bad returnType in redefine method': lambda methodName, badType, goodType, row_and_col= (0,0): error ( + error_type= 'SemanticError', + row_and_col= row_and_col, + message= 'In redefined method %s, return type %s is different from original return type %s.' %(methodName, badType, goodType) ) } diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index ac4e2215..c30a3d6a 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -21,39 +21,51 @@ class TypeCollectorVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): errors = [] - line_and_col = {} - parent_col_dict = {} for nodeClass in node.class_list: - line_and_col.update({ - nodeClass.idName: (nodeClass.line, nodeClass.column) - }) - parent_col_dict.update({ - nodeClass.idName: nodeClass.parent_col - }) result= self.visit(nodeClass) - if result: + if type (result) is error: # This ugly return is because we only need a one error, this is the panic mode! errors.append(result) - return errors, line_and_col, parent_col_dict + return errors def visit_NodeClass(self, node: NodeClass): # When we create a type, we store it in the context, if there is no errors return programContext.createType(node) class TypeInheritanceVisitor(NodeVisitor): - def visit_NodeProgram(self, node: NodeProgram, line_and_col_dict, parent_col_dict): + def visit_NodeProgram(self, node: NodeProgram): errors = [] - for _type in programContext.types: - result = self.visitForInherit(_type, - line_and_col_dict.get(_type, (0,0)), - parent_col_dict.get(_type, 0)) - if type (result) is error: + for nodeClass in node.class_list: + result = self.visit(nodeClass) + if result: errors.append(result) return errors - def visitForInherit(self, _type: str, line_and_col, parent_col): - return programContext.relateInheritance(_type, - programContext.types[_type].parent, line_and_col, parent_col) + def visit_NodeClass(self, node: NodeClass): + result= programContext.checkGoodInheritance(node) + if type(result) is error: + return result + for nodeAttr in node.attributes: + resultVisitAttr= self.visit(nodeAttr, idType= node.idName) + if type(resultVisitAttr) is error: + return resultVisitAttr + + for nodeClassMethod in node.methods: + resultVisitClassMethod= self.visit(nodeClassMethod, idType= node.idName) + if type(resultVisitClassMethod) is error: + return resultVisitClassMethod + + programContext.actualizeInherits(node) + + + def visit_NodeAttr(self, node: NodeAttr, idType): + return programContext.checkGoodOverwriteAttr(node, idType) + + + def visit_NodeClassMethod(self, node: NodeClassMethod, idType): + return programContext.checkGoodOverwriteMethod(node, idType) + + class TypeBuilderVisitor(NodeVisitor): def __init__(self): self.currentTypeName = '' From c6bbe86f936d9dfc4b93feae40f420a6e5238885 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 23 Dec 2020 16:43:25 -0500 Subject: [PATCH 72/96] It remains only the inheritance tests --- src/compiler/utils/context.py | 1 + src/compiler/utils/errors.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 4bd27915..371258e1 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -217,6 +217,7 @@ def checkGoodOverwriteMethod(self, node: NodeClassMethod, idType): return interceptError( validationFunc= lambda: len(node.formal_param_list) == len(parentInfoMethod.argTypes) , errorOption= 'bad length in redefine', + methodName= node.idName, row_and_col= (node.line, node.column) ) or interceptError ( validationFunc= lambda: not badIndexParam(), diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index 6aef07c9..bcd9e6f2 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -154,6 +154,11 @@ def __str__(self): error_type= 'SemanticError', row_and_col= row_and_col, message= 'In redefined method %s, return type %s is different from original return type %s.' %(methodName, badType, goodType) + ), + 'bad length in redefine': lambda methodName, row_and_col= (0,0): error ( + error_type='SemanticError', + row_and_col= row_and_col, + message= 'Incompatible number of formal parameters in redefined method %s.' %(methodName) ) } From c7bb9bb30f30a3144d79b523ae0cc989c38ee77e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 23 Dec 2020 17:38:29 -0500 Subject: [PATCH 73/96] Finished semantic phase --- src/compiler/utils/context.py | 31 ++++-------- src/compiler/utils/errors.py | 16 +++---- src/compiler/utils/functions_for_classes.py | 53 --------------------- src/compiler/utils/visitors_definitions.py | 6 +-- 4 files changed, 19 insertions(+), 87 deletions(-) delete mode 100644 src/compiler/utils/functions_for_classes.py diff --git a/src/compiler/utils/context.py b/src/compiler/utils/context.py index 371258e1..2a0f217c 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/utils/context.py @@ -160,11 +160,6 @@ def createType(self, node: NodeClass): errorOption= 'repeated class' if not node.idName in self.basics else 'repeated class basic', idName= node.idName, row_and_col = (node.line, node.column) - ) or interceptError ( - validationFunc= lambda: node.idName != node.parent, - errorOption= 'Inherit from itself', - idName= node.idName, - row_and_col = (node.line, node.column) )or self.types.update({ node.idName: Type (idName= node.idName, @@ -191,16 +186,10 @@ def checkGoodInheritance(self, node: NodeClass): idName= node.idName, idParent= node.parent, row_and_col= (node.line, node.parent_col) - ) or interceptError ( - validationFunc= lambda: not node.idName == node.parent, - errorOption= 'inherit from itself', - idName= node.idName, - row_and_col= (node.line, node.column) - ) or interceptError( + ) or interceptError( validationFunc= lambda: not self.isSubtype ( superType= node.idName, subType= node.parent), errorOption= 'inheritance from child', - idParent= node.parent, idChild= node.idName, row_and_col= (node.line, node.parent_col) ) @@ -236,18 +225,14 @@ def checkGoodOverwriteMethod(self, node: NodeClassMethod, idType): row_and_col= (node.line, node.columnType) ) - def checkGoodOverwriteAttr(self, node: NodeAttr, idType): + def checkNotOverwriteAttr(self, node: NodeAttr, idType): idParent= self.types[idType].parent - parentInfoAttr= self.types[idParent].attributes.get(node.idName, None) or self.types[idParent].inheritsAttr.get(node.idName, None) - if parentInfoAttr: - return interceptError( - validationFunc= lambda : node._type == parentInfoAttr._type, - errorOption= 'bad redefine attr', - badAttr= node.idName, - badType= node._type, - goodType= parentInfoAttr._type, - row_and_col= (node.line, node.column) - ) + return interceptError( + validationFunc= lambda : not (self.types[idParent].attributes.get(node.idName, None) or self.types[idParent].inheritsAttr.get(node.idName, None)), + errorOption= 'bad redefine attr', + badAttr= node.idName, + row_and_col= (node.line, node.column) + ) def actualizeInherits(self, node: NodeClass): idParent= self.types[node.idName].parent diff --git a/src/compiler/utils/errors.py b/src/compiler/utils/errors.py index bcd9e6f2..5da51633 100644 --- a/src/compiler/utils/errors.py +++ b/src/compiler/utils/errors.py @@ -50,15 +50,10 @@ def __str__(self): row_and_col=row_and_col, message="Class %s cannot inherit class %s." %(idName, idParent) ), - 'inheritance from child': lambda idChild, idParent, row_and_col=(0,0): error ( - error_type='TypeError', - row_and_col=row_and_col, - message="The class %s is an ancestor of %s class" %(idParent, idChild) - ), - 'Inherit from itself': lambda idName, row_and_col=(0,0): error ( - error_type='TypeError', + 'inheritance from child': lambda idChild, row_and_col=(0,0): error ( + error_type='SemanticError', row_and_col=row_and_col, - message="The class %s can't inherit from itself" %(idName) + message="Class %s, or an ancestor of %s, is involved in an inheritance cycle." %(idChild, idChild) ), 'undefined method in class': lambda idName, className, row_and_col=(0,0): error ( error_type= 'TypeError', @@ -159,6 +154,11 @@ def __str__(self): error_type='SemanticError', row_and_col= row_and_col, message= 'Incompatible number of formal parameters in redefined method %s.' %(methodName) + ), + 'bad redefine attr': lambda badAttr, row_and_col= (0,0) : error( + error_type= 'SemanticError', + row_and_col= row_and_col, + message= 'Attribute %s is an attribute of an inherited class.' %(badAttr) ) } diff --git a/src/compiler/utils/functions_for_classes.py b/src/compiler/utils/functions_for_classes.py deleted file mode 100644 index 4c765f8f..00000000 --- a/src/compiler/utils/functions_for_classes.py +++ /dev/null @@ -1,53 +0,0 @@ -from json import dumps - -class functionSerializable: - def __init__(self, func, - funcName, - params ): - self.func= func - self.funcName= funcName - self.params= params - - def __repr__(self): - return self.toJSON() - - def toJSON(self): - return dumps(self, default=lambda o: o.__dict__, - sort_keys=True, indent=4, separators=(',', ': ')) - - -class funcs: - abortFunc= functionSerializable ( - func= lambda: sys.exit('Error in program execution'), - funcName= "abortFunc", - params= []) - typeNameFunc= functionSerializable ( - func= lambda className: className, - funcName= "typeNameFunc", - params= ['className']) - copyFunc= functionSerializable ( - func= lambda className: self.types[className], - funcName= "copyFunc", - params= ["className"]) - outStringFunc= functionSerializable ( - func= lambda argument: print(argument) or 'SELF_TYPE', - funcName= "outStringFunc", - params= []) - outIntFunc= functionSerializable ( - func= lambda argument: print(argument) or 'SELF_TYPE', - funcName= "outIntFunc", - params= []) - readFromInputFunc= functionSerializable( - func= lambda: input(), - funcName= "readFromInputFunc", - params= []) - concatFunc= functionSerializable( - func= lambda selfVal, otherVal : selfVal + otherVal, - funcName= "concatFunc", - params= ["selfVal", "otherVal"]) - substrFunc= functionSerializable ( - func= lambda selfVal, i1, i2: selfVal[i1:i2], - funcName= "substrFunc", - params= ["selfVal", 'i1', "i2"]) - - diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/utils/visitors_definitions.py index c30a3d6a..0c585c68 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/utils/visitors_definitions.py @@ -36,9 +36,9 @@ def visit_NodeProgram(self, node: NodeProgram): errors = [] for nodeClass in node.class_list: result = self.visit(nodeClass) - if result: + if type(result) is error: errors.append(result) - return errors + return [errors.pop()] if errors else [] def visit_NodeClass(self, node: NodeClass): result= programContext.checkGoodInheritance(node) @@ -59,7 +59,7 @@ def visit_NodeClass(self, node: NodeClass): def visit_NodeAttr(self, node: NodeAttr, idType): - return programContext.checkGoodOverwriteAttr(node, idType) + return programContext.checkNotOverwriteAttr(node, idType) def visit_NodeClassMethod(self, node: NodeClassMethod, idType): From 39a0a0ee79b405ac206f658b466e4b5c990b47a8 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Wed, 23 Dec 2020 23:57:14 -0500 Subject: [PATCH 74/96] Changed the structure folder. Added some of generation --- .../components/generation/CIL_definitions.py | 183 ++++++++++++++ .../components/generation/__init__.py | 0 src/compiler/components/lexer/__init__.py | 0 .../components/lexer/lexer_analyzer.py | 231 ++++++++++++++++++ src/compiler/components/parser/__init__.py | 0 src/compiler/components/parser/parsetab.py | 86 +++++++ .../{ => parser}/syntax_analyzer.py | 6 +- .../semantic}/AST_definitions.py | 0 src/compiler/components/semantic/__init__.py | 0 .../{utils => components/semantic}/context.py | 50 +--- .../{ => semantic}/semantic_analyzer.py | 6 +- .../visitors_definitions.py | 6 +- src/compiler/initialize.py | 8 - src/compiler/utils/compiler_containers.py | 21 -- 14 files changed, 512 insertions(+), 85 deletions(-) create mode 100644 src/compiler/components/generation/CIL_definitions.py create mode 100644 src/compiler/components/generation/__init__.py create mode 100644 src/compiler/components/lexer/__init__.py create mode 100644 src/compiler/components/lexer/lexer_analyzer.py create mode 100644 src/compiler/components/parser/__init__.py create mode 100644 src/compiler/components/parser/parsetab.py rename src/compiler/components/{ => parser}/syntax_analyzer.py (99%) rename src/compiler/{utils => components/semantic}/AST_definitions.py (100%) create mode 100644 src/compiler/components/semantic/__init__.py rename src/compiler/{utils => components/semantic}/context.py (91%) rename src/compiler/components/{ => semantic}/semantic_analyzer.py (79%) rename src/compiler/{utils => components}/visitors_definitions.py (99%) delete mode 100644 src/compiler/initialize.py delete mode 100644 src/compiler/utils/compiler_containers.py diff --git a/src/compiler/components/generation/CIL_definitions.py b/src/compiler/components/generation/CIL_definitions.py new file mode 100644 index 00000000..330a991d --- /dev/null +++ b/src/compiler/components/generation/CIL_definitions.py @@ -0,0 +1,183 @@ +################################################################### +############### CIL TREE ################## +################################################################### +#The cilnodes have inside all that they need to transform to misp +class CilNode: + def __init__(self, code=""): + self.code = code + +class CilClassNode(CilNode): + def __init__(self, name, attrs=None, funcs=None, size=-1, code=""): + super().__init__(code) + self.name = name + self.attr_order = [] + self.attrs = attrs # [] -> CilIdNode + self.funcs = funcs # ["A_f"] -> CilFuncNode + +class CilFuncDeclNode(CilNode): + def __init__(self, label, body=None, formals=None, local_vars=None, retvalue=0, code = ""): + super().__init__(code) + self.label = label + self.formals = formals + self.locals = local_vars #List of instructions locals + self.body = body #List of instructions + self.retvalue = retvalue #rreturn value + +class CilFormalNode(CilNode): + def __init__(self, name, code=""): + super().__init__(code) + self.name = name + +class CilParamNode(CilNode): + def __init__(self, name, code=""): + super().__init__(code) + self.name = name + +class CilBackupNode(CilNode): + def __init__(self, name, code=""): + super().__init__(code) + self.name = name + +class CilRestoreNode(CilNode): + def __init__(self, name, code=""): + super().__init__(code) + self.name = name + +class CilGetAttrNode(CilNode): + def __init__(self, instance, attr, result, code=""): + super().__init__(code) + self.instance = instance + self.attr = attr + self.result = result + +class CilCallNode(CilNode): + def __init__(self, func_label, value, code=""): + super().__init__(code) + self.func_label = func_label + self.value = value + +class CilCondNode(CilNode): + def __init__(self, condvar, goto_label, code = ""): + super().__init__(code) + self.condvar = condvar + self.goto_label = goto_label + +class CilGoToNode(CilNode): + def __init__(self, label, code=""): + super().__init__(code) + self.label = label + +class CilLabelNode(CilNode): + def __init__(self, name, code=""): + super().__init__(code) + self.name = name + ":" + +class CilLoopNode(CilNode): + def __init__(self, condvar, label, code=""): + super().__init__(code) + self.condvar = condvar + self.label = label + +class CilDeclNode(CilNode): + def __init__(self, local_name, value, code=""): + super().__init__(code) + self.local_name = local_name + self.value = value + +class CilAssignNode(CilNode): + def __init__(self, lvalue, expr=None, code=""): + super().__init__(code) + self.lvalue = lvalue + self.expr = expr + +# ######################################################################################## +# ##################### UNOPS ######################################################## +# ######################################################################################## +class CilUnOpNode(CilNode): + # op param is just for building self.code + def __init__(self, operand, result, op=None): + self.operand = operand + self.result = result + self.op = op + self.code = result + " = " + op + " " + str(operand) + +class CilBooleanNotNode(CilUnOpNode): + def __init__(self, operand, result): + super().__init__(operand, result, "not") + +class CilIsVoidNode(CilUnOpNode): + def __init__(self, operand, result): + super().__init__(operand, result, "isvoid") + +class CilBinaryNotNode(CilUnOpNode): + def __init__(self, operand, result): + super().__init__(operand, result, "~") + +# ######################################################################################## +# ##################### BINOPS ######################################################## +# ######################################################################################## + +class CilBinOpNode(CilNode): + # op param is just for building self.code + def __init__(self, left, right, result, op=None): + self.left = left + self.right =right + self.result = result + self.op = op + self.code = result + " = " + str(left) + " " + op + " " + str(right) + +class CilSumNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "+") + +class CilMinusNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "-") + +class CilMultNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "*") + +class CilDivNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "/") + +class CilCmpLessNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "<") + +class CilCmpLessEqNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "<=") + +class CilCmpEqRefNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, add_result, "==") + +class CilCmpEqNode(CilBinOpNode): + def __init__(self, left, right, result): + super().__init__(left, right, result, "=") + +# ######################################################################################## +# ##################### TERMINALS ##################################################### +# ######################################################################################## + +class CilStringNode(CilNode): + # Ex: .data : .asciiz "Hello World!" + def __init__(self, label, addr): + self.label = label + self.addr = addr + +class CilAllocateNode(CilNode): + def __init__(self, typename, value, code=""): + self.code = "ALLOCATE {}".format(typename) + self.typename = typename + self.value = value + +class CilSetAttrNode(CilNode): + def __init__(self, instance, attr, value, code=""): + self.code = "SETATTR {} {} {}".format(instance, attr, value) + self.instance = instance + self.attr = attr + self.value = value + diff --git a/src/compiler/components/generation/__init__.py b/src/compiler/components/generation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/components/lexer/__init__.py b/src/compiler/components/lexer/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/components/lexer/lexer_analyzer.py b/src/compiler/components/lexer/lexer_analyzer.py new file mode 100644 index 00000000..a6de2e93 --- /dev/null +++ b/src/compiler/components/lexer/lexer_analyzer.py @@ -0,0 +1,231 @@ +import ply.lex as lex +from ply.lex import Token +from ply.lex import TOKEN +from compiler.utils.errors import error + +tokens = [ + # Identifiers + "ID", "TYPE", + + # Primitive Types + "INTEGER", "STRING", "BOOLEAN", + + # Literals + "LPAREN", "RPAREN", "LBRACE", "RBRACE", "COLON", "COMMA", "DOT", "SEMICOLON", "AT", + + # Operators + "PLUS", "MINUS", "MULTIPLY", "DIVIDE", "EQ", "LT", "LTEQ", "ASSIGN", "INT_COMP", + + # Special Operators + "ARROW" +] + +reserved = { + 'new':'NEW', + 'of':'OF', + 'if' : 'IF', + 'let':'LET', + 'in' : 'IN', + 'fi':'FI', + 'else' : 'ELSE', + 'while':'WHILE', + 'case':'CASE', + 'then' : 'THEN', + 'esac':'ESAC', + 'pool':'POOL', + 'class':'CLASS', + 'loop':'LOOP', + 'inherits':'INHERITS', + 'isvoid':'ISVOID', + "not": "NOT" +} + +tokens += list(reserved.values()) + +#Simple rules +t_PLUS = r'\+' +t_MINUS = r'\-' +t_MULTIPLY = r'\*' +t_DIVIDE = r'\/' +t_LPAREN = r'\(' +t_RPAREN = r'\)' +t_EQ = r'\=' +t_LT = r'\<' +t_LTEQ = r'\<\=' +t_ASSIGN = r'\<\-' +t_INT_COMP = r'~' +t_LBRACE = r'\{' +t_RBRACE = r'\}' +t_COLON = r'\:' +t_COMMA = r'\,' +t_DOT = r'\.' +t_SEMICOLON = r'\;' +t_AT = r'\@' +t_ARROW = r'\=\>' +#complex rules + +@TOKEN(r"(t[R|r][U|u][e|E]|f[a|A][l|L][s|S][e|E])") +def t_BOOLEAN(token): + token.value = token.value.lower() + return token + +@TOKEN(r"\d+") +def t_INTEGER(token): + token.value = int(token.value) + return token + +@TOKEN(r"[A-Z][A-Za-z0-9_]*") +def t_TYPE(token): + token.type = reserved.get(token.value.lower(), 'TYPE') + return token + +@TOKEN(r"[a-z][A-Za-z0-9_]*") +def t_ID(token): + token.type = reserved.get(token.value.lower(), "ID") + return token + +# Utility definitions +@TOKEN(r'\n+') +def t_newline(t): + global readjust_col + readjust_col = t.lexpos + len(t.value) + t.lexer.lineno += len(t.value) + +def t_error(token): + global readjust_col + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) + token.lexer.skip(1) + +t_ignore = ' \t' +t_ignore_COMMENTLINE = r"\-\-[^\n]*" + + +#Global states +states = ( + ("STRING", "exclusive"), + ("COMMENT", "exclusive") +) + +#The string states +@TOKEN(r'\"') +def t_start_string(token): + token.lexer.push_state("STRING") + token.lexer.string_backslashed = False + token.lexer.stringbuf = "" + +@TOKEN(r'\n') +def t_STRING_newline(token): + global readjust_col + token.lexer.lineno += 1 + if not token.lexer.string_backslashed: + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + message= "Unterminated string constant")) + token.lexer.pop_state() + else: + token.lexer.string_backslashed = False + readjust_col = token.lexpos + len(token.value) + +@TOKEN('\0') +def t_STRING_null(token): + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) + token.lexer.skip(1) + +@TOKEN(r'\"') +def t_STRING_end(token): + if not token.lexer.string_backslashed: + token.lexer.pop_state() + token.value = token.lexer.stringbuf + token.type = "STRING" + return token + else: + token.lexer.stringbuf += '"' + token.lexer.string_backslashed = False + +@TOKEN(r"[^\n]") +def t_STRING_anything(token): + if token.lexer.string_backslashed: + if token.value == 'b': + token.lexer.stringbuf += '\b' + elif token.value == 't': + token.lexer.stringbuf += '\t' + elif token.value == 'n': + token.lexer.stringbuf += '\n' + elif token.value == 'f': + token.lexer.stringbuf += '\f' + elif token.value == '\\': + token.lexer.stringbuf += '\\' + else: + token.lexer.stringbuf += token.value + token.lexer.string_backslashed = False + else: + if token.value != '\\': + token.lexer.stringbuf += token.value + else: + token.lexer.string_backslashed = True + +def t_STRING_error(token): + token.lexer.skip(1) + errors.append(error(error_type="LexicographicError", + row_and_col= (token.lineno, token.lexpos - readjust_col + 1), + message= 'ERROR at or near ')) + +def t_STRING_eof(token): + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) + token.lexer.pop_state() + +t_STRING_ignore = '' + +# The comment state + +@TOKEN(r"\(\*") +def t_start_comment(token): + token.lexer.push_state("COMMENT") + token.lexer.comment_count = 0 + +@TOKEN(r"\(\*") +def t_COMMENT_startanother(token): + token.lexer.comment_count += 1 + +@TOKEN(r"\n+") +def t_COMMENT_newline(token): + global readjust_col + readjust_col = token.lexpos + len(token.value) + token.lexer.lineno += len(token.value) + +@TOKEN(r"\*\)") +def t_COMMENT_end(token): + if token.lexer.comment_count == 0: + token.lexer.pop_state() + else: + token.lexer.comment_count -= 1 + + +def t_COMMENT_error(token): + token.lexer.skip(1) + +def t_COMMENT_eof(token): + global readjust_col + errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) + token.lexer.pop_state() + +t_COMMENT_ignore = '' +errors = [] + +def find_column(_input, token): + line_start = _input.rfind('\n', 0, token.lexpos) + 1 + return (token.lexpos - line_start) + 1 + +lexer = lex.lex() +def tokenizer(stream_input): + global readjust_col + readjust_col = 0 + lexer.input(stream_input) + token_list = [] + real_col = {} + for tok in lexer: + real_col.update({ str(tok): find_column(stream_input, tok) }) + token_list.append(tok) + + + return errors, token_list, real_col + diff --git a/src/compiler/components/parser/__init__.py b/src/compiler/components/parser/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/components/parser/parsetab.py b/src/compiler/components/parser/parsetab.py new file mode 100644 index 00000000..dd58bcd5 --- /dev/null +++ b/src/compiler/components/parser/parsetab.py @@ -0,0 +1,86 @@ + +# parsetab.py +# This file is automatically generated. Do not edit. +# pylint: disable=W,C,R +_tabversion = '3.10' + +_lr_method = 'LALR' + +_lr_signature = 'rightASSIGNrightNOTnonassocLTEQLTEQleftPLUSMINUSleftMULTIPLYDIVIDErightISVOIDrightINT_COMPleftATleftDOTARROW ASSIGN AT BOOLEAN CASE CLASS COLON COMMA DIVIDE DOT ELSE EQ ESAC FI ID IF IN INHERITS INTEGER INT_COMP ISVOID LBRACE LET LOOP LPAREN LT LTEQ MINUS MULTIPLY NEW NOT OF PLUS POOL RBRACE RPAREN SEMICOLON STRING THEN TYPE WHILE\n program : class_list\n \n class_list : class_list class SEMICOLON\n | class SEMICOLON\n \n class : CLASS TYPE LBRACE features_list_opt RBRACE\n \n class : CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE\n \n features_list_opt : features_list\n | empty\n \n features_list : features_list feature SEMICOLON\n | feature SEMICOLON\n \n feature : ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE\n \n feature : ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE\n \n feature : ID COLON TYPE ASSIGN expression\n \n feature : ID COLON TYPE\n \n formal_params_list : formal_params_list COMMA formal_param\n | formal_param\n \n formal_param : ID COLON TYPE\n \n expression : ID\n \n expression : INTEGER\n \n expression : BOOLEAN\n \n expression : STRING\n \n expression : LBRACE block_list RBRACE\n \n block_list : block_list expression SEMICOLON\n | expression SEMICOLON\n \n expression : ID ASSIGN expression\n \n expression : NEW TYPE\n \n expression : ISVOID expression\n \n expression : INT_COMP expression\n \n expression : NOT expression\n \n expression : expression PLUS expression\n | expression MINUS expression\n | expression MULTIPLY expression\n | expression DIVIDE expression\n \n expression : expression LT expression\n | expression LTEQ expression\n | expression EQ expression\n \n expression : LPAREN expression RPAREN\n \n expression : IF expression THEN expression ELSE expression FI\n \n expression : WHILE expression LOOP expression POOL\n \n expression : let_expression\n \n let_expression : LET nested_lets IN expression\n \n nested_lets : ID COLON TYPE\n | nested_lets COMMA ID COLON TYPE\n \n nested_lets : ID COLON TYPE ASSIGN expression\n | nested_lets COMMA ID COLON TYPE ASSIGN expression\n \n expression : CASE expression OF actions_list ESAC\n \n actions_list : actions_list action\n | action\n \n action : ID COLON TYPE ARROW expression SEMICOLON\n \n expression : expression DOT ID LPAREN arguments_list_opt RPAREN\n \n arguments_list_opt : arguments_list\n | empty\n \n arguments_list : arguments_list COMMA expression\n | expression\n \n expression : expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN\n \n expression : ID LPAREN arguments_list_opt RPAREN\n \n empty :\n ' + +_lr_action_items = {'CLASS':([0,2,6,8,],[4,4,-3,-2,]),'$end':([1,2,6,8,],[0,-1,-3,-2,]),'SEMICOLON':([3,5,14,17,18,28,35,40,41,42,43,44,53,70,71,72,73,74,83,88,89,90,91,92,93,94,97,98,100,108,109,119,122,127,128,133,140,143,144,],[6,8,19,-4,23,-13,-5,-17,-12,-18,-19,-20,-39,99,-25,-26,-27,-28,-24,-29,-30,-31,-32,-33,-34,-35,-21,113,-36,-11,-55,-40,-10,-38,-45,-49,-37,-54,146,]),'TYPE':([4,10,21,30,33,37,46,68,106,130,131,],[7,16,28,36,39,56,71,96,121,136,137,]),'LBRACE':([7,16,34,39,45,47,48,49,50,51,52,54,56,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[9,22,45,57,45,45,45,45,45,45,45,45,81,45,45,45,45,45,45,45,45,45,45,45,45,-23,45,45,45,45,45,-22,45,45,45,45,45,]),'INHERITS':([7,],[10,]),'RBRACE':([9,11,12,13,19,22,23,29,40,42,43,44,53,69,71,72,73,74,82,83,88,89,90,91,92,93,94,97,99,100,107,109,113,119,127,128,133,140,143,],[-56,17,-6,-7,-9,-56,-8,35,-17,-18,-19,-20,-39,97,-25,-26,-27,-28,108,-24,-29,-30,-31,-32,-33,-34,-35,-21,-23,-36,122,-55,-22,-40,-38,-45,-49,-37,-54,]),'ID':([9,12,19,20,22,23,32,34,45,47,48,49,50,51,52,54,55,57,58,59,60,61,62,63,64,65,66,67,69,81,99,101,102,103,104,105,110,111,112,113,116,117,126,129,132,134,141,142,146,],[15,15,-9,24,15,-8,24,40,40,40,40,40,40,40,40,40,80,40,40,40,40,40,40,40,40,40,40,95,40,40,-23,40,40,118,40,120,40,40,125,-22,118,-47,40,-46,40,40,40,40,-48,]),'LPAREN':([15,34,40,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,95,99,101,102,104,110,111,113,125,126,132,134,141,142,],[20,50,59,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,111,-23,50,50,50,50,50,-22,134,50,50,50,50,50,]),'COLON':([15,24,26,31,80,118,120,],[21,30,33,37,106,130,131,]),'RPAREN':([20,25,27,36,38,40,42,43,44,53,59,71,72,73,74,75,83,84,85,86,87,88,89,90,91,92,93,94,97,100,109,111,119,123,124,127,128,133,134,139,140,143,],[26,31,-15,-16,-14,-17,-18,-19,-20,-39,-56,-25,-26,-27,-28,100,-24,109,-50,-51,-53,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-56,-40,-52,133,-38,-45,-49,-56,143,-37,-54,]),'COMMA':([25,27,36,38,40,42,43,44,53,71,72,73,74,79,83,85,87,88,89,90,91,92,93,94,97,100,109,119,121,123,127,128,133,137,138,140,143,145,],[32,-15,-16,-14,-17,-18,-19,-20,-39,-25,-26,-27,-28,105,-24,110,-53,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-40,-41,-52,-38,-45,-49,-42,-43,-37,-54,-44,]),'ASSIGN':([28,40,121,137,],[34,58,132,142,]),'INTEGER':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,-23,42,42,42,42,42,-22,42,42,42,42,42,]),'BOOLEAN':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,-23,43,43,43,43,43,-22,43,43,43,43,43,]),'STRING':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,-23,44,44,44,44,44,-22,44,44,44,44,44,]),'NEW':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,-23,46,46,46,46,46,-22,46,46,46,46,46,]),'ISVOID':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,-23,47,47,47,47,47,-22,47,47,47,47,47,]),'INT_COMP':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,-23,48,48,48,48,48,-22,48,48,48,48,48,]),'NOT':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,-23,49,49,49,49,49,-22,49,49,49,49,49,]),'IF':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,-23,51,51,51,51,51,-22,51,51,51,51,51,]),'WHILE':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,-23,52,52,52,52,52,-22,52,52,52,52,52,]),'CASE':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,-23,54,54,54,54,54,-22,54,54,54,54,54,]),'LET':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,99,101,102,104,110,111,113,126,132,134,141,142,],[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,-23,55,55,55,55,55,-22,55,55,55,55,55,]),'PLUS':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,60,-18,-19,-20,-39,60,-25,-26,-27,60,60,60,60,60,60,60,60,-29,-30,-31,-32,60,60,60,-21,60,-36,60,-55,60,60,60,60,-38,-45,-49,60,60,-37,-54,60,60,]),'MINUS':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,61,-18,-19,-20,-39,61,-25,-26,-27,61,61,61,61,61,61,61,61,-29,-30,-31,-32,61,61,61,-21,61,-36,61,-55,61,61,61,61,-38,-45,-49,61,61,-37,-54,61,61,]),'MULTIPLY':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,62,-18,-19,-20,-39,62,-25,-26,-27,62,62,62,62,62,62,62,62,62,62,-31,-32,62,62,62,-21,62,-36,62,-55,62,62,62,62,-38,-45,-49,62,62,-37,-54,62,62,]),'DIVIDE':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,63,-18,-19,-20,-39,63,-25,-26,-27,63,63,63,63,63,63,63,63,63,63,-31,-32,63,63,63,-21,63,-36,63,-55,63,63,63,63,-38,-45,-49,63,63,-37,-54,63,63,]),'LT':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,64,-18,-19,-20,-39,64,-25,-26,-27,64,64,64,64,64,64,64,64,-29,-30,-31,-32,None,None,None,-21,64,-36,64,-55,64,64,64,64,-38,-45,-49,64,64,-37,-54,64,64,]),'LTEQ':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,65,-18,-19,-20,-39,65,-25,-26,-27,65,65,65,65,65,65,65,65,-29,-30,-31,-32,None,None,None,-21,65,-36,65,-55,65,65,65,65,-38,-45,-49,65,65,-37,-54,65,65,]),'EQ':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,66,-18,-19,-20,-39,66,-25,-26,-27,66,66,66,66,66,66,66,66,-29,-30,-31,-32,None,None,None,-21,66,-36,66,-55,66,66,66,66,-38,-45,-49,66,66,-37,-54,66,66,]),'DOT':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,96,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,67,-18,-19,-20,-39,67,-25,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,112,-21,67,-36,67,-55,67,67,67,67,-38,-45,-49,67,67,-37,-54,67,67,]),'AT':([40,41,42,43,44,53,70,71,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,97,98,100,107,109,114,115,119,123,127,128,133,135,138,140,143,144,145,],[-17,68,-18,-19,-20,-39,68,-25,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,-21,68,-36,68,-55,68,68,68,68,-38,-45,-49,68,68,-37,-54,68,68,]),'THEN':([40,42,43,44,53,71,72,73,74,76,83,88,89,90,91,92,93,94,97,100,109,119,127,128,133,140,143,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,101,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-40,-38,-45,-49,-37,-54,]),'LOOP':([40,42,43,44,53,71,72,73,74,77,83,88,89,90,91,92,93,94,97,100,109,119,127,128,133,140,143,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,102,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-40,-38,-45,-49,-37,-54,]),'OF':([40,42,43,44,53,71,72,73,74,78,83,88,89,90,91,92,93,94,97,100,109,119,127,128,133,140,143,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,103,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-40,-38,-45,-49,-37,-54,]),'ELSE':([40,42,43,44,53,71,72,73,74,83,88,89,90,91,92,93,94,97,100,109,114,119,127,128,133,140,143,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,126,-40,-38,-45,-49,-37,-54,]),'POOL':([40,42,43,44,53,71,72,73,74,83,88,89,90,91,92,93,94,97,100,109,115,119,127,128,133,140,143,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,127,-40,-38,-45,-49,-37,-54,]),'FI':([40,42,43,44,53,71,72,73,74,83,88,89,90,91,92,93,94,97,100,109,119,127,128,133,135,140,143,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-40,-38,-45,-49,140,-37,-54,]),'IN':([40,42,43,44,53,71,72,73,74,79,83,88,89,90,91,92,93,94,97,100,109,119,121,127,128,133,137,138,140,143,145,],[-17,-18,-19,-20,-39,-25,-26,-27,-28,104,-24,-29,-30,-31,-32,-33,-34,-35,-21,-36,-55,-40,-41,-38,-45,-49,-42,-43,-37,-54,-44,]),'ESAC':([116,117,129,146,],[128,-47,-46,-48,]),'ARROW':([136,],[141,]),} + +_lr_action = {} +for _k, _v in _lr_action_items.items(): + for _x,_y in zip(_v[0],_v[1]): + if not _x in _lr_action: _lr_action[_x] = {} + _lr_action[_x][_k] = _y +del _lr_action_items + +_lr_goto_items = {'program':([0,],[1,]),'class_list':([0,],[2,]),'class':([0,2,],[3,5,]),'features_list_opt':([9,22,],[11,29,]),'features_list':([9,22,],[12,12,]),'empty':([9,22,59,111,134,],[13,13,86,86,86,]),'feature':([9,12,22,],[14,18,14,]),'formal_params_list':([20,],[25,]),'formal_param':([20,32,],[27,38,]),'expression':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,101,102,104,110,111,126,132,134,141,142,],[41,70,72,73,74,75,76,77,78,82,83,87,88,89,90,91,92,93,94,98,107,114,115,119,123,87,135,138,87,144,145,]),'let_expression':([34,45,47,48,49,50,51,52,54,57,58,59,60,61,62,63,64,65,66,69,81,101,102,104,110,111,126,132,134,141,142,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'block_list':([45,],[69,]),'nested_lets':([55,],[79,]),'arguments_list_opt':([59,111,134,],[84,124,139,]),'arguments_list':([59,111,134,],[85,85,85,]),'actions_list':([103,],[116,]),'action':([103,116,],[117,129,]),} + +_lr_goto = {} +for _k, _v in _lr_goto_items.items(): + for _x, _y in zip(_v[0], _v[1]): + if not _x in _lr_goto: _lr_goto[_x] = {} + _lr_goto[_x][_k] = _y +del _lr_goto_items +_lr_productions = [ + ("S' -> program","S'",1,None,None,None), + ('program -> class_list','program',1,'p_program','syntax_analyzer.py',29), + ('class_list -> class_list class SEMICOLON','class_list',3,'p_class_list','syntax_analyzer.py',35), + ('class_list -> class SEMICOLON','class_list',2,'p_class_list','syntax_analyzer.py',36), + ('class -> CLASS TYPE LBRACE features_list_opt RBRACE','class',5,'p_class','syntax_analyzer.py',42), + ('class -> CLASS TYPE INHERITS TYPE LBRACE features_list_opt RBRACE','class',7,'p_class_inherits','syntax_analyzer.py',53), + ('features_list_opt -> features_list','features_list_opt',1,'p_feature_list_opt','syntax_analyzer.py',65), + ('features_list_opt -> empty','features_list_opt',1,'p_feature_list_opt','syntax_analyzer.py',66), + ('features_list -> features_list feature SEMICOLON','features_list',3,'p_feature_list','syntax_analyzer.py',72), + ('features_list -> feature SEMICOLON','features_list',2,'p_feature_list','syntax_analyzer.py',73), + ('feature -> ID LPAREN formal_params_list RPAREN COLON TYPE LBRACE expression RBRACE','feature',9,'p_feature_method','syntax_analyzer.py',86), + ('feature -> ID LPAREN RPAREN COLON TYPE LBRACE expression RBRACE','feature',8,'p_feature_method_no_formals','syntax_analyzer.py',98), + ('feature -> ID COLON TYPE ASSIGN expression','feature',5,'p_feature_attr_initialized','syntax_analyzer.py',110), + ('feature -> ID COLON TYPE','feature',3,'p_feature_attr','syntax_analyzer.py',121), + ('formal_params_list -> formal_params_list COMMA formal_param','formal_params_list',3,'p_formal_list_many','syntax_analyzer.py',130), + ('formal_params_list -> formal_param','formal_params_list',1,'p_formal_list_many','syntax_analyzer.py',131), + ('formal_param -> ID COLON TYPE','formal_param',3,'p_formal','syntax_analyzer.py',137), + ('expression -> ID','expression',1,'p_expression_object_identifier','syntax_analyzer.py',145), + ('expression -> INTEGER','expression',1,'p_expression_integer_constant','syntax_analyzer.py',153), + ('expression -> BOOLEAN','expression',1,'p_expression_boolean_constant','syntax_analyzer.py',161), + ('expression -> STRING','expression',1,'p_expression_string_constant','syntax_analyzer.py',169), + ('expression -> LBRACE block_list RBRACE','expression',3,'p_expression_block','syntax_analyzer.py',184), + ('block_list -> block_list expression SEMICOLON','block_list',3,'p_block_list','syntax_analyzer.py',192), + ('block_list -> expression SEMICOLON','block_list',2,'p_block_list','syntax_analyzer.py',193), + ('expression -> ID ASSIGN expression','expression',3,'p_expression_assignment','syntax_analyzer.py',199), + ('expression -> NEW TYPE','expression',2,'p_expression_new','syntax_analyzer.py',213), + ('expression -> ISVOID expression','expression',2,'p_expression_isvoid','syntax_analyzer.py',222), + ('expression -> INT_COMP expression','expression',2,'p_expression_integer_complement','syntax_analyzer.py',230), + ('expression -> NOT expression','expression',2,'p_expression_boolean_complement','syntax_analyzer.py',239), + ('expression -> expression PLUS expression','expression',3,'p_expression_math_operations','syntax_analyzer.py',249), + ('expression -> expression MINUS expression','expression',3,'p_expression_math_operations','syntax_analyzer.py',250), + ('expression -> expression MULTIPLY expression','expression',3,'p_expression_math_operations','syntax_analyzer.py',251), + ('expression -> expression DIVIDE expression','expression',3,'p_expression_math_operations','syntax_analyzer.py',252), + ('expression -> expression LT expression','expression',3,'p_expression_math_comparisons','syntax_analyzer.py',273), + ('expression -> expression LTEQ expression','expression',3,'p_expression_math_comparisons','syntax_analyzer.py',274), + ('expression -> expression EQ expression','expression',3,'p_expression_math_comparisons','syntax_analyzer.py',275), + ('expression -> LPAREN expression RPAREN','expression',3,'p_expression_with_parenthesis','syntax_analyzer.py',292), + ('expression -> IF expression THEN expression ELSE expression FI','expression',7,'p_expression_if_conditional','syntax_analyzer.py',300), + ('expression -> WHILE expression LOOP expression POOL','expression',5,'p_expression_while_loop','syntax_analyzer.py',308), + ('expression -> let_expression','expression',1,'p_expression_let','syntax_analyzer.py',317), + ('let_expression -> LET nested_lets IN expression','let_expression',4,'p_expression_let_simple','syntax_analyzer.py',323), + ('nested_lets -> ID COLON TYPE','nested_lets',3,'p_nested_lets_simple','syntax_analyzer.py',331), + ('nested_lets -> nested_lets COMMA ID COLON TYPE','nested_lets',5,'p_nested_lets_simple','syntax_analyzer.py',332), + ('nested_lets -> ID COLON TYPE ASSIGN expression','nested_lets',5,'p_nested_lets_initialize','syntax_analyzer.py',348), + ('nested_lets -> nested_lets COMMA ID COLON TYPE ASSIGN expression','nested_lets',7,'p_nested_lets_initialize','syntax_analyzer.py',349), + ('expression -> CASE expression OF actions_list ESAC','expression',5,'p_expression_case','syntax_analyzer.py',371), + ('actions_list -> actions_list action','actions_list',2,'p_actions_list','syntax_analyzer.py',379), + ('actions_list -> action','actions_list',1,'p_actions_list','syntax_analyzer.py',380), + ('action -> ID COLON TYPE ARROW expression SEMICOLON','action',6,'p_action_expr','syntax_analyzer.py',386), + ('expression -> expression DOT ID LPAREN arguments_list_opt RPAREN','expression',6,'p_expression_dispatch','syntax_analyzer.py',399), + ('arguments_list_opt -> arguments_list','arguments_list_opt',1,'p_arguments_list_opt','syntax_analyzer.py',408), + ('arguments_list_opt -> empty','arguments_list_opt',1,'p_arguments_list_opt','syntax_analyzer.py',409), + ('arguments_list -> arguments_list COMMA expression','arguments_list',3,'p_arguments_list','syntax_analyzer.py',415), + ('arguments_list -> expression','arguments_list',1,'p_arguments_list','syntax_analyzer.py',416), + ('expression -> expression AT TYPE DOT ID LPAREN arguments_list_opt RPAREN','expression',8,'p_expression_static_dispatch','syntax_analyzer.py',422), + ('expression -> ID LPAREN arguments_list_opt RPAREN','expression',4,'p_expression_self_dispatch','syntax_analyzer.py',433), + ('empty -> ','empty',0,'p_empty','syntax_analyzer.py',446), +] diff --git a/src/compiler/components/syntax_analyzer.py b/src/compiler/components/parser/syntax_analyzer.py similarity index 99% rename from src/compiler/components/syntax_analyzer.py rename to src/compiler/components/parser/syntax_analyzer.py index cc5de3f7..8087f35e 100644 --- a/src/compiler/components/syntax_analyzer.py +++ b/src/compiler/components/parser/syntax_analyzer.py @@ -1,8 +1,8 @@ import ply.yacc as yacc from ply.yacc import YaccProduction, YaccSymbol -from ..utils.errors import error -from ..utils.AST_definitions import * -from ..components.lexer_analyzer import lexer +from compiler.utils.errors import error +from compiler.components.semantic.AST_definitions import * +from ..lexer.lexer_analyzer import lexer class pyCoolParser: def __init__(self, tokens, source_program, real_col): diff --git a/src/compiler/utils/AST_definitions.py b/src/compiler/components/semantic/AST_definitions.py similarity index 100% rename from src/compiler/utils/AST_definitions.py rename to src/compiler/components/semantic/AST_definitions.py diff --git a/src/compiler/components/semantic/__init__.py b/src/compiler/components/semantic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/compiler/utils/context.py b/src/compiler/components/semantic/context.py similarity index 91% rename from src/compiler/utils/context.py rename to src/compiler/components/semantic/context.py index 2a0f217c..511a747a 100644 --- a/src/compiler/utils/context.py +++ b/src/compiler/components/semantic/context.py @@ -1,5 +1,5 @@ -from ..utils.AST_definitions import * -from ..utils.errors import error, interceptError +from .AST_definitions import * +from compiler.utils.errors import error, interceptError import json import sys @@ -254,51 +254,7 @@ def actualizeFeatures(self, dictChild, dictToActualize, dictParent ): dictToActualize.update({ f.idName: f for f in dictParent.values() if not f.idName in dictChild }) - -# def actualizeInheritMethod(self, -# idName, -# childInfoMethod: Method, -# parentInfoMethod: Method, -# row_and_col): -# badIndexParam= not childInfoMethod or next((i for i in range (len( childInfoMethod.argTypes)) -# if childInfoMethod.argTypes[i] != parentInfoMethod.argTypes[i]), False) -# return interceptError( -# validationFunc= lambda: not badIndexParam, -# errorOption= 'bad redefine method', -# nameClass= idName, -# badType = childInfoMethod.argTypes[badIndexParam] if badIndexParam else None, -# goodType = parentInfoMethod.argTypes[badIndexParam] if badIndexParam else None, -# row_and_col= row_and_col -# )or (childInfoMethod and childInfoMethod.idName == parentInfoMethod.idName) or self.types[idName].inheritsMethods.update({ -# parentInfoMethod.idName: parentInfoMethod -# }) -# -# def actualizeInheritAttr(self, -# idName, -# childInfoAttr: Attribute, -# parentInfoAttr: Attribute, -# row_and_col): -# -# return interceptError( -# validationFunc= lambda: not (childInfoAttr and childInfoAttr._type != parentInfoAttr._type), -# errorOption= "bad redefine attr", -# nameClass= idName, -# attrName= childInfoAttr.idName if childInfoAttr else None, -# attrType= childInfoAttr._type if childInfoAttr else None, -# row_and_col= row_and_col -# ) or childInfoAttr or self.types[idName].inheritsAttr.update({ -# parentInfoAttr.idName: parentInfoAttr -# }) -# -# def isAncestor(self, idChild: str, idParent: str): -# -# currentName = self.types[idParent].parent -# while currentName != 'Object' and currentName != idChild and currentName != idParent: -# try: -# currentName = self.types[currentName].parent -# except KeyError: -# break -# return currentName == idChild + def getType(self, idName: str, row_and_col): return interceptError( diff --git a/src/compiler/components/semantic_analyzer.py b/src/compiler/components/semantic/semantic_analyzer.py similarity index 79% rename from src/compiler/components/semantic_analyzer.py rename to src/compiler/components/semantic/semantic_analyzer.py index 62dd8f4d..c0d5b4c1 100644 --- a/src/compiler/components/semantic_analyzer.py +++ b/src/compiler/components/semantic/semantic_analyzer.py @@ -1,6 +1,6 @@ -from ..utils.visitors_definitions import TypeCollectorVisitor, TypeBuilderVisitor, TypeInheritanceVisitor, TypeCheckerVisitor -from ..utils.AST_definitions import NodeProgram -from ..utils.context import programContext +from ..visitors_definitions import TypeCollectorVisitor, TypeBuilderVisitor, TypeInheritanceVisitor, TypeCheckerVisitor +from .AST_definitions import NodeProgram +from .context import programContext class semanticAnalyzer: diff --git a/src/compiler/utils/visitors_definitions.py b/src/compiler/components/visitors_definitions.py similarity index 99% rename from src/compiler/utils/visitors_definitions.py rename to src/compiler/components/visitors_definitions.py index 0c585c68..18c9bd0f 100644 --- a/src/compiler/utils/visitors_definitions.py +++ b/src/compiler/components/visitors_definitions.py @@ -1,6 +1,6 @@ -from ..utils.AST_definitions import * -from ..utils.context import programContext -from ..utils.errors import error +from ..components.semantic.AST_definitions import * +from ..components.semantic.context import programContext +from compiler.utils.errors import error class NodeVisitor: diff --git a/src/compiler/initialize.py b/src/compiler/initialize.py deleted file mode 100644 index 7ebf2a62..00000000 --- a/src/compiler/initialize.py +++ /dev/null @@ -1,8 +0,0 @@ -from utils import compiler_containers - -class compiler: - def __init__(self, lexer, parser): - self.symbolTable = {} - self.lexer = lexer - self.parser = parser - pass \ No newline at end of file diff --git a/src/compiler/utils/compiler_containers.py b/src/compiler/utils/compiler_containers.py deleted file mode 100644 index 9484d1a7..00000000 --- a/src/compiler/utils/compiler_containers.py +++ /dev/null @@ -1,21 +0,0 @@ -from dependency_injector import containers, providers -from ..components import dummy_component, lexer_analyzer -from ..utils import lexer_definitions - -component_injector = { - 'lexer_options': { 'dummy': dummy_component, - 'cool' : lexer_analyzer }, - 'parser_options': {'dummy' : dummy_component} - } - -params_for_component = { - 'lexer' : { - 'cool' : { - 'basic_keywords': lexer_definitions.basic_keywords, - 'simple_rules' : lexer_definitions.simple_rules, - 'complex_rules' : lexer_definitions.complex_rules, - 'tokens_collection' : lexer_definitions.tokens_collection, - 'error_handlers' : lexer_definitions.error_handlers - } - } -} \ No newline at end of file From e67dee693daafeca52e894ed43bad0e25424d234 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 08:56:59 -0500 Subject: [PATCH 75/96] Changed to a folder the lexer --- .../components/lexer/lexer_analyzer.py | 2 + src/compiler/components/lexer_analyzer.py | 231 ------------------ 2 files changed, 2 insertions(+), 231 deletions(-) delete mode 100644 src/compiler/components/lexer_analyzer.py diff --git a/src/compiler/components/lexer/lexer_analyzer.py b/src/compiler/components/lexer/lexer_analyzer.py index a6de2e93..4a3d1ba8 100644 --- a/src/compiler/components/lexer/lexer_analyzer.py +++ b/src/compiler/components/lexer/lexer_analyzer.py @@ -221,6 +221,8 @@ def tokenizer(stream_input): readjust_col = 0 lexer.input(stream_input) token_list = [] + lexer.lineno= 1 + #lexer.lexpos= 1 real_col = {} for tok in lexer: real_col.update({ str(tok): find_column(stream_input, tok) }) diff --git a/src/compiler/components/lexer_analyzer.py b/src/compiler/components/lexer_analyzer.py deleted file mode 100644 index 78e7eda4..00000000 --- a/src/compiler/components/lexer_analyzer.py +++ /dev/null @@ -1,231 +0,0 @@ -import ply.lex as lex -from ply.lex import Token -from ply.lex import TOKEN -from ..utils.errors import error - -tokens = [ - # Identifiers - "ID", "TYPE", - - # Primitive Types - "INTEGER", "STRING", "BOOLEAN", - - # Literals - "LPAREN", "RPAREN", "LBRACE", "RBRACE", "COLON", "COMMA", "DOT", "SEMICOLON", "AT", - - # Operators - "PLUS", "MINUS", "MULTIPLY", "DIVIDE", "EQ", "LT", "LTEQ", "ASSIGN", "INT_COMP", - - # Special Operators - "ARROW" -] - -reserved = { - 'new':'NEW', - 'of':'OF', - 'if' : 'IF', - 'let':'LET', - 'in' : 'IN', - 'fi':'FI', - 'else' : 'ELSE', - 'while':'WHILE', - 'case':'CASE', - 'then' : 'THEN', - 'esac':'ESAC', - 'pool':'POOL', - 'class':'CLASS', - 'loop':'LOOP', - 'inherits':'INHERITS', - 'isvoid':'ISVOID', - "not": "NOT" -} - -tokens += list(reserved.values()) - -#Simple rules -t_PLUS = r'\+' -t_MINUS = r'\-' -t_MULTIPLY = r'\*' -t_DIVIDE = r'\/' -t_LPAREN = r'\(' -t_RPAREN = r'\)' -t_EQ = r'\=' -t_LT = r'\<' -t_LTEQ = r'\<\=' -t_ASSIGN = r'\<\-' -t_INT_COMP = r'~' -t_LBRACE = r'\{' -t_RBRACE = r'\}' -t_COLON = r'\:' -t_COMMA = r'\,' -t_DOT = r'\.' -t_SEMICOLON = r'\;' -t_AT = r'\@' -t_ARROW = r'\=\>' -#complex rules - -@TOKEN(r"(t[R|r][U|u][e|E]|f[a|A][l|L][s|S][e|E])") -def t_BOOLEAN(token): - token.value = token.value.lower() - return token - -@TOKEN(r"\d+") -def t_INTEGER(token): - token.value = int(token.value) - return token - -@TOKEN(r"[A-Z][A-Za-z0-9_]*") -def t_TYPE(token): - token.type = reserved.get(token.value.lower(), 'TYPE') - return token - -@TOKEN(r"[a-z][A-Za-z0-9_]*") -def t_ID(token): - token.type = reserved.get(token.value.lower(), "ID") - return token - -# Utility definitions -@TOKEN(r'\n+') -def t_newline(t): - global readjust_col - readjust_col = t.lexpos + len(t.value) - t.lexer.lineno += len(t.value) - -def t_error(token): - global readjust_col - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='ERROR "%s"' % (token.value[:1]))) - token.lexer.skip(1) - -t_ignore = ' \t' -t_ignore_COMMENTLINE = r"\-\-[^\n]*" - - -#Global states -states = ( - ("STRING", "exclusive"), - ("COMMENT", "exclusive") -) - -#The string states -@TOKEN(r'\"') -def t_start_string(token): - token.lexer.push_state("STRING") - token.lexer.string_backslashed = False - token.lexer.stringbuf = "" - -@TOKEN(r'\n') -def t_STRING_newline(token): - global readjust_col - token.lexer.lineno += 1 - if not token.lexer.string_backslashed: - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), - message= "Unterminated string constant")) - token.lexer.pop_state() - else: - token.lexer.string_backslashed = False - readjust_col = token.lexpos + len(token.value) - -@TOKEN('\0') -def t_STRING_null(token): - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='Null character in string')) - token.lexer.skip(1) - -@TOKEN(r'\"') -def t_STRING_end(token): - if not token.lexer.string_backslashed: - token.lexer.pop_state() - token.value = token.lexer.stringbuf - token.type = "STRING" - return token - else: - token.lexer.stringbuf += '"' - token.lexer.string_backslashed = False - -@TOKEN(r"[^\n]") -def t_STRING_anything(token): - if token.lexer.string_backslashed: - if token.value == 'b': - token.lexer.stringbuf += '\b' - elif token.value == 't': - token.lexer.stringbuf += '\t' - elif token.value == 'n': - token.lexer.stringbuf += '\n' - elif token.value == 'f': - token.lexer.stringbuf += '\f' - elif token.value == '\\': - token.lexer.stringbuf += '\\' - else: - token.lexer.stringbuf += token.value - token.lexer.string_backslashed = False - else: - if token.value != '\\': - token.lexer.stringbuf += token.value - else: - token.lexer.string_backslashed = True - -def t_STRING_error(token): - token.lexer.skip(1) - errors.append(error(error_type="LexicographicError", - row_and_col= (token.lineno, token.lexpos - readjust_col + 1), - message= 'ERROR at or near ')) - -def t_STRING_eof(token): - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message='EOF in string constant')) - token.lexer.pop_state() - -t_STRING_ignore = '' - -# The comment state - -@TOKEN(r"\(\*") -def t_start_comment(token): - token.lexer.push_state("COMMENT") - token.lexer.comment_count = 0 - -@TOKEN(r"\(\*") -def t_COMMENT_startanother(token): - token.lexer.comment_count += 1 - -@TOKEN(r"\n+") -def t_COMMENT_newline(token): - global readjust_col - readjust_col = token.lexpos + len(token.value) - token.lexer.lineno += len(token.value) - -@TOKEN(r"\*\)") -def t_COMMENT_end(token): - if token.lexer.comment_count == 0: - token.lexer.pop_state() - else: - token.lexer.comment_count -= 1 - - -def t_COMMENT_error(token): - token.lexer.skip(1) - -def t_COMMENT_eof(token): - global readjust_col - errors.append(error(error_type="LexicographicError", row_and_col= (token.lineno, token.lexpos - readjust_col + 1), message= "EOF in comment")) - token.lexer.pop_state() - -t_COMMENT_ignore = '' -errors = [] - -def find_column(_input, token): - line_start = _input.rfind('\n', 0, token.lexpos) + 1 - return (token.lexpos - line_start) + 1 - -lexer = lex.lex() -def tokenizer(stream_input): - global readjust_col - readjust_col = 0 - lexer.input(stream_input) - token_list = [] - real_col = {} - for tok in lexer: - real_col.update({ str(tok): find_column(stream_input, tok) }) - token_list.append(tok) - - - return errors, token_list, real_col - From c2aed1ca27c7aa5a1469123b36e14e45ccb10fdc Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 08:58:41 -0500 Subject: [PATCH 76/96] Another structure for the compiler --- .../components/parser/syntax_analyzer.py | 2 +- .../components/semantic/AST_definitions.py | 2 +- src/compiler/components/semantic/context.py | 147 ++++-------------- .../components/visitors_definitions.py | 104 +++++++------ 4 files changed, 92 insertions(+), 163 deletions(-) diff --git a/src/compiler/components/parser/syntax_analyzer.py b/src/compiler/components/parser/syntax_analyzer.py index 8087f35e..7e2f50de 100644 --- a/src/compiler/components/parser/syntax_analyzer.py +++ b/src/compiler/components/parser/syntax_analyzer.py @@ -44,7 +44,7 @@ class : CLASS TYPE LBRACE features_list_opt RBRACE p[0] = NodeClass(idName = p[2], methods= p[4]['methods'], attributes= p[4]['attributes'], - parent = "Object", + parent = "Object" if p[2] != 'Object' else None, line= p.slice[1].lineno, column=(self.real_col[ str(p.slice[2]) ] ) ) diff --git a/src/compiler/components/semantic/AST_definitions.py b/src/compiler/components/semantic/AST_definitions.py index ac619438..1fefca66 100644 --- a/src/compiler/components/semantic/AST_definitions.py +++ b/src/compiler/components/semantic/AST_definitions.py @@ -59,7 +59,7 @@ def __init__(self, classes): class NodeClass(Node): def __init__(self, idName: str, methods, attributes, parent, - line, column, parent_col = -1): + line = 0, column = 0, parent_col = -1): super().__init__(line= line, column= column) self.idName = idName self.methods = methods diff --git a/src/compiler/components/semantic/context.py b/src/compiler/components/semantic/context.py index 511a747a..136386d9 100644 --- a/src/compiler/components/semantic/context.py +++ b/src/compiler/components/semantic/context.py @@ -24,6 +24,10 @@ def __init__(self, idName, attributes, self.children= {} class feature(jsonable): + def __init__(self, idName, wrapperType): + self.wrapperType = wrapperType + self.idName= idName + def __eq__(self, other): if type(self) == type(other): for f in self.__dict__: @@ -33,8 +37,8 @@ def __eq__(self, other): return False class Attribute(feature): - def __init__(self, idName: str, _type: str): - self.idName = idName + def __init__(self, idName: str, _type: str, wrapperType): + super().__init__(idName= idName, wrapperType= wrapperType) self._type = _type @@ -42,9 +46,9 @@ class Method(feature): def __init__(self, idName: str, returnType: str, argNames, - argTypes): - - self.idName = idName + argTypes, + wrapperType): + super().__init__(idName= idName, wrapperType= wrapperType) self.returnType = returnType self.argNames = argNames self.argTypes= argTypes @@ -52,107 +56,8 @@ def __init__(self, idName: str, class globalContext: def __init__(self, dictionaries ={}): - - self.types= { - 'Object': Type( idName= 'Object', - methods= { - 'abort': Method(idName= 'abort', - argNames=[], - argTypes=[], - returnType='Object'), - 'type_name': Method(idName= 'type_name', - returnType= 'String', - argTypes= [], - argNames= []), - 'copy': Method(idName= 'copy', - returnType= 'Object', - argNames= [], - argTypes= []) - }, - attributes= {}, - parent= None), - 'Int': Type(idName= 'Int', - methods= {}, - attributes= { - 'default': Attribute( - idName= 'default', - _type= 'Int' - ) - }, - parent= 'Object', - builtIn= True), - 'IO': Type( idName= 'IO', - methods= { - "out_string": Method( idName= "out_string", - returnType="IO", - argNames= ['x'], - argTypes= ['String'] - ), - "out_int": Method( idName= "out_int", - returnType="IO", - argNames= ['x'], - argTypes= ['Int']), - 'in_string': Method( idName= 'in_string', - returnType='String', - argTypes= [], - argNames= []), - 'in_int': Method (idName='in_int', - returnType='Int', - argTypes= [], - argNames= []) - }, - attributes= {}, - parent= 'Object'), - 'SELF_TYPE': Type(idName='SELF_TYPE', - parent= 'Object', - attributes= {}, - methods={}), - 'String': Type( idName= 'String', - methods= { - 'length': Method( - idName='length', - returnType='Int', - argTypes= [], - argNames= [] - ), - 'concat': Method ( - idName= 'concat', - returnType= 'String', - argTypes= ['String'], - argNames= ['x'] - ), - 'substr': Method ( - idName= 'substr', - returnType='String', - argNames= ['i', 'l'], - argTypes=['Int', 'Int'] - ) - }, - attributes= { - 'default': Attribute( - idName= 'default', - _type='String') - }, - parent= 'Object', - builtIn= True - ), - 'Bool': Type (idName= 'Bool', - attributes= {}, - methods= {}, - builtIn= True, - parent= 'Object') - } - - for _type in self.types: - if _type != 'Object': - idParent= self.types[_type].parent - self.types[_type].inheritsAttr.update({ - attr.idName: attr for attr in self.types[idParent].attributes.values() - }) - self.types[_type].inheritsMethods.update({ - method.idName: method for method in self.types[idParent].methods.values() - }) - self.basics = [i for i in self.types] + self.types= { } + self.basics = ['Object', 'IO', 'String', 'Bool', 'Int'] def createType(self, node: NodeClass): return interceptError( @@ -165,23 +70,24 @@ def createType(self, node: NodeClass): Type (idName= node.idName, attributes= {}, methods= {}, - parent= node.parent if node else 'Object') + parent= node.parent, + builtIn= node.idName in ['String', 'Bool', 'Int']) }) def checkGoodInheritance(self, node: NodeClass): - return interceptError( + return interceptError( validationFunc= lambda: node.idName in self.types, errorOption= 'undefined type', idName= node.idName, row_and_col= (node.line, node.column) ) or interceptError ( - validationFunc= lambda: node.parent in + validationFunc= lambda: node.idName == 'Object' or node.parent in self.types, errorOption= 'undefined type', idName= node.parent, row_and_col= (node.line, node.parent_col) ) or interceptError( - validationFunc= lambda: not self.types[node.parent].builtIn, + validationFunc= lambda: node.idName == 'Object' or not self.types[node.parent].builtIn, errorOption= 'built-in inheritance', idName= node.idName, idParent= node.parent, @@ -273,14 +179,15 @@ def defineAttrInType(self, typeName: str, attr: NodeAttr): idName= attr.idName, row_and_col= (attr.line, attr.column) ) or interceptError( - validationFunc= lambda: attr._type in self.types, + validationFunc= lambda: ('__prim_zero_slot' == attr._type or '__prim_empty_slot'== attr._type) or attr._type in self.types, errorOption= 'undefined type in attr', idAttr= attr.idName, idBadType= attr._type, row_and_col= (attr.line, attr.columnTypeAttr ) ) or self.types[typeName].attributes.update({ attr.idName: Attribute(idName= attr.idName, - _type= attr._type ) + _type= attr._type, + wrapperType= typeName) }) def defineMethod(self, typeName: str, @@ -307,7 +214,8 @@ def defineMethod(self, typeName: str, node.idName: Method(idName= node.idName, returnType= node.returnType, argNames= [f.idName for f in node.formal_param_list] , - argTypes= [f._type for f in node.formal_param_list]) + argTypes= [f._type for f in node.formal_param_list], + wrapperType= typeName) }) def checkDynamicDispatch(self, @@ -519,3 +427,16 @@ def default(self, obj): programContext = globalContext() + +### Definition of basics classes + +#ObjClass = NodeClass(idName= 'Object', +# methods= [ +# NodeClassMethod( +# +# ) +# ], +# attributes= [ +# +# ], +# parent= None) diff --git a/src/compiler/components/visitors_definitions.py b/src/compiler/components/visitors_definitions.py index 18c9bd0f..c04c9fdc 100644 --- a/src/compiler/components/visitors_definitions.py +++ b/src/compiler/components/visitors_definitions.py @@ -1,16 +1,19 @@ from ..components.semantic.AST_definitions import * -from ..components.semantic.context import programContext + from compiler.utils.errors import error class NodeVisitor: - + def __init__(self, programContext): + self.programContext= programContext + def visit(self, node: Node, **args): - if node.__class__.__bases__[0] is NodeBinaryOperation: - return self.visit_NodeBinaryOperation(node, **args) + if isinstance(self, TypeCheckerVisitor): + if issubclass(type(node), NodeBinaryOperation): + return self.visit_NodeBinaryOperation(node, **args) + visitor_method_name = 'visit_' + node.clsname - visitor = getattr(self, visitor_method_name, self.not_implemented) - + visitor = getattr(self, visitor_method_name, self.not_implemented) return visitor(node, **args) # Return the new context result from the visit def not_implemented(self, node: Node, **args): @@ -29,7 +32,7 @@ def visit_NodeProgram(self, node: NodeProgram): def visit_NodeClass(self, node: NodeClass): # When we create a type, we store it in the context, if there is no errors - return programContext.createType(node) + return self.programContext.createType(node) class TypeInheritanceVisitor(NodeVisitor): def visit_NodeProgram(self, node: NodeProgram): @@ -41,10 +44,13 @@ def visit_NodeProgram(self, node: NodeProgram): return [errors.pop()] if errors else [] def visit_NodeClass(self, node: NodeClass): - result= programContext.checkGoodInheritance(node) + result= self.programContext.checkGoodInheritance(node) if type(result) is error: return result + if node.idName == 'Object': + return + for nodeAttr in node.attributes: resultVisitAttr= self.visit(nodeAttr, idType= node.idName) if type(resultVisitAttr) is error: @@ -55,19 +61,20 @@ def visit_NodeClass(self, node: NodeClass): if type(resultVisitClassMethod) is error: return resultVisitClassMethod - programContext.actualizeInherits(node) + self.programContext.actualizeInherits(node) def visit_NodeAttr(self, node: NodeAttr, idType): - return programContext.checkNotOverwriteAttr(node, idType) + return self.programContext.checkNotOverwriteAttr(node, idType) def visit_NodeClassMethod(self, node: NodeClassMethod, idType): - return programContext.checkGoodOverwriteMethod(node, idType) + return self.programContext.checkGoodOverwriteMethod(node, idType) class TypeBuilderVisitor(NodeVisitor): - def __init__(self): + def __init__(self, programContext): + super().__init__(programContext) self.currentTypeName = '' def visit_NodeProgram(self, node: NodeProgram): @@ -87,7 +94,7 @@ def visit_NodeClass(self, node: NodeClass): return errors def visit_NodeAttr(self, node:NodeAttr): - resultOp= programContext.defineAttrInType(self.currentTypeName, + resultOp= self.programContext.defineAttrInType(self.currentTypeName, node) if type (resultOp) is error: @@ -97,9 +104,9 @@ def visit_NodeAttr(self, node:NodeAttr): def visit_NodeClassMethod(self, node: NodeClassMethod): return [definition for definition in - [programContext.getType(node.returnType, (node.line, node.column))] + - [programContext.getType(idName = formal_param._type, row_and_col= (formal_param.line, formal_param.column)) for formal_param in node.formal_param_list] + - [programContext.defineMethod( + [self.programContext.getType(node.returnType, (node.line, node.column))] + + [self.programContext.getType(idName = formal_param._type, row_and_col= (formal_param.line, formal_param.column)) for formal_param in node.formal_param_list] + + [self.programContext.defineMethod( typeName = self.currentTypeName, node= node )] @@ -108,17 +115,16 @@ def visit_NodeClassMethod(self, node: NodeClassMethod): class TypeCheckerVisitor(NodeVisitor): - def __init__(self): - pass def visit_NodeProgram(self, node: NodeProgram): + self.mapExprWithType= {} errors = [] for nodeClass in node.class_list: - environment = programContext.buildEnv (typeName= nodeClass.idName) + environment = self.programContext.buildEnv (typeName= nodeClass.idName) errors += self.visit(nodeClass, previousEnv= environment) - return errors + return errors, self.mapExprWithType def visit_NodeClass(self, node: NodeClass, previousEnv): errors = [] @@ -136,7 +142,7 @@ def visit_NodeClass(self, node: NodeClass, previousEnv): return errors def visit_NodeClassMethod(self, node: NodeClassMethod, previousEnv): - newEnv = programContext.buildEnvForMethod(node, previousEnv) + newEnv = self.programContext.buildEnvForMethod(node, previousEnv) if type(newEnv) is error: return newEnv @@ -145,7 +151,7 @@ def visit_NodeClassMethod(self, node: NodeClassMethod, previousEnv): if type(typeResult) is error: return typeResult - return programContext.checkReturnType(node.returnType, + return self.programContext.checkReturnType(node.returnType, typeResult, (node.line, node.column), 'uncompatible types') @@ -160,7 +166,7 @@ def visit_NodeAttr(self, node: NodeAttr, previousEnv): if type(typeExpr) is error: return typeExpr - resultCheckAssign= programContext.checkAssign(nameObject= node.idName, + resultCheckAssign= self.programContext.checkAssign(nameObject= node.idName, nodeType= node._type, returnType= typeExpr, row_and_col= (node.expr.line, node.expr.column) @@ -199,7 +205,7 @@ def visit_NodeLet(self, node: NodeLet, previousEnv): row_and_col = (node.body.line, node.body.column) if node.body else (node.line, node.column) - resultCheckAssign= programContext.checkAssign(node.idName, + resultCheckAssign= self.programContext.checkAssign(node.idName, node.type, exprType, row_and_col, @@ -224,7 +230,7 @@ def visit_NodeAssignment(self, node: NodeAssignment, return resultExpr - resultCheckAssign= programContext.checkAssign(nameObject= node.nodeObject.idName, + resultCheckAssign= self.programContext.checkAssign(nameObject= node.nodeObject.idName, nodeType= resultObj, returnType= resultExpr, row_and_col= (node.nodeObject.line, node.nodeObject.column ), @@ -253,7 +259,7 @@ def visit_NodeBinaryOperation(self, return typeSecondExpr if type(node) is NodeEqual: - return programContext.checkEqualOp(typeFirstExpr, + return self.programContext.checkEqualOp(typeFirstExpr, typeSecondExpr, (node.line, node.column)) @@ -264,7 +270,7 @@ def visit_NodeBinaryOperation(self, NodeMultiplication} - return programContext.checkArithmetic(typeFirstExpr, + return self.programContext.checkArithmetic(typeFirstExpr, typeSecondExpr, (node.line, node.column), node.symbol, @@ -273,7 +279,7 @@ def visit_NodeBinaryOperation(self, def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): - result = programContext.getType(node.type, + result = self.programContext.getType(node.type, row_and_col=(node.line, node.column)) if type(result) is error: return result @@ -301,7 +307,7 @@ def visit_NodeBooleanComplement(self, typeExpr = self.visit(node.boolean_expr, previousEnv= previousEnv) if type(typeExpr) is error: return typeExpr - return programContext.checkReturnType(nodeType= "Bool", returnType= typeExpr, + return self.programContext.checkReturnType(nodeType= "Bool", returnType= typeExpr, row_and_col= (node.line, node.boolean_expr.column -2), errorOption= 'bad not') @@ -313,7 +319,7 @@ def visit_NodeObject(self, previousEnv): if node.idName == 'self': return previousEnv['wrapperType'] - return programContext.searchValue(node, + return self.programContext.searchValue(node, (node.line, node.column), previousEnv) @@ -326,7 +332,8 @@ def visit_NodeDynamicDispatch(self, if type (typeExpr) is error: return typeExpr - methodInfo= programContext.checkMethodInType(idType= typeExpr, + self.mapExprWithType[(node.line, node.column)]= typeExpr + methodInfo= self.programContext.checkMethodInType(idType= typeExpr, idMethod = node.method, row_and_col= (node.line, node.column + 1)) if type(methodInfo) is error: @@ -340,7 +347,7 @@ def visit_NodeDynamicDispatch(self, return currenttypeExpr argTypes.append(currenttypeExpr) - resultCheck= programContext.checkArgumentsInDispatch( + resultCheck= self.programContext.checkArgumentsInDispatch( node, methodInfo.argNames, argTypes, @@ -360,7 +367,7 @@ def visit_NodeIntegerComplement(self, node: NodeIntegerComplement, typeExpr = self.visit(node.integer_expr, previousEnv= previousEnv) if type(typeExpr) is error: return typeExpr - return programContext.checkReturnType(nodeType= "Int", returnType= typeExpr, + return self.programContext.checkReturnType(nodeType= "Int", returnType= typeExpr, row_and_col= (node.line, node.column + 1), errorOption= 'bad ~') @@ -378,7 +385,7 @@ def visit_NodeIf(self, node: NodeIf, previousEnv): if type(predType) is error: return predType - resultCheck = programContext.checkReturnType(nodeType= 'Bool', returnType= predType, + resultCheck = self.programContext.checkReturnType(nodeType= 'Bool', returnType= predType, row_and_col= (node.line, node.column), errorOption= 'uncompatible types') @@ -393,10 +400,10 @@ def visit_NodeIf(self, node: NodeIf, previousEnv): if type(elseType) is error: return elseType - return programContext.LCA(idName1 = thenType, idName2= elseType) + return self.programContext.LCA(idName1 = thenType, idName2= elseType) def visit_NodeCase(self, node: NodeCase, previousEnv): - resultTypeInit= self.visit(node.expr) + resultTypeInit= self.visit(node.expr, previousEnv= previousEnv) if type(resultTypeInit) is error: return resultTypeInit @@ -414,7 +421,7 @@ def visit_NodeCaseActions(self, nodeActions, previousEnv, resultTypeInit): lca = returnTypesExpressions[0] for typeExpr in returnTypesExpressions: - lca= programContext.LCA(idName1= lca, idName2= typeExpr) + lca= self.programContext.LCA(idName1= lca, idName2= typeExpr) return lca @@ -424,12 +431,12 @@ def searchLessActionCaseAndReturnTypes(self, nodeActions, currentTypeCase= 'Object' returnTypesExpressions = [] - resultCheckNonRepetition= programContext.checkNonRepetition(nodeActions) + resultCheckNonRepetition= self.programContext.checkNonRepetition(nodeActions) if type(resultCheckNonRepetition) is error: return resultCheckNonRepetition, None for action in nodeActions: - actionType= programContext.getType(idName= action.type, + actionType= self.programContext.getType(idName= action.type, row_and_col= (action.line, action.column)) if type(actionType) is error: @@ -445,8 +452,8 @@ def searchLessActionCaseAndReturnTypes(self, nodeActions, returnTypesExpressions.append(returnTypeAction) - if programContext.isSubtype(subType= resultTypeInit, - superType= action.type) and programContext.isSubtype( + if self.programContext.isSubtype(subType= resultTypeInit, + superType= action.type) and self.programContext.isSubtype( subType= action.type, superType= currentTypeCase): actionToReturn= action @@ -466,12 +473,12 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): if type(typeLeftMost) is error: return typeLeftMost - dispatchType= programContext.getType(idName= node.dispatch_type, + dispatchType= self.programContext.getType(idName= node.dispatch_type, row_and_col= (node.line, node.columnType)) if type(dispatchType) is error: return dispatchType - methodInfo= programContext.checkMethodInType(idType= node.dispatch_type, + methodInfo= self.programContext.checkMethodInType(idType= node.dispatch_type, idMethod= node.method, row_and_col= (node.line, node.columnIdMethod)) if type(methodInfo) is error: @@ -480,7 +487,7 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): typeExprOfArgs = [] for arg in node.arguments: resultType= self.visit(node= arg, - environment = previousEnv) + previousEnv = previousEnv) if type(resultType) is error: return resultType @@ -488,7 +495,7 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): typeExprOfArgs.append(resultType) - checkingArgumentsResult= programContext.checkArgumentsInDispatch( + checkingArgumentsResult= self.programContext.checkArgumentsInDispatch( node, methodInfo.argNames, typeExprOfArgs, @@ -497,7 +504,7 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): if type(checkingArgumentsResult) is error: return checkingArgumentsResult - return programContext.checkDispatchTypes(typeLeftMost= typeLeftMost, + return self.programContext.checkDispatchTypes(typeLeftMost= typeLeftMost, typeRight= dispatchType.idName, returnType= methodInfo.returnType, row_and_col= (node.expr.line, node.expr.column)) @@ -506,7 +513,7 @@ def visit_NodeWhileLoop(self, node: NodeWhileLoop, previousEnv): resultExprPred = self.visit(node.predicate, previousEnv= previousEnv) if type(resultExprPred) is error: return resultExprPred - resultCheck = programContext.checkBoolInPredicate(node, resultExprPred) + resultCheck = self.programContext.checkBoolInPredicate(node, resultExprPred) if type(resultCheck) is error: return resultCheck @@ -515,4 +522,5 @@ def visit_NodeWhileLoop(self, node: NodeWhileLoop, previousEnv): return resultExpr return 'Object' - \ No newline at end of file + + From ebc5165a93026f7b9e45c90c5f9779b066db3c09 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 08:59:31 -0500 Subject: [PATCH 77/96] More things --- .../components/generation/CIL_definitions.py | 581 ++++++++++++------ .../components/semantic/semantic_analyzer.py | 29 +- 2 files changed, 421 insertions(+), 189 deletions(-) diff --git a/src/compiler/components/generation/CIL_definitions.py b/src/compiler/components/generation/CIL_definitions.py index 330a991d..6b0dfafd 100644 --- a/src/compiler/components/generation/CIL_definitions.py +++ b/src/compiler/components/generation/CIL_definitions.py @@ -1,183 +1,400 @@ -################################################################### -############### CIL TREE ################## -################################################################### -#The cilnodes have inside all that they need to transform to misp -class CilNode: - def __init__(self, code=""): - self.code = code - -class CilClassNode(CilNode): - def __init__(self, name, attrs=None, funcs=None, size=-1, code=""): - super().__init__(code) - self.name = name - self.attr_order = [] - self.attrs = attrs # [] -> CilIdNode - self.funcs = funcs # ["A_f"] -> CilFuncNode - -class CilFuncDeclNode(CilNode): - def __init__(self, label, body=None, formals=None, local_vars=None, retvalue=0, code = ""): - super().__init__(code) - self.label = label - self.formals = formals - self.locals = local_vars #List of instructions locals - self.body = body #List of instructions - self.retvalue = retvalue #rreturn value - -class CilFormalNode(CilNode): - def __init__(self, name, code=""): - super().__init__(code) - self.name = name - -class CilParamNode(CilNode): - def __init__(self, name, code=""): - super().__init__(code) - self.name = name - -class CilBackupNode(CilNode): - def __init__(self, name, code=""): - super().__init__(code) - self.name = name - -class CilRestoreNode(CilNode): - def __init__(self, name, code=""): - super().__init__(code) - self.name = name - -class CilGetAttrNode(CilNode): - def __init__(self, instance, attr, result, code=""): - super().__init__(code) - self.instance = instance - self.attr = attr - self.result = result - -class CilCallNode(CilNode): - def __init__(self, func_label, value, code=""): - super().__init__(code) - self.func_label = func_label - self.value = value - -class CilCondNode(CilNode): - def __init__(self, condvar, goto_label, code = ""): - super().__init__(code) - self.condvar = condvar - self.goto_label = goto_label - -class CilGoToNode(CilNode): - def __init__(self, label, code=""): - super().__init__(code) - self.label = label - -class CilLabelNode(CilNode): - def __init__(self, name, code=""): - super().__init__(code) - self.name = name + ":" - -class CilLoopNode(CilNode): - def __init__(self, condvar, label, code=""): - super().__init__(code) - self.condvar = condvar - self.label = label - -class CilDeclNode(CilNode): - def __init__(self, local_name, value, code=""): - super().__init__(code) - self.local_name = local_name - self.value = value - -class CilAssignNode(CilNode): - def __init__(self, lvalue, expr=None, code=""): - super().__init__(code) - self.lvalue = lvalue - self.expr = expr - -# ######################################################################################## -# ##################### UNOPS ######################################################## -# ######################################################################################## -class CilUnOpNode(CilNode): - # op param is just for building self.code - def __init__(self, operand, result, op=None): - self.operand = operand - self.result = result - self.op = op - self.code = result + " = " + op + " " + str(operand) - -class CilBooleanNotNode(CilUnOpNode): - def __init__(self, operand, result): - super().__init__(operand, result, "not") - -class CilIsVoidNode(CilUnOpNode): - def __init__(self, operand, result): - super().__init__(operand, result, "isvoid") - -class CilBinaryNotNode(CilUnOpNode): - def __init__(self, operand, result): - super().__init__(operand, result, "~") - -# ######################################################################################## -# ##################### BINOPS ######################################################## -# ######################################################################################## - -class CilBinOpNode(CilNode): - # op param is just for building self.code - def __init__(self, left, right, result, op=None): - self.left = left - self.right =right - self.result = result - self.op = op - self.code = result + " = " + str(left) + " " + op + " " + str(right) - -class CilSumNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "+") - -class CilMinusNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "-") - -class CilMultNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "*") - -class CilDivNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "/") - -class CilCmpLessNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "<") - -class CilCmpLessEqNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "<=") - -class CilCmpEqRefNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, add_result, "==") - -class CilCmpEqNode(CilBinOpNode): - def __init__(self, left, right, result): - super().__init__(left, right, result, "=") - -# ######################################################################################## -# ##################### TERMINALS ##################################################### -# ######################################################################################## - -class CilStringNode(CilNode): - # Ex: .data : .asciiz "Hello World!" - def __init__(self, label, addr): - self.label = label - self.addr = addr - -class CilAllocateNode(CilNode): - def __init__(self, typename, value, code=""): - self.code = "ALLOCATE {}".format(typename) - self.typename = typename - self.value = value - -class CilSetAttrNode(CilNode): - def __init__(self, instance, attr, value, code=""): - self.code = "SETATTR {} {} {}".format(instance, attr, value) - self.instance = instance - self.attr = attr - self.value = value + +########################################## AST #################################################### + + +class AST: + def __init__(self): + pass + + @property + def clsname(self): + return str(self.__class__.__name__) + + def to_readable(self): + return "{}".format(self.clsname) + + def __repr__(self): + return self.__str__() + + def __str__(self): + return str(self.to_readable()) + "\n" + + +##################################### PROGRAM ##################################################### + + +class Program(AST): + def __init__(self, type_section, data_section, code_section): + super(Program, self).__init__() + self.code_section = code_section + self.data_section = data_section + self.type_section = type_section + + def to_readable(self): + ttype = "" + for t in self.type_section: + ttype += str(t) + data = "" + for t in self.data_section: + data += str(t) + code = "" + for t in self.code_section: + code += str(t) + return "CIL\n\t.TYPE\n{}\n\t.DATA\n{}\n\t.CODE\n{}\n".format(ttype, data, code) + + + +################################ TYPES, DATAS, STATEMENTS ######################################### + + +class Type(AST): + def __init__(self, name, attributes = {}, methods= {}): + self.type_name = name + self.attributes = attributes + self.methods = methods + + def to_readable(self): + attrs = "" + for t in self.attributes: + attrs += str(t) + "\t" + m = "" + for t in self.methods: + m += str(t) + "\t" + return "type {} {}\n\t{}\n\t{}\n{}\n".format(self.type_name, "{", attrs, m, "}") + + +class Data(AST): + def __init__(self, dest, value): + self.dest = dest + self.value = value + + def to_readable(self): + return "{} = {}\n".format(self.dest, self.value) + + +class Statement(AST): + pass + + +#################################### ATTRIBUTE ################################################### + +class TypeFeature(AST): + pass + +class Attribute(TypeFeature): + def __init__(self, name): + self.name = name + + def to_readable(self): + return "attribute {}\n".format(self.name) + +class Method(TypeFeature): + def __init__(self, name, function_name): + self.name = name + self.function_name = function_name + + def to_readable(self): + return "method {} : {}\n".format(self.name, self.function_name) + + +#################################### FUNCTION #################################################### + + +class Function(TypeFeature): + def __init__(self, name, args, vlocals, body): + self.name = name + self.args = args + self.vlocals = vlocals + self.body = body + + def to_readable(self): + args = "" + for t in self.args: + args += str(t) + "\t" + args += "\n" + vlocals = "" + for t in self.vlocals: + vlocals += str(t) + "\t" + args += "\n" + body = "" + for t in self.body: + body += str(t) + "\t" + body += "\n" + return "function {} {}\n\t{}\n\n\t{}\n\n\t{}\n{}\n".format(self.name, "{", args, vlocals, body, "}") + + + +class ArgDeclaration(AST): + def __init__(self, name): + self.name = name + + def to_readable(self): + return "PARAM {}\n".format(self.name) + + +class LocalDeclaration(AST): + def __init__(self, name): + self.name = name + + def to_readable(self): + return "LOCAL {}\n".format(self.name) + + +#################################### STATEMENTS ################################################# + + +class Assign(Statement): + def __init__(self, dest, source): + self.dest = dest + self.source = source + + def to_readable(self): + return "{} = {}\n".format(self.dest, self.source) + +#----------- BinaryOperator + +class BinaryOperator(Statement): + def __init__(self, dest, left, right, op): + self.dest = dest + self.left = left + self.right = right + self.op = op + + def to_readable(self): + return "{} = {} {} {}\n".format(self.dest, self.left, self.op, self.right) + +class Plus(BinaryOperator): + def __init__(self, dest, left, right): + super(Plus, self).__init__(dest, left, right, "+") + +class Minus(BinaryOperator): + def __init__(self, dest, left, right): + super(Minus, self).__init__(dest, left, right, "-") + +class Mult(BinaryOperator): + def __init__(self, dest, left, right): + super(Mult, self).__init__(dest, left, right, "*") + +class Div(BinaryOperator): + def __init__(self, dest, left, right): + super(Div, self).__init__(dest, left, right, "/") + +#---------- COMPARISONS + +class Equal(BinaryOperator): + def __init__(self, dest, left, right): + super(Equal, self).__init__(dest, left, right, "==") + +class LessThan(BinaryOperator): + def __init__(self, dest, left, right): + super(LessThan, self).__init__(dest, left, right, "<") + +class EqualOrLessThan(BinaryOperator): + def __init__(self, dest, left, right): + super(EqualOrLessThan, self).__init__(dest, left, right, "<=") + +#---------- TYPES + +class GetAttrib(Statement): + def __init__(self, dest, instance, attribute): + self.dest = dest + self.instance = instance + self.attribute = attribute + + def to_readable(self): + return "{} = GETATTR {} {}\n".format(self.dest, self.instance, self.attribute) + +class SetAttrib(Statement): + def __init__(self, instance, attribute, src): + self.instance = instance + self.attribute = attribute + self.src = src + + def to_readable(self): + return "SETATTR {} {} {}\n".format(self.instance, self.attribute, self.src) + +#---------- ARRAYS + +# self.attribute will represent the index + +class GetIndex(GetAttrib): + def to_readable(self): + return "{} = GETINDEX {} {}\n".format(self.dest, self.instance, self.attribute) + + +class SetIndex(SetAttrib): + def to_readable(self): + return "SETINDEX {} {} {}\n".format(self.instance, self.attribute, self.src) + + +################################ MEMORY STATEMENTS ############################################## + + +class TypeOf(Statement): + def __init__(self, dest, instance): + self.dest = dest + self.instance = instance + + def to_readable(self): + return "{} = TYPEOF {}\n".format(self.dest, self.instance) + + + +class Allocate(Statement): + def __init__(self, dest, ttype): + self.dest = dest + self.ttype = ttype + + def to_readable(self): + return "{} = ALLOCATE {}\n".format(self.dest, self.ttype) + + +class Array(Statement): + def __init__(self, dest, src): + self.dest = dest + self.src = src + + def to_readable(self): + return "{} = ARRAY {}\n".format(self.dest, self.src) + + + + +################################# DISPATCH STATEMENTS, RETURN ################################# + + +class Call(Statement): + def __init__(self, dest, f): + self.dest = dest + self.f = f + + def to_readable(self): + return "{} = CALL {}\n".format(self.dest, self.f) + + +class VCall(Statement): + def __init__(self, dest, ttype, f): + self.dest = dest + self.ttype = ttype + self.f = f + + def to_readable(self): + return "{} = VCALL {} {}\n".format(self.dest, self.ttype, self.f) + + +class PushParam(Statement): + def __init__(self, name): + self.name = name + + def to_readable(self): + return "ARG {}\n".format(self.name) + +class PopParam(Statement): + def __init__(self, name): + self.name = name + + def to_readable(self): + return "POP {}\n".format(self.name) + +class Return(Statement): + def __init__(self, value=None): + self.value = value + + def to_readable(self): + return "RETURN {}\n".format(self.value) + +################################## JUMP STATEMENTS ########################################### + + +class Label(Statement): + def __init__(self, name): + self.name = name + + def to_readable(self): + return "LABEL {}\n".format(self.name) + +class Goto(Statement): + def __init__(self, label): + self.label = label + + def to_readable(self): + return "GOTO {}\n".format(self.label) + +class IfGoto(Statement): + def __init__(self, condition, label): + self.condition = condition + self.label = label + + def to_readable(self): + return "IF {} GOTO {}\n".format(self.condition, self.label) + +######################################## STR STATEMENTS ###################################### + + +class Load(Statement): + def __init__(self, dest, msg): + self.dest = dest + self.msg = msg + + def to_readable(self): + return "{} = LOAD {}\n".format(self.dest, self.msg) + + + +class Length(Statement): + def __init__(self, dest, str_addr): + self.dest = dest + self.str_addr = str_addr + + def to_readable(self): + return "{} = LENGTH {}\n".format(self.dest, self.str_addr) + + +class Concat(Statement): + def __init__(self, dest, first, second): + self.dest = dest + self.first = first + self.second = second + + def to_readable(self): + return "{} = CONCAT {} {}\n".format(self.dest, self.first, self.second) + + +class Substring(Statement): + def __init__(self, dest, str_addr, pos_left=0, pos_right=-1): + self.dest = dest + self.str_addr = str_addr + self.pos_left = pos_left + self.pos_right = pos_right + + def to_readable(self): + return "{} = SUBSTRING {} {} {}\n".format(self.dest, self.str_addr, self.pos_left, self.pos_right) + + +class ToString(Statement): + def __init__(self, dest, num): + self.dest = dest + self.num = num + + def to_readable(self): + return "{} = STR {}\n".format(self.dest, self.num) + + +#################################### IO STATEMENTS ########################################### + + +class Read(Statement): + def __init__(self, dest): + self.dest = dest + + def to_readable(self): + return "{} = READ\n".format(self.dest) + + +class Print(Statement): + def __init__(self, str_addr): + self.str_addr = str_addr + + def to_readable(self): + return "PRINT {}\n".format(self.str_addr) diff --git a/src/compiler/components/semantic/semantic_analyzer.py b/src/compiler/components/semantic/semantic_analyzer.py index c0d5b4c1..3b98dcef 100644 --- a/src/compiler/components/semantic/semantic_analyzer.py +++ b/src/compiler/components/semantic/semantic_analyzer.py @@ -1,29 +1,44 @@ from ..visitors_definitions import TypeCollectorVisitor, TypeBuilderVisitor, TypeInheritanceVisitor, TypeCheckerVisitor from .AST_definitions import NodeProgram -from .context import programContext +from .context import programContext, Attribute + class semanticAnalyzer: - def __init__(self, ast: NodeProgram): + def __init__(self, ast: NodeProgram, + programContext): self.ast = ast self.errors = [] + self.programContext= programContext def run_visits(self: NodeProgram): - typeCollectorResult= TypeCollectorVisitor().visit(self.ast) + typeCollectorResult= TypeCollectorVisitor(self.programContext).visit(self.ast) if typeCollectorResult: self.errors += typeCollectorResult return - typeBuilderResult= TypeBuilderVisitor().visit(self.ast) + typeBuilderResult= TypeBuilderVisitor(self.programContext).visit(self.ast) if typeBuilderResult: self.errors += typeBuilderResult return - typeInheritanceResult= TypeInheritanceVisitor().visit(self.ast) + typeInheritanceResult= TypeInheritanceVisitor(self.programContext).visit(self.ast) if typeInheritanceResult: self.errors += typeInheritanceResult return - typeCheckerResult= TypeCheckerVisitor().visit(self.ast) + typeCheckerResult, mapExprWithResult= TypeCheckerVisitor(self.programContext).visit(self.ast) if typeCheckerResult: self.errors += typeCheckerResult return - + programContext.types['Int'].attributes['_val']= Attribute(idName= '_val', + _type= '__prim_zero_slot', + wrapperType='Int') + programContext.types['Bool'].attributes['_val']= Attribute(idName= '_val', + _type='__prim_zero_slot', + wrapperType='Bool') + programContext.types['String'].attributes['_val']= Attribute(idName= '_val', + _type= '__prim_zero_slot', + wrapperType='String') + programContext.types['String'].attributes['_val']= Attribute(idName= '_str_field', + _type= '__prim_empty_slot', + wrapperType='String') + self.mapExprWithResult = mapExprWithResult \ No newline at end of file From b6d2aee64452270eed6aaddff703bf52823404cc Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 09:00:27 -0500 Subject: [PATCH 78/96] CIL visitor. It looks fine --- .../components/generation/CIL_generator.py | 704 ++++++++++++++++++ src/compiler/components/generation/context.py | 23 + 2 files changed, 727 insertions(+) create mode 100644 src/compiler/components/generation/CIL_generator.py create mode 100644 src/compiler/components/generation/context.py diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py new file mode 100644 index 00000000..9993bdb2 --- /dev/null +++ b/src/compiler/components/generation/CIL_generator.py @@ -0,0 +1,704 @@ +from compiler.components.visitors_definitions import NodeVisitor +from ..semantic.AST_definitions import * +import compiler.components.generation.CIL_definitions as cil +from compiler.components.generation.context import NameMap +from compiler.utils.errors import error + +class CILVisitor(NodeVisitor): + def __init__(self, programContext, mapExpr): + super().__init__(programContext= programContext) + self.mapExpr= mapExpr + + # Type declarations of the program + self.dottype= [] + # String declarations of the program + self.dotdata= [] + # Function declarations of the program + self.dotcode= [] + + # Data of the class being visited + self.currentClassName= "" + + # Data of the function being visited + self.currentFunctionName= "" + self.localvars= [] + self.instructions= [] + + # Attributes index map[][] + self.attrIndexMap= {} + + # Methods index map + self.mthMap= {} + + # Counters to make variable's names unique + self.internalVarCount = 0 # LOCAL variables + self.internalLabelCount = 0 # LABELs + + + # Add static code + self.addBuiltIns() + + # Class depth dictionary used to analyze Case expressions + self.classDepth = {} + + def addBuiltIns(self): + # Add static types, functions and string constants + self.emptyString = self.registerData("") + + self.dottype.append(cil.Type('void', [], [])) + + #---------- LABELs + def defineInternalLabel(self): + label = f'LABEL_{self.internalLabelCount}' + self.internalLabelCount += 1 + return label + + #---------- .TYPE + def registerType(self, ttype): + self.dottype.append(ttype) + + #---------- .DATA + def registerData(self, value): + vname = f'data_{len(self.dotdata)}' + sameData = [data for data in self.dotdata if data.value == value] + if sameData != []: + return sameData[0].dest + + dataNode = cil.Data(vname, value) + self.dotdata.append(dataNode) + return dataNode.dest + + #---------- .CODE + + def buildInternalVname(self, vname): + vname = f'_{vname}_{self.internalVarCount}' + return vname + + def registerInternalLocal(self): + return self.registerLocal('internal') + + def registerLocal(self, vname): + vname = self.buildInternalVname(vname) + self.localvars.append(cil.LocalDeclaration(vname)) + self.internalVarCount +=1 + return vname + + def registerInstruction(self, instructionType, *args): + instruction = instructionType(*args) + self.instructions.append(instruction) + return instruction + + def registerFunction(self, function): + self.dotcode.append(function) + + def buildNewObject(self, dest, ttype): + self.registerInstruction(cil.Allocate, dest, ttype) + self.registerInstruction(cil.PushParam, dest) + self.registerInstruction(cil.Call, dest, f'{ttype}_{"_init"}') + self.registerInstruction(cil.PopParam, dest) + + def inspectInitializers(self, typeName): + parentName = self.programContext.types[typeName].parent if typeName == "Object" or self.programContext.types[typeName].parent else 'Object' + initializers = [] + while parentName: + initializers.append(f'{parentName}_{"_init"}') + parentName= self.programContext.types[parentName].parent + + return initializers + + def buildClassDepth(self, node: NodeProgram): + # Initialize class depth dictionary + for c in node.class_list: + self.classDepth[c.idName] = 0 + + for _class in node.class_list: + if _class.parent: + # Build the class depth dictionary + self.classDepth[_class.idName] = self.classDepth[_class.parent] + 1 + + def visit_NodeProgram(self, node: NodeProgram): + self.buildClassDepth(node) + for nodeClass in node.class_list: + newType= self.visit(nodeClass, + initializers= self.inspectInitializers(nodeClass.idName)) + self.registerType(newType) + + for func in self.dotcode: + for inst in func.body: + if isinstance(inst, cil.VCall): + inst.f = self.mthMap[inst.f] + if (isinstance(inst, cil.SetAttrib) or isinstance(inst, cil.GetAttrib)) \ + and isinstance(inst.attribute, str): + inst.attribute = self.attrIndexMap[inst.attribute] + + return cil.Program(self.dottype, self.dotdata, self.dotcode) + + def visit_NodeClass(self, node: NodeClass, initializers): + + self.currentClassName = node.idName + # Ovewritting attrs it's not allowed, so the first attrs of the class are the inhertited + if node.idName != 'Object': + parentName= 'Object' if not node.parent else node.parent + inhAttributes = [cil.Attribute(f'{parentName}_{attrName}') for attrName in + self.programContext.types[node.idName].inheritsAttr] + + methods= [cil.Method(methodName, f'{parentName}_{methodName}') for methodName in + self.programContext.types[parentName].inheritsMethods.keys()] + methods += [cil.Method(methodName, f'{parentName}_{methodName}') for methodName in + self.programContext.types[parentName].methods.keys() if not methodName in methods] + + for i in range(len(inhAttributes)): + self.attrIndexMap[f'{self.currentClassName}_{inhAttributes[i].name}']= i + for i in range(len(methods)): + self.mthMap[f'{self.currentClassName}_{methods[i].name}']= i + else: + inhAttributes = [] + methods = [] + # Translate all the properties (COOL) into attributes (CIL) + # and build an initializer function + self.localvars= [] + self.instructions= [] + self.internalVarCount= 0 + self.currentFunctionName= f'{self.currentClassName}_{"_init"}' + + # Build the initializer function and attributes list + for initializer in initializers: + self.registerInstruction(cil.PushParam, "__self") + self.registerInstruction(cil.Call, None, initializer) # Call superclasses's initializers + self.registerInstruction(cil.PopParam, None) + + ind= len(inhAttributes) + naturalAttrs= [] + for nodeAttr in node.attributes: + self.currentIndex= ind + naturalAttrs.append(self.visit(nodeAttr)) + ind += 1 + + # Register the initializer function + self.registerInstruction(cil.Return, '__self') + func = cil.Function(self.currentFunctionName, + [cil.ArgDeclaration('__self')], + self.localvars, self.instructions) + + self.registerFunction(func) + + # Translate all Class Methods (COOL) into Type Methods (CIL) + # and the functions associated will be automatically registered by the visitor + ind = len(methods) + for nodeClassMethod in node.methods: + # Check if this method is being redefined + + if nodeClassMethod.idName in methods: + # If it's being redefined, use the offset of the function already defined + index = methods.index(nodeClassMethod.idName) + del methods[i] + ind -= 1 + + else: + index= ind + self.currentIndex= index + method = self.visit(nodeClassMethod) + methods.insert(index, method) + ind += 1 + + return cil.Type(node.idName, inhAttributes + naturalAttrs, methods) + + + def visit_NodeAttr(self, node: NodeAttr): + if node.expr: + rname = self.visit(node.expr) + self.registerInstruction(cil.SetAttrib, "__self", self.currentIndex, rname) + elif node._type == "prim_zero_slot": + self.registerInstruction(cil.SetAttrib, "__self", self.currentIndex, 0) + elif node._type == "prim_empty_slot": + + self.registerInstruction(cil.SetAttrib, + "__self", + self.currentIndex, + self.emptyString) + else: + _temp = self.registerInternalLocal() + if node._type == 'Int': + self.buildNewObject(_temp, 'Int') + elif node._type == 'Bool': + self.buildNewObject(_temp, 'Bool') + elif node._type == 'String': + self.buildNewObject(_temp, 'String') + else: + self.registerInstruction(cil.Allocate, _temp, 'void') + self.registerInstruction(cil.SetAttrib, "__self", self.currentIndex, _temp) + + self.attrIndexMap[f'{self.currentClassName}_{node.idName}']= self.currentIndex + return cil.Attribute(f'{self.currentClassName}_{node.idName}') + + def visit_NodeClassMethod(self, node: NodeClassMethod): + self.localvars= [] + self.instructions= [] + self.internalVarCount= 0 + self.currentFunctionName= f"{self.currentClassName}_{node.idName}" + + self.nameMap = NameMap() + + arguments = [cil.ArgDeclaration("__self")] + + for formal_param in node.formal_param_list: + arguments.append(self.visit(formal_param)) + + if not self.currentClassName in self.programContext.basics: + returnVal = self.visit(node.body) + self.registerInstruction(cil.Return, returnVal) + + #----- Register the function and return the corresponding method node + func= cil.Function(self.currentFunctionName, arguments, + self.localvars, self.instructions) + + self.registerFunction(func) + + self.mthMap[func.name]= self.currentIndex + + return cil.Method(node.idName, func.name) + + def visit_NodeFormalParam(self, node: NodeFormalParam): + self.nameMap.define_variable(node.idName, f'_{node.idName}') + return cil.ArgDeclaration(f'_{node.idName}') + + ################################## INSTANCES ############################## + def visit_NodeObject(self, node: NodeObject): + if node.idName == 'self': return '__self' + objVname = self.nameMap.get_cil_name(node.idName) + if objVname: + return objVname + else: + vname = self.registerLocal(node.idName) + attributeCilName = f'{self.currentClassName}_{node.idName}' + self.registerInstruction(cil.GetAttrib, + vname, + '__self', + attributeCilName) + + return vname + + def visit_NodeSelf(self, node: NodeSelf): + return '__self' + + + ################################## CONSTANTS ############################## + + def visit_NodeInteger(self, node: NodeInteger): + boxedInt = self.registerInternalLocal() + self.registerInstruction(cil.Allocate, boxedInt, 'Int') + self.registerInstruction(cil.SetAttrib, boxedInt, 0, node.content) + return boxedInt + + def visit_NodeString(self, node: NodeString): + dataVname= self.registerData(node.content) + boxedString = self.registerInternalLocal() + boxedInt = self.registerInternalLocal() + self.registerInstruction(cil.Allocate, boxedInt, 'Int') + self.registerInstruction(cil.SetAttrib, boxedInt, 0, len(node.content)) + + self.registerInstruction(cil.Allocate, boxedString, 'String') + self.registerInstruction(cil.SetAttrib, boxedString, 0, boxedInt) + self.registerInstruction(cil.SetAttrib, boxedString, 1, dataVname) + return boxedString + + def visit_NodeBoolean(self, node: NodeBoolean): + boxedBool = self.registerInternalLocal() + self.registerInstruction(cil.Allocate, boxedBool, 'Bool') + if node.content: + self.registerInstruction(cil.SetAttrib, boxedBool, 0, 1) + else: + self.registerInstruction(cil.SetAttrib, boxedBool, 0, 0) + return boxedBool + + ################################## EXPRESSIONS ############################## + + def visit_NodeNewObject(self, node: NodeNewObject): + vname = self.registerInternalLocal() + _temp = self.registerInternalLocal() + self.registerInstruction(cil.Allocate, vname, node.type) + self.registerInstruction(cil.PushParam, vname) + self.registerInstruction(cil.Call, _temp, f'{node.type}_{"_init"}') + self.registerInstruction(cil.PopParam, vname) + return vname + + def visit_NodeIsVoid(self, node: NodeIsVoid): + value = self.registerInternalLocal() + exprVal = self.visit(node.expr) + self.registerInstruction(cil.PushParam, exprVal) + self.registerInstruction(cil.Call, value, "_isvoid") + self.registerInstruction(cil.PopParam, exprVal) + return value + + def visit_NodeAssignment(self, node: NodeAssignment): + rname = self.visit(node.expr) + cilName = self.nameMap.get_cil_name(node.nodeObject.idName) + if cilName: + self.registerInstruction(cil.Assign, cilName, rname) + else: + attributeCilName = f'{self.currentClassName}_{node.nodeObject.idName}' + self.registerInstruction(cil.SetAttrib, + '__self', attributeCilName, rname) + return rname + + def visit_NodeBlock(self, node: NodeBlock): + blockValue = None + for expr in node.expr_list: + blockValue = self.visit(expr) + return blockValue + + def visit_NodeLetComplex(self, node: NodeLetComplex): + self.nameMap = self.nameMap.create_child_scope() + for nodeLet in node.nestedLets: + self.visit(nodeLet) + + res_vname = self.visit(node.body) + self.nameMap.exit_child_scope() + + return res_vname + + def visit_NodeLet(self, node: NodeLet): + varName = "" + if node.body: + varName = self.visit(node.body) + else: + varName = self.registerLocal(node.idName) + if node.type == 'Int': + self.registerInstruction(cil.SetAttrib, '__self', self.currentIndex, 0) + self.buildNewObject(varName, 'Int') + elif node.type == 'Bool': + self.registerInstruction(cil.SetAttrib, '__self', self.currentIndex, 0) + self.buildNewObject(varName, 'Bool') + elif node.type == 'String': + self.registerInstruction(cil.SetAttrib, '__self', self.currentIndex, self.emptyString) + self.buildNewObject(varName, 'String') + elif node.type == '__prim_zero_slot': + self.register_instruction(cil.SetAttrib, '__self', self.currentIndex, 0) + elif node.type == '__prim_empty_slot': + self.register_instruction(cil.SetAttrib, '__self', self.currentIndex, self.emptyString) + else: + self.registerInstruction(cil.Allocate, varName, 'Void') + + self.nameMap.define_variable(node.idName, varName) + + def visit_NodeIf(self, node: NodeIf): + # LOCAL + # + # + # + # ... + # + # condition-unboxed = GetAttr _value + # if condition-unboxed GOTO then_lbl + # + # = + # GOTO continue_lbl + # LABEL then_lbl: + # + # = + # LABEL continue_lbl: + + # <.locals> + ifValue = self.registerInternalLocal() + conditionUnboxed = self.registerInternalLocal() + thenLbl = self.defineInternalLabel() + continueLbl = self.defineInternalLabel() + + # <.body> + conditionValue = self.visit(node.predicate) + self.registerInstruction(cil.GetAttrib, conditionUnboxed, conditionValue, 0) + self.registerInstruction(cil.IfGoto, conditionUnboxed, thenLbl) + elseValue = self.visit(node.else_body) + self.registerInstruction(cil.Assign, ifValue, elseValue) + self.registerInstruction(cil.Goto, continueLbl) + self.registerInstruction(cil.Label, thenLbl) + thenValue = self.visit(node.then_body) + self.registerInstruction(cil.Assign, ifValue, thenValue) + self.registerInstruction(cil.Label, continueLbl) + + return ifValue + + def visit_NodeWhileLoop(self, node: NodeWhileLoop): + # LOCAL + # + # + # ... + # LABEL start_lbl + # + # condition-unboxed = GetAttr _value + # if condition-unboxed GOTO body_lbl + # GOTO continue_lbl + # LABEL body_lbl + # + # GOTO start_lbl + # LABEL continue_lbl + # = 'VOID_TYPE' + + # <.locals> + whileValue = self.registerInternalLocal() + conditionUnboxed = self.registerInternalLocal() + startLbl = self.defineInternalLabel() + bodyLbl = self.defineInternalLabel() + continueLbl = self.defineInternalLabel() + + # <.code> + self.registerInstruction(cil.Label, startLbl) + conditionValue = self.visit(node.predicate) # Generate and + self.registerInstruction(cil.GetAttrib, conditionUnboxed, conditionValue, 0) + self.registerInstruction(cil.IfGoto, conditionUnboxed, bodyLbl) + self.registerInstruction(cil.Goto, continueLbl) + self.registerInstruction(cil.Label, bodyLbl) + self.visit(node.body) + self.registerInstruction(cil.Goto, startLbl) + self.registerInstruction(cil.Label, continueLbl) + self.registerInstruction(cil.Allocate, whileValue, 'Void') + + return whileValue + + def visit_NodeCase(self, node: NodeCase): + # Sort types by their depths in the class hierarchy + actions = list(node.actions) + actions.sort(key = lambda x: self.classDepth[x.type], reverse = True) + + # <.locals> + _temp = self.registerInternalLocal() + exprType = self.registerLocal("expression_type") + caseValue = self.registerInternalLocal() + + # Labels + labels = [] + for _ in node.actions: + labels.append(self.defineInternalLabel()) + endLabel = self.defineInternalLabel() + + # <.code> + exprValue = self.visit(node.expr) + self.registerInstruction(cil.TypeOf, exprType, exprValue) + + for i in range(len(actions)): + self.registerInstruction(cil.PushParam, actions[i].type) + self.registerInstruction(cil.PushParam, exprType) + # Call conforms function : (typex, typey) -> typex <= typey + self.registerInstruction(cil.Call, _temp, "__conforms") + self.registerInstruction(cil.PopParam, None) + self.registerInstruction(cil.PopParam, None) + self.registerInstruction(cil.IfGoto, _temp, labels[i]) + + for i in range(len(actions)): + self.registerInstruction(cil.Label, labels[i]) + self.nameMap.define_variable(actions[i].idName, exprValue) + self.nameMap = self.nameMap.create_child_scope() + expr_i = self.visit(actions[i]) + self.nameMap.exit_child_scope() + self.registerInstruction(cil.Assign, caseValue, expr_i) + self.registerInstruction(cil.Goto, endLabel) + + self.registerInstruction(cil.Label, endLabel) + return caseValue + + def visit_NodeCaseAction(self, node: NodeCaseAction): + return self.visit(node.expr) + + ################################# DISPATCHS ####################################### + + def visit_NodeDynamicDispatch(self, node: NodeDynamicDispatch): + instanceVname = self.visit(node.expr) + ttype = self.registerInternalLocal() + result = self.registerInternalLocal() + + # Save the params to do Pop after calling the function + pops = [] + for i in range(len(node.arguments)-1, -1, -1): + param = node.arguments[i] + paramVname = self.visit(param) + self.registerInstruction(cil.PushParam, paramVname) + pops.append(paramVname) + + # Instance + self.registerInstruction(cil.PushParam, instanceVname) + + # Compute instance's type + self.registerInstruction(cil.TypeOf, ttype, instanceVname) + methodPrefix= self.mapExpr[(node.line, node.column)] + # Call the function + methodName = f'{methodPrefix}_{node.method}' + self.registerInstruction(cil.VCall, result, ttype, methodName) + self.registerInstruction(cil.PopParam, instanceVname) + + # Pop the arguments + for i in range(len(pops)-1, -1, -1): + self.registerInstruction(cil.PopParam, pops[i]) + + return result + + def visit_NodeStaticDispatch(self, node: NodeStaticDispatch): + instanceVname = self.visit(node.expr) + result = self.registerInternalLocal() + + # Save the params to do Pop after calling the function + pops = [] + for i in range(len(node.arguments)-1, -1, -1): + param = node.arguments[i] + paramVname = self.visit(param) + self.registerInstruction(cil.PushParam, paramVname) + pops.append(paramVname) + + # Instance + self.registerInstruction(cil.PushParam, instanceVname) + + # Call the function + method_name = f'{node.expr.type}_{node.method}' + self.registerInstruction(cil.VCall, result, node.dispatch_type, method_name) + self.registerInstruction(cil.PopParam, instanceVname) + + + # Pop the arguments + for i in range(len(pops)-1, -1, -1): + self.registerInstruction(cil.PopParam, pops[i]) + + return result + + def visit_NodeIntegerComplement(self, node: NodeIntegerComplement): + # <.locals> + unboxedVal = self.registerInternalLocal() + _temp = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + boxedVal = self.visit(node.integer_expr) + self.registerInstruction(cil.GetAttrib, unboxedVal, boxedVal, 0) + self.registerInstruction(cil.Minus, _temp, 0, unboxedVal) + self.registerInstruction(cil.Allocate, result, "Int") + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeBooleanComplement(self, node: NodeBooleanComplement): + # <.locals> + unboxedVal = self.registerInternalLocal() + _temp = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + boxedVal = self.visit(node.boolean_expr) + self.registerInstruction(cil.GetAttrib, unboxedVal, boxedVal, 0) + self.registerInstruction(cil.Minus, _temp, 1, unboxedVal) + self.registerInstruction(cil.Allocate, result, 'Bool') + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + ################################ BINARY OPERATIONS ################################## + + def visit_NodeAddition(self, node: NodeAddition): + # <.locals> + _temp = self.registerInternalLocal() + firstVal = self.registerInternalLocal() + secondVal = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + firstBoxed = self.visit(node.first) + secondBoxed = self.visit(node.second) + self.registerInstruction(cil.GetAttrib, firstVal, firstBoxed, 0) + self.registerInstruction(cil.GetAttrib, secondVal, secondBoxed, 0) + self.registerInstruction(cil.Plus, _temp, firstVal, secondVal) + self.registerInstruction(cil.Allocate, result, 'Int') + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeSubtraction(self, node: NodeSubtraction): + # <.locals> + _temp = self.registerInternalLocal() + firstVal = self.registerInternalLocal() + secondVal = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + firstBoxed= self.visit(node.first) + secondBoxed= self.visit(node.second) + self.registerInstruction(cil.GetAttrib, firstVal, firstBoxed, 0) + self.registerInstruction(cil.GetAttrib, secondVal, secondBoxed, 0) + self.registerInstruction(cil.Minus, _temp, firstVal, secondVal) + self.registerInstruction(cil.Allocate, result, "Int") + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeMultiplication(self, node: NodeMultiplication): + # <.locals> + _temp = self.registerInternalLocal() + firstVal = self.registerInternalLocal() + secondVal = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + firstBoxed = self.visit(node.first) + secondBoxed = self.visit(node.second) + self.registerInstruction(cil.GetAttrib, firstVal, firstBoxed, 0) + self.registerInstruction(cil.GetAttrib, secondVal, secondBoxed, 0) + self.registerInstruction(cil.Mult, _temp, firstVal, secondVal) + self.registerInstruction(cil.Allocate, result, 'Int') + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeDivision(self, node: NodeDivision): + # <.locals> + _temp = self.registerInternalLocal() + firstVal = self.registerInternalLocal() + secondVal = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + firstBoxed = self.visit(node.first) + secondBoxed = self.visit(node.second) + self.registerInstruction(cil.GetAttrib, firstVal, firstBoxed, 0) + self.registerInstruction(cil.GetAttrib, secondVal, secondBoxed, 0) + self.registerInstruction(cil.Div, _temp, firstVal, secondVal) + self.registerInstruction(cil.Allocate, result, "Int") + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeEqual(self, node: NodeEqual): + # <.locals> + _temp = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + first_val = self.visit(node.first) + second_val = self.visit(node.second) + self.registerInstruction(cil.Equal, _temp, first_val, second_val) + self.registerInstruction(cil.Allocate, result, 'Bool') + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeLessThan(self, node: NodeLessThan): + # <.locals> + _temp = self.registerInternalLocal() + first_val = self.registerInternalLocal() + second_val = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + first_boxed = self.visit(node.first) + second_boxed = self.visit(node.second) + self.registerInstruction(cil.GetAttrib, first_val, first_boxed, 0) + self.registerInstruction(cil.GetAttrib, second_val, second_boxed, 0) + self.registerInstruction(cil.LessThan, _temp, first_val, second_val) + self.registerInstruction(cil.Allocate, result, "Int") + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result + + def visit_NodeLessThanOrEqual(self, node: NodeLessThanOrEqual): + # <.locals> + _temp = self.registerInternalLocal() + firstVal = self.registerInternalLocal() + secondVal = self.registerInternalLocal() + result = self.registerInternalLocal() + + # <.code> + firstBoxed = self.visit(node.first) + secondBoxed = self.visit(node.second) + self.registerInstruction(cil.GetAttrib, firstVal, firstBoxed, 0) + self.registerInstruction(cil.GetAttrib, secondVal, secondBoxed, 0) + self.registerInstruction(cil.EqualOrLessThan, _temp, firstVal, secondVal) + self.registerInstruction(cil.Allocate, result, "Int") + self.registerInstruction(cil.SetAttrib, result, 0, _temp) + return result diff --git a/src/compiler/components/generation/context.py b/src/compiler/components/generation/context.py new file mode 100644 index 00000000..bdd9645d --- /dev/null +++ b/src/compiler/components/generation/context.py @@ -0,0 +1,23 @@ + + +class NameMap: + def __init__(self, parent=None): + self.namemap = {} + self.parent = parent + + def define_variable(self, coolname, cilname): + self.namemap[coolname] = cilname + + def create_child_scope(self): + child_scope = NameMap(self) + return child_scope + + def exit_child_scope(self): + self.namemap = self.parent.namemap + self.parent = self.parent.parent + + def get_cil_name(self, coolname): + if not coolname in self.namemap.keys(): + return self.parent.get_cil_name(coolname) if self.parent else None + else: + return self.namemap[coolname] \ No newline at end of file From 77d69854dc86bef9edce0755eab0deef9f224f69 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 09:01:15 -0500 Subject: [PATCH 79/96] Added the built in classes writted in COOL --- src/compiler/utils/basics_classes.cl | 26 ++++++++++++++++ src/main.py | 46 +++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/compiler/utils/basics_classes.cl diff --git a/src/compiler/utils/basics_classes.cl b/src/compiler/utils/basics_classes.cl new file mode 100644 index 00000000..7341a29c --- /dev/null +++ b/src/compiler/utils/basics_classes.cl @@ -0,0 +1,26 @@ +class Object { + abort(): Object { self }; + copy(): Object { self }; + type_name(): String { "" }; +}; + +class IO { + in_int(): Int { 0 }; + in_string(): String { "" }; + out_int(x: Int): IO { self }; + out_string(x: String): IO { self }; +}; + +class String { + length(): Int { 0 }; + concat(s: String): String { "" }; + substr(i: Int, l: Int): String { "" }; +}; + +class Int { +}; + +class Bool { +}; + + diff --git a/src/main.py b/src/main.py index 8da1d36d..b5a675c9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,11 +1,32 @@ import sys, fileinput from argparse import ArgumentParser -from compiler.components.lexer_analyzer import tokenizer, tokens -from compiler.components.syntax_analyzer import run_parser -from compiler.components.semantic_analyzer import semanticAnalyzer -from compiler.utils.context import programContext +from compiler.components.lexer.lexer_analyzer import tokenizer, tokens +from compiler.components.parser.syntax_analyzer import run_parser +from compiler.components.semantic.semantic_analyzer import semanticAnalyzer +from compiler.components.semantic.context import programContext +from compiler.components.generation.CIL_generator import CILVisitor +#from compiler.utils.basics_AST import build_basic_ast from compiler.utils.preprocess_input import replace_tabs +import compiler.components.semantic.AST_definitions as ast +def build_basic_ast(): + fpath = "./compiler/utils/basics_classes.cl" + with open(fpath, encoding="utf-8") as file: + code = file.read() + _, _, real_col_basic= tokenizer(code) + ast_basic,_= run_parser(tokens= tokens, + source_program= code, + real_col= real_col_basic) + for _class in ast_basic.class_list: + if _class.idName == 'Int' or _class.idName == 'Bool' or _class.idName == 'String': + _class.attributes.append(ast.NodeAttr(idName = '_val', + _type= '__prim_zero_slot', + line= 0, column= 0)) + if _class.idName== 'String': + _class.attributes.append(ast.NodeAttr(idName = '_str_field', + _type= '__prim_empty_slot', + line= 0, column= 0)) + return ast_basic parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') @@ -15,6 +36,8 @@ parser_input.add_argument("--output", help = 'Put the info of the selected components in the standard output.', choices = ['l','p','t']) """ + + args= parser_input.parse_args() file= open(args.files_for_compile[0]) working_input= file.read() @@ -38,16 +61,25 @@ for error in parser_errors: print(error) exit(1) -#if parser_errors: print("In the parser_errors ", parser_errors) -sa = semanticAnalyzer(ast_result) + +basic_ast= build_basic_ast() +# Adding the builtIn classes +ast_result.class_list= basic_ast.class_list + ast_result.class_list + +# Running semantic analyzer +sa = semanticAnalyzer(ast_result, programContext) sa.run_visits() -#print('errors %s' %sa.errors) all_errors += token_errors + parser_errors + sa.errors if all_errors: for error in all_errors: print(error) exit(1) + +cilGen = CILVisitor(programContext, mapExpr= sa.mapExprWithResult) +programResult= cilGen.visit(sa.ast) + +print(programResult) From 339e78064c6b7ecdef0007c39162e8489f4413d6 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 10:51:40 -0500 Subject: [PATCH 80/96] Fixed the static dispatch --- src/compiler/components/generation/CIL_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py index 9993bdb2..170b8dae 100644 --- a/src/compiler/components/generation/CIL_generator.py +++ b/src/compiler/components/generation/CIL_generator.py @@ -547,7 +547,7 @@ def visit_NodeStaticDispatch(self, node: NodeStaticDispatch): self.registerInstruction(cil.PushParam, instanceVname) # Call the function - method_name = f'{node.expr.type}_{node.method}' + method_name = f'{node.dispatch_type}_{node.method}' self.registerInstruction(cil.VCall, result, node.dispatch_type, method_name) self.registerInstruction(cil.PopParam, instanceVname) From 288eb9b1984deaa30ff6c731f3566e54e52c1d95 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 10:52:16 -0500 Subject: [PATCH 81/96] Fixed the checkGoodInheritance method --- src/compiler/components/semantic/context.py | 14 +++++++------- .../components/semantic/semantic_analyzer.py | 12 ------------ 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/compiler/components/semantic/context.py b/src/compiler/components/semantic/context.py index 136386d9..64c8d6f7 100644 --- a/src/compiler/components/semantic/context.py +++ b/src/compiler/components/semantic/context.py @@ -104,24 +104,24 @@ def checkGoodInheritance(self, node: NodeClass): def checkGoodOverwriteMethod(self, node: NodeClassMethod, idType): idParent= self.types[idType].parent childInfoMethod= self.types[idType].methods.get(node.idName) - badIndexParam = lambda: next((i for i in range (len( childInfoMethod.argTypes)) - if childInfoMethod.argTypes[i] != parentInfoMethod.argTypes[i]), False) parentInfoMethod= self.types[idParent].methods.get(node.idName, None) or self.types[idParent].inheritsMethods.get(node.idName, None) if parentInfoMethod: + badIndexParam = next((i for i in range (len( childInfoMethod.argTypes)) + if childInfoMethod.argTypes[i] != parentInfoMethod.argTypes[i]), False) if len(node.formal_param_list) == len(parentInfoMethod.argTypes) else None return interceptError( validationFunc= lambda: len(node.formal_param_list) == len(parentInfoMethod.argTypes) , errorOption= 'bad length in redefine', methodName= node.idName, row_and_col= (node.line, node.column) ) or interceptError ( - validationFunc= lambda: not badIndexParam(), + validationFunc= lambda: not badIndexParam, errorOption= 'bad redefine method', methodName= node.idName, - badType= node.formal_param_list[badIndexParam()]._type, - goodType= parentInfoMethod.argTypes[badIndexParam()], - row_and_col= (node.formal_param_list[badIndexParam()].line, - node.formal_param_list[badIndexParam()].column) + badType= node.formal_param_list[badIndexParam]._type if badIndexParam else None, + goodType= parentInfoMethod.argTypes[badIndexParam] if badIndexParam else None, + row_and_col= (node.formal_param_list[badIndexParam].line if badIndexParam else None, + node.formal_param_list[badIndexParam].column if badIndexParam else None) ) or interceptError ( validationFunc = lambda: node.returnType == parentInfoMethod.returnType, errorOption= 'bad returnType in redefine method', diff --git a/src/compiler/components/semantic/semantic_analyzer.py b/src/compiler/components/semantic/semantic_analyzer.py index 3b98dcef..89bb4c05 100644 --- a/src/compiler/components/semantic/semantic_analyzer.py +++ b/src/compiler/components/semantic/semantic_analyzer.py @@ -29,16 +29,4 @@ def run_visits(self: NodeProgram): self.errors += typeCheckerResult return - programContext.types['Int'].attributes['_val']= Attribute(idName= '_val', - _type= '__prim_zero_slot', - wrapperType='Int') - programContext.types['Bool'].attributes['_val']= Attribute(idName= '_val', - _type='__prim_zero_slot', - wrapperType='Bool') - programContext.types['String'].attributes['_val']= Attribute(idName= '_val', - _type= '__prim_zero_slot', - wrapperType='String') - programContext.types['String'].attributes['_val']= Attribute(idName= '_str_field', - _type= '__prim_empty_slot', - wrapperType='String') self.mapExprWithResult = mapExprWithResult \ No newline at end of file From bf5728bc1d6a52379058241d65c01d6cc6ab284b Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 2 Jan 2021 21:46:06 -0500 Subject: [PATCH 82/96] Added a config folder --- src/compiler/utils/config.py | 95 ++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/compiler/utils/config.py diff --git a/src/compiler/utils/config.py b/src/compiler/utils/config.py new file mode 100644 index 00000000..83ae33bd --- /dev/null +++ b/src/compiler/utils/config.py @@ -0,0 +1,95 @@ +TYPE_ERROR = "TypeError" +NAME_ERROR = "NameError" +ATTRIBUTE_ERROR = "AttributeError" +SEMANTIC_ERROR = "SemanticError" + +SELF_TYPE = "SELF_TYPE" +INT = "Int" +BOOL = "Bool" +STRING = "String" +OBJECT = "Object" +IO = "IO" + +ABORT = "abort" +COPY = "copy" +TYPE_NAME = "type_name" + +OUT_STRING = "out_string" +OUT_INT = "out_int" +IN_STRING = "in_string" +IN_INT = "in_int" + +LENGTH = "length" +CONCAT = "concat" +SUBSTR = "substr" + + +ABORT_SIGNAL = "abort_signal"#CIL +CASE_MISSMATCH = "case_missmatch"#CIL +CASE_VOID = "case_on_void"#MIPS +DISPATCH_VOID = "dispatch_on_void"#MIPS +ZERO_DIVISION = "division_by_zero"#MIPS +SUBSTR_OUT_RANGE = "substr_out_of_range"#MIPS +HEAP_OVERFLOW = "heap_overflow" + +#code_gen +WORD = ".word" +ASCIIZ = ".asciiz" +SPACE = ".space" + +t0 = "$t0" +t1 = "$t1" +t2 = "$t2" +t3 = "$t3" +t6 = "$t6" # convenios +t7 = "$t7" # convenios +a0 = "$a0" +a1 = "$a1" +fp = "$fp" +sp = "$sp" +ra = "$ra" +lo = "lo" +hi = "hi" +v0 = "$v0" +s0 = "$s0" +s1 = "$s1" +s2 = "$s2" +s3 = "$s3" +zero = "$zero" + +BUFFER_SIZE = 1024 +INSTANCE_EXTRA_FIELDS = 1 # just type_info +VTABLE_EXTRA_FIELDS = 3 # type_name, parent, size +FP_ARGS_DISTANCE = 3 # how far finishes $fp from arguments in method call +FP_LOCALS_DISTANCE = 0 # how far finishes $fp from localvars in method call +VOID = "void" +STR_CMP = "string_comparer" +EMPTY_STRING = "empty_string" +INPUT_STR_BUFFER = "input_str_buffer" +EXIT = "exit" + +TYPEINFO_ATTR_OFFSET = 0 + +#type_info offsets +TYPENAME_OFFSET = 0 +PARENT_OFFSET = 4 +SIZE_OFFSET = 8 + +#str attributes offsets +LENGTH_ATTR_OFFSET = 4 +CHARS_ATTR_OFFSET = 8 + +SYSCALL_PRINT_INT = 1 +SYSCALL_PRINT_STR = 4 +SYSCALL_READ_INT = 5 +SYSCALL_READ_STR = 8 +SYSCALL_SBRK = 9 +SYSCALL_EXIT = 10 + +RA_OFFSET = 4 +OLD_FP_OFFSET = 8 +SELF_OFFSET = 12 + +BOX_SIZE = 8 +BOXED_VALUE_OFFSET = 4 +STRING_SIZE = 12 \ No newline at end of file From 2511ff24c051f70906cb8e0c7158095bb21d1c0a Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 10 Jan 2021 12:50:22 -0500 Subject: [PATCH 83/96] Ok, a safe copy --- .../components/generation/CIL_definitions.py | 7 +++- .../components/generation/CIL_generator.py | 41 +++++++++++++------ .../components/semantic/AST_definitions.py | 2 +- src/compiler/components/semantic/context.py | 10 +++-- src/compiler/utils/basics_classes.cl | 10 +++-- src/main.py | 12 ++++-- 6 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/compiler/components/generation/CIL_definitions.py b/src/compiler/components/generation/CIL_definitions.py index 6b0dfafd..1f0db66c 100644 --- a/src/compiler/components/generation/CIL_definitions.py +++ b/src/compiler/components/generation/CIL_definitions.py @@ -48,7 +48,7 @@ def to_readable(self): class Type(AST): - def __init__(self, name, attributes = {}, methods= {}): + def __init__(self, name, attributes, methods): self.type_name = name self.attributes = attributes self.methods = methods @@ -101,12 +101,15 @@ def to_readable(self): class Function(TypeFeature): - def __init__(self, name, args, vlocals, body): + def __init__(self, name, args, vlocals, body, returnType): self.name = name self.args = args self.vlocals = vlocals self.body = body + #Not for print + self.returnType= returnType + def to_readable(self): args = "" for t in self.args: diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py index 170b8dae..b721df54 100644 --- a/src/compiler/components/generation/CIL_generator.py +++ b/src/compiler/components/generation/CIL_generator.py @@ -37,10 +37,11 @@ def __init__(self, programContext, mapExpr): # Add static code self.addBuiltIns() - + # Class depth dictionary used to analyze Case expressions - self.classDepth = {} + self.classDepth= {} + def addBuiltIns(self): # Add static types, functions and string constants self.emptyString = self.registerData("") @@ -103,7 +104,7 @@ def inspectInitializers(self, typeName): while parentName: initializers.append(f'{parentName}_{"_init"}') parentName= self.programContext.types[parentName].parent - + initializers.reverse() return initializers def buildClassDepth(self, node: NodeProgram): @@ -114,13 +115,28 @@ def buildClassDepth(self, node: NodeProgram): for _class in node.class_list: if _class.parent: # Build the class depth dictionary - self.classDepth[_class.idName] = self.classDepth[_class.parent] + 1 + self.classDepth[_class.idName]= self.classDepth[_class.parent] + 1 + def orderClassesByInhertiance(self, typeName, classList, visitedDict): + order = [self.indexInClassByTypeName(typeName, classList)] + for child in self.programContext.types[typeName].children: + if not visitedDict[typeName]: + order += self.orderClassesByInhertiance(child, classList, visitedDict) + + visitedDict[typeName]= True + return order + + def indexInClassByTypeName(self, typeName, classList): + return next((i for i in range(len(classList)) if classList[i].idName == typeName), None) + + + def visit_NodeProgram(self, node: NodeProgram): self.buildClassDepth(node) - for nodeClass in node.class_list: - newType= self.visit(nodeClass, - initializers= self.inspectInitializers(nodeClass.idName)) + inhertirOrder= self.orderClassesByInhertiance('Object', node.class_list, {node.idName: False for node in node.class_list}) + for ind in inhertirOrder: + newType= self.visit(node.class_list[ind], + initializers= self.inspectInitializers(node.class_list[ind].idName)) self.registerType(newType) for func in self.dotcode: @@ -142,7 +158,7 @@ def visit_NodeClass(self, node: NodeClass, initializers): inhAttributes = [cil.Attribute(f'{parentName}_{attrName}') for attrName in self.programContext.types[node.idName].inheritsAttr] - methods= [cil.Method(methodName, f'{parentName}_{methodName}') for methodName in + methods= [cil.Method(methodName, f'{self.programContext.types[parentName].inheritsMethods[methodName].wrapperType}_{methodName}') for methodName in self.programContext.types[parentName].inheritsMethods.keys()] methods += [cil.Method(methodName, f'{parentName}_{methodName}') for methodName in self.programContext.types[parentName].methods.keys() if not methodName in methods] @@ -178,7 +194,8 @@ def visit_NodeClass(self, node: NodeClass, initializers): self.registerInstruction(cil.Return, '__self') func = cil.Function(self.currentFunctionName, [cil.ArgDeclaration('__self')], - self.localvars, self.instructions) + self.localvars, self.instructions, + node.idName) self.registerFunction(func) @@ -250,7 +267,7 @@ def visit_NodeClassMethod(self, node: NodeClassMethod): #----- Register the function and return the corresponding method node func= cil.Function(self.currentFunctionName, arguments, - self.localvars, self.instructions) + self.localvars, self.instructions, node.returnType) self.registerFunction(func) @@ -377,7 +394,7 @@ def visit_NodeLet(self, node: NodeLet): elif node.type == '__prim_empty_slot': self.register_instruction(cil.SetAttrib, '__self', self.currentIndex, self.emptyString) else: - self.registerInstruction(cil.Allocate, varName, 'Void') + self.registerInstruction(cil.Allocate, varName, 'void') self.nameMap.define_variable(node.idName, varName) @@ -451,7 +468,7 @@ def visit_NodeWhileLoop(self, node: NodeWhileLoop): self.visit(node.body) self.registerInstruction(cil.Goto, startLbl) self.registerInstruction(cil.Label, continueLbl) - self.registerInstruction(cil.Allocate, whileValue, 'Void') + self.registerInstruction(cil.Allocate, whileValue, 'void') return whileValue diff --git a/src/compiler/components/semantic/AST_definitions.py b/src/compiler/components/semantic/AST_definitions.py index 1fefca66..bbed88e4 100644 --- a/src/compiler/components/semantic/AST_definitions.py +++ b/src/compiler/components/semantic/AST_definitions.py @@ -99,7 +99,7 @@ def __init__(self, def to_readable(self): return "{}(name='{}', formal_param_list={}, returnType={}, body={})".format( - self.clsname, self.idName, self.formal_param_list, + self.clsname, self.idName, self.formal_param_list, self.returnType, self.body ) diff --git a/src/compiler/components/semantic/context.py b/src/compiler/components/semantic/context.py index 64c8d6f7..584f890c 100644 --- a/src/compiler/components/semantic/context.py +++ b/src/compiler/components/semantic/context.py @@ -21,7 +21,7 @@ def __init__(self, idName, attributes, self.builtIn= builtIn self.inheritsAttr= {} self.inheritsMethods= {} - self.children= {} + self.children= [] class feature(jsonable): def __init__(self, idName, wrapperType): @@ -75,19 +75,21 @@ def createType(self, node: NodeClass): }) def checkGoodInheritance(self, node: NodeClass): + if node.idName == 'Object': return + parent = 'Object' if not node.parent else node.parent return interceptError( validationFunc= lambda: node.idName in self.types, errorOption= 'undefined type', idName= node.idName, row_and_col= (node.line, node.column) ) or interceptError ( - validationFunc= lambda: node.idName == 'Object' or node.parent in + validationFunc= lambda: node.parent in self.types, errorOption= 'undefined type', idName= node.parent, row_and_col= (node.line, node.parent_col) ) or interceptError( - validationFunc= lambda: node.idName == 'Object' or not self.types[node.parent].builtIn, + validationFunc= lambda: not self.types[node.parent].builtIn, errorOption= 'built-in inheritance', idName= node.idName, idParent= node.parent, @@ -98,7 +100,7 @@ def checkGoodInheritance(self, node: NodeClass): errorOption= 'inheritance from child', idChild= node.idName, row_and_col= (node.line, node.parent_col) - ) + ) or self.types[parent].children.append(node.idName) def checkGoodOverwriteMethod(self, node: NodeClassMethod, idType): diff --git a/src/compiler/utils/basics_classes.cl b/src/compiler/utils/basics_classes.cl index 7341a29c..94075b38 100644 --- a/src/compiler/utils/basics_classes.cl +++ b/src/compiler/utils/basics_classes.cl @@ -11,16 +11,18 @@ class IO { out_string(x: String): IO { self }; }; +class Int { +}; + +class Bool { +}; + class String { length(): Int { 0 }; concat(s: String): String { "" }; substr(i: Int, l: Int): String { "" }; }; -class Int { -}; -class Bool { -}; diff --git a/src/main.py b/src/main.py index b5a675c9..e24347f2 100644 --- a/src/main.py +++ b/src/main.py @@ -7,10 +7,12 @@ from compiler.components.generation.CIL_generator import CILVisitor #from compiler.utils.basics_AST import build_basic_ast from compiler.utils.preprocess_input import replace_tabs +from compiler.components.generation.MIPS_generator import MipsVisitor import compiler.components.semantic.AST_definitions as ast +import subprocess as sp def build_basic_ast(): - fpath = "./compiler/utils/basics_classes.cl" + fpath = "./cool-compiler-2020/src/compiler/utils/basics_classes.cl" with open(fpath, encoding="utf-8") as file: code = file.read() _, _, real_col_basic= tokenizer(code) @@ -79,7 +81,11 @@ def build_basic_ast(): print(error) exit(1) -cilGen = CILVisitor(programContext, mapExpr= sa.mapExprWithResult) +cilGen= CILVisitor(programContext, mapExpr= sa.mapExprWithResult) programResult= cilGen.visit(sa.ast) -print(programResult) +mipsGen= MipsVisitor(programContext) + +mipsCode= mipsGen.visit(programResult) + +print(mipsCode) From 3d43cdc27a631cca6bef4267a4d288f26fc20a3a Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 10 Jan 2021 12:51:55 -0500 Subject: [PATCH 84/96] Those are mips files for generation. Are a s**t. So, I'm gonna change from top of it's design --- .../components/generation/MIPS_defintions.py | 257 +++++ .../components/generation/MIPS_generator.py | 1001 +++++++++++++++++ 2 files changed, 1258 insertions(+) create mode 100644 src/compiler/components/generation/MIPS_defintions.py create mode 100644 src/compiler/components/generation/MIPS_generator.py diff --git a/src/compiler/components/generation/MIPS_defintions.py b/src/compiler/components/generation/MIPS_defintions.py new file mode 100644 index 00000000..7c719cad --- /dev/null +++ b/src/compiler/components/generation/MIPS_defintions.py @@ -0,0 +1,257 @@ +class MIPSNode: + pass + +class MIPSProgramNode(MIPSNode): + def __init__(self, dotdata, dottext): + self.dotdata = dotdata + self.dottext = dottext + +class MIPSDataNode(MIPSNode): + pass + +class MIPSProcedureNode(MIPSNode): + def __init__(self, label): + self.label = label + self.instructions = [] + +class MIPSInstructionNode(MIPSNode): + pass + +class MIPSDataTypedNode(MIPSDataNode): + def __init__(self, vname, data_type, values): + self.vname = vname + self.data_type = data_type + self.values = values + + def __str__(self): + values = "" + for value in self.values: + values += f", {value}" + return f"{self.vname} : {self.data_type}{values}" + +class MIPSConstantNode(MIPSDataNode): + def __init__(self, vname, value): + self.vname = vname + self.value = value + +class MIPSArithmeticAndLogicNode(MIPSInstructionNode) : + def __init__(self, destination, left, right): + self.destination = destination + self.left = left + self.right = right + +class MIPSAddNode(MIPSArithmeticAndLogicNode): + def __str__(self): + return f"add {self.destination}, {self.left}, {self.right}" + +class MIPSSubstractNode(MIPSArithmeticAndLogicNode): + def __str__(self): + return f"sub {self.destination}, {self.left}, {self.right}" + +class MIPSAddInmediateNode(MIPSArithmeticAndLogicNode): + def __str__(self): + return f'addi {self.destination}, {self.left}, {self.right}' + +class MIPSAddUnsigned(MIPSArithmeticAndLogicNode): + pass + +class MIPSSubstractUnsignedNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSAddInmediateUnsignedNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSMultiplyWithoutOverflow(MIPSArithmeticAndLogicNode): + pass + +class MIPSAndNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSOrNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSAndInmediateNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSOrInmediateNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSShiftLeftNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSShiftRightNode(MIPSArithmeticAndLogicNode): + pass + +class MIPSHiLoOperationNode(MIPSInstructionNode): + def __init__(self,left,right): + self.left = left + self.right = right + +class MIPSMultiplyNode(MIPSHiLoOperationNode): + def __str__(self): + return f'mult {self.left}, {self.right}' + +class MIPSDivideNode(MIPSHiLoOperationNode): + def __str__(self): + return f'div {self.left}, {self.right}' + +class MIPSDataTransferNode(MIPSInstructionNode): + pass +class MIPSDataTransferWithOffsetNode(MIPSDataTransferNode): + def __init__(self, source, offset, destination): + self.source = source + self.offset = offset + self.destination = destination + +class MIPSLoadWordNode(MIPSDataTransferWithOffsetNode): + def __str__(self): + return f'lw {self.source}, {str(self.offset)}({self.destination})' + +class MIPSLoadByteNode(MIPSDataTransferWithOffsetNode): + def __str__(self): + return f'lb {self.source}, {str(self.offset)}({self.destination})' + +class MIPSStoreWordNode(MIPSDataTransferWithOffsetNode): + def __str__(self): + return f'sw {self.source}, {str(self.offset)}({self.destination})' + +class MIPSStoreByteNode(MIPSDataTransferWithOffsetNode): + def __str__(self): + return f'sb {self.source}, {str(self.offset)}({self.destination})' + +class MIPSLoadNode(MIPSDataTransferNode): + def __init__(self, destination, source): + self.destination = destination + self.source = source + +class MIPSLoadUpperInmediateNode(MIPSLoadNode): + pass + +class MIPSLoadAdressNode(MIPSLoadNode): + def __str__(self): + return f'la {self.destination}, {self.source}' + +class MIPSLoadInmediateNode(MIPSLoadNode): + def __str__(self): + return f'li {self.destination}, {str(self.source)}' + +class MIPSMoveFromNode(MIPSDataTransferNode): + def __init__(self, destination): + self.destination = destination + +class MIPSMoveNode(MIPSDataTransferNode): + def __init__(self, destination, source): + self.destination = destination + self.source = source + + def __str__(self): + return f"move {self.destination} {self.source}" + +class MIPSConditionalBranchNode(MIPSInstructionNode): + def __init__(self, r1, r2, jump): + self.r1 = r1 + self.r2 = r2 + self.jump = jump + +class MIPSBranchOnEqualNode(MIPSConditionalBranchNode): + def __str__(self): + return f"beq {self.r1}, {self.r2}, {self.jump}" + +class MIPSBranchNeqZero(MIPSInstructionNode): + def __init__(self, r, label): + self.r = r + self.label = label + + def __str__(self): + return f"bnez {self.r}, {self.label}" + +class MIPSBranchOnNotEqualNode(MIPSConditionalBranchNode): + def __str__(self): + return f"bne {self.r1}, {self.r2}, {self.jump}" + +class MIPSBranchOnGTNode(MIPSConditionalBranchNode): + def __str__(self): + return f"bgt {self.r1}, {self.r2}, {self.jump}" + +class MIPSBranchOnGTENode(MIPSConditionalBranchNode): + pass + +class MIPSBranchOnLTNode(MIPSConditionalBranchNode): + def __str__(self): + return f"blt {self.r1}, {self.r2}, {self.jump}" + +class MIPSBranchOnLTENode(MIPSConditionalBranchNode): + pass + +class MIPSComparissonNode(MIPSInstructionNode): + def __init__(self, result_register, value1, value2): + self.result_register = result_register + self.value1 = value1 + self.value2 = value2 + +class MIPSSetOnLTNode(MIPSComparissonNode): + def __str__(self): + return f'slt {self.result_register}, {self.value1}, {self.value2}' + +class MIPSSetOnLTENode(MIPSComparissonNode): + def __str__(self): + return f'sleu {self.result_register}, {self.value1}, {self.value2}' + +class MIPSSetOnENode(MIPSComparissonNode): + def __str__(self): + return f'seq {self.result_register}, {self.value1}, {self.value2}' + +class MIPSSetOnLTInmediateNode(MIPSComparissonNode): + def __str__(self): + return f'slti {self.result_register}, {self.value1}, {self.value2}' + +class MIPSUnconditionalJumpNode(MIPSInstructionNode): + def __init__(self, jump): + self.jump = jump + +class MIPSJumpNode(MIPSUnconditionalJumpNode): + def __str__(self): + return f"j {self.jump}" + +class MIPSJumpRegisterNode(MIPSUnconditionalJumpNode): + def __str__(self): + return f"jr {self.jump}" + +class MIPSJumpAndLinkNode(MIPSUnconditionalJumpNode): + def __str__(self): + return f"jal {self.jump}" + +class MIPSJumpAndLinkRegNode(MIPSInstructionNode): + def __init__(self, r): + self.r = r + + def __str__(self): + return f"jalr {self.r}" + +class MIPSLabelNode(MIPSInstructionNode): + def __init__(self, label): + self.label = label + + def __str__(self): + return f"{self.label}:" + +class MIPSEmptyInstruction(MIPSInstructionNode): + def __str__(self): + return "" + +class MIPSCommentNode(MIPSNode): + def __init__(self, comment): + self.comment = comment + + def __str__(self): + return f"#{self.comment}" + +class MIPSSyscallNode(MIPSInstructionNode): + def __str__(self): + return "syscall" + +class MIPSMLONode(MIPSInstructionNode): + def __init__(self,destiny): + self.destiny = destiny + def __str__(self): + return f"mflo {self.destiny}" diff --git a/src/compiler/components/generation/MIPS_generator.py b/src/compiler/components/generation/MIPS_generator.py new file mode 100644 index 00000000..db7f4734 --- /dev/null +++ b/src/compiler/components/generation/MIPS_generator.py @@ -0,0 +1,1001 @@ +from compiler.components.visitors_definitions import NodeVisitor +import compiler.components.generation.CIL_definitions as cil +from compiler.utils.config import * + + +class MipsVisitor(NodeVisitor): + def __init__(self, programContext, output_file="mips_code.mips"): + super().__init__(programContext) + self.code = [] + self.offset = {} + self.type_index = {} + self.dispatchtable_code = [] + self.prototypes_code = [] + self.cur_labels_id = 0 + self.text= ['.text\n.globl main\n'] + self.data= ['.data\n'] + self.output_file = output_file + + + def push(self): + self.write_info('sw $a0 0($sp)') + self.write_info('addiu $sp $sp -4') + + def pop(self, dest=None): + self.write_info(f'addiu $sp $sp 4') + + + def write_info(self, msg, placeToWrite = 'text', tabbed=True): + info= "{}{}\n".format("\t" if tabbed else "", msg) + if placeToWrite == 'text': + self.code.append(info) + self.text.append(info) + else: + self.data.append(info) + + #def write_file(self, mode = "a"): + # f = open(self.output_file, mode) + # toWrite= self.data + '\n' + self.text + # f.write(toWrite) + # f.close() + + + def allocate_memory(self, size=None, register=False): + if register: + self.write_info('move $a0 {}'.format(size)) + else: + if size: + self.write_info('li $a0 {}'.format(size)) + self.write_info('li $v0 9') + self.write_info('syscall') + + def new_labels_id(self): + self.cur_labels_id += 1 + return self.cur_labels_id + + def to_stream(self): + stream = '' + for s in self.data: + stream += s + stream += '\n' + for s in self.text: + stream += s + return stream + + def visit_Program(self, node: cil.Program): + #-------------------- DATA SECTION ---------------------------- + + # Declare static data + self.static_datas() + + # Transpile CIL data section + for data in node.data_section: + self.visit(data) + self.write_info('', placeToWrite= 'data') + + # Declare class name strings and map class index + for i, _type in enumerate(node.type_section): + self.type_index[_type.type_name] = i + self.write_info('classname_{}: .asciiz \"{}\"'.format(_type.type_name, _type.type_name), + placeToWrite= 'data') + # Declare void type + self.write_info(f'{"type_void"}: .asciiz \"\"', placeToWrite= 'data') + + #-------------------- TEXT SECTION ---------------------------- + + self.entry() + + self.write_info('\n########## STATIC FUNCTIONS ##########\n') + # CONFORMS + self.conforms() + # IS_VOID + self.isvoid() + # OBJECT + self.object_abort() + self.object_copy() + self.object_typename() + # STRING + self.string_length() + self.string_concat() + self.string_substr() + # IO + self.io_in_int() + self.io_in_string() + self.io_out_int() + self.io_out_string() + + for t in node.type_section: + self.visit(t) + + self.write_info('\n############## TABLES ################\n') + + # Generate method that creates classes's name table + self.write_info('function_build_class_name_table:', tabbed=False) + self.allocate_memory(len(node.type_section) * 4) + self.write_info('move $s1 $v0') # save the address of the table in a register + for i in range(len(node.type_section)): + self.write_info('la $t1 classname_{}'.format(node.type_section[i].type_name)) + self.write_info('sw $t1 {}($s1)'.format(4 * i)) + self.write_info('') + + # Generate method that allocates memory for prototypes table + self.write_info('function_allocate_prototypes_table:', tabbed=False) + self.allocate_memory(8 * len(self.type_index)) + self.write_info('move $s0 $v0') # save the address of the table in a register + self.write_info('') + + # Generate mips method that builds prototypes + self.write_info('function_build_prototypes:', tabbed=False) + for ins in self.prototypes_code: + self.write_info(ins) + self.write_info('') + + # Generate mips method that builds dispatch tables + self.write_info('function_build_dispatch_tables:', tabbed=False) + for ins in self.dispatchtable_code: + self.write_info(ins) + self.write_info('') + + # Generate method that builds class parents table + self.write_info('function_build_class_parents_table:', tabbed=False) + self.allocate_memory(4 * len(self.type_index)) + self.write_info('move $s2 $v0') # save the address of the table in a register + self.write_info('') + + # Fill table entry for each class type + for parent in self.programContext.types.keys(): + p_index = self.type_index[parent] + for childName in self.programContext.types[parent].children: + ch_index= self.type_index[childName] + self.write_info(f'li $t0 {ch_index}') + self.write_info(f'mul $t0 $t0 4') + self.write_info(f'add $t0 $t0 $s2') + self.write_info(f'li $t1 {p_index}') + self.write_info(f'sw $t1 0($t0)') + self.write_info('') + + self.write_info('') + + + # Generate COOL functions + self.write_info('\n########### COOL FUNCTIONS ##########\n') + for func in node.code_section: + is_built_in = False + if not "_init" in func.name: + is_built_in = [x for x in self.programContext.basics if f'{x}_' in func.name] != [] + if not is_built_in: + self.visit(func) + self.write_info('\n#####################################\n') + + return self.to_stream() + + +################################ .DATA ####################################### + def visit_Data(self, node: cil.Data): + self.write_info(f'{node.dest}: .asciiz \"{str(node.value.encode())[2:-1]}\"', placeToWrite= 'data') + + +################################ TYPES ####################################### + + def visit_Type(self, node: cil.Type): + # Allocate + self.dispatchtable_code.append(f'# Type {node.type_name}') + self.dispatchtable_code.append('li $a0 {}'.format(4 * len(node.methods))) + self.dispatchtable_code.append('li $v0 9') + self.dispatchtable_code.append('syscall') + + # Add dispatch table code + for i in range(len(node.methods)): + self.dispatchtable_code.append('la $t1 function_{}'.format(node.methods[i].function_name)) + self.dispatchtable_code.append('sw $t1 {}($v0)'.format(4 * i)) + self.dispatchtable_code.append('lw $t0 {}($s0)'.format(8 * self.type_index[node.type_name])) + self.dispatchtable_code.append('sw $v0 8($t0)') + self.dispatchtable_code.append('') + + # Allocate + self.prototypes_code.append(f'# Type {node.type_name}') + self.prototypes_code.append('li $a0 {}'.format(12 + 4 * len(node.attributes))) + self.prototypes_code.append('li $v0 9') + self.prototypes_code.append('syscall') + + # Add prototype code + class_index = self.type_index[node.type_name] + self.prototypes_code.append('li $a0 {}'.format(class_index)) + self.prototypes_code.append('sw $a0 0($v0)') + self.prototypes_code.append('li $a0 {}'.format(12 + 4 * len(node.attributes))) + self.prototypes_code.append('sw $a0 4($v0)') + self.prototypes_code.append('sw $v0 {}($s0)'.format(8 * class_index)) + self.prototypes_code.append('') + + def visit_Function(self, node: cil.Function): + self.code = [] + self.write_info(f'function_{node.name}:', tabbed=False) + + # Set up stack frame + self.write_info(f'move $fp, $sp') + self.write_info(f'subu $sp, $sp, {4 * len(node.vlocals)}') + + # Register arguments offsets + for i in range(len(node.args)): + self.offset[node.args[i].name] = 12 + i * 4 + + # Register locals offsets + for i in range(len(node.vlocals)): + self.offset[node.vlocals[i].name] = i * (-4) + + # Generate mips code for the function's body + for inst in node.body: + # Equal node needs unique id for its labels + if isinstance(inst, cil.Equal) or isinstance(inst, cil.Div): + inst.id = self.new_labels_id() + + self.visit(inst) + + # Pop the stack frame + self.write_info(f'addiu $sp, $sp, {4 * len(node.vlocals)}') + + # Return + self.write_info('jr $ra') + + self.write_info('') + +############################## ASSIGNMENT #################################### + + def visit_Assign(self, node: cil.Assign): + self.write_info('# ASSIGN') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.source])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + +############################# ARITHMETICS #################################### + + + def visit_Plus(self, node: cil.Plus): + self.write_info('# +') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info('add $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Minus(self, node: cil.Minus): + self.write_info('# -') + if isinstance(node.left, int): + self.write_info('li $a0 {}'.format(node.left)) + else: + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info('sub $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Mult(self, node: cil.Mult): + self.write_info('# *') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info('mul $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Div(self, node: cil.Div): + self.write_info('# /') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info(f'beqz $a1 _div_error_{node.id}_') + self.write_info('div $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info(f'b _div_end_{node.id}_') + self.write_info(f'_div_error_{node.id}_:',tabbed=False) + self.write_info('la $a0 _div_zero_msg') + self.write_info('li $v0 4') + self.write_info('syscall') + self.write_info('la $a0 _abort_msg') + self.write_info('li $v0 4') + self.write_info('syscall') + self.write_info('li $v0 10') + self.write_info('syscall') + self.write_info(f'_div_end_{node.id}_:',tabbed=False) + + +############################# COMPARISONS #################################### + + + def visit_Equal(self, node: cil.Equal): + self.write_info('lw $t0 {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $t1 {}($fp)'.format(self.offset[node.right])) + self.write_info(f'beq $t0 $zero _eq_false_{node.id}_') # $t0 can't also be void + self.write_info(f'beq $t1 $zero _eq_false_{node.id}_') # $t1 can't also be void + self.write_info('lw $a0 0($t0)') # get object 1 tag + self.write_info('lw $a1 0($t1)') # get object 2 tag + self.write_info(f'bne $a0 $a1 _eq_false_{node.id}_') # compare tags + self.write_info('li $a2 {}'.format(self.type_index["Int"])) # load int tag + self.write_info(f'beq $a0 $a2 _eq_int_bool_{node.id}') # Integers + self.write_info('li $a2 {}'.format(self.type_index["Bool"])) # load bool tag + self.write_info(f'beq $a0 $a2 _eq_int_bool_{node.id}') # Booleans + self.write_info('li $a2 {}'.format(self.type_index["String"])) # load string tag + self.write_info(f'bne $a0 $a2 _not_basic_type_{node.id}_') # Not a primitive type + + # equal strings + # verify len of the strings + self.write_info(f'_eq_str_{node.id}_:', tabbed = False) # handle strings + self.write_info('lw $t3 12($t0)') # get string_1 size + self.write_info('lw $t3 12($t3)') # unbox string_1 size + self.write_info('lw $t4, 12($t1)') # get string_2 size + self.write_info('lw $t4, 12($t4)') # unbox string_2 size + self.write_info(f'bne $t3 $t4 _eq_false_{node.id}_') # string size are distinct + self.write_info(f'beq $t3 $0 _eq_true_{node.id}_') # if strings are empty + + # Verify ascii secuences + self.write_info('addu $t0 $t0 16') # Point to start of string s1 + self.write_info('lw $t0 0($t0)') + self.write_info('addu $t1 $t1 16') # Point to start of string s2 + self.write_info('lw $t1 0($t1)') + self.write_info('move $t2 $t3') # Keep string length as counter + self.write_info(f'_verify_ascii_sequences_{node.id}_:', tabbed = False) + self.write_info('lb $a0 0($t0)') # get char of s1 + self.write_info('lb $a1 0($t1)') # get char of s2 + self.write_info(f'bne $a0 $a1 _eq_false_{node.id}_') # char s1 /= char s2 + self.write_info('addu $t0 $t0 1') + self.write_info('addu $t1 $t1 1') + self.write_info('addiu $t2 $t2 -1') # Decrement counter + self.write_info(f'bnez $t2 _verify_ascii_sequences_{node.id}_') + self.write_info(f'b _eq_true_{node.id}_') # end of strings + + self.write_info(f'_not_basic_type_{node.id}_:', tabbed = False) + self.write_info(f'bne $t0 $t1 _eq_false_{node.id}_') + self.write_info(f'b _eq_true_{node.id}_') + + # equal int or boolf + self.write_info(f'_eq_int_bool_{node.id}:', tabbed = False) # handles booleans and ints + self.write_info('lw $a3 12($t0)') # load value variable_1 + self.write_info('lw $t4 12($t1)') # load variable_2 + self.write_info(f'bne $a3 $t4 _eq_false_{node.id}_') # value of int or bool are distinct + + #return true + self.write_info(f'_eq_true_{node.id}_:', tabbed = False) + self.write_info('li $a0 1') + self.write_info('sw $a0 {}($fp)'.format(self.offset[node.dest])) + self.write_info(f'b end_equal_{node.id}_') + + #return false + self.write_info(f'_eq_false_{node.id}_:', tabbed = False) + self.write_info('li $a0 0') + self.write_info('sw $a0 {}($fp)'.format(self.offset[node.dest])) + self.write_info(f'end_equal_{node.id}_:', tabbed = False) + + def visit_LessThan(self, node: cil.LessThan): + self.write_info('# <') + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) + self.write_info('slt $a0, $a1, $a2'.format(self.offset[node.right])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_EqualOrLessThan(self, node: cil.EqualOrLessThan): + self.write_info('# <=') + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) + self.write_info('sle $a0, $a1, $a2'.format(self.offset[node.right])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + +############################## ATTRIBUTES #################################### + + def visit_GetAttrib(self, node: cil.GetAttrib): + self.write_info('# GETATTR') + self.write_info(f'lw $a1 {self.offset[node.instance]}($fp)') + self.write_info(f'lw $a0 {12 + 4 * node.attribute}($a1)') + self.write_info(f'sw $a0 {self.offset[node.dest]}($fp)') + self.write_info('') + + def visit_SetAttrib(self, node: cil.SetAttrib): + self.write_info('# SETATTR') + self.write_info(f'lw $a1 {self.offset[node.instance]}($fp)') + if isinstance(node.src, int): + self.write_info(f'li $a0, {node.src}') + elif node.src[:5] == "data_": + self.write_info(f'la $a0, {node.src}') + else: + self.write_info(f'lw $a0 {self.offset[node.src]}($fp)') + self.write_info(f'sw $a0 {12 + 4 * node.attribute}($a1)') + self.write_info('') + + +################################ MEMORY ###################################### + + def visit_TypeOf(self, node: cil.TypeOf): + self.write_info('# TYPEOF') + self.write_info(f'lw $a1 {self.offset[node.instance]}($fp)') + self.write_info(f'lw $a0 0($a1)') + self.write_info(f'sw $a0 {self.offset[node.dest]}($fp)') + self.write_info('') + + def visit_Allocate(self, node: cil.Allocate): + self.write_info('# ALLOCATE') + if node.ttype == "void": + self.write_info(f'la $v0 {"type_void"}') + self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') + else: + offset_proto = self.type_index[node.ttype] * 8 + self.write_info('lw $t0 {}($s0)'.format(offset_proto)) + self.write_info('sw $t0, 0($sp)') + self.write_info('addiu $sp, $sp, -4') + self.write_info('') + self.visit(cil.Call(dest = node.dest, f = "Object_copy")) + self.write_info('addiu $sp, $sp, 4') + self.write_info('') + + +########################## DISPATCH STATEMENTS ############################### + + def visit_Call(self, node: cil.Call): + self.write_info('# CALL') + + # Save return address and frame pointer + self.write_info(f'addiu $sp, $sp, -8') + self.write_info(f'sw $ra, 4($sp)') + self.write_info(f'sw $fp, 8($sp)') + + # Call the function + self.write_info(f'jal function_{node.f}') + + # Restore return address and frame pointer + self.write_info(f'lw $fp, 8($sp)') + self.write_info(f'lw $ra, 4($sp)') + self.write_info(f'addiu $sp, $sp, 8') + + if node.dest: + self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') + + self.write_info('') + + + def visit_VCall(self, node: cil.VCall): + self.write_info('# VCALL') + + # Save return address and frame pointer + self.write_info(f'addiu $sp, $sp, -8') + self.write_info(f'sw $ra, 4($sp)') + self.write_info(f'sw $fp, 8($sp)') + + if node.ttype[0] == "_": + # If node.type is a local CIL variable + self.write_info(f'lw $a2, {self.offset[node.ttype]}($fp)') + else: + # If node.type a type name + self.write_info(f'li $a2, {self.type_index[node.ttype]}') + self.write_info(f'mul $a2, $a2, 8') + self.write_info(f'addu $a2, $a2, $s0') + self.write_info(f'lw $a1, 0($a2)') + + # Check the dispatch table for the method's address + self.write_info(f'lw $a2, 8($a1)') + self.write_info(f'lw $a0 {node.f * 4}($a2)') + + # Call the function at 0($a0) + self.write_info(f'jalr $a0') + + # Restore return address and frame pointer + self.write_info(f'lw $fp, 8($sp)') + self.write_info(f'lw $ra, 4($sp)') + self.write_info(f'addiu $sp, $sp, 8') + + # Save value after restoring $fp + self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') + + # Check prototypes table for the dynamic type + if node.ttype[0] != '_': + self.write_info(f'li $a2, {self.type_index[node.ttype]}') + else: + self.write_info(f'lw $a2, {self.offset[node.ttype]}($fp)') + + self.write_info('') + + + def visit_PushParam(self, node: cil.PushParam): + self.write_info('# PUSHPARAM') + if node.name[0] != "_": + self.write_info('li $a0, {}'.format(self.type_index[node.name])) + else: + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.name])) + self.push() + self.write_info('') + + + def visit_PopParam(self, node: cil.PopParam): + self.write_info('# POPPARAM') + self.pop(node.name) + self.write_info('') + + def visit_Return(self, node: cil.Return): + self.write_info('# RETURN') + self.write_info('lw $v0, {}($fp)'.format(self.offset[node.value])) + + +################################# JUMPS ###################################### + + + def visit_Label(self, node: cil.Label): + self.write_info('_cil_label_{}:'.format(node.name), tabbed=False) + + def visit_Goto(self, node: cil.Goto): + self.write_info('# GOTO') + self.write_info('j _cil_label_{}'.format(node.label)) + self.write_info('') + + + def visit_IfGoto(self, node: cil.IfGoto): + self.write_info('# IF GOTO') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.condition])) + self.write_info('bnez $a0, _cil_label_{}'.format(node.label)) + self.write_info('') + + +############################## STATIC CODE ################################### + + #----- STATIC DATAs + + def static_datas(self): + # Buffer for reading strings + self.write_info('str_buffer: .space 1025', placeToWrite='data') + self.write_info('', placeToWrite='data') + + # Declare error mensages + self.write_info('_index_negative_msg: .asciiz \"Index to substr is negative\\n\"', placeToWrite= 'data') + self.write_info('_index_out_msg: .asciiz \"Index out range exception\\n\"', placeToWrite= 'data') + self.write_info('_abort_msg: .asciiz \"Execution aborted\\n\"', placeToWrite= 'data') + self.write_info('_div_zero_msg: .asciiz \"Division by zero exception\\n\"', placeToWrite= 'data') + + self.write_info('', placeToWrite= 'data') + + #----- ENTRY FUNCTION + + def entry(self): + self.write_info('main:', tabbed=False) + self.visit(cil.Call(dest = None, f = 'build_class_name_table')) + self.visit(cil.Call(dest = None, f = 'allocate_prototypes_table')) + self.visit(cil.Call(dest = None, f = 'build_prototypes')) + self.visit(cil.Call(dest = None, f = 'build_dispatch_tables')) + self.visit(cil.Call(dest = None, f = 'build_class_parents_table')) + self.visit(cil.Allocate(dest = None, ttype = 'Main')) + + # Push main self + self.write_info('sw $v0 0($sp)') + self.write_info('addiu $sp $sp -4') + + self.visit(cil.Call(dest = None, f = f'Main__init')) + self.write_info('addiu $sp $sp 4') + + # Push main self + self.write_info('sw $v0 0($sp)') + self.write_info('addiu $sp $sp -4') + + self.visit(cil.Call(dest = None, f = 'Main_main')) + self.write_info('addiu $sp $sp 4') + + self.write_info('li $v0 10') + self.write_info('syscall') + + #----- OBJECT METHODS + + def object_abort(self): + self.write_info('function_Object_abort:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info('jr $ra') + self.write_info('') + + def object_copy(self): + self.write_info('function_Object_copy:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info('lw $t0 12($fp)')# recoger la instancia a copiar + self.write_info('lw $a0 4($t0)') + self.write_info('move $t4 $a0') + self.write_info('li $v0 9') + self.write_info('syscall')# guarda en v0 la direccion de memoria que se reservo + self.write_info('move $t2 $v0')# salvar la direccion donde comienza el objeto + self.write_info('li $t3 0') # size ya copiado + self.write_info('_objcopy_loop:', tabbed=False) + self.write_info('lw $t1 0($t0)') # cargar la palabra por la que voy + self.write_info('sw $t1 0($v0)') # copiar la palabra + self.write_info('addiu $t0 $t0 4') # posiciona el puntero en la proxima palabra a copiar + self.write_info('addiu $v0 $v0 4') # posiciona el puntero en la direccion donde copiar la proxima palabra + self.write_info('addiu $t3 $t3 4') # actualizar el size copiado + self.write_info('ble $t4 $t3 _objcopy_loop') # verificar si la condicion es igual o menor igual + self.write_info('_objcopy_div_end_:', tabbed=False) + self.write_info('move $v0 $t2') # dejar en v0 la direccion donde empieza el nuevo objeto + self.write_info('jr $ra') + self.write_info('') + + def object_typename(self): + self.write_info('function_Object_type_name:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + # Box the string reference + self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object + self.write_info('move $v1 $v0') + + # Box string's length + self.visit(cil.Allocate(dest = None, ttype = "Int") ) # Create new Int object + + self.write_info('lw $a1 12($fp)') # self + self.write_info('lw $a1 0($a1)') + self.write_info('mul $a1 $a1 4') # self's class tag + self.write_info('addu $a1 $a1 $s1') # class name table entry address + self.write_info('lw $a1 0($a1)') # Get class name address + + self.write_info('move $a2 $0') # Compute string's length + self.write_info('move $t2 $a1') + self.write_info('_str_len_clsname_:', tabbed=False) + self.write_info('lb $a0 0($t2)') + self.write_info('beq $a0 $0 _end_clsname_len_') + self.write_info('addiu $a2 $a2 1') + self.write_info('addiu $t2 $t2 1') + self.write_info('j _str_len_clsname_') + self.write_info('_end_clsname_len_:', tabbed=False) + + self.write_info('sw $a2, 12($v0)') # Store string's length + + self.write_info('sw $v0, 12($v1)') # Fill String attributes + self.write_info('sw $a1, 16($v1)') + + self.write_info('move $v0 $v1') + self.write_info('jr $ra') + self.write_info('') + + + #----- STRING METHODS + + def string_length(self): + self.write_info('function_String_length:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info('lw $a0 12($fp)') # Self + self.write_info('lw $v0 12($a0)') + self.write_info('jr $ra') + self.write_info('') + + def string_concat(self): + self.write_info('function_String_concat:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object + self.write_info('move $v1 $v0') # Save new Int Object + + self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object + self.write_info('move $t3 $v0') # Store new String object + + self.write_info('lw $a1 12($fp)') # Self + self.write_info('lw $a2 16($fp)') # Boxed String to concat + + self.write_info('lw $t1 12($a1)') # Self's length Int object + self.write_info('lw $t1 12($t1)') # Self's length + + self.write_info('lw $t2 12($a2)') # strings to concat's length Int object + self.write_info('lw $t2 12($t2)') # strings to concat's length + + self.write_info('addu $t0 $t2 $t1') # New string's length + self.write_info('sw $t0 12($v1)') # Store new string's length into box + + self.write_info('lw $a1 16($a1)') # Unbox strings + self.write_info('lw $a2 16($a2)') + + self.write_info('addiu $t0 $t0 1') # Add space for \0 + self.allocate_memory('$t0', register=True) # Allocate memory for new string + self.write_info('move $t5 $v0') # Keep the string's reference in v0 and use t7 + + + # a1: self's string a2: 2nd string t1: length self t2: 2nd string length + # v1: new string's int object + + self.write_info('move $t4 $a1') # Index for iterating the self string + self.write_info('addu $a1 $a1 $t1') # self's copy limit + self.write_info('_strcat_copy_:', tabbed=False) + self.write_info('beq $t4 $a1 _end_strcat_copy_') # No more characters to copy + + self.write_info('lb $a0 0($t4)') # Copy the character + self.write_info('sb $a0 0($t5)') + + self.write_info('addiu $t5 $t5 1') # Advance indices + self.write_info('addiu $t4 $t4 1') + self.write_info('j _strcat_copy_') + self.write_info('_end_strcat_copy_:', tabbed=False) + + # Copy 2nd string + + self.write_info('move $t4 $a2') # Index for iterating the strings + self.write_info('addu $a2 $a2 $t2') # self's copy limit + self.write_info('_strcat_copy_snd_:', tabbed=False) + self.write_info('beq $t4 $a2 _end_strcat_copy_snd_') # No more characters to copy + + self.write_info('lb $a0 0($t4)') # Copy the character + self.write_info('sb $a0 0($t5)') + + self.write_info('addiu $t5 $t5 1') # Advance indices + self.write_info('addiu $t4 $t4 1') + self.write_info('j _strcat_copy_snd_') + self.write_info('_end_strcat_copy_snd_:', tabbed=False) + + self.write_info('sb $0 0($t5)') # End string with \0 + + # $v0: reference to new string $v1: length int object + # $t3: new string object + # -> Create boxed string + + self.write_info('sw $v1 12($t3)') # New length + self.write_info('sw $v0 16($t3)') # New string + + self.write_info('move $v0 $t3') # Return new String object in $v0 + self.write_info('jr $ra') + self.write_info('') + + def string_substr(self): + self.write_info('function_String_substr:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + self.write_info(f'lw $t5 12($fp)') # self param + self.write_info(f'lw $a1 16($fp)') # reference of object int that represent i + self.write_info(f'lw $a1 12($a1)') # value of i + self.write_info(f'lw $a2 20($fp)') # reference of object int that represent j + self.write_info(f'lw $a2 12($a2)') # value of j that is length to copy + self.write_info(f'blt $a1 $0 _index_negative') # index i is negative + self.write_info(f'blt $a2 $0 _index_negative') # length j is negative + self.write_info(f'add $a2 $a1 $a2') # finish index + self.write_info(f'lw $a3 12($t5)') + self.write_info(f'lw $a3 12($a3)') # length of string + self.write_info(f'bgt $a2 $a3 _index_out') # j > lenght + + # not errors + self.visit(cil.Allocate(dest = None, ttype = "String")) + self.write_info(f'move $v1 $v0') # new string + + self.visit(cil.Allocate(dest = None, ttype = "Int")) + self.write_info(f'move $t0 $v0') # lenght of string + self.write_info(f'move $t7 $a2') + self.write_info(f'subu $t7 $t7 $a1') + self.write_info(f'sw $t7 12($t0)') # save number that represent lenght of new string + + self.allocate_memory('$a2', register=True) # $v0 -> address of the string + + self.write_info(f'sw $t0 12($v1)') # store length + self.write_info(f'sw $v0 16($v1)') # store address of new string to String object + + # generate substring + self.write_info('move $t1 $v0') # Index for iterating the new string + + self.write_info('lw $t5 16($t5)') # Index for iterating the self string + self.write_info('move $t4 $t5') + self.write_info('addu $t4 $t4 $a1') # self's copy start + self.write_info('addu $t5 $t5 $a2') # self's copy limit + + self.write_info('_substr_copy_:', tabbed=False) + self.write_info('bge $t4 $t5 _end_substr_copy_') # No more characters to copy + + self.write_info('lb $a0 0($t4)') # Copy the character + self.write_info('sb $a0 0($t1)') + + self.write_info('addiu $t1 $t1 1') # Advance indices + self.write_info('addiu $t4 $t4 1') + self.write_info('j _substr_copy_') + + # errors sections + self.write_info(f'_index_negative:',tabbed=False) + self.write_info(f'la $a0 _index_negative_msg') + self.write_info(f'b _subst_abort') + + self.write_info(f'_index_out:',tabbed=False) + self.write_info(f'la $a0 _index_out_msg') + self.write_info(f'b _subst_abort') + + # abort execution + self.write_info(f'_subst_abort:',tabbed=False) + self.write_info(f'li $v0 4') + self.write_info(f'syscall') + self.write_info('la $a0 _abort_msg') + self.write_info(f'li $v0 4') + self.write_info(f'syscall') + self.write_info(f'li $v0 10') + self.write_info(f'syscall') # exit + + # successful execution + self.write_info('_end_substr_copy_:', tabbed=False) + + self.write_info('move $v0 $v1') + self.write_info('jr $ra') + self.write_info('') + + #----- IO + + def io_in_int(self): + self.write_info('function_IO_in_int:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object + + self.write_info('move $t0 $v0') # Save Int object + + self.write_info('li $v0 5') # Read int + self.write_info('syscall') + + self.write_info('sw $v0 12($t0)') # Store int + + self.write_info('move $v0 $t0') + self.write_info('jr $ra') + self.write_info('') + + def io_in_string(self): + self.write_info('function_IO_in_string:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object for string's length + self.write_info('move $v1 $v0') # $v1: Int pbject + + self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object + self.write_info('sw $v1 12($v0)') + self.write_info('move $t5 $v0') # $t5: String object + + # Read String and store in a temp buffer + self.write_info('la $a0 str_buffer') + self.write_info('li $a1 1025') + self.write_info('li $v0 8') # Read string + self.write_info('syscall') + + # Compute string's length + self.write_info('move $a0 $0') + self.write_info('la $t2 str_buffer') + self.write_info('_in_string_str_len_:', tabbed=False) + self.write_info('lb $t0 0($t2)') + self.write_info('beq $t0 $0 _end_in_string_str_len_') + self.write_info('beq $t0 10 _end_in_string_str_len_') + self.write_info('addiu $a0 $a0 1') + self.write_info('addiu $t2 $t2 1') + self.write_info('j _in_string_str_len_') + self.write_info('_end_in_string_str_len_:', tabbed=False) + + # Store string's length into Integer class + self.write_info('sw $a0 12($v1)') + + # Allocate size in $a0 ... string's length + self.allocate_memory() + + # $a0: string's length $v0: string's new address $t5: String object + + # Copy string from buffer to new address + self.write_info('la $t4 str_buffer') # Index for iterating the string buffer + self.write_info('move $t1 $v0') # Index for iterating new string address + + self.write_info('_in_str_copy_:', tabbed=False) + self.write_info('lb $t0 0($t4)') # Load a character + self.write_info('beq $t0 $0 _end_in_str_copy_') # No more characters to copy + self.write_info('beq $t0 10 _end_in_str_copy_') # No more characters to copy + + self.write_info('sb $t0 0($t1)') # Copy the character + + self.write_info('addiu $t4 $t4 1') # Advance indices + self.write_info('addiu $t1 $t1 1') + self.write_info('j _in_str_copy_') + self.write_info('_end_in_str_copy_:', tabbed=False) + + # Store string + self.write_info('sw $v0 16($t5)') + + # Clean string buffer + self.write_info('la $t4 str_buffer') # Index for iterating the string buffer + self.write_info('_in_str_clean_:', tabbed=False) + self.write_info('lb $t0 0($t4)') # Load a character + self.write_info('beq $t0 $0 _end_in_str_clean_') # No more characters to clean + + self.write_info('sb $0 0($t4)') # Clean the character + + self.write_info('addiu $t4 $t4 1') # Advance indices + self.write_info('j _in_str_clean_') + self.write_info('_end_in_str_clean_:', tabbed=False) + + # Return new string in $v0 + self.write_info('move $v0 $t5') + self.write_info('jr $ra') + self.write_info('') + + def io_out_int(self): + self.write_info('function_IO_out_int:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info('lw $a0 16($fp)') # Get Int object + self.write_info('lw $a0 12($a0)') + + self.write_info('li $v0 1') # Print int + self.write_info('syscall') + + self.write_info('lw $v0 12($fp)') # Return self + self.write_info('jr $ra') + self.write_info('') + + def io_out_string(self): + self.write_info('function_IO_out_string:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info('lw $a0 16($fp)') # Get String object + self.write_info('lw $a0 16($a0)') + + self.write_info('li $v0 4') # Print string + self.write_info('syscall') + + self.write_info('lw $v0 12($fp)') # Return self + self.write_info('jr $ra') + self.write_info('') + + #------ CONFORMS + + def conforms(self): + self.write_info(f'function___conforms:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info(f'lw $t0 12($fp)') # First arg's class tag + self.write_info(f'lw $t1 16($fp)') # Second arg's class tag + + # 2nd arg == Object -> return true + self.write_info(f'beq $t1 {self.type_index["Object"]} _conforms_ret_true_') + + self.write_info('_conforms_loop_:', tabbed=False) + + # current == 2nd arg -> return true + self.write_info('beq $t0 $t1 _conforms_ret_true_') + + # current == Object -> return false + self.write_info(f'beq $t0 {self.type_index["Object"]} _conforms_ret_false_') + + # Query parents's class tag from $s2 ... class parent table + self.write_info('mul $t0 $t0 4') + self.write_info('addu $t0 $t0 $s2') + self.write_info('lw $t0 0($t0)') # current = current.parent + self.write_info('j _conforms_loop_') + + self.write_info('_conforms_ret_true_:', tabbed=False) + self.write_info('li $v0 1') + self.write_info('j _conforms_ret_') + + self.write_info('_conforms_ret_false_:', tabbed=False) + self.write_info('li $v0 0') + + # No need to store result in a Bool class + self.write_info('_conforms_ret_:') + self.write_info('jr $ra') + self.write_info('') + + #------ ISVOID + + def isvoid(self): + self.write_info(f'function__isvoid:', tabbed=False) + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.visit(cil.Allocate(dest = None, ttype = "Bool")) + # $v0 contains new Bool object + + self.write_info(f'lw $t0 12($fp)') # 1st arg is an object address + self.write_info(f'la $t1 {"type_void"}') + + self.write_info(f'beq $t0 $t1 _is_void_true_') # arg == void type + self.write_info(f'sw $0 12($v0)') # return False + self.write_info(f'j _is_void_end_') + + self.write_info(f'_is_void_true_:', tabbed=False) + self.write_info(f'li $t0 1') + self.write_info(f'sw $t0 12($v0)') # return True + self.write_info(f'_is_void_end_:', tabbed=False) + + # Return Bool object in $v0 + self.write_info(f'jr $ra') + self.write_info(f'') From e36b632efe3853cd1d5f51b71e66551e63790869 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 12 Jan 2021 17:53:45 -0500 Subject: [PATCH 85/96] Rebooted the writing of MIPS generator. Right now it prints hello world --- .../components/generation/MIPS_generator.py | 800 ++++++------------ 1 file changed, 280 insertions(+), 520 deletions(-) diff --git a/src/compiler/components/generation/MIPS_generator.py b/src/compiler/components/generation/MIPS_generator.py index db7f4734..635bb91f 100644 --- a/src/compiler/components/generation/MIPS_generator.py +++ b/src/compiler/components/generation/MIPS_generator.py @@ -4,19 +4,14 @@ class MipsVisitor(NodeVisitor): - def __init__(self, programContext, output_file="mips_code.mips"): - super().__init__(programContext) - self.code = [] - self.offset = {} - self.type_index = {} - self.dispatchtable_code = [] - self.prototypes_code = [] - self.cur_labels_id = 0 - self.text= ['.text\n.globl main\n'] - self.data= ['.data\n'] - self.output_file = output_file - - + def __init__(self, programContext): + super().__init__(programContext = programContext) + self.buffer = [] + self.type_index= [] + self.dispatchtable_code= [] + self.prototypes_code= [] + self.offset= {} + def push(self): self.write_info('sw $a0 0($sp)') self.write_info('addiu $sp $sp -4') @@ -24,22 +19,10 @@ def push(self): def pop(self, dest=None): self.write_info(f'addiu $sp $sp 4') - - def write_info(self, msg, placeToWrite = 'text', tabbed=True): - info= "{}{}\n".format("\t" if tabbed else "", msg) - if placeToWrite == 'text': - self.code.append(info) - self.text.append(info) - else: - self.data.append(info) - - #def write_file(self, mode = "a"): - # f = open(self.output_file, mode) - # toWrite= self.data + '\n' + self.text - # f.write(toWrite) - # f.close() - - + def write_info(self, msg, tabbed= True): + info = "{}{}\n".format("\t" if tabbed else "", msg) + self.buffer.append(info) + def allocate_memory(self, size=None, register=False): if register: self.write_info('move $a0 {}'.format(size)) @@ -49,41 +32,32 @@ def allocate_memory(self, size=None, register=False): self.write_info('li $v0 9') self.write_info('syscall') - def new_labels_id(self): - self.cur_labels_id += 1 - return self.cur_labels_id - - def to_stream(self): - stream = '' - for s in self.data: - stream += s - stream += '\n' - for s in self.text: - stream += s - return stream - + def visit_Data(self, node: cil.Data): + self.write_info(f'{node.dest}: .asciiz \"{str(node.value.encode())[2:-1]}\"') + def visit_Program(self, node: cil.Program): #-------------------- DATA SECTION ---------------------------- - - # Declare static data - self.static_datas() - - # Transpile CIL data section + + self.write_info('.data', tabbed= False) + for data in node.data_section: self.visit(data) - self.write_info('', placeToWrite= 'data') + + self.write_info('') + for i in range(len(node.type_section)): + self.type_index.append(node.type_section[i].type_name) + self.write_info('classname_{}: .asciiz \"{}\"'.format(node.type_section[i].type_name, + node.type_section[i].type_name)) - # Declare class name strings and map class index - for i, _type in enumerate(node.type_section): - self.type_index[_type.type_name] = i - self.write_info('classname_{}: .asciiz \"{}\"'.format(_type.type_name, _type.type_name), - placeToWrite= 'data') - # Declare void type - self.write_info(f'{"type_void"}: .asciiz \"\"', placeToWrite= 'data') + self.write_info(f'type_void: .asciiz \"\"') #-------------------- TEXT SECTION ---------------------------- - self.entry() + self.write_info('\n.text', tabbed= False) + self.entrypoint() + + for t in node.type_section: + self.visit(t) self.write_info('\n########## STATIC FUNCTIONS ##########\n') # CONFORMS @@ -103,12 +77,8 @@ def visit_Program(self, node: cil.Program): self.io_in_string() self.io_out_int() self.io_out_string() - - for t in node.type_section: - self.visit(t) - + self.write_info('\n############## TABLES ################\n') - # Generate method that creates classes's name table self.write_info('function_build_class_name_table:', tabbed=False) self.allocate_memory(len(node.type_section) * 4) @@ -116,24 +86,28 @@ def visit_Program(self, node: cil.Program): for i in range(len(node.type_section)): self.write_info('la $t1 classname_{}'.format(node.type_section[i].type_name)) self.write_info('sw $t1 {}($s1)'.format(4 * i)) + self.write_info('jr $ra') self.write_info('') # Generate method that allocates memory for prototypes table self.write_info('function_allocate_prototypes_table:', tabbed=False) self.allocate_memory(8 * len(self.type_index)) self.write_info('move $s0 $v0') # save the address of the table in a register + self.write_info('jr $ra') self.write_info('') # Generate mips method that builds prototypes self.write_info('function_build_prototypes:', tabbed=False) for ins in self.prototypes_code: self.write_info(ins) + self.write_info('jr $ra') self.write_info('') # Generate mips method that builds dispatch tables self.write_info('function_build_dispatch_tables:', tabbed=False) for ins in self.dispatchtable_code: - self.write_info(ins) + self.write_info(ins) + self.write_info('jr $ra') self.write_info('') # Generate method that builds class parents table @@ -143,17 +117,19 @@ def visit_Program(self, node: cil.Program): self.write_info('') # Fill table entry for each class type - for parent in self.programContext.types.keys(): - p_index = self.type_index[parent] - for childName in self.programContext.types[parent].children: - ch_index= self.type_index[childName] - self.write_info(f'li $t0 {ch_index}') - self.write_info(f'mul $t0 $t0 4') - self.write_info(f'add $t0 $t0 $s2') - self.write_info(f'li $t1 {p_index}') - self.write_info(f'sw $t1 0($t0)') - self.write_info('') + for parent in node.type_section: + if parent.type_name != 'void': + p_index = self.type_index.index(parent.type_name) + for child in self.programContext.types[parent.type_name].children: + ch_index = self.type_index.index(child) + self.write_info(f'li $t0 {ch_index}') + self.write_info(f'mul $t0 $t0 4') + self.write_info(f'add $t0 $t0 $s2') + self.write_info(f'li $t1 {p_index}') + self.write_info(f'sw $t1 0($t0)') + self.write_info('') + self.write_info('jr $ra') self.write_info('') @@ -161,54 +137,42 @@ def visit_Program(self, node: cil.Program): self.write_info('\n########### COOL FUNCTIONS ##########\n') for func in node.code_section: is_built_in = False - if not "_init" in func.name: + if not '__init' in func.name: is_built_in = [x for x in self.programContext.basics if f'{x}_' in func.name] != [] if not is_built_in: self.visit(func) self.write_info('\n#####################################\n') + return self.buffer - return self.to_stream() + def entrypoint(self): + self.write_info('main:', tabbed=False) + self.visit(cil.Call(dest = None, f = 'build_class_name_table')) + self.visit(cil.Call(dest = None, f = 'allocate_prototypes_table')) + self.visit(cil.Call(dest = None, f = 'build_prototypes')) + self.visit(cil.Call(dest = None, f = 'build_dispatch_tables')) + self.visit(cil.Call(dest = None, f = 'build_class_parents_table')) + self.visit(cil.Allocate(dest = None, ttype = 'Main')) + self.visit(cil.Allocate(dest = None, ttype = 'Main')) -################################ .DATA ####################################### - def visit_Data(self, node: cil.Data): - self.write_info(f'{node.dest}: .asciiz \"{str(node.value.encode())[2:-1]}\"', placeToWrite= 'data') - + # Push main self + self.write_info('sw $v0 0($sp)') + self.write_info('addiu $sp $sp -4') -################################ TYPES ####################################### + self.visit(cil.Call(dest = None, f = f'Main__init')) + self.write_info('addiu $sp $sp 4') - def visit_Type(self, node: cil.Type): - # Allocate - self.dispatchtable_code.append(f'# Type {node.type_name}') - self.dispatchtable_code.append('li $a0 {}'.format(4 * len(node.methods))) - self.dispatchtable_code.append('li $v0 9') - self.dispatchtable_code.append('syscall') + # Push main self + self.write_info('sw $v0 0($sp)') + self.write_info('addiu $sp $sp -4') - # Add dispatch table code - for i in range(len(node.methods)): - self.dispatchtable_code.append('la $t1 function_{}'.format(node.methods[i].function_name)) - self.dispatchtable_code.append('sw $t1 {}($v0)'.format(4 * i)) - self.dispatchtable_code.append('lw $t0 {}($s0)'.format(8 * self.type_index[node.type_name])) - self.dispatchtable_code.append('sw $v0 8($t0)') - self.dispatchtable_code.append('') + self.visit(cil.Call(dest = None, f = 'Main_main')) + self.write_info('addiu $sp $sp 4') - # Allocate - self.prototypes_code.append(f'# Type {node.type_name}') - self.prototypes_code.append('li $a0 {}'.format(12 + 4 * len(node.attributes))) - self.prototypes_code.append('li $v0 9') - self.prototypes_code.append('syscall') + self.write_info('li $v0 10') + self.write_info('syscall') - # Add prototype code - class_index = self.type_index[node.type_name] - self.prototypes_code.append('li $a0 {}'.format(class_index)) - self.prototypes_code.append('sw $a0 0($v0)') - self.prototypes_code.append('li $a0 {}'.format(12 + 4 * len(node.attributes))) - self.prototypes_code.append('sw $a0 4($v0)') - self.prototypes_code.append('sw $v0 {}($s0)'.format(8 * class_index)) - self.prototypes_code.append('') - def visit_Function(self, node: cil.Function): - self.code = [] self.write_info(f'function_{node.name}:', tabbed=False) # Set up stack frame @@ -236,152 +200,48 @@ def visit_Function(self, node: cil.Function): # Return self.write_info('jr $ra') - + self.write_info('') + + def visit_PushParam(self, node: cil.PushParam): + self.write_info('# PUSHPARAM') + if node.name[0] != "_": + self.write_info('li $a0, {}'.format(self.type_index.index(node.name))) + else: + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.name])) + self.push() self.write_info('') -############################## ASSIGNMENT #################################### - def visit_Assign(self, node: cil.Assign): - self.write_info('# ASSIGN') - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.source])) - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) - self.write_info('') - -############################# ARITHMETICS #################################### + def visit_PopParam(self, node: cil.PopParam): + self.write_info('# POPPARAM') + self.pop(node.name) + self.write_info('') + + def visit_Return(self, node: cil.Return): + self.write_info('# RETURN') + self.write_info('lw $v0, {}($fp)'.format(self.offset[node.value])) + def visit_Call(self, node: cil.Call): + self.write_info('# CALL') - def visit_Plus(self, node: cil.Plus): - self.write_info('# +') - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) - self.write_info('add $a0, $a0, $a1') - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) - self.write_info('') + # Save return address and frame pointer + self.write_info(f'addiu $sp, $sp, -8') + self.write_info(f'sw $ra, 4($sp)') + self.write_info(f'sw $fp, 8($sp)') - def visit_Minus(self, node: cil.Minus): - self.write_info('# -') - if isinstance(node.left, int): - self.write_info('li $a0 {}'.format(node.left)) - else: - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) - self.write_info('sub $a0, $a0, $a1') - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) - self.write_info('') + # Call the function + self.write_info(f'jal function_{node.f}') - def visit_Mult(self, node: cil.Mult): - self.write_info('# *') - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) - self.write_info('mul $a0, $a0, $a1') - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) - self.write_info('') + # Restore return address and frame pointer + self.write_info(f'lw $fp, 8($sp)') + self.write_info(f'lw $ra, 4($sp)') + self.write_info(f'addiu $sp, $sp, 8') - def visit_Div(self, node: cil.Div): - self.write_info('# /') - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) - self.write_info(f'beqz $a1 _div_error_{node.id}_') - self.write_info('div $a0, $a0, $a1') - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) - self.write_info(f'b _div_end_{node.id}_') - self.write_info(f'_div_error_{node.id}_:',tabbed=False) - self.write_info('la $a0 _div_zero_msg') - self.write_info('li $v0 4') - self.write_info('syscall') - self.write_info('la $a0 _abort_msg') - self.write_info('li $v0 4') - self.write_info('syscall') - self.write_info('li $v0 10') - self.write_info('syscall') - self.write_info(f'_div_end_{node.id}_:',tabbed=False) - - -############################# COMPARISONS #################################### - - - def visit_Equal(self, node: cil.Equal): - self.write_info('lw $t0 {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $t1 {}($fp)'.format(self.offset[node.right])) - self.write_info(f'beq $t0 $zero _eq_false_{node.id}_') # $t0 can't also be void - self.write_info(f'beq $t1 $zero _eq_false_{node.id}_') # $t1 can't also be void - self.write_info('lw $a0 0($t0)') # get object 1 tag - self.write_info('lw $a1 0($t1)') # get object 2 tag - self.write_info(f'bne $a0 $a1 _eq_false_{node.id}_') # compare tags - self.write_info('li $a2 {}'.format(self.type_index["Int"])) # load int tag - self.write_info(f'beq $a0 $a2 _eq_int_bool_{node.id}') # Integers - self.write_info('li $a2 {}'.format(self.type_index["Bool"])) # load bool tag - self.write_info(f'beq $a0 $a2 _eq_int_bool_{node.id}') # Booleans - self.write_info('li $a2 {}'.format(self.type_index["String"])) # load string tag - self.write_info(f'bne $a0 $a2 _not_basic_type_{node.id}_') # Not a primitive type - - # equal strings - # verify len of the strings - self.write_info(f'_eq_str_{node.id}_:', tabbed = False) # handle strings - self.write_info('lw $t3 12($t0)') # get string_1 size - self.write_info('lw $t3 12($t3)') # unbox string_1 size - self.write_info('lw $t4, 12($t1)') # get string_2 size - self.write_info('lw $t4, 12($t4)') # unbox string_2 size - self.write_info(f'bne $t3 $t4 _eq_false_{node.id}_') # string size are distinct - self.write_info(f'beq $t3 $0 _eq_true_{node.id}_') # if strings are empty - - # Verify ascii secuences - self.write_info('addu $t0 $t0 16') # Point to start of string s1 - self.write_info('lw $t0 0($t0)') - self.write_info('addu $t1 $t1 16') # Point to start of string s2 - self.write_info('lw $t1 0($t1)') - self.write_info('move $t2 $t3') # Keep string length as counter - self.write_info(f'_verify_ascii_sequences_{node.id}_:', tabbed = False) - self.write_info('lb $a0 0($t0)') # get char of s1 - self.write_info('lb $a1 0($t1)') # get char of s2 - self.write_info(f'bne $a0 $a1 _eq_false_{node.id}_') # char s1 /= char s2 - self.write_info('addu $t0 $t0 1') - self.write_info('addu $t1 $t1 1') - self.write_info('addiu $t2 $t2 -1') # Decrement counter - self.write_info(f'bnez $t2 _verify_ascii_sequences_{node.id}_') - self.write_info(f'b _eq_true_{node.id}_') # end of strings - - self.write_info(f'_not_basic_type_{node.id}_:', tabbed = False) - self.write_info(f'bne $t0 $t1 _eq_false_{node.id}_') - self.write_info(f'b _eq_true_{node.id}_') - - # equal int or boolf - self.write_info(f'_eq_int_bool_{node.id}:', tabbed = False) # handles booleans and ints - self.write_info('lw $a3 12($t0)') # load value variable_1 - self.write_info('lw $t4 12($t1)') # load variable_2 - self.write_info(f'bne $a3 $t4 _eq_false_{node.id}_') # value of int or bool are distinct - - #return true - self.write_info(f'_eq_true_{node.id}_:', tabbed = False) - self.write_info('li $a0 1') - self.write_info('sw $a0 {}($fp)'.format(self.offset[node.dest])) - self.write_info(f'b end_equal_{node.id}_') - - #return false - self.write_info(f'_eq_false_{node.id}_:', tabbed = False) - self.write_info('li $a0 0') - self.write_info('sw $a0 {}($fp)'.format(self.offset[node.dest])) - self.write_info(f'end_equal_{node.id}_:', tabbed = False) - - def visit_LessThan(self, node: cil.LessThan): - self.write_info('# <') - self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) - self.write_info('slt $a0, $a1, $a2'.format(self.offset[node.right])) - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) - self.write_info('') + if node.dest: + self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') - def visit_EqualOrLessThan(self, node: cil.EqualOrLessThan): - self.write_info('# <=') - self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) - self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) - self.write_info('sle $a0, $a1, $a2'.format(self.offset[node.right])) - self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) self.write_info('') - - -############################## ATTRIBUTES #################################### - + def visit_GetAttrib(self, node: cil.GetAttrib): self.write_info('# GETATTR') self.write_info(f'lw $a1 {self.offset[node.instance]}($fp)') @@ -389,6 +249,22 @@ def visit_GetAttrib(self, node: cil.GetAttrib): self.write_info(f'sw $a0 {self.offset[node.dest]}($fp)') self.write_info('') + def visit_Allocate(self, node: cil.Allocate): + self.write_info('# ALLOCATE') + if node.ttype == 'void': + self.write_info(f'la $v0 type_void') + self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') + else: + offset_proto = self.type_index.index(node.ttype) * 8 + self.write_info('lw $t0 {}($s0)'.format(offset_proto)) + self.write_info('sw $t0, 0($sp)') + self.write_info('addiu $sp, $sp, -4') + self.write_info('') + self.visit(cil.Call(dest = node.dest, f = "Object_copy")) + self.write_info('addiu $sp, $sp, 4') + self.write_info('') + + def visit_SetAttrib(self, node: cil.SetAttrib): self.write_info('# SETATTR') self.write_info(f'lw $a1 {self.offset[node.instance]}($fp)') @@ -401,9 +277,6 @@ def visit_SetAttrib(self, node: cil.SetAttrib): self.write_info(f'sw $a0 {12 + 4 * node.attribute}($a1)') self.write_info('') - -################################ MEMORY ###################################### - def visit_TypeOf(self, node: cil.TypeOf): self.write_info('# TYPEOF') self.write_info(f'lw $a1 {self.offset[node.instance]}($fp)') @@ -411,46 +284,6 @@ def visit_TypeOf(self, node: cil.TypeOf): self.write_info(f'sw $a0 {self.offset[node.dest]}($fp)') self.write_info('') - def visit_Allocate(self, node: cil.Allocate): - self.write_info('# ALLOCATE') - if node.ttype == "void": - self.write_info(f'la $v0 {"type_void"}') - self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') - else: - offset_proto = self.type_index[node.ttype] * 8 - self.write_info('lw $t0 {}($s0)'.format(offset_proto)) - self.write_info('sw $t0, 0($sp)') - self.write_info('addiu $sp, $sp, -4') - self.write_info('') - self.visit(cil.Call(dest = node.dest, f = "Object_copy")) - self.write_info('addiu $sp, $sp, 4') - self.write_info('') - - -########################## DISPATCH STATEMENTS ############################### - - def visit_Call(self, node: cil.Call): - self.write_info('# CALL') - - # Save return address and frame pointer - self.write_info(f'addiu $sp, $sp, -8') - self.write_info(f'sw $ra, 4($sp)') - self.write_info(f'sw $fp, 8($sp)') - - # Call the function - self.write_info(f'jal function_{node.f}') - - # Restore return address and frame pointer - self.write_info(f'lw $fp, 8($sp)') - self.write_info(f'lw $ra, 4($sp)') - self.write_info(f'addiu $sp, $sp, 8') - - if node.dest: - self.write_info(f'sw $v0 {self.offset[node.dest]}($fp)') - - self.write_info('') - - def visit_VCall(self, node: cil.VCall): self.write_info('# VCALL') @@ -464,7 +297,7 @@ def visit_VCall(self, node: cil.VCall): self.write_info(f'lw $a2, {self.offset[node.ttype]}($fp)') else: # If node.type a type name - self.write_info(f'li $a2, {self.type_index[node.ttype]}') + self.write_info(f'li $a2, {self.type_index.index(node.ttype)}') self.write_info(f'mul $a2, $a2, 8') self.write_info(f'addu $a2, $a2, $s0') self.write_info(f'lw $a1, 0($a2)') @@ -486,106 +319,53 @@ def visit_VCall(self, node: cil.VCall): # Check prototypes table for the dynamic type if node.ttype[0] != '_': - self.write_info(f'li $a2, {self.type_index[node.ttype]}') + self.write_info(f'li $a2, {self.type_index.index(node.ttype)}') else: self.write_info(f'lw $a2, {self.offset[node.ttype]}($fp)') self.write_info('') - def visit_PushParam(self, node: cil.PushParam): - self.write_info('# PUSHPARAM') - if node.name[0] != "_": - self.write_info('li $a0, {}'.format(self.type_index[node.name])) - else: - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.name])) - self.push() - self.write_info('') - - - def visit_PopParam(self, node: cil.PopParam): - self.write_info('# POPPARAM') - self.pop(node.name) - self.write_info('') - - def visit_Return(self, node: cil.Return): - self.write_info('# RETURN') - self.write_info('lw $v0, {}($fp)'.format(self.offset[node.value])) - - -################################# JUMPS ###################################### - - - def visit_Label(self, node: cil.Label): - self.write_info('_cil_label_{}:'.format(node.name), tabbed=False) - - def visit_Goto(self, node: cil.Goto): - self.write_info('# GOTO') - self.write_info('j _cil_label_{}'.format(node.label)) - self.write_info('') - - - def visit_IfGoto(self, node: cil.IfGoto): - self.write_info('# IF GOTO') - self.write_info('lw $a0, {}($fp)'.format(self.offset[node.condition])) - self.write_info('bnez $a0, _cil_label_{}'.format(node.label)) - self.write_info('') - - -############################## STATIC CODE ################################### - - #----- STATIC DATAs - - def static_datas(self): - # Buffer for reading strings - self.write_info('str_buffer: .space 1025', placeToWrite='data') - self.write_info('', placeToWrite='data') - - # Declare error mensages - self.write_info('_index_negative_msg: .asciiz \"Index to substr is negative\\n\"', placeToWrite= 'data') - self.write_info('_index_out_msg: .asciiz \"Index out range exception\\n\"', placeToWrite= 'data') - self.write_info('_abort_msg: .asciiz \"Execution aborted\\n\"', placeToWrite= 'data') - self.write_info('_div_zero_msg: .asciiz \"Division by zero exception\\n\"', placeToWrite= 'data') - - self.write_info('', placeToWrite= 'data') - - #----- ENTRY FUNCTION - - def entry(self): - self.write_info('main:', tabbed=False) - self.visit(cil.Call(dest = None, f = 'build_class_name_table')) - self.visit(cil.Call(dest = None, f = 'allocate_prototypes_table')) - self.visit(cil.Call(dest = None, f = 'build_prototypes')) - self.visit(cil.Call(dest = None, f = 'build_dispatch_tables')) - self.visit(cil.Call(dest = None, f = 'build_class_parents_table')) - self.visit(cil.Allocate(dest = None, ttype = 'Main')) - - # Push main self - self.write_info('sw $v0 0($sp)') - self.write_info('addiu $sp $sp -4') - - self.visit(cil.Call(dest = None, f = f'Main__init')) - self.write_info('addiu $sp $sp 4') + def visit_Type(self, node: cil.Type): + # Allocate + self.dispatchtable_code.append(f'# Type {node.type_name}') + self.dispatchtable_code.append('li $a0 {}'.format(4 * len(node.methods))) + self.dispatchtable_code.append('li $v0 9') + self.dispatchtable_code.append('syscall') - # Push main self - self.write_info('sw $v0 0($sp)') - self.write_info('addiu $sp $sp -4') + # Add dispatch table code + for i in range(len(node.methods)): + self.dispatchtable_code.append('la $t1 function_{}'.format(node.methods[i].function_name)) + self.dispatchtable_code.append('sw $t1 {}($v0)'.format(4 * i)) + self.dispatchtable_code.append('lw $t0 {}($s0)'.format(8 * self.type_index.index(node.type_name))) + self.dispatchtable_code.append('sw $v0 8($t0)') + self.dispatchtable_code.append('') - self.visit(cil.Call(dest = None, f = 'Main_main')) - self.write_info('addiu $sp $sp 4') + # Allocate + self.prototypes_code.append(f'# Type {node.type_name}') + self.prototypes_code.append('li $a0 {}'.format(12 + 4 * len(node.attributes))) + self.prototypes_code.append('li $v0 9') + self.prototypes_code.append('syscall') - self.write_info('li $v0 10') - self.write_info('syscall') + # Add prototype code + class_index = self.type_index.index(node.type_name) + self.prototypes_code.append('li $a0 {}'.format(class_index)) + self.prototypes_code.append('sw $a0 0($v0)') + self.prototypes_code.append('li $a0 {}'.format(12 + 4 * len(node.attributes))) + self.prototypes_code.append('sw $a0 4($v0)') + self.prototypes_code.append('sw $v0 {}($s0)'.format(8 * class_index)) + self.prototypes_code.append('') +####################### STATIC FUNCTIONS ####################### #----- OBJECT METHODS def object_abort(self): self.write_info('function_Object_abort:', tabbed=False) - # Set up stack frame - self.write_info(f'move $fp, $sp') - - self.write_info('jr $ra') - self.write_info('') + ## Set up stack frame + #self.write_info(f'move $fp, $sp') +# + #self.write_info('jr $ra') + #self.write_info('') def object_copy(self): self.write_info('function_Object_copy:', tabbed=False) @@ -610,136 +390,136 @@ def object_copy(self): self.write_info('move $v0 $t2') # dejar en v0 la direccion donde empieza el nuevo objeto self.write_info('jr $ra') self.write_info('') - +# def object_typename(self): self.write_info('function_Object_type_name:', tabbed=False) # Set up stack frame - self.write_info(f'move $fp, $sp') - - # Box the string reference - self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object - self.write_info('move $v1 $v0') - - # Box string's length - self.visit(cil.Allocate(dest = None, ttype = "Int") ) # Create new Int object - - self.write_info('lw $a1 12($fp)') # self - self.write_info('lw $a1 0($a1)') - self.write_info('mul $a1 $a1 4') # self's class tag - self.write_info('addu $a1 $a1 $s1') # class name table entry address - self.write_info('lw $a1 0($a1)') # Get class name address - - self.write_info('move $a2 $0') # Compute string's length - self.write_info('move $t2 $a1') - self.write_info('_str_len_clsname_:', tabbed=False) - self.write_info('lb $a0 0($t2)') - self.write_info('beq $a0 $0 _end_clsname_len_') - self.write_info('addiu $a2 $a2 1') - self.write_info('addiu $t2 $t2 1') - self.write_info('j _str_len_clsname_') - self.write_info('_end_clsname_len_:', tabbed=False) - - self.write_info('sw $a2, 12($v0)') # Store string's length - - self.write_info('sw $v0, 12($v1)') # Fill String attributes - self.write_info('sw $a1, 16($v1)') - - self.write_info('move $v0 $v1') - self.write_info('jr $ra') - self.write_info('') - + #self.write_info(f'move $fp, $sp') +# + ## Box the string reference + #self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) # Create new String object + #self.write_info('move $v1 $v0') +# + ## Box string's length + #self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS) ) # Create new Int object +# + #self.write_info('lw $a1 12($fp)') # self + #self.write_info('lw $a1 0($a1)') + #self.write_info('mul $a1 $a1 4') # self's class tag + #self.write_info('addu $a1 $a1 $s1') # class name table entry address + #self.write_info('lw $a1 0($a1)') # Get class name address +# + #self.write_info('move $a2 $0') # Compute string's length + #self.write_info('move $t2 $a1') + #self.write_info('_str_len_clsname_:', tabbed=False) + #self.write_info('lb $a0 0($t2)') + #self.write_info('beq $a0 $0 _end_clsname_len_') + #self.write_info('addiu $a2 $a2 1') + #self.write_info('addiu $t2 $t2 1') + #self.write_info('j _str_len_clsname_') + #self.write_info('_end_clsname_len_:', tabbed=False) +# + #self.write_info('sw $a2, 12($v0)') # Store string's length +# + #self.write_info('sw $v0, 12($v1)') # Fill String attributes + #self.write_info('sw $a1, 16($v1)') +# + #self.write_info('move $v0 $v1') + #self.write_info('jr $ra') + #self.write_info('') +# #----- STRING METHODS def string_length(self): self.write_info('function_String_length:', tabbed=False) - # Set up stack frame - self.write_info(f'move $fp, $sp') - - self.write_info('lw $a0 12($fp)') # Self - self.write_info('lw $v0 12($a0)') - self.write_info('jr $ra') - self.write_info('') + ## Set up stack frame + #self.write_info(f'move $fp, $sp') +# + #self.write_info('lw $a0 12($fp)') # Self + #self.write_info('lw $v0 12($a0)') + #self.write_info('jr $ra') + #self.write_info('') def string_concat(self): self.write_info('function_String_concat:', tabbed=False) # Set up stack frame - self.write_info(f'move $fp, $sp') - - self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object - self.write_info('move $v1 $v0') # Save new Int Object - - self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object - self.write_info('move $t3 $v0') # Store new String object - - self.write_info('lw $a1 12($fp)') # Self - self.write_info('lw $a2 16($fp)') # Boxed String to concat - - self.write_info('lw $t1 12($a1)') # Self's length Int object - self.write_info('lw $t1 12($t1)') # Self's length - - self.write_info('lw $t2 12($a2)') # strings to concat's length Int object - self.write_info('lw $t2 12($t2)') # strings to concat's length - - self.write_info('addu $t0 $t2 $t1') # New string's length - self.write_info('sw $t0 12($v1)') # Store new string's length into box - - self.write_info('lw $a1 16($a1)') # Unbox strings - self.write_info('lw $a2 16($a2)') - - self.write_info('addiu $t0 $t0 1') # Add space for \0 - self.allocate_memory('$t0', register=True) # Allocate memory for new string - self.write_info('move $t5 $v0') # Keep the string's reference in v0 and use t7 + #self.write_info(f'move $fp, $sp') +# + #self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) # Create new Int object + #self.write_info('move $v1 $v0') # Save new Int Object +# + #self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) # Create new String object + #self.write_info('move $t3 $v0') # Store new String object +# + #self.write_info('lw $a1 12($fp)') # Self + #self.write_info('lw $a2 16($fp)') # Boxed String to concat +# + #self.write_info('lw $t1 12($a1)') # Self's length Int object + #self.write_info('lw $t1 12($t1)') # Self's length +# + #self.write_info('lw $t2 12($a2)') # strings to concat's length Int object + #self.write_info('lw $t2 12($t2)') # strings to concat's length +# + #self.write_info('addu $t0 $t2 $t1') # New string's length + #self.write_info('sw $t0 12($v1)') # Store new string's length into box +# + #self.write_info('lw $a1 16($a1)') # Unbox strings + #self.write_info('lw $a2 16($a2)') +# + #self.write_info('addiu $t0 $t0 1') # Add space for \0 + #self.allocate_memory('$t0', register=True) # Allocate memory for new string + #self.write_info('move $t5 $v0') # Keep the string's reference in v0 and use t7 # a1: self's string a2: 2nd string t1: length self t2: 2nd string length # v1: new string's int object - self.write_info('move $t4 $a1') # Index for iterating the self string - self.write_info('addu $a1 $a1 $t1') # self's copy limit - self.write_info('_strcat_copy_:', tabbed=False) - self.write_info('beq $t4 $a1 _end_strcat_copy_') # No more characters to copy - - self.write_info('lb $a0 0($t4)') # Copy the character - self.write_info('sb $a0 0($t5)') - - self.write_info('addiu $t5 $t5 1') # Advance indices - self.write_info('addiu $t4 $t4 1') - self.write_info('j _strcat_copy_') - self.write_info('_end_strcat_copy_:', tabbed=False) - - # Copy 2nd string - - self.write_info('move $t4 $a2') # Index for iterating the strings - self.write_info('addu $a2 $a2 $t2') # self's copy limit - self.write_info('_strcat_copy_snd_:', tabbed=False) - self.write_info('beq $t4 $a2 _end_strcat_copy_snd_') # No more characters to copy - - self.write_info('lb $a0 0($t4)') # Copy the character - self.write_info('sb $a0 0($t5)') - - self.write_info('addiu $t5 $t5 1') # Advance indices - self.write_info('addiu $t4 $t4 1') - self.write_info('j _strcat_copy_snd_') - self.write_info('_end_strcat_copy_snd_:', tabbed=False) - - self.write_info('sb $0 0($t5)') # End string with \0 - - # $v0: reference to new string $v1: length int object - # $t3: new string object - # -> Create boxed string - - self.write_info('sw $v1 12($t3)') # New length - self.write_info('sw $v0 16($t3)') # New string - - self.write_info('move $v0 $t3') # Return new String object in $v0 - self.write_info('jr $ra') - self.write_info('') - + #self.write_info('move $t4 $a1') # Index for iterating the self string + #self.write_info('addu $a1 $a1 $t1') # self's copy limit + #self.write_info('_strcat_copy_:', tabbed=False) + #self.write_info('beq $t4 $a1 _end_strcat_copy_') # No more characters to copy +# + #self.write_info('lb $a0 0($t4)') # Copy the character + #self.write_info('sb $a0 0($t5)') +# + #self.write_info('addiu $t5 $t5 1') # Advance indices + #self.write_info('addiu $t4 $t4 1') + #self.write_info('j _strcat_copy_') + #self.write_info('_end_strcat_copy_:', tabbed=False) +# + ## Copy 2nd string +# + #self.write_info('move $t4 $a2') # Index for iterating the strings + #self.write_info('addu $a2 $a2 $t2') # self's copy limit + #self.write_info('_strcat_copy_snd_:', tabbed=False) + #self.write_info('beq $t4 $a2 _end_strcat_copy_snd_') # No more characters to copy +# + #self.write_info('lb $a0 0($t4)') # Copy the character + #self.write_info('sb $a0 0($t5)') +# + #self.write_info('addiu $t5 $t5 1') # Advance indices + #self.write_info('addiu $t4 $t4 1') + #self.write_info('j _strcat_copy_snd_') + #self.write_info('_end_strcat_copy_snd_:', tabbed=False) +# + #self.write_info('sb $0 0($t5)') # End string with \0 +# + ## $v0: reference to new string $v1: length int object + ## $t3: new string object + ## -> Create boxed string +# + #self.write_info('sw $v1 12($t3)') # New length + #self.write_info('sw $v0 16($t3)') # New string +# + #self.write_info('move $v0 $t3') # Return new String object in $v0 + #self.write_info('jr $ra') + #self.write_info('') +# def string_substr(self): self.write_info('function_String_substr:', tabbed=False) # Set up stack frame - self.write_info(f'move $fp, $sp') + ''' self.write_info(f'move $fp, $sp') self.write_info(f'lw $t5 12($fp)') # self param self.write_info(f'lw $a1 16($fp)') # reference of object int that represent i self.write_info(f'lw $a1 12($a1)') # value of i @@ -753,10 +533,10 @@ def string_substr(self): self.write_info(f'bgt $a2 $a3 _index_out') # j > lenght # not errors - self.visit(cil.Allocate(dest = None, ttype = "String")) + self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) self.write_info(f'move $v1 $v0') # new string - self.visit(cil.Allocate(dest = None, ttype = "Int")) + self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) self.write_info(f'move $t0 $v0') # lenght of string self.write_info(f'move $t7 $a2') self.write_info(f'subu $t7 $t7 $a1') @@ -809,16 +589,16 @@ def string_substr(self): self.write_info('move $v0 $v1') self.write_info('jr $ra') - self.write_info('') + self.write_info('') ''' #----- IO def io_in_int(self): self.write_info('function_IO_in_int:', tabbed=False) # Set up stack frame - self.write_info(f'move $fp, $sp') + '''self.write_info(f'move $fp, $sp') - self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object + self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) # Create new Int object self.write_info('move $t0 $v0') # Save Int object @@ -829,17 +609,17 @@ def io_in_int(self): self.write_info('move $v0 $t0') self.write_info('jr $ra') - self.write_info('') + self.write_info('') ''' def io_in_string(self): self.write_info('function_IO_in_string:', tabbed=False) # Set up stack frame - self.write_info(f'move $fp, $sp') + '''self.write_info(f'move $fp, $sp') - self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object for string's length + self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) # Create new Int object for string's length self.write_info('move $v1 $v0') # $v1: Int pbject - self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object + self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) # Create new String object self.write_info('sw $v1 12($v0)') self.write_info('move $t5 $v0') # $t5: String object @@ -903,7 +683,7 @@ def io_in_string(self): # Return new string in $v0 self.write_info('move $v0 $t5') self.write_info('jr $ra') - self.write_info('') + self.write_info('') ''' def io_out_int(self): self.write_info('function_IO_out_int:', tabbed=False) @@ -916,7 +696,7 @@ def io_out_int(self): self.write_info('li $v0 1') # Print int self.write_info('syscall') - self.write_info('lw $v0 12($fp)') # Return self + self.write_info('lw $v0 12($fp)') # Return self self.write_info('jr $ra') self.write_info('') @@ -940,13 +720,13 @@ def io_out_string(self): def conforms(self): self.write_info(f'function___conforms:', tabbed=False) # Set up stack frame - self.write_info(f'move $fp, $sp') + '''self.write_info(f'move $fp, $sp') self.write_info(f'lw $t0 12($fp)') # First arg's class tag self.write_info(f'lw $t1 16($fp)') # Second arg's class tag # 2nd arg == Object -> return true - self.write_info(f'beq $t1 {self.type_index["Object"]} _conforms_ret_true_') + self.write_info(f'beq $t1 {self.type_index.index(OBJECT_CLASS)} _conforms_ret_true_') self.write_info('_conforms_loop_:', tabbed=False) @@ -954,7 +734,7 @@ def conforms(self): self.write_info('beq $t0 $t1 _conforms_ret_true_') # current == Object -> return false - self.write_info(f'beq $t0 {self.type_index["Object"]} _conforms_ret_false_') + self.write_info(f'beq $t0 {self.type_index.index(OBJECT_CLASS)} _conforms_ret_false_') # Query parents's class tag from $s2 ... class parent table self.write_info('mul $t0 $t0 4') @@ -972,30 +752,10 @@ def conforms(self): # No need to store result in a Bool class self.write_info('_conforms_ret_:') self.write_info('jr $ra') - self.write_info('') - + self.write_info('')''' + #------ ISVOID def isvoid(self): self.write_info(f'function__isvoid:', tabbed=False) - # Set up stack frame - self.write_info(f'move $fp, $sp') - - self.visit(cil.Allocate(dest = None, ttype = "Bool")) - # $v0 contains new Bool object - - self.write_info(f'lw $t0 12($fp)') # 1st arg is an object address - self.write_info(f'la $t1 {"type_void"}') - - self.write_info(f'beq $t0 $t1 _is_void_true_') # arg == void type - self.write_info(f'sw $0 12($v0)') # return False - self.write_info(f'j _is_void_end_') - - self.write_info(f'_is_void_true_:', tabbed=False) - self.write_info(f'li $t0 1') - self.write_info(f'sw $t0 12($v0)') # return True - self.write_info(f'_is_void_end_:', tabbed=False) - - # Return Bool object in $v0 - self.write_info(f'jr $ra') - self.write_info(f'') + \ No newline at end of file From fd4488bc40c197c9484a38958f6e19a831f6be53 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sat, 16 Jan 2021 18:19:52 -0500 Subject: [PATCH 86/96] Pass 9 of 17 test of code generation --- .../components/generation/CIL_generator.py | 39 +- .../components/generation/MIPS_generator.py | 548 ++++++--- src/compiler/components/semantic/context.py | 7 +- .../components/visitors_definitions.py | 1042 +++++++++-------- 4 files changed, 936 insertions(+), 700 deletions(-) diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py index b721df54..31a1b58d 100644 --- a/src/compiler/components/generation/CIL_generator.py +++ b/src/compiler/components/generation/CIL_generator.py @@ -117,26 +117,13 @@ def buildClassDepth(self, node: NodeProgram): # Build the class depth dictionary self.classDepth[_class.idName]= self.classDepth[_class.parent] + 1 - def orderClassesByInhertiance(self, typeName, classList, visitedDict): - order = [self.indexInClassByTypeName(typeName, classList)] - for child in self.programContext.types[typeName].children: - if not visitedDict[typeName]: - order += self.orderClassesByInhertiance(child, classList, visitedDict) - visitedDict[typeName]= True - return order - def indexInClassByTypeName(self, typeName, classList): - return next((i for i in range(len(classList)) if classList[i].idName == typeName), None) - - - def visit_NodeProgram(self, node: NodeProgram): self.buildClassDepth(node) - inhertirOrder= self.orderClassesByInhertiance('Object', node.class_list, {node.idName: False for node in node.class_list}) - for ind in inhertirOrder: - newType= self.visit(node.class_list[ind], - initializers= self.inspectInitializers(node.class_list[ind].idName)) + for _class in node.class_list: + newType= self.visit(_class, + initializers= self.inspectInitializers(_class.idName)) self.registerType(newType) for func in self.dotcode: @@ -155,7 +142,7 @@ def visit_NodeClass(self, node: NodeClass, initializers): # Ovewritting attrs it's not allowed, so the first attrs of the class are the inhertited if node.idName != 'Object': parentName= 'Object' if not node.parent else node.parent - inhAttributes = [cil.Attribute(f'{parentName}_{attrName}') for attrName in + inhAttributes = [cil.Attribute(f'{attrName}') for attrName in self.programContext.types[node.idName].inheritsAttr] methods= [cil.Method(methodName, f'{self.programContext.types[parentName].inheritsMethods[methodName].wrapperType}_{methodName}') for methodName in @@ -225,9 +212,9 @@ def visit_NodeAttr(self, node: NodeAttr): if node.expr: rname = self.visit(node.expr) self.registerInstruction(cil.SetAttrib, "__self", self.currentIndex, rname) - elif node._type == "prim_zero_slot": + elif node._type == "__prim_zero_slot": self.registerInstruction(cil.SetAttrib, "__self", self.currentIndex, 0) - elif node._type == "prim_empty_slot": + elif node._type == "__prim_empty_slot": self.registerInstruction(cil.SetAttrib, "__self", @@ -254,9 +241,9 @@ def visit_NodeClassMethod(self, node: NodeClassMethod): self.internalVarCount= 0 self.currentFunctionName= f"{self.currentClassName}_{node.idName}" - self.nameMap = NameMap() + self.nameMap= NameMap() - arguments = [cil.ArgDeclaration("__self")] + arguments= [cil.ArgDeclaration("__self")] for formal_param in node.formal_param_list: arguments.append(self.visit(formal_param)) @@ -272,9 +259,10 @@ def visit_NodeClassMethod(self, node: NodeClassMethod): self.registerFunction(func) self.mthMap[func.name]= self.currentIndex - + return cil.Method(node.idName, func.name) - + + def visit_NodeFormalParam(self, node: NodeFormalParam): self.nameMap.define_variable(node.idName, f'_{node.idName}') return cil.ArgDeclaration(f'_{node.idName}') @@ -322,7 +310,7 @@ def visit_NodeString(self, node: NodeString): def visit_NodeBoolean(self, node: NodeBoolean): boxedBool = self.registerInternalLocal() self.registerInstruction(cil.Allocate, boxedBool, 'Bool') - if node.content: + if node.content != 'false': self.registerInstruction(cil.SetAttrib, boxedBool, 0, 1) else: self.registerInstruction(cil.SetAttrib, boxedBool, 0, 0) @@ -381,13 +369,10 @@ def visit_NodeLet(self, node: NodeLet): else: varName = self.registerLocal(node.idName) if node.type == 'Int': - self.registerInstruction(cil.SetAttrib, '__self', self.currentIndex, 0) self.buildNewObject(varName, 'Int') elif node.type == 'Bool': - self.registerInstruction(cil.SetAttrib, '__self', self.currentIndex, 0) self.buildNewObject(varName, 'Bool') elif node.type == 'String': - self.registerInstruction(cil.SetAttrib, '__self', self.currentIndex, self.emptyString) self.buildNewObject(varName, 'String') elif node.type == '__prim_zero_slot': self.register_instruction(cil.SetAttrib, '__self', self.currentIndex, 0) diff --git a/src/compiler/components/generation/MIPS_generator.py b/src/compiler/components/generation/MIPS_generator.py index 635bb91f..501bbffc 100644 --- a/src/compiler/components/generation/MIPS_generator.py +++ b/src/compiler/components/generation/MIPS_generator.py @@ -5,12 +5,14 @@ class MipsVisitor(NodeVisitor): def __init__(self, programContext): - super().__init__(programContext = programContext) - self.buffer = [] + super().__init__(programContext= programContext) + self.buffer= [] self.type_index= [] self.dispatchtable_code= [] self.prototypes_code= [] + self.cur_labels_id = 0 self.offset= {} + self.code = "" def push(self): self.write_info('sw $a0 0($sp)') @@ -21,6 +23,7 @@ def pop(self, dest=None): def write_info(self, msg, tabbed= True): info = "{}{}\n".format("\t" if tabbed else "", msg) + self.code += info self.buffer.append(info) def allocate_memory(self, size=None, register=False): @@ -32,24 +35,29 @@ def allocate_memory(self, size=None, register=False): self.write_info('li $v0 9') self.write_info('syscall') + def new_labels_id(self): + self.cur_labels_id += 1 + return self.cur_labels_id + def visit_Data(self, node: cil.Data): - self.write_info(f'{node.dest}: .asciiz \"{str(node.value.encode())[2:-1]}\"') + self.write_info(f'{node.dest}: .align 2 \n \t\t\t.asciiz \"{str(node.value.encode())[2:-1]}\"') def visit_Program(self, node: cil.Program): #-------------------- DATA SECTION ---------------------------- self.write_info('.data', tabbed= False) - + self.static_datas() + for data in node.data_section: self.visit(data) self.write_info('') for i in range(len(node.type_section)): self.type_index.append(node.type_section[i].type_name) - self.write_info('classname_{}: .asciiz \"{}\"'.format(node.type_section[i].type_name, + self.write_info('classname_{}: .align 2 \n\t\t\t.asciiz \"{}\"'.format(node.type_section[i].type_name, node.type_section[i].type_name)) - self.write_info(f'type_void: .asciiz \"\"') + self.write_info(f'type_void: .align 2 \n\t\t\t .asciiz \"\"') #-------------------- TEXT SECTION ---------------------------- @@ -106,7 +114,7 @@ def visit_Program(self, node: cil.Program): # Generate mips method that builds dispatch tables self.write_info('function_build_dispatch_tables:', tabbed=False) for ins in self.dispatchtable_code: - self.write_info(ins) + self.write_info(ins) self.write_info('jr $ra') self.write_info('') @@ -145,34 +153,9 @@ def visit_Program(self, node: cil.Program): return self.buffer - def entrypoint(self): - self.write_info('main:', tabbed=False) - self.visit(cil.Call(dest = None, f = 'build_class_name_table')) - self.visit(cil.Call(dest = None, f = 'allocate_prototypes_table')) - self.visit(cil.Call(dest = None, f = 'build_prototypes')) - self.visit(cil.Call(dest = None, f = 'build_dispatch_tables')) - self.visit(cil.Call(dest = None, f = 'build_class_parents_table')) - self.visit(cil.Allocate(dest = None, ttype = 'Main')) - self.visit(cil.Allocate(dest = None, ttype = 'Main')) - - # Push main self - self.write_info('sw $v0 0($sp)') - self.write_info('addiu $sp $sp -4') - - self.visit(cil.Call(dest = None, f = f'Main__init')) - self.write_info('addiu $sp $sp 4') - - # Push main self - self.write_info('sw $v0 0($sp)') - self.write_info('addiu $sp $sp -4') - - self.visit(cil.Call(dest = None, f = 'Main_main')) - self.write_info('addiu $sp $sp 4') - - self.write_info('li $v0 10') - self.write_info('syscall') - + def visit_Function(self, node: cil.Function): + self.code = "" self.write_info(f'function_{node.name}:', tabbed=False) # Set up stack frame @@ -357,15 +340,67 @@ def visit_Type(self, node: cil.Type): self.prototypes_code.append('') ####################### STATIC FUNCTIONS ####################### + + #----- STATIC DATAs + + def static_datas(self): + # Buffer for reading strings + self.write_info('str_buffer: .space 1024') + self.write_info('') + + # Declare error mensages + self.write_info('_index_negative_msg: .align 2 \n\t\t\t .asciiz \"Index to substr is negative\\n\"') + self.write_info('_index_out_msg: .align 2 \n\t\t\t .asciiz \"Index out range exception\\n\"') + self.write_info('_abort_msg: .align 2 \n\t\t\t .asciiz \"Abort called from class\\n\"') + self.write_info('_div_zero_msg: .align 2 \n\t\t\t .asciiz \"Division by zero exception\\n\"') + + self.write_info('') + + def entrypoint(self): + self.write_info('main:', tabbed=False) + self.visit(cil.Call(dest = None, f = 'build_class_name_table')) + self.visit(cil.Call(dest = None, f = 'allocate_prototypes_table')) + self.visit(cil.Call(dest = None, f = 'build_prototypes')) + self.visit(cil.Call(dest = None, f = 'build_dispatch_tables')) + self.visit(cil.Call(dest = None, f = 'build_class_parents_table')) + self.visit(cil.Allocate(dest = None, ttype = 'Main')) + self.visit(cil.Allocate(dest = None, ttype = 'Main')) + + # Push main self + self.write_info('sw $v0 0($sp)') + self.write_info('addiu $sp $sp -4') + + self.visit(cil.Call(dest = None, f = f'Main__init')) + self.write_info('addiu $sp $sp 4') + + # Push main self + self.write_info('sw $v0 0($sp)') + self.write_info('addiu $sp $sp -4') + + self.visit(cil.Call(dest = None, f = 'Main_main')) + self.write_info('addiu $sp $sp 4') + + self.write_info('li $v0 10') + self.write_info('syscall') + + #----- OBJECT METHODS def object_abort(self): self.write_info('function_Object_abort:', tabbed=False) - ## Set up stack frame - #self.write_info(f'move $fp, $sp') -# - #self.write_info('jr $ra') - #self.write_info('') + # Set up stack frame + self.write_info('move $fp, $sp') + + # Printing the message + self.write_info('la $a0 _abort_msg') + self.write_info('li $v0 4') + self.write_info('syscall') + self.write_info('') + + # Aborting + self.write_info('li $v0 10') + self.write_info('syscall') + self.write_info('') def object_copy(self): self.write_info('function_Object_copy:', tabbed=False) @@ -390,136 +425,136 @@ def object_copy(self): self.write_info('move $v0 $t2') # dejar en v0 la direccion donde empieza el nuevo objeto self.write_info('jr $ra') self.write_info('') -# + def object_typename(self): self.write_info('function_Object_type_name:', tabbed=False) # Set up stack frame - #self.write_info(f'move $fp, $sp') -# - ## Box the string reference - #self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) # Create new String object - #self.write_info('move $v1 $v0') -# - ## Box string's length - #self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS) ) # Create new Int object -# - #self.write_info('lw $a1 12($fp)') # self - #self.write_info('lw $a1 0($a1)') - #self.write_info('mul $a1 $a1 4') # self's class tag - #self.write_info('addu $a1 $a1 $s1') # class name table entry address - #self.write_info('lw $a1 0($a1)') # Get class name address -# - #self.write_info('move $a2 $0') # Compute string's length - #self.write_info('move $t2 $a1') - #self.write_info('_str_len_clsname_:', tabbed=False) - #self.write_info('lb $a0 0($t2)') - #self.write_info('beq $a0 $0 _end_clsname_len_') - #self.write_info('addiu $a2 $a2 1') - #self.write_info('addiu $t2 $t2 1') - #self.write_info('j _str_len_clsname_') - #self.write_info('_end_clsname_len_:', tabbed=False) -# - #self.write_info('sw $a2, 12($v0)') # Store string's length -# - #self.write_info('sw $v0, 12($v1)') # Fill String attributes - #self.write_info('sw $a1, 16($v1)') -# - #self.write_info('move $v0 $v1') - #self.write_info('jr $ra') - #self.write_info('') -# + self.write_info(f'move $fp, $sp') + + # Box the string reference + self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object + self.write_info('move $v1 $v0') + + # Box string's length + self.visit(cil.Allocate(dest = None, ttype = "Int") ) # Create new Int object + + self.write_info('lw $a1 12($fp)') # self + self.write_info('lw $a1 0($a1)') + self.write_info('mul $a1 $a1 4') # self's class tag + self.write_info('addu $a1 $a1 $s1') # class name table entry address + self.write_info('lw $a1 0($a1)') # Get class name address + + self.write_info('move $a2 $0') # Compute string's length + self.write_info('move $t2 $a1') + self.write_info('_str_len_clsname_:', tabbed=False) + self.write_info('lb $a0 0($t2)') + self.write_info('beq $a0 $0 _end_clsname_len_') + self.write_info('addiu $a2 $a2 1') + self.write_info('addiu $t2 $t2 1') + self.write_info('j _str_len_clsname_') + self.write_info('_end_clsname_len_:', tabbed=False) + + self.write_info('sw $a2, 12($v0)') # Store string's length + + self.write_info('sw $v0, 12($v1)') # Fill String attributes + self.write_info('sw $a1, 16($v1)') + + self.write_info('move $v0 $v1') + self.write_info('jr $ra') + self.write_info('') + #----- STRING METHODS def string_length(self): self.write_info('function_String_length:', tabbed=False) - ## Set up stack frame - #self.write_info(f'move $fp, $sp') -# - #self.write_info('lw $a0 12($fp)') # Self - #self.write_info('lw $v0 12($a0)') - #self.write_info('jr $ra') - #self.write_info('') + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.write_info('lw $a0 12($fp)') # Self + self.write_info('lw $v0 12($a0)') + self.write_info('jr $ra') + self.write_info('') def string_concat(self): self.write_info('function_String_concat:', tabbed=False) # Set up stack frame - #self.write_info(f'move $fp, $sp') -# - #self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) # Create new Int object - #self.write_info('move $v1 $v0') # Save new Int Object -# - #self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) # Create new String object - #self.write_info('move $t3 $v0') # Store new String object -# - #self.write_info('lw $a1 12($fp)') # Self - #self.write_info('lw $a2 16($fp)') # Boxed String to concat -# - #self.write_info('lw $t1 12($a1)') # Self's length Int object - #self.write_info('lw $t1 12($t1)') # Self's length -# - #self.write_info('lw $t2 12($a2)') # strings to concat's length Int object - #self.write_info('lw $t2 12($t2)') # strings to concat's length -# - #self.write_info('addu $t0 $t2 $t1') # New string's length - #self.write_info('sw $t0 12($v1)') # Store new string's length into box -# - #self.write_info('lw $a1 16($a1)') # Unbox strings - #self.write_info('lw $a2 16($a2)') -# - #self.write_info('addiu $t0 $t0 1') # Add space for \0 - #self.allocate_memory('$t0', register=True) # Allocate memory for new string - #self.write_info('move $t5 $v0') # Keep the string's reference in v0 and use t7 + self.write_info(f'move $fp, $sp') + + self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object + self.write_info('move $v1 $v0') # Save new Int Object + + self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object + self.write_info('move $t3 $v0') # Store new String object + + self.write_info('lw $a1 12($fp)') # Self + self.write_info('lw $a2 16($fp)') # Boxed String to concat + + self.write_info('lw $t1 12($a1)') # Self's length Int object + self.write_info('lw $t1 12($t1)') # Self's length + + self.write_info('lw $t2 12($a2)') # strings to concat's length Int object + self.write_info('lw $t2 12($t2)') # strings to concat's length + + self.write_info('addu $t0 $t2 $t1') # New string's length + self.write_info('sw $t0 12($v1)') # Store new string's length into box + + self.write_info('lw $a1 16($a1)') # Unbox strings + self.write_info('lw $a2 16($a2)') + + self.write_info('addiu $t0 $t0 1') # Add space for \0 + self.allocate_memory('$t0', register=True) # Allocate memory for new string + self.write_info('move $t5 $v0') # Keep the string's reference in v0 and use t7 # a1: self's string a2: 2nd string t1: length self t2: 2nd string length # v1: new string's int object - #self.write_info('move $t4 $a1') # Index for iterating the self string - #self.write_info('addu $a1 $a1 $t1') # self's copy limit - #self.write_info('_strcat_copy_:', tabbed=False) - #self.write_info('beq $t4 $a1 _end_strcat_copy_') # No more characters to copy -# - #self.write_info('lb $a0 0($t4)') # Copy the character - #self.write_info('sb $a0 0($t5)') -# - #self.write_info('addiu $t5 $t5 1') # Advance indices - #self.write_info('addiu $t4 $t4 1') - #self.write_info('j _strcat_copy_') - #self.write_info('_end_strcat_copy_:', tabbed=False) -# - ## Copy 2nd string -# - #self.write_info('move $t4 $a2') # Index for iterating the strings - #self.write_info('addu $a2 $a2 $t2') # self's copy limit - #self.write_info('_strcat_copy_snd_:', tabbed=False) - #self.write_info('beq $t4 $a2 _end_strcat_copy_snd_') # No more characters to copy -# - #self.write_info('lb $a0 0($t4)') # Copy the character - #self.write_info('sb $a0 0($t5)') -# - #self.write_info('addiu $t5 $t5 1') # Advance indices - #self.write_info('addiu $t4 $t4 1') - #self.write_info('j _strcat_copy_snd_') - #self.write_info('_end_strcat_copy_snd_:', tabbed=False) -# - #self.write_info('sb $0 0($t5)') # End string with \0 -# - ## $v0: reference to new string $v1: length int object - ## $t3: new string object - ## -> Create boxed string -# - #self.write_info('sw $v1 12($t3)') # New length - #self.write_info('sw $v0 16($t3)') # New string -# - #self.write_info('move $v0 $t3') # Return new String object in $v0 - #self.write_info('jr $ra') - #self.write_info('') -# + self.write_info('move $t4 $a1') # Index for iterating the self string + self.write_info('addu $a1 $a1 $t1') # self's copy limit + self.write_info('_strcat_copy_:', tabbed=False) + self.write_info('beq $t4 $a1 _end_strcat_copy_') # No more characters to copy + + self.write_info('lb $a0 0($t4)') # Copy the character + self.write_info('sb $a0 0($t5)') + + self.write_info('addiu $t5 $t5 1') # Advance indices + self.write_info('addiu $t4 $t4 1') + self.write_info('j _strcat_copy_') + self.write_info('_end_strcat_copy_:', tabbed=False) + + # Copy 2nd string + + self.write_info('move $t4 $a2') # Index for iterating the strings + self.write_info('addu $a2 $a2 $t2') # self's copy limit + self.write_info('_strcat_copy_snd_:', tabbed=False) + self.write_info('beq $t4 $a2 _end_strcat_copy_snd_') # No more characters to copy + + self.write_info('lb $a0 0($t4)') # Copy the character + self.write_info('sb $a0 0($t5)') + + self.write_info('addiu $t5 $t5 1') # Advance indices + self.write_info('addiu $t4 $t4 1') + self.write_info('j _strcat_copy_snd_') + self.write_info('_end_strcat_copy_snd_:', tabbed=False) + + self.write_info('sb $0 0($t5)') # End string with \0 + + # $v0: reference to new string $v1: length int object + # $t3: new string object + # -> Create boxed string + + self.write_info('sw $v1 12($t3)') # New length + self.write_info('sw $v0 16($t3)') # New string + + self.write_info('move $v0 $t3') # Return new String object in $v0 + self.write_info('jr $ra') + self.write_info('') + def string_substr(self): self.write_info('function_String_substr:', tabbed=False) # Set up stack frame - ''' self.write_info(f'move $fp, $sp') + self.write_info(f'move $fp, $sp') self.write_info(f'lw $t5 12($fp)') # self param self.write_info(f'lw $a1 16($fp)') # reference of object int that represent i self.write_info(f'lw $a1 12($a1)') # value of i @@ -533,10 +568,10 @@ def string_substr(self): self.write_info(f'bgt $a2 $a3 _index_out') # j > lenght # not errors - self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) + self.visit(cil.Allocate(dest = None, ttype = "String")) self.write_info(f'move $v1 $v0') # new string - self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) + self.visit(cil.Allocate(dest = None, ttype = "Int")) self.write_info(f'move $t0 $v0') # lenght of string self.write_info(f'move $t7 $a2') self.write_info(f'subu $t7 $t7 $a1') @@ -589,16 +624,16 @@ def string_substr(self): self.write_info('move $v0 $v1') self.write_info('jr $ra') - self.write_info('') ''' + self.write_info('') #----- IO def io_in_int(self): self.write_info('function_IO_in_int:', tabbed=False) # Set up stack frame - '''self.write_info(f'move $fp, $sp') + self.write_info(f'move $fp, $sp') - self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) # Create new Int object + self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object self.write_info('move $t0 $v0') # Save Int object @@ -609,17 +644,17 @@ def io_in_int(self): self.write_info('move $v0 $t0') self.write_info('jr $ra') - self.write_info('') ''' + self.write_info('') def io_in_string(self): self.write_info('function_IO_in_string:', tabbed=False) # Set up stack frame - '''self.write_info(f'move $fp, $sp') + self.write_info(f'move $fp, $sp') - self.visit(cil.Allocate(dest = None, ttype = INTEGER_CLASS)) # Create new Int object for string's length + self.visit(cil.Allocate(dest = None, ttype = "Int")) # Create new Int object for string's length self.write_info('move $v1 $v0') # $v1: Int pbject - self.visit(cil.Allocate(dest = None, ttype = STRING_CLASS)) # Create new String object + self.visit(cil.Allocate(dest = None, ttype = "String")) # Create new String object self.write_info('sw $v1 12($v0)') self.write_info('move $t5 $v0') # $t5: String object @@ -683,7 +718,7 @@ def io_in_string(self): # Return new string in $v0 self.write_info('move $v0 $t5') self.write_info('jr $ra') - self.write_info('') ''' + self.write_info('') def io_out_int(self): self.write_info('function_IO_out_int:', tabbed=False) @@ -720,13 +755,13 @@ def io_out_string(self): def conforms(self): self.write_info(f'function___conforms:', tabbed=False) # Set up stack frame - '''self.write_info(f'move $fp, $sp') + self.write_info(f'move $fp, $sp') self.write_info(f'lw $t0 12($fp)') # First arg's class tag self.write_info(f'lw $t1 16($fp)') # Second arg's class tag # 2nd arg == Object -> return true - self.write_info(f'beq $t1 {self.type_index.index(OBJECT_CLASS)} _conforms_ret_true_') + self.write_info(f'beq $t1 {self.type_index.index("Object")} _conforms_ret_true_') self.write_info('_conforms_loop_:', tabbed=False) @@ -734,7 +769,7 @@ def conforms(self): self.write_info('beq $t0 $t1 _conforms_ret_true_') # current == Object -> return false - self.write_info(f'beq $t0 {self.type_index.index(OBJECT_CLASS)} _conforms_ret_false_') + self.write_info(f'beq $t0 {self.type_index.index("Object")} _conforms_ret_false_') # Query parents's class tag from $s2 ... class parent table self.write_info('mul $t0 $t0 4') @@ -752,10 +787,195 @@ def conforms(self): # No need to store result in a Bool class self.write_info('_conforms_ret_:') self.write_info('jr $ra') - self.write_info('')''' + self.write_info('') #------ ISVOID def isvoid(self): self.write_info(f'function__isvoid:', tabbed=False) - \ No newline at end of file + # Set up stack frame + self.write_info(f'move $fp, $sp') + + self.visit(cil.Allocate(dest = None, ttype = "Bool")) + # $v0 contains new Bool object + + self.write_info(f'lw $t0 12($fp)') # 1st arg is an object address + self.write_info(f'la $t1 type_void') + + self.write_info(f'beq $t0 $t1 _is_void_true_') # arg == void type + self.write_info(f'sw $0 12($v0)') # return False + self.write_info(f'j _is_void_end_') + + self.write_info(f'_is_void_true_:', tabbed=False) + self.write_info(f'li $t0 1') + self.write_info(f'sw $t0 12($v0)') # return True + self.write_info(f'_is_void_end_:', tabbed=False) + + # Return Bool object in $v0 + self.write_info(f'jr $ra') + self.write_info(f'') + +############################# COMPARISONS #################################### + + def visit_Equal(self, node: cil.Equal): + self.write_info('lw $t0 {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $t1 {}($fp)'.format(self.offset[node.right])) + self.write_info(f'beq $t0 $zero _eq_false_{node.id}_') # $t0 can't also be void + self.write_info(f'beq $t1 $zero _eq_false_{node.id}_') # $t1 can't also be void + self.write_info('lw $a0 0($t0)') # get object 1 tag + self.write_info('lw $a1 0($t1)') # get object 2 tag + self.write_info(f'bne $a0 $a1 _eq_false_{node.id}_') # compare tags + self.write_info('li $a2 {}'.format(self.type_index.index("Int"))) # load int tag + self.write_info(f'beq $a0 $a2 _eq_int_bool_{node.id}') # Integers + self.write_info('li $a2 {}'.format(self.type_index.index("Bool"))) # load bool tag + self.write_info(f'beq $a0 $a2 _eq_int_bool_{node.id}') # Booleans + self.write_info('li $a2 {}'.format(self.type_index.index("String"))) # load string tag + self.write_info(f'bne $a0 $a2 _not_basic_type_{node.id}_') # Not a primitive type + + # equal strings + # verify len of the strings + self.write_info(f'_eq_str_{node.id}_:', tabbed = False) # handle strings + self.write_info('lw $t3 12($t0)') # get string_1 size + self.write_info('lw $t3 12($t3)') # unbox string_1 size + self.write_info('lw $t4, 12($t1)') # get string_2 size + self.write_info('lw $t4, 12($t4)') # unbox string_2 size + self.write_info(f'bne $t3 $t4 _eq_false_{node.id}_') # string size are distinct + self.write_info(f'beq $t3 $0 _eq_true_{node.id}_') # if strings are empty + + # Verify ascii secuences + self.write_info('addu $t0 $t0 16') # Point to start of string s1 + self.write_info('lw $t0 0($t0)') + self.write_info('addu $t1 $t1 16') # Point to start of string s2 + self.write_info('lw $t1 0($t1)') + self.write_info('move $t2 $t3') # Keep string length as counter + self.write_info(f'_verify_ascii_sequences_{node.id}_:', tabbed = False) + self.write_info('lb $a0 0($t0)') # get char of s1 + self.write_info('lb $a1 0($t1)') # get char of s2 + self.write_info(f'bne $a0 $a1 _eq_false_{node.id}_') # char s1 /= char s2 + self.write_info('addu $t0 $t0 1') + self.write_info('addu $t1 $t1 1') + self.write_info('addiu $t2 $t2 -1') # Decrement counter + self.write_info(f'bnez $t2 _verify_ascii_sequences_{node.id}_') + self.write_info(f'b _eq_true_{node.id}_') # end of strings + + self.write_info(f'_not_basic_type_{node.id}_:', tabbed = False) + self.write_info(f'bne $t0 $t1 _eq_false_{node.id}_') + self.write_info(f'b _eq_true_{node.id}_') + + # equal int or boolf + self.write_info(f'_eq_int_bool_{node.id}:', tabbed = False) # handles booleans and ints + self.write_info('lw $a3 12($t0)') # load value variable_1 + self.write_info('lw $t4 12($t1)') # load variable_2 + self.write_info(f'bne $a3 $t4 _eq_false_{node.id}_') # value of int or bool are distinct + + #return true + self.write_info(f'_eq_true_{node.id}_:', tabbed = False) + self.write_info('li $a0 1') + self.write_info('sw $a0 {}($fp)'.format(self.offset[node.dest])) + self.write_info(f'b end_equal_{node.id}_') + + #return false + self.write_info(f'_eq_false_{node.id}_:', tabbed = False) + self.write_info('li $a0 0') + self.write_info('sw $a0 {}($fp)'.format(self.offset[node.dest])) + self.write_info(f'end_equal_{node.id}_:', tabbed = False) + + + def visit_EqualOrLessThan(self, node: cil.EqualOrLessThan): + self.write_info('# <=') + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) + self.write_info('sle $a0, $a1, $a2'.format(self.offset[node.right])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_LessThan(self, node: cil.LessThan): + self.write_info('# <') + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) + self.write_info('slt $a0, $a1, $a2'.format(self.offset[node.right])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Goto(self, node: cil.Goto): + self.write_info('# GOTO') + self.write_info('j _cil_label_{}'.format(node.label)) + self.write_info('') + + def visit_IfGoto(self, node: cil.IfGoto): + self.write_info('# IF GOTO') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.condition])) + self.write_info('bnez $a0, _cil_label_{}'.format(node.label)) + self.write_info('') + +############################## ASSIGNMENT #################################### + + def visit_Assign(self, node: cil.Assign): + self.write_info('# ASSIGN') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.source])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Label(self, node: cil.Label): + self.write_info('_cil_label_{}:'.format(node.name), tabbed=False) + +############################# ARITHMETICS #################################### + + def visit_Plus(self, node: cil.Plus): + self.write_info('# +') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info('add $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + + def visit_Minus(self, node: cil.Minus): + self.write_info('# -') + if isinstance(node.left, int): + self.write_info('li $a0 {}'.format(node.left)) + else: + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info('sub $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Mult(self, node: cil.Mult): + self.write_info('# *') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info('mul $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + + def visit_Div(self, node: cil.Div): + self.write_info('# /') + self.write_info('lw $a0, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.right])) + self.write_info(f'beqz $a1 _div_error_{node.id}_') + self.write_info('div $a0, $a0, $a1') + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info(f'b _div_end_{node.id}_') + self.write_info(f'_div_error_{node.id}_:',tabbed=False) + self.write_info('la $a0 _div_zero_msg') + self.write_info('li $v0 4') + self.write_info('syscall') + self.write_info('la $a0 _abort_msg') + self.write_info('li $v0 4') + self.write_info('syscall') + self.write_info('li $v0 10') + self.write_info('syscall') + self.write_info(f'_div_end_{node.id}_:',tabbed=False) + + +############################# COMPARISONS #################################### + + def visit_LessThan(self, node: cil.LessThan): + self.write_info('# <') + self.write_info('lw $a1, {}($fp)'.format(self.offset[node.left])) + self.write_info('lw $a2, {}($fp)'.format(self.offset[node.right])) + self.write_info('slt $a0, $a1, $a2'.format(self.offset[node.right])) + self.write_info('sw $a0, {}($fp)'.format(self.offset[node.dest])) + self.write_info('') + diff --git a/src/compiler/components/semantic/context.py b/src/compiler/components/semantic/context.py index 584f890c..d822e0ee 100644 --- a/src/compiler/components/semantic/context.py +++ b/src/compiler/components/semantic/context.py @@ -74,6 +74,11 @@ def createType(self, node: NodeClass): builtIn= node.idName in ['String', 'Bool', 'Int']) }) + def actualizeChildren(self): + for _type, info in self.types.items(): + if _type != 'Object': + self.types[info.parent].children.append(_type) + def checkGoodInheritance(self, node: NodeClass): if node.idName == 'Object': return parent = 'Object' if not node.parent else node.parent @@ -100,7 +105,7 @@ def checkGoodInheritance(self, node: NodeClass): errorOption= 'inheritance from child', idChild= node.idName, row_and_col= (node.line, node.parent_col) - ) or self.types[parent].children.append(node.idName) + ) def checkGoodOverwriteMethod(self, node: NodeClassMethod, idType): diff --git a/src/compiler/components/visitors_definitions.py b/src/compiler/components/visitors_definitions.py index c04c9fdc..a392b4c1 100644 --- a/src/compiler/components/visitors_definitions.py +++ b/src/compiler/components/visitors_definitions.py @@ -4,523 +4,549 @@ class NodeVisitor: - def __init__(self, programContext): - self.programContext= programContext - - def visit(self, node: Node, **args): - if isinstance(self, TypeCheckerVisitor): - if issubclass(type(node), NodeBinaryOperation): - return self.visit_NodeBinaryOperation(node, **args) - - visitor_method_name = 'visit_' + node.clsname - visitor = getattr(self, visitor_method_name, self.not_implemented) - return visitor(node, **args) # Return the new context result from the visit - - def not_implemented(self, node: Node, **args): - raise Exception('Not implemented visit_{} method'.format(node.clsname)) + def __init__(self, programContext): + self.programContext= programContext + + def visit(self, node: Node, **args): + if isinstance(self, TypeCheckerVisitor): + if issubclass(type(node), NodeBinaryOperation): + return self.visit_NodeBinaryOperation(node, **args) + + visitor_method_name = 'visit_' + node.clsname + visitor = getattr(self, visitor_method_name, self.not_implemented) + return visitor(node, **args) # Return the new context result from the visit + + def not_implemented(self, node: Node, **args): + raise Exception('Not implemented visit_{} method'.format(node.clsname)) # We need to highlight here the inheritance relations between classes class TypeCollectorVisitor(NodeVisitor): - def visit_NodeProgram(self, node: NodeProgram): - errors = [] - for nodeClass in node.class_list: - result= self.visit(nodeClass) - if type (result) is error: # This ugly return is because we only need a one error, this is the panic mode! - errors.append(result) - return errors + def visit_NodeProgram(self, node: NodeProgram): + errors = [] + for nodeClass in node.class_list: + result= self.visit(nodeClass) + if type (result) is error: # This ugly return is because we only need a one error, this is the panic mode! + errors.append(result) + return errors + + + def visit_NodeClass(self, node: NodeClass): + # When we create a type, we store it in the context, if there is no errors + return self.programContext.createType(node) - def visit_NodeClass(self, node: NodeClass): - # When we create a type, we store it in the context, if there is no errors - return self.programContext.createType(node) class TypeInheritanceVisitor(NodeVisitor): - def visit_NodeProgram(self, node: NodeProgram): - errors = [] - for nodeClass in node.class_list: - result = self.visit(nodeClass) - if type(result) is error: - errors.append(result) - return [errors.pop()] if errors else [] - - def visit_NodeClass(self, node: NodeClass): - result= self.programContext.checkGoodInheritance(node) - if type(result) is error: - return result - - if node.idName == 'Object': - return - - for nodeAttr in node.attributes: - resultVisitAttr= self.visit(nodeAttr, idType= node.idName) - if type(resultVisitAttr) is error: - return resultVisitAttr - - for nodeClassMethod in node.methods: - resultVisitClassMethod= self.visit(nodeClassMethod, idType= node.idName) - if type(resultVisitClassMethod) is error: - return resultVisitClassMethod - - self.programContext.actualizeInherits(node) - - - def visit_NodeAttr(self, node: NodeAttr, idType): - return self.programContext.checkNotOverwriteAttr(node, idType) - - - def visit_NodeClassMethod(self, node: NodeClassMethod, idType): - return self.programContext.checkGoodOverwriteMethod(node, idType) - - + + + def visit_NodeProgram(self, node: NodeProgram): + errors = [] + + for nodeClass in node.class_list: + result = self.programContext.checkGoodInheritance(nodeClass) + if type(result) is error: + errors.append(result) + + # This is because we need only one error to pass the tests. + if errors: + return [errors.pop()] + + self.programContext.actualizeChildren() + node.class_list= self.orderClassesByInhertiance('Object', node.class_list, + {node.idName: False for node in node.class_list}) + + for nodeClass in node.class_list: + result = self.visit(nodeClass) + if type(result) is error: + errors.append(result) + return [errors.pop()] if errors else [] + + def visit_NodeClass(self, node: NodeClass): + + if node.idName == 'Object': + return + + for nodeAttr in node.attributes: + resultVisitAttr= self.visit(nodeAttr, idType= node.idName) + if type(resultVisitAttr) is error: + return resultVisitAttr + + for nodeClassMethod in node.methods: + resultVisitClassMethod= self.visit(nodeClassMethod, idType= node.idName) + if type(resultVisitClassMethod) is error: + return resultVisitClassMethod + + self.programContext.actualizeInherits(node) + + + def visit_NodeAttr(self, node: NodeAttr, idType): + return self.programContext.checkNotOverwriteAttr(node, idType) + + + def visit_NodeClassMethod(self, node: NodeClassMethod, idType): + return self.programContext.checkGoodOverwriteMethod(node, idType) + + def orderClassesByInhertiance(self, typeName, classList, visitedDict): + order = [self.returnClassByIdName(typeName, classList)] + for child in self.programContext.types[typeName].children: + if not visitedDict[typeName]: + order += self.orderClassesByInhertiance(child, classList, visitedDict) + + visitedDict[typeName]= True + return order + + def returnClassByIdName(self, typeName, classList): + return next((_class for _class in classList if _class.idName == typeName), None) + class TypeBuilderVisitor(NodeVisitor): - def __init__(self, programContext): - super().__init__(programContext) - self.currentTypeName = '' - - def visit_NodeProgram(self, node: NodeProgram): - errors = [] - for nodeClass in node.class_list: - errors += self.visit(nodeClass) - return errors - - def visit_NodeClass(self, node: NodeClass): - errors= [] - self.currentTypeName= node.idName - - for nodeAttr in node.attributes: - errors += self.visit(nodeAttr) - for nodeClassMethod in node.methods: - errors += self.visit(nodeClassMethod) - return errors - - def visit_NodeAttr(self, node:NodeAttr): - resultOp= self.programContext.defineAttrInType(self.currentTypeName, - node) - - if type (resultOp) is error: - return [resultOp] - - return [] - - def visit_NodeClassMethod(self, node: NodeClassMethod): - return [definition for definition in - [self.programContext.getType(node.returnType, (node.line, node.column))] + - [self.programContext.getType(idName = formal_param._type, row_and_col= (formal_param.line, formal_param.column)) for formal_param in node.formal_param_list] + - [self.programContext.defineMethod( - typeName = self.currentTypeName, - node= node - )] - if type(definition) is error - ] + def __init__(self, programContext): + super().__init__(programContext) + self.currentTypeName = '' + + def visit_NodeProgram(self, node: NodeProgram): + errors = [] + for nodeClass in node.class_list: + errors += self.visit(nodeClass) + return errors + + def visit_NodeClass(self, node: NodeClass): + errors= [] + self.currentTypeName= node.idName + + for nodeAttr in node.attributes: + errors += self.visit(nodeAttr) + for nodeClassMethod in node.methods: + errors += self.visit(nodeClassMethod) + return errors + + def visit_NodeAttr(self, node:NodeAttr): + resultOp= self.programContext.defineAttrInType(self.currentTypeName, + node) + + if type (resultOp) is error: + return [resultOp] + + return [] + + def visit_NodeClassMethod(self, node: NodeClassMethod): + return [definition for definition in + [self.programContext.getType(node.returnType, (node.line, node.column))] + + [self.programContext.getType(idName = formal_param._type, row_and_col= (formal_param.line, formal_param.column)) for formal_param in node.formal_param_list] + + [self.programContext.defineMethod( + typeName = self.currentTypeName, + node= node + )] + if type(definition) is error + ] class TypeCheckerVisitor(NodeVisitor): - - - def visit_NodeProgram(self, node: NodeProgram): - self.mapExprWithType= {} - errors = [] - for nodeClass in node.class_list: - environment = self.programContext.buildEnv (typeName= nodeClass.idName) - errors += self.visit(nodeClass, previousEnv= environment) - - return errors, self.mapExprWithType - - def visit_NodeClass(self, node: NodeClass, previousEnv): - errors = [] - for nodeAttr in node.attributes: - result= self.visit(nodeAttr, previousEnv= previousEnv) - if type(result) is error: - errors.append(result) - - - for nodeClassMethod in node.methods: - result= self.visit(nodeClassMethod, previousEnv= previousEnv) - if type(result) is error: - errors.append(result) - - return errors - - def visit_NodeClassMethod(self, node: NodeClassMethod, previousEnv): - newEnv = self.programContext.buildEnvForMethod(node, previousEnv) - if type(newEnv) is error: - return newEnv - - typeResult = self.visit(node.body, previousEnv= newEnv) - - if type(typeResult) is error: - return typeResult - - return self.programContext.checkReturnType(node.returnType, - typeResult, - (node.line, node.column), - 'uncompatible types') - - def visit_NodeString(self, node: NodeString, **kwargs): - return 'String' - - def visit_NodeAttr(self, node: NodeAttr, previousEnv): - if node.expr: - typeExpr= self.visit(node.expr, - previousEnv= previousEnv) - if type(typeExpr) is error: - return typeExpr - - resultCheckAssign= self.programContext.checkAssign(nameObject= node.idName, - nodeType= node._type, - returnType= typeExpr, - row_and_col= (node.expr.line, node.expr.column) - if node.expr else (node.line, node.column), - errorOption= 'uncompatible assign attr') - if type(resultCheckAssign) is error: - return resultCheckAssign - - return node._type - - def visit_NodeLetComplex(self, - node: NodeLetComplex, - previousEnv: dict): - newEnv= previousEnv.copy() - for nodeLet in node.nestedLets: - - result= self.visit(nodeLet, - previousEnv= newEnv) - if type(result) is error: - return result - newEnv.update({ - nodeLet.idName: result - }) - - result= self.visit( node.body, - previousEnv= newEnv) - - return result - - def visit_NodeLet(self, node: NodeLet, previousEnv): - errors= [] - exprType= self.visit(node.body, - previousEnv= previousEnv) if node.body else node.type - if type(exprType) is error: - return exprType - - row_and_col = (node.body.line, node.body.column) if node.body else (node.line, node.column) - - resultCheckAssign= self.programContext.checkAssign(node.idName, - node.type, - exprType, - row_and_col, - 'uncompatible assing object', - node.column) - if type(resultCheckAssign) is error: - return resultCheckAssign - - return node.type - - def visit_NodeAssignment(self, node: NodeAssignment, - previousEnv): - - resultObj = self.visit(node.nodeObject, previousEnv= previousEnv) - - if type(resultObj) is error: - return resultObj - - resultExpr = self.visit(node.expr, previousEnv= previousEnv) - - if type(resultExpr) is error: - return resultExpr - - - resultCheckAssign= self.programContext.checkAssign(nameObject= node.nodeObject.idName, - nodeType= resultObj, - returnType= resultExpr, - row_and_col= (node.nodeObject.line, node.nodeObject.column ), - errorOption= 'uncompatible assing object', - columnAssign= node.columnAssign) - if type(resultCheckAssign) is error: - return resultCheckAssign - - return resultExpr - - def visit_NodeBinaryOperation(self, - node: NodeBinaryOperation, - previousEnv): - - - typeFirstExpr= self.visit(node.first, - previousEnv= previousEnv) - - typeSecondExpr= self.visit(node.second, - previousEnv= previousEnv) - - if type (typeFirstExpr) is error: - return typeFirstExpr - - if type (typeSecondExpr) is error: - return typeSecondExpr - - if type(node) is NodeEqual: - return self.programContext.checkEqualOp(typeFirstExpr, - typeSecondExpr, - (node.line, node.column)) - - - arithmeticOp = type(node) in {NodeAddition, - NodeSubtraction, - NodeDivision, - NodeMultiplication} - - - return self.programContext.checkArithmetic(typeFirstExpr, - typeSecondExpr, - (node.line, node.column), - node.symbol, - arithmeticOp) - - - - def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): - result = self.programContext.getType(node.type, - row_and_col=(node.line, node.column)) - if type(result) is error: - return result - return node.type - - def visit_NodeExpr(self, - node: NodeExpr, - previousEnv): - return self.visit(node, previousEnv= previousEnv) - - - def visit_NodeInteger(self, - node: NodeInteger, - **kwargs): - return 'Int' - - def visit_NodeBoolean(self, - node: NodeBoolean, - **kwargs): - return 'Bool' - - def visit_NodeBooleanComplement(self, - node: NodeBooleanComplement, - previousEnv): - typeExpr = self.visit(node.boolean_expr, previousEnv= previousEnv) - if type(typeExpr) is error: - return typeExpr - return self.programContext.checkReturnType(nodeType= "Bool", returnType= typeExpr, - row_and_col= (node.line, node.boolean_expr.column -2), - errorOption= 'bad not') - - - - - def visit_NodeObject(self, - node: NodeObject, - previousEnv): - if node.idName == 'self': - return previousEnv['wrapperType'] - return self.programContext.searchValue(node, - (node.line, node.column), - previousEnv) - - def visit_NodeDynamicDispatch(self, - node: NodeDynamicDispatch, - previousEnv): - - typeExpr= self.visit(node.expr, - previousEnv= previousEnv) - if type (typeExpr) is error: - return typeExpr - - self.mapExprWithType[(node.line, node.column)]= typeExpr - methodInfo= self.programContext.checkMethodInType(idType= typeExpr, - idMethod = node.method, - row_and_col= (node.line, node.column + 1)) - if type(methodInfo) is error: - return methodInfo - - argTypes = [] - for arg in node.arguments: - currenttypeExpr= self.visit(arg, - previousEnv= previousEnv) - if type (currenttypeExpr) is error: - return currenttypeExpr - argTypes.append(currenttypeExpr) - - resultCheck= self.programContext.checkArgumentsInDispatch( - node, - methodInfo.argNames, - argTypes, - methodInfo.argTypes) - - if type(resultCheck) is error: - return resultCheck - - return methodInfo.returnType - - - def visit_NodeSelf(self, node: NodeSelf, previousEnv): - return previousEnv['wrapperType'] - - def visit_NodeIntegerComplement(self, node: NodeIntegerComplement, - previousEnv): - typeExpr = self.visit(node.integer_expr, previousEnv= previousEnv) - if type(typeExpr) is error: - return typeExpr - return self.programContext.checkReturnType(nodeType= "Int", returnType= typeExpr, - row_and_col= (node.line, node.column + 1), - errorOption= 'bad ~') - - def visit_NodeBlock(self, node: NodeBlock, previousEnv): - blockType = None - for expr in node.expr_list: - - blockType = self.visit(expr, previousEnv= previousEnv) - if type(blockType) is error: - return blockType - return blockType - - def visit_NodeIf(self, node: NodeIf, previousEnv): - predType = self.visit(node.predicate, previousEnv = previousEnv) - if type(predType) is error: - return predType - - resultCheck = self.programContext.checkReturnType(nodeType= 'Bool', returnType= predType, - row_and_col= (node.line, node.column), - errorOption= 'uncompatible types') - - if type(resultCheck) is error: - return resultCheck - - thenType = self.visit(node.then_body, previousEnv= previousEnv) - if type(thenType) is error: - return thenType - - elseType = self.visit(node.else_body, previousEnv= previousEnv) - if type(elseType) is error: - return elseType - - return self.programContext.LCA(idName1 = thenType, idName2= elseType) - - def visit_NodeCase(self, node: NodeCase, previousEnv): - resultTypeInit= self.visit(node.expr, previousEnv= previousEnv) - if type(resultTypeInit) is error: - return resultTypeInit - - return self.visit_NodeCaseActions(node.actions, - previousEnv, - resultTypeInit) - - def visit_NodeCaseActions(self, nodeActions, previousEnv, resultTypeInit): - - action, returnTypesExpressions= self.searchLessActionCaseAndReturnTypes(nodeActions, - previousEnv, - resultTypeInit) - if type(action) is error: - return action - - lca = returnTypesExpressions[0] - for typeExpr in returnTypesExpressions: - lca= self.programContext.LCA(idName1= lca, idName2= typeExpr) - - return lca - - def searchLessActionCaseAndReturnTypes(self, nodeActions, - previousEnv, resultTypeInit): - actionToReturn = None - currentTypeCase= 'Object' - returnTypesExpressions = [] - - resultCheckNonRepetition= self.programContext.checkNonRepetition(nodeActions) - if type(resultCheckNonRepetition) is error: - return resultCheckNonRepetition, None - - for action in nodeActions: - actionType= self.programContext.getType(idName= action.type, - row_and_col= (action.line, - action.column)) - if type(actionType) is error: - return actionType, None - - newEnv= previousEnv.copy() - newEnv.update({ - action.idName: action.type - }) - returnTypeAction= self.visit(action.expr, previousEnv= newEnv) - if type(returnTypeAction) is error: - return returnTypeAction, None - - returnTypesExpressions.append(returnTypeAction) - - if self.programContext.isSubtype(subType= resultTypeInit, - superType= action.type) and self.programContext.isSubtype( - subType= action.type, - superType= currentTypeCase): - actionToReturn= action - currentTypeCase= action.type - - return actionToReturn, returnTypesExpressions - - - def visit_NodeIsVoid(self, node: NodeIsVoid, previousEnv): - typeExpr= self.visit(node.expr, previousEnv = previousEnv) - if type(typeExpr) is error: - return typeExpr - return 'Bool' - - def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): - typeLeftMost= self.visit(node.expr, previousEnv= previousEnv) - if type(typeLeftMost) is error: - return typeLeftMost - - dispatchType= self.programContext.getType(idName= node.dispatch_type, - row_and_col= (node.line, node.columnType)) - if type(dispatchType) is error: - return dispatchType - - methodInfo= self.programContext.checkMethodInType(idType= node.dispatch_type, - idMethod= node.method, - row_and_col= (node.line, node.columnIdMethod)) - if type(methodInfo) is error: - return methodInfo - - typeExprOfArgs = [] - for arg in node.arguments: - resultType= self.visit(node= arg, - previousEnv = previousEnv) - - if type(resultType) is error: - return resultType - - typeExprOfArgs.append(resultType) - - - checkingArgumentsResult= self.programContext.checkArgumentsInDispatch( - node, - methodInfo.argNames, - typeExprOfArgs, - methodInfo.argTypes,) - - if type(checkingArgumentsResult) is error: - return checkingArgumentsResult - - return self.programContext.checkDispatchTypes(typeLeftMost= typeLeftMost, - typeRight= dispatchType.idName, - returnType= methodInfo.returnType, - row_and_col= (node.expr.line, node.expr.column)) - - def visit_NodeWhileLoop(self, node: NodeWhileLoop, previousEnv): - resultExprPred = self.visit(node.predicate, previousEnv= previousEnv) - if type(resultExprPred) is error: - return resultExprPred - resultCheck = self.programContext.checkBoolInPredicate(node, resultExprPred) - if type(resultCheck) is error: - return resultCheck - - resultExpr = self.visit(node.body, previousEnv= previousEnv) - if type(resultExpr) is error: - return resultExpr - - return 'Object' - + + + def visit_NodeProgram(self, node: NodeProgram): + self.mapExprWithType= {} + errors = [] + for nodeClass in node.class_list: + environment = self.programContext.buildEnv (typeName= nodeClass.idName) + errors += self.visit(nodeClass, previousEnv= environment) + + return errors, self.mapExprWithType + + def visit_NodeClass(self, node: NodeClass, previousEnv): + errors = [] + for nodeAttr in node.attributes: + result= self.visit(nodeAttr, previousEnv= previousEnv) + if type(result) is error: + errors.append(result) + + + for nodeClassMethod in node.methods: + result= self.visit(nodeClassMethod, previousEnv= previousEnv) + if type(result) is error: + errors.append(result) + + return errors + + def visit_NodeClassMethod(self, node: NodeClassMethod, previousEnv): + newEnv = self.programContext.buildEnvForMethod(node, previousEnv) + if type(newEnv) is error: + return newEnv + + typeResult = self.visit(node.body, previousEnv= newEnv) + + if type(typeResult) is error: + return typeResult + + return self.programContext.checkReturnType(node.returnType, + typeResult, + (node.line, node.column), + 'uncompatible types') + + def visit_NodeString(self, node: NodeString, **kwargs): + return 'String' + + def visit_NodeAttr(self, node: NodeAttr, previousEnv): + if node.expr: + typeExpr= self.visit(node.expr, + previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + + resultCheckAssign= self.programContext.checkAssign(nameObject= node.idName, + nodeType= node._type, + returnType= typeExpr, + row_and_col= (node.expr.line, node.expr.column) + if node.expr else (node.line, node.column), + errorOption= 'uncompatible assign attr') + if type(resultCheckAssign) is error: + return resultCheckAssign + + return node._type + + def visit_NodeLetComplex(self, + node: NodeLetComplex, + previousEnv: dict): + newEnv= previousEnv.copy() + for nodeLet in node.nestedLets: + + result= self.visit(nodeLet, + previousEnv= newEnv) + if type(result) is error: + return result + newEnv.update({ + nodeLet.idName: result + }) + + result= self.visit( node.body, + previousEnv= newEnv) + + return result + + def visit_NodeLet(self, node: NodeLet, previousEnv): + errors= [] + exprType= self.visit(node.body, + previousEnv= previousEnv) if node.body else node.type + if type(exprType) is error: + return exprType + + row_and_col = (node.body.line, node.body.column) if node.body else (node.line, node.column) + + resultCheckAssign= self.programContext.checkAssign(node.idName, + node.type, + exprType, + row_and_col, + 'uncompatible assing object', + node.column) + if type(resultCheckAssign) is error: + return resultCheckAssign + + return node.type + + def visit_NodeAssignment(self, node: NodeAssignment, + previousEnv): + + resultObj = self.visit(node.nodeObject, previousEnv= previousEnv) + + if type(resultObj) is error: + return resultObj + + resultExpr = self.visit(node.expr, previousEnv= previousEnv) + + if type(resultExpr) is error: + return resultExpr + + + resultCheckAssign= self.programContext.checkAssign(nameObject= node.nodeObject.idName, + nodeType= resultObj, + returnType= resultExpr, + row_and_col= (node.nodeObject.line, node.nodeObject.column ), + errorOption= 'uncompatible assing object', + columnAssign= node.columnAssign) + if type(resultCheckAssign) is error: + return resultCheckAssign + + return resultExpr + + def visit_NodeBinaryOperation(self, + node: NodeBinaryOperation, + previousEnv): + + + typeFirstExpr= self.visit(node.first, + previousEnv= previousEnv) + + typeSecondExpr= self.visit(node.second, + previousEnv= previousEnv) + + if type (typeFirstExpr) is error: + return typeFirstExpr + + if type (typeSecondExpr) is error: + return typeSecondExpr + + if type(node) is NodeEqual: + return self.programContext.checkEqualOp(typeFirstExpr, + typeSecondExpr, + (node.line, node.column)) + + + arithmeticOp = type(node) in {NodeAddition, + NodeSubtraction, + NodeDivision, + NodeMultiplication} + + + return self.programContext.checkArithmetic(typeFirstExpr, + typeSecondExpr, + (node.line, node.column), + node.symbol, + arithmeticOp) + + + + def visit_NodeNewObject(self, node: NodeNewObject, **kwargs): + result = self.programContext.getType(node.type, + row_and_col=(node.line, node.column)) + if type(result) is error: + return result + return node.type + + def visit_NodeExpr(self, + node: NodeExpr, + previousEnv): + return self.visit(node, previousEnv= previousEnv) + + + def visit_NodeInteger(self, + node: NodeInteger, + **kwargs): + return 'Int' + + def visit_NodeBoolean(self, + node: NodeBoolean, + **kwargs): + return 'Bool' + + def visit_NodeBooleanComplement(self, + node: NodeBooleanComplement, + previousEnv): + typeExpr = self.visit(node.boolean_expr, previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + return self.programContext.checkReturnType(nodeType= "Bool", returnType= typeExpr, + row_and_col= (node.line, node.boolean_expr.column -2), + errorOption= 'bad not') + + + + + def visit_NodeObject(self, + node: NodeObject, + previousEnv): + if node.idName == 'self': + return previousEnv['wrapperType'] + return self.programContext.searchValue(node, + (node.line, node.column), + previousEnv) + + def visit_NodeDynamicDispatch(self, + node: NodeDynamicDispatch, + previousEnv): + + typeExpr= self.visit(node.expr, + previousEnv= previousEnv) + if type (typeExpr) is error: + return typeExpr + + self.mapExprWithType[(node.line, node.column)]= typeExpr + methodInfo= self.programContext.checkMethodInType(idType= typeExpr, + idMethod = node.method, + row_and_col= (node.line, node.column + 1)) + if type(methodInfo) is error: + return methodInfo + + argTypes = [] + for arg in node.arguments: + currenttypeExpr= self.visit(arg, + previousEnv= previousEnv) + if type (currenttypeExpr) is error: + return currenttypeExpr + argTypes.append(currenttypeExpr) + + resultCheck= self.programContext.checkArgumentsInDispatch( + node, + methodInfo.argNames, + argTypes, + methodInfo.argTypes) + + if type(resultCheck) is error: + return resultCheck + + return methodInfo.returnType + + + def visit_NodeSelf(self, node: NodeSelf, previousEnv): + return previousEnv['wrapperType'] + + def visit_NodeIntegerComplement(self, node: NodeIntegerComplement, + previousEnv): + typeExpr = self.visit(node.integer_expr, previousEnv= previousEnv) + if type(typeExpr) is error: + return typeExpr + return self.programContext.checkReturnType(nodeType= "Int", returnType= typeExpr, + row_and_col= (node.line, node.column + 1), + errorOption= 'bad ~') + + def visit_NodeBlock(self, node: NodeBlock, previousEnv): + blockType = None + for expr in node.expr_list: + + blockType = self.visit(expr, previousEnv= previousEnv) + if type(blockType) is error: + return blockType + return blockType + + def visit_NodeIf(self, node: NodeIf, previousEnv): + predType = self.visit(node.predicate, previousEnv = previousEnv) + if type(predType) is error: + return predType + + resultCheck = self.programContext.checkReturnType(nodeType= 'Bool', returnType= predType, + row_and_col= (node.line, node.column), + errorOption= 'uncompatible types') + + if type(resultCheck) is error: + return resultCheck + + thenType = self.visit(node.then_body, previousEnv= previousEnv) + if type(thenType) is error: + return thenType + + elseType = self.visit(node.else_body, previousEnv= previousEnv) + if type(elseType) is error: + return elseType + + return self.programContext.LCA(idName1 = thenType, idName2= elseType) + + def visit_NodeCase(self, node: NodeCase, previousEnv): + resultTypeInit= self.visit(node.expr, previousEnv= previousEnv) + if type(resultTypeInit) is error: + return resultTypeInit + + return self.visit_NodeCaseActions(node.actions, + previousEnv, + resultTypeInit) + + def visit_NodeCaseActions(self, nodeActions, previousEnv, resultTypeInit): + + action, returnTypesExpressions= self.searchLessActionCaseAndReturnTypes(nodeActions, + previousEnv, + resultTypeInit) + if type(action) is error: + return action + + lca = returnTypesExpressions[0] + for typeExpr in returnTypesExpressions: + lca= self.programContext.LCA(idName1= lca, idName2= typeExpr) + + return lca + + def searchLessActionCaseAndReturnTypes(self, nodeActions, + previousEnv, resultTypeInit): + actionToReturn = None + currentTypeCase= 'Object' + returnTypesExpressions = [] + + resultCheckNonRepetition= self.programContext.checkNonRepetition(nodeActions) + if type(resultCheckNonRepetition) is error: + return resultCheckNonRepetition, None + + for action in nodeActions: + actionType= self.programContext.getType(idName= action.type, + row_and_col= (action.line, + action.column)) + if type(actionType) is error: + return actionType, None + + newEnv= previousEnv.copy() + newEnv.update({ + action.idName: action.type + }) + returnTypeAction= self.visit(action.expr, previousEnv= newEnv) + if type(returnTypeAction) is error: + return returnTypeAction, None + + returnTypesExpressions.append(returnTypeAction) + + if self.programContext.isSubtype(subType= resultTypeInit, + superType= action.type) and self.programContext.isSubtype( + subType= action.type, + superType= currentTypeCase): + actionToReturn= action + currentTypeCase= action.type + + return actionToReturn, returnTypesExpressions + + + def visit_NodeIsVoid(self, node: NodeIsVoid, previousEnv): + typeExpr= self.visit(node.expr, previousEnv = previousEnv) + if type(typeExpr) is error: + return typeExpr + return 'Bool' + + def visit_NodeStaticDispatch(self, node: NodeStaticDispatch, previousEnv): + typeLeftMost= self.visit(node.expr, previousEnv= previousEnv) + if type(typeLeftMost) is error: + return typeLeftMost + + dispatchType= self.programContext.getType(idName= node.dispatch_type, + row_and_col= (node.line, node.columnType)) + if type(dispatchType) is error: + return dispatchType + + methodInfo= self.programContext.checkMethodInType(idType= node.dispatch_type, + idMethod= node.method, + row_and_col= (node.line, node.columnIdMethod)) + if type(methodInfo) is error: + return methodInfo + + typeExprOfArgs = [] + for arg in node.arguments: + resultType= self.visit(node= arg, + previousEnv = previousEnv) + + if type(resultType) is error: + return resultType + + typeExprOfArgs.append(resultType) + + + checkingArgumentsResult= self.programContext.checkArgumentsInDispatch( + node, + methodInfo.argNames, + typeExprOfArgs, + methodInfo.argTypes,) + + if type(checkingArgumentsResult) is error: + return checkingArgumentsResult + + return self.programContext.checkDispatchTypes(typeLeftMost= typeLeftMost, + typeRight= dispatchType.idName, + returnType= methodInfo.returnType, + row_and_col= (node.expr.line, node.expr.column)) + + def visit_NodeWhileLoop(self, node: NodeWhileLoop, previousEnv): + resultExprPred = self.visit(node.predicate, previousEnv= previousEnv) + if type(resultExprPred) is error: + return resultExprPred + resultCheck = self.programContext.checkBoolInPredicate(node, resultExprPred) + if type(resultCheck) is error: + return resultCheck + + resultExpr = self.visit(node.body, previousEnv= previousEnv) + if type(resultExpr) is error: + return resultExpr + + return 'Object' + From 793518a9fb1226291ca125c17b7254950de7a7a6 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 18 Jan 2021 17:03:03 -0500 Subject: [PATCH 87/96] It remains only 3 test! --- .../components/generation/CIL_generator.py | 27 +++++++++++++------ .../components/generation/MIPS_generator.py | 10 ++----- src/main.py | 26 +++++++++++++++--- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py index 31a1b58d..1fc9528f 100644 --- a/src/compiler/components/generation/CIL_generator.py +++ b/src/compiler/components/generation/CIL_generator.py @@ -143,12 +143,12 @@ def visit_NodeClass(self, node: NodeClass, initializers): if node.idName != 'Object': parentName= 'Object' if not node.parent else node.parent inhAttributes = [cil.Attribute(f'{attrName}') for attrName in - self.programContext.types[node.idName].inheritsAttr] + self.programContext.types[node.idName].inheritsAttr] methods= [cil.Method(methodName, f'{self.programContext.types[parentName].inheritsMethods[methodName].wrapperType}_{methodName}') for methodName in - self.programContext.types[parentName].inheritsMethods.keys()] + self.programContext.types[parentName].inheritsMethods.keys()] methods += [cil.Method(methodName, f'{parentName}_{methodName}') for methodName in - self.programContext.types[parentName].methods.keys() if not methodName in methods] + self.programContext.types[parentName].methods.keys() if not methodName in methods] for i in range(len(inhAttributes)): self.attrIndexMap[f'{self.currentClassName}_{inhAttributes[i].name}']= i @@ -182,7 +182,7 @@ def visit_NodeClass(self, node: NodeClass, initializers): func = cil.Function(self.currentFunctionName, [cil.ArgDeclaration('__self')], self.localvars, self.instructions, - node.idName) + node.idName) self.registerFunction(func) @@ -192,10 +192,11 @@ def visit_NodeClass(self, node: NodeClass, initializers): for nodeClassMethod in node.methods: # Check if this method is being redefined - if nodeClassMethod.idName in methods: + index = next((i for i in range(len (methods)) + if methods[i].name == nodeClassMethod.idName), None ) + if index: # If it's being redefined, use the offset of the function already defined - index = methods.index(nodeClassMethod.idName) - del methods[i] + del methods[index] ind -= 1 else: @@ -248,6 +249,7 @@ def visit_NodeClassMethod(self, node: NodeClassMethod): for formal_param in node.formal_param_list: arguments.append(self.visit(formal_param)) + # If a function is built in, doesn't need CIL code. if not self.currentClassName in self.programContext.basics: returnVal = self.visit(node.body) self.registerInstruction(cil.Return, returnVal) @@ -499,11 +501,20 @@ def visit_NodeCase(self, node: NodeCase): return caseValue def visit_NodeCaseAction(self, node: NodeCaseAction): - return self.visit(node.expr) + return self.visit(node.expr) ################################# DISPATCHS ####################################### def visit_NodeDynamicDispatch(self, node: NodeDynamicDispatch): + if node.method == 'abort': + # This is near to trolling. I know, is pretty ugly, but it works. + self.mapExpr[node.line + 0.5, node.column + 0.5]= "IO" + self.visit_NodeDynamicDispatch( + NodeDynamicDispatch(line= node.line + 0.5, + column= node.column + 0.5, + method= 'out_string', + expr= NodeNewObject("IO", line= -1, column=-1), + arguments= [NodeString (content= f'Abort called from class {self.mapExpr[(node.line, node.column)]}\n', line = -1, column = -1)])) instanceVname = self.visit(node.expr) ttype = self.registerInternalLocal() result = self.registerInternalLocal() diff --git a/src/compiler/components/generation/MIPS_generator.py b/src/compiler/components/generation/MIPS_generator.py index 501bbffc..cf22f25a 100644 --- a/src/compiler/components/generation/MIPS_generator.py +++ b/src/compiler/components/generation/MIPS_generator.py @@ -114,7 +114,7 @@ def visit_Program(self, node: cil.Program): # Generate mips method that builds dispatch tables self.write_info('function_build_dispatch_tables:', tabbed=False) for ins in self.dispatchtable_code: - self.write_info(ins) + self.write_info(ins) self.write_info('jr $ra') self.write_info('') @@ -351,7 +351,7 @@ def static_datas(self): # Declare error mensages self.write_info('_index_negative_msg: .align 2 \n\t\t\t .asciiz \"Index to substr is negative\\n\"') self.write_info('_index_out_msg: .align 2 \n\t\t\t .asciiz \"Index out range exception\\n\"') - self.write_info('_abort_msg: .align 2 \n\t\t\t .asciiz \"Abort called from class\\n\"') + self.write_info('_abort_msg: .align 2 \n\t\t\t .asciiz \"Execution aborted\\n\"') self.write_info('_div_zero_msg: .align 2 \n\t\t\t .asciiz \"Division by zero exception\\n\"') self.write_info('') @@ -391,12 +391,6 @@ def object_abort(self): # Set up stack frame self.write_info('move $fp, $sp') - # Printing the message - self.write_info('la $a0 _abort_msg') - self.write_info('li $v0 4') - self.write_info('syscall') - self.write_info('') - # Aborting self.write_info('li $v0 10') self.write_info('syscall') diff --git a/src/main.py b/src/main.py index e24347f2..4fed5ea0 100644 --- a/src/main.py +++ b/src/main.py @@ -1,4 +1,4 @@ -import sys, fileinput +import sys, fileinput, os from argparse import ArgumentParser from compiler.components.lexer.lexer_analyzer import tokenizer, tokens from compiler.components.parser.syntax_analyzer import run_parser @@ -12,7 +12,7 @@ import subprocess as sp def build_basic_ast(): - fpath = "./cool-compiler-2020/src/compiler/utils/basics_classes.cl" + fpath = "./compiler/utils/basics_classes.cl" with open(fpath, encoding="utf-8") as file: code = file.read() _, _, real_col_basic= tokenizer(code) @@ -32,6 +32,7 @@ def build_basic_ast(): parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') parser_input.add_argument('files_for_compile', help = 'The file(s) to be compiled', nargs= '+') +parser_input.add_argument('--test', help = 'Indicates if the compiling is for test', action="store_true") """ parser_input.add_argument("--lexer", help = 'Select the lexer that you could use from avialable options', choices = component_injector['lexer_options'].keys(), default='cool') parser_input.add_argument("--parser", help = 'Select the lexer that you could use from avialable options', choices = component_injector['parser_options'].keys()) @@ -81,6 +82,9 @@ def build_basic_ast(): print(error) exit(1) + +# Running code generation + cilGen= CILVisitor(programContext, mapExpr= sa.mapExprWithResult) programResult= cilGen.visit(sa.ast) @@ -88,4 +92,20 @@ def build_basic_ast(): mipsCode= mipsGen.visit(programResult) -print(mipsCode) + +# Saving the compiling +filePath= args.files_for_compile[0] + +fileToWritePath= filePath[:filePath.rfind('.') + 1] + 'mips' + +with open(fileToWritePath, 'w', encoding="utf-8") as file: + stream = '#Compiled by DiazRock COOL compiler\n' + for line in mipsCode: + stream += line + + file.write(stream) + if args.test: + pathTest= filePath[ :filePath.rfind('.') ] + '_input.txt' + spim= 'spim -f ' + fileToWritePath + os.system('cat "{}"|{} '.format(pathTest, spim) ) + From 073ad93113f54dd139aa65bf4a0416114e8d8e42 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Tue, 19 Jan 2021 15:20:33 -0500 Subject: [PATCH 88/96] It remains only 1 test --- src/compiler/components/generation/MIPS_generator.py | 1 - src/main.py | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/compiler/components/generation/MIPS_generator.py b/src/compiler/components/generation/MIPS_generator.py index cf22f25a..771d2da7 100644 --- a/src/compiler/components/generation/MIPS_generator.py +++ b/src/compiler/components/generation/MIPS_generator.py @@ -364,7 +364,6 @@ def entrypoint(self): self.visit(cil.Call(dest = None, f = 'build_dispatch_tables')) self.visit(cil.Call(dest = None, f = 'build_class_parents_table')) self.visit(cil.Allocate(dest = None, ttype = 'Main')) - self.visit(cil.Allocate(dest = None, ttype = 'Main')) # Push main self self.write_info('sw $v0 0($sp)') diff --git a/src/main.py b/src/main.py index 4fed5ea0..41529cb0 100644 --- a/src/main.py +++ b/src/main.py @@ -20,14 +20,18 @@ def build_basic_ast(): source_program= code, real_col= real_col_basic) for _class in ast_basic.class_list: - if _class.idName == 'Int' or _class.idName == 'Bool' or _class.idName == 'String': + if _class.idName == 'Int' or _class.idName == 'Bool': _class.attributes.append(ast.NodeAttr(idName = '_val', _type= '__prim_zero_slot', line= 0, column= 0)) if _class.idName== 'String': + _class.attributes.append(ast.NodeAttr(idName = '_val', + _type= 'Int', + line= 0, column= 0)) _class.attributes.append(ast.NodeAttr(idName = '_str_field', _type= '__prim_empty_slot', line= 0, column= 0)) + return ast_basic parser_input = ArgumentParser(description= 'This is the Diaz-Horrach cool compiler, an school project.\nRead this help and see the ofitial repo') From 1a7c7a8cf3b04896134ece65ee769a064346ac4e Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 21 Jan 2021 16:41:23 -0500 Subject: [PATCH 89/96] In CIL_generator, the child class only use the parent initializer. --- src/compiler/components/generation/CIL_generator.py | 4 ++-- src/coolc.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py index 1fc9528f..e9748121 100644 --- a/src/compiler/components/generation/CIL_generator.py +++ b/src/compiler/components/generation/CIL_generator.py @@ -164,10 +164,10 @@ def visit_NodeClass(self, node: NodeClass, initializers): self.internalVarCount= 0 self.currentFunctionName= f'{self.currentClassName}_{"_init"}' + if initializers: # Build the initializer function and attributes list - for initializer in initializers: self.registerInstruction(cil.PushParam, "__self") - self.registerInstruction(cil.Call, None, initializer) # Call superclasses's initializers + self.registerInstruction(cil.Call, None, initializers[-1]) # Call superclasses's initializers self.registerInstruction(cil.PopParam, None) ind= len(inhAttributes) diff --git a/src/coolc.sh b/src/coolc.sh index 2c010d0e..73f7fd95 100755 --- a/src/coolc.sh +++ b/src/coolc.sh @@ -11,7 +11,7 @@ OUTPUT_FILE=${INPUT_FILE:0: -2}mips # Si su compilador no lo hace ya, aquí puede imprimir la información de contacto -echo "LINEA_CON_NOMBRE_Y_VERSION_DEL_COMPILADOR" # TODO: Recuerde cambiar estas +echo "DiazRock_CoolCompiler.V1.0" # TODO: Recuerde cambiar estas echo "CopyLeft (L) 2020: Alejandro Díaz Roque, Rafael Horrach" # Llamar al compilador From d7820bebaabfaa90123e8ec3230526a6a49a6674 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Thu, 21 Jan 2021 16:46:29 -0500 Subject: [PATCH 90/96] Deleted all the logic for the initializers. --- .../components/generation/CIL_generator.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/compiler/components/generation/CIL_generator.py b/src/compiler/components/generation/CIL_generator.py index e9748121..22209d38 100644 --- a/src/compiler/components/generation/CIL_generator.py +++ b/src/compiler/components/generation/CIL_generator.py @@ -98,14 +98,6 @@ def buildNewObject(self, dest, ttype): self.registerInstruction(cil.Call, dest, f'{ttype}_{"_init"}') self.registerInstruction(cil.PopParam, dest) - def inspectInitializers(self, typeName): - parentName = self.programContext.types[typeName].parent if typeName == "Object" or self.programContext.types[typeName].parent else 'Object' - initializers = [] - while parentName: - initializers.append(f'{parentName}_{"_init"}') - parentName= self.programContext.types[parentName].parent - initializers.reverse() - return initializers def buildClassDepth(self, node: NodeProgram): # Initialize class depth dictionary @@ -122,8 +114,7 @@ def buildClassDepth(self, node: NodeProgram): def visit_NodeProgram(self, node: NodeProgram): self.buildClassDepth(node) for _class in node.class_list: - newType= self.visit(_class, - initializers= self.inspectInitializers(_class.idName)) + newType= self.visit(_class) self.registerType(newType) for func in self.dotcode: @@ -136,7 +127,7 @@ def visit_NodeProgram(self, node: NodeProgram): return cil.Program(self.dottype, self.dotdata, self.dotcode) - def visit_NodeClass(self, node: NodeClass, initializers): + def visit_NodeClass(self, node: NodeClass): self.currentClassName = node.idName # Ovewritting attrs it's not allowed, so the first attrs of the class are the inhertited @@ -164,10 +155,10 @@ def visit_NodeClass(self, node: NodeClass, initializers): self.internalVarCount= 0 self.currentFunctionName= f'{self.currentClassName}_{"_init"}' - if initializers: + if self.currentClassName != 'Object': # Build the initializer function and attributes list self.registerInstruction(cil.PushParam, "__self") - self.registerInstruction(cil.Call, None, initializers[-1]) # Call superclasses's initializers + self.registerInstruction(cil.Call, None, node.parent + '__init') # Call superclasses's initializers self.registerInstruction(cil.PopParam, None) ind= len(inhAttributes) From 2193c7cadc429eba41bf077982a517b0827e3abb Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 24 Jan 2021 21:50:01 -0500 Subject: [PATCH 91/96] The semantic and codegen test --- tests/codegen/arith.mips | 18970 +++++++++++++++++++++++ tests/codegen/arith.s | 18736 ++++++++++++++++++++++ tests/codegen/arith_input.txt | 13 + tests/codegen/arith_output.txt | 158 + tests/codegen/atoi.mips | 7719 +++++++++ tests/codegen/atoi.s | 7469 +++++++++ tests/codegen/atoi2.cl | 92 - tests/codegen/atoi_input.txt | 0 tests/codegen/atoi_output.txt | 1 + tests/codegen/book_list.mips | 4157 +++++ tests/codegen/book_list.s | 3796 +++++ tests/codegen/book_list_input.txt | 0 tests/codegen/book_list_output.txt | 7 + tests/codegen/cells.mips | 3788 +++++ tests/codegen/cells.s | 3784 +++++ tests/codegen/cells_input.txt | 0 tests/codegen/cells_output.txt | 21 + tests/codegen/complex.mips | 2715 ++++ tests/codegen/complex.s | 2728 ++++ tests/codegen/complex_input.txt | 0 tests/codegen/complex_output.txt | 1 + tests/codegen/fib.mips | 1620 ++ tests/codegen/fib.s | 1616 ++ tests/codegen/fib_input.txt | 1 + tests/codegen/fib_output.txt | 2 + tests/codegen/graph.mips | 10190 ++++++++++++ tests/codegen/graph_input.txt | 5 + tests/codegen/graph_output.txt | 7 + tests/codegen/hairyscary.mips | 3003 ++++ tests/codegen/hairyscary_input.txt | 0 tests/codegen/hairyscary_output.txt | 1 + tests/codegen/hello_world.mips | 1087 ++ tests/codegen/hello_world.s | 1083 ++ tests/codegen/hello_world_input.txt | 0 tests/codegen/hello_world_output.txt | 1 + tests/codegen/helloworld.cl | 6 - tests/codegen/io.mips | 2045 +++ tests/codegen/io_input.txt | 0 tests/codegen/io_output.txt | 5 + tests/codegen/life.mips | 17702 +++++++++++++++++++++ tests/codegen/life_input.txt | 66 + tests/codegen/life_output.txt | 778 + tests/codegen/list.mips | 2616 ++++ tests/codegen/list.s | 2389 +++ tests/codegen/list_input.txt | 0 tests/codegen/list_output.txt | 5 + tests/codegen/new_complex.mips | 3371 ++++ tests/codegen/new_complex.s | 3384 ++++ tests/codegen/new_complex_input.txt | 0 tests/codegen/new_complex_output.txt | 2 + tests/codegen/palindrome.mips | 2358 +++ tests/codegen/palindrome.s | 2354 +++ tests/codegen/palindrome_input.txt | 1 + tests/codegen/palindrome_output.txt | 2 + tests/codegen/primes.mips | 2493 +++ tests/codegen/primes.s | 2365 +++ tests/codegen/primes_input.txt | 0 tests/codegen/primes_output.txt | 96 + tests/codegen/print-cool.mips | 1456 ++ tests/codegen/print-cool.s | 1452 ++ tests/codegen/print-cool_input.txt | 0 tests/codegen/print-cool_output.txt | 1 + tests/codegen/sort-list.mips | 3876 +++++ tests/codegen/sort-list.s | 3495 +++++ tests/codegen/sort-list_input.txt | 1 + tests/codegen/sort-list_output.txt | 10 + tests/codegen/test.cl | 19 - tests/semantic/arithmetic1.cl | 11 + tests/semantic/arithmetic10.cl | 15 + tests/semantic/arithmetic10_error.txt | 1 + tests/semantic/arithmetic11.cl | 14 + tests/semantic/arithmetic11_error.txt | 1 + tests/semantic/arithmetic12.cl | 14 + tests/semantic/arithmetic12_error.txt | 1 + tests/semantic/arithmetic1_error.txt | 1 + tests/semantic/arithmetic2.cl | 11 + tests/semantic/arithmetic2_error.txt | 1 + tests/semantic/arithmetic3.cl | 11 + tests/semantic/arithmetic3_error.txt | 1 + tests/semantic/arithmetic4.cl | 11 + tests/semantic/arithmetic4_error.txt | 1 + tests/semantic/arithmetic5.cl | 11 + tests/semantic/arithmetic5_error.txt | 1 + tests/semantic/arithmetic6.cl | 11 + tests/semantic/arithmetic6_error.txt | 1 + tests/semantic/arithmetic7.cl | 12 + tests/semantic/arithmetic7_error.txt | 1 + tests/semantic/arithmetic8.cl | 13 + tests/semantic/arithmetic8_error.txt | 1 + tests/semantic/arithmetic9.cl | 15 + tests/semantic/arithmetic9_error.txt | 1 + tests/semantic/assignment1.cl | 7 + tests/semantic/assignment1_error.txt | 1 + tests/semantic/assignment2.cl | 13 + tests/semantic/assignment2_error.txt | 1 + tests/semantic/assignment3.cl | 14 + tests/semantic/assignment3_error.txt | 1 + tests/semantic/attributes1.cl | 13 + tests/semantic/attributes1_error.txt | 1 + tests/semantic/attributes2.cl | 13 + tests/semantic/attributes2_error.txt | 1 + tests/semantic/attributes3.cl | 25 + tests/semantic/attributes3_error.txt | 1 + tests/semantic/attributes4.cl | 39 + tests/semantic/attributes4_error.txt | 1 + tests/semantic/basics1.cl | 10 + tests/semantic/basics1_error.txt | 1 + tests/semantic/basics2.cl | 9 + tests/semantic/basics2_error.txt | 1 + tests/semantic/basics3.cl | 9 + tests/semantic/basics3_error.txt | 1 + tests/semantic/basics4.cl | 9 + tests/semantic/basics4_error.txt | 1 + tests/semantic/basics5.cl | 9 + tests/semantic/basics5_error.txt | 1 + tests/semantic/basics6.cl | 9 + tests/semantic/basics6_error.txt | 1 + tests/semantic/basics7.cl | 9 + tests/semantic/basics7_error.txt | 1 + tests/semantic/basics8.cl | 9 + tests/semantic/basics8_error.txt | 1 + tests/semantic/blocks1.cl | 31 + tests/semantic/blocks1_error.txt | 1 + tests/semantic/case1.cl | 23 + tests/semantic/case1_error.txt | 1 + tests/semantic/case2.cl | 23 + tests/semantic/case2_error.txt | 1 + tests/semantic/case3.cl | 23 + tests/semantic/case3_error.txt | 1 + tests/semantic/class1.cl | 9 + tests/semantic/class1_error.txt | 2 + tests/semantic/conditionals1.cl | 14 + tests/semantic/conditionals1_error.txt | 1 + tests/semantic/conditionals2.cl | 24 + tests/semantic/conditionals2_error.txt | 2 + tests/semantic/dispatch1.cl | 33 + tests/semantic/dispatch1_error.txt | 1 + tests/semantic/dispatch2.cl | 34 + tests/semantic/dispatch2_error.txt | 1 + tests/semantic/dispatch3.cl | 36 + tests/semantic/dispatch3_error.txt | 1 + tests/semantic/dispatch4.cl | 36 + tests/semantic/dispatch4_error.txt | 1 + tests/semantic/dispatch5.cl | 31 + tests/semantic/dispatch5_error.txt | 1 + tests/semantic/dispatch6.cl | 32 + tests/semantic/dispatch6_error.txt | 1 + tests/semantic/eq1.cl | 17 + tests/semantic/eq1_error.txt | 1 + tests/semantic/eq2.cl | 17 + tests/semantic/eq2_error.txt | 1 + tests/semantic/eq3.cl | 17 + tests/semantic/eq3_error.txt | 1 + tests/semantic/eq4.cl | 17 + tests/semantic/eq4_error.txt | 1 + tests/semantic/features1.cl | 19 + tests/semantic/features1_error.txt | 1 + tests/semantic/features2.cl | 19 + tests/semantic/features2_error.txt | 1 + tests/semantic/features3.cl | 15 + tests/semantic/features3_error.txt | 1 + tests/semantic/hello_world.cl | 5 - tests/semantic/inheritance1.cl | 19 + tests/semantic/inheritance1_error.txt | 1 + tests/semantic/inheritance2.cl | 19 + tests/semantic/inheritance2.mips | 1323 ++ tests/semantic/inheritance2_error.txt | 1 + tests/semantic/inheritance3.cl | 13 + tests/semantic/inheritance3.mips | 1177 ++ tests/semantic/inheritance3_error.txt | 1 + tests/semantic/inheritance4.cl | 19 + tests/semantic/inheritance4.mips | 1177 ++ tests/semantic/inheritance4_error.txt | 1 + tests/semantic/inheritance5.cl | 21 + tests/semantic/inheritance5.mips | 1177 ++ tests/semantic/inheritance5_error.txt | 1 + tests/semantic/isvoid1.cl | 26 + tests/semantic/isvoid1_error.txt | 1 + tests/semantic/let1.cl | 15 + tests/semantic/let1_error.txt | 1 + tests/semantic/let2.cl | 15 + tests/semantic/let2_error.txt | 1 + tests/semantic/let3.cl | 15 + tests/semantic/let3_error.txt | 1 + tests/semantic/loops1.cl | 8 + tests/semantic/loops1_error.txt | 1 + tests/semantic/loops2.cl | 9 + tests/semantic/loops2_error.txt | 1 + tests/semantic/methods1.cl | 12 + tests/semantic/methods1_error.txt | 1 + tests/semantic/methods2.cl | 12 + tests/semantic/methods2_error.txt | 1 + tests/semantic/methods3.cl | 14 + tests/semantic/methods3_error.txt | 1 + tests/semantic/methods4.cl | 19 + tests/semantic/methods4_error.txt | 1 + tests/semantic/methods5.cl | 20 + tests/semantic/methods5_error.txt | 1 + tests/semantic/methods6.cl | 27 + tests/semantic/methods6_error.txt | 1 + tests/semantic/methods7.cl | 12 + tests/semantic/methods7_error.txt | 1 + tests/semantic/methods8.cl | 12 + tests/semantic/methods8_error.txt | 1 + tests/semantic/new1.cl | 31 + tests/semantic/new1_error.txt | 1 + tests/semantic/self1.cl | 11 + tests/semantic/self1_error.txt | 1 + tests/semantic/self2.cl | 10 + tests/semantic/self2_error.txt | 1 + tests/semantic/self3.cl | 10 + tests/semantic/self3_error.txt | 1 + tests/semantic/self4.cl | 10 + tests/semantic/self4_error.txt | 1 + 214 files changed, 151124 insertions(+), 122 deletions(-) create mode 100644 tests/codegen/arith.mips create mode 100644 tests/codegen/arith.s create mode 100644 tests/codegen/arith_input.txt create mode 100644 tests/codegen/arith_output.txt create mode 100644 tests/codegen/atoi.mips create mode 100644 tests/codegen/atoi.s delete mode 100644 tests/codegen/atoi2.cl create mode 100644 tests/codegen/atoi_input.txt create mode 100644 tests/codegen/atoi_output.txt create mode 100644 tests/codegen/book_list.mips create mode 100644 tests/codegen/book_list.s create mode 100644 tests/codegen/book_list_input.txt create mode 100644 tests/codegen/book_list_output.txt create mode 100644 tests/codegen/cells.mips create mode 100644 tests/codegen/cells.s create mode 100644 tests/codegen/cells_input.txt create mode 100644 tests/codegen/cells_output.txt create mode 100644 tests/codegen/complex.mips create mode 100644 tests/codegen/complex.s create mode 100644 tests/codegen/complex_input.txt create mode 100644 tests/codegen/complex_output.txt create mode 100644 tests/codegen/fib.mips create mode 100644 tests/codegen/fib.s create mode 100644 tests/codegen/fib_input.txt create mode 100644 tests/codegen/fib_output.txt create mode 100644 tests/codegen/graph.mips create mode 100644 tests/codegen/graph_input.txt create mode 100644 tests/codegen/graph_output.txt create mode 100644 tests/codegen/hairyscary.mips create mode 100644 tests/codegen/hairyscary_input.txt create mode 100644 tests/codegen/hairyscary_output.txt create mode 100644 tests/codegen/hello_world.mips create mode 100644 tests/codegen/hello_world.s create mode 100644 tests/codegen/hello_world_input.txt create mode 100644 tests/codegen/hello_world_output.txt delete mode 100644 tests/codegen/helloworld.cl create mode 100644 tests/codegen/io.mips create mode 100644 tests/codegen/io_input.txt create mode 100644 tests/codegen/io_output.txt create mode 100644 tests/codegen/life.mips create mode 100644 tests/codegen/life_input.txt create mode 100644 tests/codegen/life_output.txt create mode 100644 tests/codegen/list.mips create mode 100644 tests/codegen/list.s create mode 100644 tests/codegen/list_input.txt create mode 100644 tests/codegen/list_output.txt create mode 100644 tests/codegen/new_complex.mips create mode 100644 tests/codegen/new_complex.s create mode 100644 tests/codegen/new_complex_input.txt create mode 100644 tests/codegen/new_complex_output.txt create mode 100644 tests/codegen/palindrome.mips create mode 100644 tests/codegen/palindrome.s create mode 100644 tests/codegen/palindrome_input.txt create mode 100644 tests/codegen/palindrome_output.txt create mode 100644 tests/codegen/primes.mips create mode 100644 tests/codegen/primes.s create mode 100644 tests/codegen/primes_input.txt create mode 100644 tests/codegen/primes_output.txt create mode 100644 tests/codegen/print-cool.mips create mode 100644 tests/codegen/print-cool.s create mode 100644 tests/codegen/print-cool_input.txt create mode 100644 tests/codegen/print-cool_output.txt create mode 100644 tests/codegen/sort-list.mips create mode 100644 tests/codegen/sort-list.s create mode 100644 tests/codegen/sort-list_input.txt create mode 100644 tests/codegen/sort-list_output.txt delete mode 100755 tests/codegen/test.cl create mode 100644 tests/semantic/arithmetic1.cl create mode 100644 tests/semantic/arithmetic10.cl create mode 100644 tests/semantic/arithmetic10_error.txt create mode 100644 tests/semantic/arithmetic11.cl create mode 100644 tests/semantic/arithmetic11_error.txt create mode 100644 tests/semantic/arithmetic12.cl create mode 100644 tests/semantic/arithmetic12_error.txt create mode 100644 tests/semantic/arithmetic1_error.txt create mode 100644 tests/semantic/arithmetic2.cl create mode 100644 tests/semantic/arithmetic2_error.txt create mode 100644 tests/semantic/arithmetic3.cl create mode 100644 tests/semantic/arithmetic3_error.txt create mode 100644 tests/semantic/arithmetic4.cl create mode 100644 tests/semantic/arithmetic4_error.txt create mode 100644 tests/semantic/arithmetic5.cl create mode 100644 tests/semantic/arithmetic5_error.txt create mode 100644 tests/semantic/arithmetic6.cl create mode 100644 tests/semantic/arithmetic6_error.txt create mode 100644 tests/semantic/arithmetic7.cl create mode 100644 tests/semantic/arithmetic7_error.txt create mode 100644 tests/semantic/arithmetic8.cl create mode 100644 tests/semantic/arithmetic8_error.txt create mode 100644 tests/semantic/arithmetic9.cl create mode 100644 tests/semantic/arithmetic9_error.txt create mode 100644 tests/semantic/assignment1.cl create mode 100644 tests/semantic/assignment1_error.txt create mode 100644 tests/semantic/assignment2.cl create mode 100644 tests/semantic/assignment2_error.txt create mode 100644 tests/semantic/assignment3.cl create mode 100644 tests/semantic/assignment3_error.txt create mode 100644 tests/semantic/attributes1.cl create mode 100644 tests/semantic/attributes1_error.txt create mode 100644 tests/semantic/attributes2.cl create mode 100644 tests/semantic/attributes2_error.txt create mode 100644 tests/semantic/attributes3.cl create mode 100644 tests/semantic/attributes3_error.txt create mode 100644 tests/semantic/attributes4.cl create mode 100644 tests/semantic/attributes4_error.txt create mode 100644 tests/semantic/basics1.cl create mode 100644 tests/semantic/basics1_error.txt create mode 100644 tests/semantic/basics2.cl create mode 100644 tests/semantic/basics2_error.txt create mode 100644 tests/semantic/basics3.cl create mode 100644 tests/semantic/basics3_error.txt create mode 100644 tests/semantic/basics4.cl create mode 100644 tests/semantic/basics4_error.txt create mode 100644 tests/semantic/basics5.cl create mode 100644 tests/semantic/basics5_error.txt create mode 100644 tests/semantic/basics6.cl create mode 100644 tests/semantic/basics6_error.txt create mode 100644 tests/semantic/basics7.cl create mode 100644 tests/semantic/basics7_error.txt create mode 100644 tests/semantic/basics8.cl create mode 100644 tests/semantic/basics8_error.txt create mode 100644 tests/semantic/blocks1.cl create mode 100644 tests/semantic/blocks1_error.txt create mode 100644 tests/semantic/case1.cl create mode 100644 tests/semantic/case1_error.txt create mode 100644 tests/semantic/case2.cl create mode 100644 tests/semantic/case2_error.txt create mode 100644 tests/semantic/case3.cl create mode 100644 tests/semantic/case3_error.txt create mode 100644 tests/semantic/class1.cl create mode 100644 tests/semantic/class1_error.txt create mode 100644 tests/semantic/conditionals1.cl create mode 100644 tests/semantic/conditionals1_error.txt create mode 100644 tests/semantic/conditionals2.cl create mode 100644 tests/semantic/conditionals2_error.txt create mode 100644 tests/semantic/dispatch1.cl create mode 100644 tests/semantic/dispatch1_error.txt create mode 100644 tests/semantic/dispatch2.cl create mode 100644 tests/semantic/dispatch2_error.txt create mode 100644 tests/semantic/dispatch3.cl create mode 100644 tests/semantic/dispatch3_error.txt create mode 100644 tests/semantic/dispatch4.cl create mode 100644 tests/semantic/dispatch4_error.txt create mode 100644 tests/semantic/dispatch5.cl create mode 100644 tests/semantic/dispatch5_error.txt create mode 100644 tests/semantic/dispatch6.cl create mode 100644 tests/semantic/dispatch6_error.txt create mode 100644 tests/semantic/eq1.cl create mode 100644 tests/semantic/eq1_error.txt create mode 100644 tests/semantic/eq2.cl create mode 100644 tests/semantic/eq2_error.txt create mode 100644 tests/semantic/eq3.cl create mode 100644 tests/semantic/eq3_error.txt create mode 100644 tests/semantic/eq4.cl create mode 100644 tests/semantic/eq4_error.txt create mode 100644 tests/semantic/features1.cl create mode 100644 tests/semantic/features1_error.txt create mode 100644 tests/semantic/features2.cl create mode 100644 tests/semantic/features2_error.txt create mode 100644 tests/semantic/features3.cl create mode 100644 tests/semantic/features3_error.txt delete mode 100755 tests/semantic/hello_world.cl create mode 100644 tests/semantic/inheritance1.cl create mode 100644 tests/semantic/inheritance1_error.txt create mode 100644 tests/semantic/inheritance2.cl create mode 100644 tests/semantic/inheritance2.mips create mode 100644 tests/semantic/inheritance2_error.txt create mode 100644 tests/semantic/inheritance3.cl create mode 100644 tests/semantic/inheritance3.mips create mode 100644 tests/semantic/inheritance3_error.txt create mode 100644 tests/semantic/inheritance4.cl create mode 100644 tests/semantic/inheritance4.mips create mode 100644 tests/semantic/inheritance4_error.txt create mode 100644 tests/semantic/inheritance5.cl create mode 100644 tests/semantic/inheritance5.mips create mode 100644 tests/semantic/inheritance5_error.txt create mode 100644 tests/semantic/isvoid1.cl create mode 100644 tests/semantic/isvoid1_error.txt create mode 100644 tests/semantic/let1.cl create mode 100644 tests/semantic/let1_error.txt create mode 100644 tests/semantic/let2.cl create mode 100644 tests/semantic/let2_error.txt create mode 100644 tests/semantic/let3.cl create mode 100644 tests/semantic/let3_error.txt create mode 100644 tests/semantic/loops1.cl create mode 100644 tests/semantic/loops1_error.txt create mode 100644 tests/semantic/loops2.cl create mode 100644 tests/semantic/loops2_error.txt create mode 100644 tests/semantic/methods1.cl create mode 100644 tests/semantic/methods1_error.txt create mode 100644 tests/semantic/methods2.cl create mode 100644 tests/semantic/methods2_error.txt create mode 100644 tests/semantic/methods3.cl create mode 100644 tests/semantic/methods3_error.txt create mode 100644 tests/semantic/methods4.cl create mode 100644 tests/semantic/methods4_error.txt create mode 100644 tests/semantic/methods5.cl create mode 100644 tests/semantic/methods5_error.txt create mode 100644 tests/semantic/methods6.cl create mode 100644 tests/semantic/methods6_error.txt create mode 100644 tests/semantic/methods7.cl create mode 100644 tests/semantic/methods7_error.txt create mode 100644 tests/semantic/methods8.cl create mode 100644 tests/semantic/methods8_error.txt create mode 100644 tests/semantic/new1.cl create mode 100644 tests/semantic/new1_error.txt create mode 100644 tests/semantic/self1.cl create mode 100644 tests/semantic/self1_error.txt create mode 100644 tests/semantic/self2.cl create mode 100644 tests/semantic/self2_error.txt create mode 100644 tests/semantic/self3.cl create mode 100644 tests/semantic/self3_error.txt create mode 100644 tests/semantic/self4.cl create mode 100644 tests/semantic/self4_error.txt diff --git a/tests/codegen/arith.mips b/tests/codegen/arith.mips new file mode 100644 index 00000000..840221a2 --- /dev/null +++ b/tests/codegen/arith.mips @@ -0,0 +1,18970 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n\tTo add a number to " + data_2: .align 2 + .asciiz "...enter a:\n" + data_3: .align 2 + .asciiz "\tTo negate " + data_4: .align 2 + .asciiz "...enter b:\n" + data_5: .align 2 + .asciiz "\tTo find the difference between " + data_6: .align 2 + .asciiz "and another number...enter c:\n" + data_7: .align 2 + .asciiz "\tTo find the factorial of " + data_8: .align 2 + .asciiz "...enter d:\n" + data_9: .align 2 + .asciiz "\tTo square " + data_10: .align 2 + .asciiz "...enter e:\n" + data_11: .align 2 + .asciiz "\tTo cube " + data_12: .align 2 + .asciiz "...enter f:\n" + data_13: .align 2 + .asciiz "\tTo find out if " + data_14: .align 2 + .asciiz "is a multiple of 3...enter g:\n" + data_15: .align 2 + .asciiz "\tTo divide " + data_16: .align 2 + .asciiz "by 8...enter h:\n" + data_17: .align 2 + .asciiz "\tTo get a new number...enter j:\n" + data_18: .align 2 + .asciiz "\tTo quit...enter q:\n\n" + data_19: .align 2 + .asciiz "\n" + data_20: .align 2 + .asciiz "Please enter a number... " + data_21: .align 2 + .asciiz "Class type is now E\n" + data_22: .align 2 + .asciiz "Class type is now C\n" + data_23: .align 2 + .asciiz "Class type is now D\n" + data_24: .align 2 + .asciiz "Class type is now B\n" + data_25: .align 2 + .asciiz "Class type is now A\n" + data_26: .align 2 + .asciiz "Oooops\n" + data_27: .align 2 + .asciiz " " + data_28: .align 2 + .asciiz "number " + data_29: .align 2 + .asciiz "is odd!\n" + data_30: .align 2 + .asciiz "is even!\n" + data_31: .align 2 + .asciiz "a" + data_32: .align 2 + .asciiz "b" + data_33: .align 2 + .asciiz "c" + data_34: .align 2 + .asciiz "d" + data_35: .align 2 + .asciiz "e" + data_36: .align 2 + .asciiz "f" + data_37: .align 2 + .asciiz "g" + data_38: .align 2 + .asciiz "h" + data_39: .align 2 + .asciiz "j" + data_40: .align 2 + .asciiz "q" + data_41: .align 2 + .asciiz "is equal to " + data_42: .align 2 + .asciiz "times 8 with a remainder of " + data_43: .align 2 + .asciiz "is not divisible by 3.\n" + data_44: .align 2 + .asciiz "is divisible by 3.\n" + data_45: .align 2 + .asciiz "Abort called from class Main\n" + data_46: .align 2 + .asciiz "0" + data_47: .align 2 + .asciiz "1" + data_48: .align 2 + .asciiz "2" + data_49: .align 2 + .asciiz "3" + data_50: .align 2 + .asciiz "4" + data_51: .align 2 + .asciiz "5" + data_52: .align 2 + .asciiz "6" + data_53: .align 2 + .asciiz "7" + data_54: .align 2 + .asciiz "8" + data_55: .align 2 + .asciiz "9" + data_56: .align 2 + .asciiz "Abort called from class A2I\n" + data_57: .align 2 + .asciiz "-" + data_58: .align 2 + .asciiz "+" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_A: .align 2 + .asciiz "A" + classname_B: .align 2 + .asciiz "B" + classname_C: .align 2 + .asciiz "C" + classname_D: .align 2 + .asciiz "D" + classname_E: .align 2 + .asciiz "E" + classname_A2I: .align 2 + .asciiz "A2I" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 52 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_A + sw $t1 28($s1) + la $t1 classname_B + sw $t1 32($s1) + la $t1 classname_C + sw $t1 36($s1) + la $t1 classname_D + sw $t1 40($s1) + la $t1 classname_E + sw $t1 44($s1) + la $t1 classname_A2I + sw $t1 48($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 104 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 28 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 28 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type A + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type B + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type C + li $a0 16 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type D + li $a0 16 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 80($s0) + + # Type E + li $a0 16 + li $v0 9 + syscall + li $a0 11 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 88($s0) + + # Type A2I + li $a0 12 + li $v0 9 + syscall + li $a0 12 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 96($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 56 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_menu + sw $t1 28($v0) + la $t1 function_Main_prompt + sw $t1 32($v0) + la $t1 function_Main_get_int + sw $t1 36($v0) + la $t1 function_Main_is_even + sw $t1 40($v0) + la $t1 function_Main_class_type + sw $t1 44($v0) + la $t1 function_Main_print + sw $t1 48($v0) + la $t1 function_Main_main + sw $t1 52($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type A + li $a0 40 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_A_method5 + sw $t1 36($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type B + li $a0 40 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_B_method5 + sw $t1 36($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type C + li $a0 44 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_C_method5 + sw $t1 36($v0) + la $t1 function_C_method6 + sw $t1 40($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type D + li $a0 44 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_B_method5 + sw $t1 36($v0) + la $t1 function_D_method7 + sw $t1 40($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + # Type E + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_B_method5 + sw $t1 36($v0) + la $t1 function_D_method7 + sw $t1 40($v0) + la $t1 function_E_method6 + sw $t1 44($v0) + lw $t0 88($s0) + sw $v0 8($t0) + + # Type A2I + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A2I_c2i + sw $t1 12($v0) + la $t1 function_A2I_i2c + sw $t1 16($v0) + la $t1 function_A2I_a2i + sw $t1 20($v0) + la $t1 function_A2I_a2i_aux + sw $t1 24($v0) + la $t1 function_A2I_i2a + sw $t1 28($v0) + la $t1 function_A2I_i2a_aux + sw $t1 32($v0) + lw $t0 96($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 52 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 12 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 7 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 8 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 8 + sw $t1 0($t0) + + li $t0 11 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 10 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -8($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 24($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main_menu: + move $fp, $sp + subu $sp, $sp, 392 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 32 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -100($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -96($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -112($fp) + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -124($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -144($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -140($fp) + la $a0, data_7 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -140($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -132($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -132($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + lw $a2, -132($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -156($fp) + + # PUSHPARAM + lw $a0, -156($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + lw $a0 -172($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -168($fp) + la $a0, data_8 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -168($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -160($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -160($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + lw $a2, -160($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_9 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -184($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -200($fp) + + # PUSHPARAM + lw $a0, -200($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -192($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -192($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + lw $a2, -192($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + lw $a0 -216($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -212($fp) + la $a0, data_10 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -212($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -204($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -204($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + lw $a2, -204($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + li $a0, 9 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -232($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -228($fp) + la $a0, data_11 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -228($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -220($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -220($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + lw $a2, -220($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -244($fp) + + # PUSHPARAM + lw $a0, -244($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -236($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -236($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + lw $a2, -236($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_12 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -256($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 16 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -272($fp) + la $a0, data_13 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -272($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -264($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -264($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + lw $a2, -264($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -288($fp) + + # PUSHPARAM + lw $a0, -288($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -280($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -280($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + lw $a2, -280($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + lw $a0 -304($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -300($fp) + la $a0, data_14 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -300($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -292($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -292($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + lw $a2, -292($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -320($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -320($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + lw $a0 -320($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -316($fp) + la $a0, data_15 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -316($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -308($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -308($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + lw $a2, -308($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -332($fp) + + # PUSHPARAM + lw $a0, -332($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -324($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -324($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -328($fp) + lw $a2, -324($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + li $a0, 16 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -344($fp) + lw $a0 -348($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -344($fp) + la $a0, data_16 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -344($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -336($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -336($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -340($fp) + lw $a2, -336($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -364($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -364($fp) + li $a0, 32 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -360($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -360($fp) + lw $a0 -364($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -360($fp) + la $a0, data_17 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -360($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -352($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -352($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -356($fp) + lw $a2, -352($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -380($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -380($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + lw $a0 -380($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -376($fp) + la $a0, data_18 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -376($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -368($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -368($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + lw $a2, -368($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -384($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -384($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -388($fp) + lw $a2, -384($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -388($fp) + addiu $sp, $sp, 392 + jr $ra + +function_Main_prompt: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_19 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -24($fp) + la $a0, data_20 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 40 + jr $ra + +function_Main_get_int: + move $fp, $sp + subu $sp, $sp, 24 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -20($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Main_is_even: + move $fp, $sp + subu $sp, $sp, 124 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -44($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -36($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -64($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -56($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 2 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # - + lw $a0, -80($fp) + lw $a1, -84($fp) + sub $a0, $a0, $a1 + sw $a0, -76($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # - + li $a0 0 + lw $a1, -112($fp) + sub $a0, $a0, $a1 + sw $a0, -116($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -120($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 124 + jr $ra + +function_Main_class_type: + move $fp, $sp + subu $sp, $sp, 108 + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # PUSHPARAM + li $a0, 11 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_6 + + # PUSHPARAM + li $a0, 9 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_7 + + # PUSHPARAM + li $a0, 10 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_8 + + # PUSHPARAM + li $a0, 8 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_9 + + # PUSHPARAM + li $a0, 7 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_10 + + # PUSHPARAM + li $a0, 1 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_11 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -20($fp) + la $a0, data_21 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -16($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_7: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_22 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -32($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_23 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -48($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_9: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -68($fp) + la $a0, data_24 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -64($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_25 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_11: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_26 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_12: + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 108 + jr $ra + +function_Main_print: + move $fp, $sp + subu $sp, $sp, 48 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_27 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 48 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 1068 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 16($a1) + +_cil_label_LABEL_13: + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -16($fp) + + # GETATTR + lw $a1 -16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # IF GOTO + lw $a0, -12($fp) + bnez $a0, _cil_label_LABEL_14 + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_14: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -28($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -64($fp) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -64($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_16 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 8 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_29 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 9 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_30 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_17: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -116($fp) + + # PUSHPARAM + lw $a0, -116($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -120($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -120($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + lw $a2, -120($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -124($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -144($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -148($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -148($fp) + la $a0, data_31 + sw $a0 16($a1) + + lw $t0 -144($fp) + lw $t1 -148($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -136($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -136($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -132($fp) + + # IF GOTO + lw $a0, -132($fp) + bnez $a0, _cil_label_LABEL_18 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + lw $a0 -180($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -176($fp) + la $a0, data_32 + sw $a0 16($a1) + + lw $t0 -172($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_4 + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -164($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -164($fp) +end_equal_4_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -168($fp) + lw $a0 12($a1) + sw $a0 -160($fp) + + # IF GOTO + lw $a0, -160($fp) + bnez $a0, _cil_label_LABEL_20 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -208($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -204($fp) + la $a0, data_33 + sw $a0 16($a1) + + lw $t0 -200($fp) + lw $t1 -204($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_5 + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -192($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -192($fp) +end_equal_5_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -196($fp) + lw $a0 12($a1) + sw $a0 -188($fp) + + # IF GOTO + lw $a0, -188($fp) + bnez $a0, _cil_label_LABEL_22 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -228($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_34 + sw $a0 16($a1) + + lw $t0 -228($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_6 + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -220($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -220($fp) +end_equal_6_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -224($fp) + lw $a0 12($a1) + sw $a0 -216($fp) + + # IF GOTO + lw $a0, -216($fp) + bnez $a0, _cil_label_LABEL_24 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -256($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + lw $a0 -264($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -260($fp) + la $a0, data_35 + sw $a0 16($a1) + + lw $t0 -256($fp) + lw $t1 -260($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_7 + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 -248($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 -248($fp) +end_equal_7_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + lw $a0 -248($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -252($fp) + lw $a0 12($a1) + sw $a0 -244($fp) + + # IF GOTO + lw $a0, -244($fp) + bnez $a0, _cil_label_LABEL_26 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -284($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + lw $a0 -292($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -288($fp) + la $a0, data_36 + sw $a0 16($a1) + + lw $t0 -284($fp) + lw $t1 -288($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_8 + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 -276($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 -276($fp) +end_equal_8_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -280($fp) + lw $a0 12($a1) + sw $a0 -272($fp) + + # IF GOTO + lw $a0, -272($fp) + bnez $a0, _cil_label_LABEL_28 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -312($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -320($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -320($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + lw $a0 -320($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -316($fp) + la $a0, data_37 + sw $a0 16($a1) + + lw $t0 -312($fp) + lw $t1 -316($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_9 + li $a2 5 + beq $a0 $a2 _eq_int_bool_9 + li $a2 6 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -304($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -304($fp) +end_equal_9_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + lw $a0 -304($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -308($fp) + lw $a0 12($a1) + sw $a0 -300($fp) + + # IF GOTO + lw $a0, -300($fp) + bnez $a0, _cil_label_LABEL_30 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -340($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -344($fp) + lw $a0 -348($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -344($fp) + la $a0, data_38 + sw $a0 16($a1) + + lw $t0 -340($fp) + lw $t1 -344($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_10 + li $a2 5 + beq $a0 $a2 _eq_int_bool_10 + li $a2 6 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -332($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -332($fp) +end_equal_10_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -336($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -336($fp) + lw $a0 -332($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -336($fp) + lw $a0 12($a1) + sw $a0 -328($fp) + + # IF GOTO + lw $a0, -328($fp) + bnez $a0, _cil_label_LABEL_32 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -368($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -372($fp) + lw $a0 -376($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -372($fp) + la $a0, data_39 + sw $a0 16($a1) + + lw $t0 -368($fp) + lw $t1 -372($fp) + beq $t0 $zero _eq_false_11_ + beq $t1 $zero _eq_false_11_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_11 + li $a2 5 + beq $a0 $a2 _eq_int_bool_11 + li $a2 6 + bne $a0 $a2 _not_basic_type_11_ +_eq_str_11_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_11_ + beq $t3 $0 _eq_true_11_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_11_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_11_ + b _eq_true_11_ +_not_basic_type_11_: + bne $t0 $t1 _eq_false_11_ + b _eq_true_11_ +_eq_int_bool_11: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_11_ +_eq_true_11_: + li $a0 1 + sw $a0 -360($fp) + b end_equal_11_ +_eq_false_11_: + li $a0 0 + sw $a0 -360($fp) +end_equal_11_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -364($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -364($fp) + lw $a0 -360($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -364($fp) + lw $a0 12($a1) + sw $a0 -356($fp) + + # IF GOTO + lw $a0, -356($fp) + bnez $a0, _cil_label_LABEL_34 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -396($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -404($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -404($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -400($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -400($fp) + lw $a0 -404($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -400($fp) + la $a0, data_40 + sw $a0 16($a1) + + lw $t0 -396($fp) + lw $t1 -400($fp) + beq $t0 $zero _eq_false_12_ + beq $t1 $zero _eq_false_12_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_12 + li $a2 5 + beq $a0 $a2 _eq_int_bool_12 + li $a2 6 + bne $a0 $a2 _not_basic_type_12_ +_eq_str_12_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_12_ + beq $t3 $0 _eq_true_12_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_12_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_12_ + b _eq_true_12_ +_not_basic_type_12_: + bne $t0 $t1 _eq_false_12_ + b _eq_true_12_ +_eq_int_bool_12: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_12_ +_eq_true_12_: + li $a0 1 + sw $a0 -388($fp) + b end_equal_12_ +_eq_false_12_: + li $a0 0 + sw $a0 -388($fp) +end_equal_12_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -392($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -392($fp) + lw $a0 -388($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -392($fp) + lw $a0 12($a1) + sw $a0 -384($fp) + + # IF GOTO + lw $a0, -384($fp) + bnez $a0, _cil_label_LABEL_36 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -408($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -408($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -412($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -424($fp) + + # PUSHPARAM + lw $a0, -424($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -424($fp) + lw $a0 0($a1) + sw $a0 -428($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -428($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -432($fp) + lw $a2, -428($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -432($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -408($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -408($fp) + lw $a0 0($a1) + sw $a0 -416($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -416($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -420($fp) + lw $a2, -416($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -420($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -420($fp) + sw $a0, -380($fp) + + # GOTO + j _cil_label_LABEL_37 + +_cil_label_LABEL_36: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -436($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -436($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -436($fp) + sw $a0 24($a1) + + # ASSIGN + lw $a0, -436($fp) + sw $a0, -380($fp) + +_cil_label_LABEL_37: + # ASSIGN + lw $a0, -380($fp) + sw $a0, -352($fp) + + # GOTO + j _cil_label_LABEL_35 + +_cil_label_LABEL_34: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -440($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -440($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -444($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -440($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -440($fp) + sw $a0, -352($fp) + +_cil_label_LABEL_35: + # ASSIGN + lw $a0, -352($fp) + sw $a0, -324($fp) + + # GOTO + j _cil_label_LABEL_33 + +_cil_label_LABEL_32: + # ALLOCATE + la $v0 type_void + sw $v0 -448($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -452($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -452($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -456($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -468($fp) + + # PUSHPARAM + lw $a0, -468($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -468($fp) + lw $a0 0($a1) + sw $a0 -472($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -472($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -476($fp) + lw $a2, -472($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -476($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -452($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -452($fp) + lw $a0 0($a1) + sw $a0 -460($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -460($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -464($fp) + lw $a2, -460($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -464($fp) + sw $a0, -448($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -496($fp) + + # PUSHPARAM + lw $a0, -496($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -496($fp) + lw $a0 0($a1) + sw $a0 -500($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -500($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -504($fp) + lw $a2, -500($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -448($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -448($fp) + lw $a0 0($a1) + sw $a0 -524($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -524($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -528($fp) + lw $a2, -524($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -532($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -532($fp) + li $a0, 8 + sw $a0 12($a1) + + # GETATTR + lw $a1 -528($fp) + lw $a0 12($a1) + sw $a0 -512($fp) + + # GETATTR + lw $a1 -532($fp) + lw $a0 12($a1) + sw $a0 -516($fp) + + # * + lw $a0, -512($fp) + lw $a1, -516($fp) + mul $a0, $a0, $a1 + sw $a0, -508($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -520($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -520($fp) + lw $a0 -508($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -504($fp) + lw $a0 12($a1) + sw $a0 -484($fp) + + # GETATTR + lw $a1 -520($fp) + lw $a0 12($a1) + sw $a0 -488($fp) + + # - + lw $a0, -484($fp) + lw $a1, -488($fp) + sub $a0, $a0, $a1 + sw $a0, -480($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -492($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -492($fp) + lw $a0 -480($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -548($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -548($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -544($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -544($fp) + lw $a0 -548($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -544($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -544($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -536($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -536($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -540($fp) + lw $a2, -536($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -560($fp) + + # PUSHPARAM + lw $a0, -560($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -552($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -552($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -556($fp) + lw $a2, -552($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -576($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -576($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -572($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -572($fp) + lw $a0 -576($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -572($fp) + la $a0, data_41 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -572($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -564($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -564($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -568($fp) + lw $a2, -564($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -448($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -580($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -580($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -584($fp) + lw $a2, -580($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -600($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -600($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -596($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -596($fp) + lw $a0 -600($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -596($fp) + la $a0, data_42 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -596($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -588($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -588($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -592($fp) + lw $a2, -588($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -604($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -604($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -608($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -492($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -604($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -604($fp) + lw $a0 0($a1) + sw $a0 -620($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -620($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -624($fp) + lw $a2, -620($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -624($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -612($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -612($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -616($fp) + lw $a2, -612($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -640($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -640($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -636($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -636($fp) + lw $a0 -640($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -636($fp) + la $a0, data_19 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -636($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -628($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -628($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -632($fp) + lw $a2, -628($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -448($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -448($fp) + sw $a0, -324($fp) + +_cil_label_LABEL_33: + # ASSIGN + lw $a0, -324($fp) + sw $a0, -296($fp) + + # GOTO + j _cil_label_LABEL_31 + +_cil_label_LABEL_30: + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -652($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -652($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -656($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -668($fp) + + # PUSHPARAM + lw $a0, -668($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -668($fp) + lw $a0 0($a1) + sw $a0 -672($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -672($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -676($fp) + lw $a2, -672($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -676($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -652($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -652($fp) + lw $a0 0($a1) + sw $a0 -660($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -660($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -664($fp) + lw $a2, -660($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -664($fp) + lw $a0 12($a1) + sw $a0 -648($fp) + + # IF GOTO + lw $a0, -648($fp) + bnez $a0, _cil_label_LABEL_38 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -692($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -692($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -688($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -688($fp) + lw $a0 -692($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -688($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -688($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -680($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -680($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -684($fp) + lw $a2, -680($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -704($fp) + + # PUSHPARAM + lw $a0, -704($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -696($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -696($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -700($fp) + lw $a2, -696($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -720($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -720($fp) + li $a0, 23 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -716($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -716($fp) + lw $a0 -720($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -716($fp) + la $a0, data_43 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -716($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -708($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -708($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -712($fp) + lw $a2, -708($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -712($fp) + sw $a0, -644($fp) + + # GOTO + j _cil_label_LABEL_39 + +_cil_label_LABEL_38: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -736($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -736($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -732($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -732($fp) + lw $a0 -736($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -732($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -732($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -724($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -724($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -728($fp) + lw $a2, -724($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -748($fp) + + # PUSHPARAM + lw $a0, -748($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -740($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -740($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -744($fp) + lw $a2, -740($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -764($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -764($fp) + li $a0, 19 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -760($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -760($fp) + lw $a0 -764($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -760($fp) + la $a0, data_44 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -760($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -752($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -752($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -756($fp) + lw $a2, -752($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -756($fp) + sw $a0, -644($fp) + +_cil_label_LABEL_39: + # ASSIGN + lw $a0, -644($fp) + sw $a0, -296($fp) + +_cil_label_LABEL_31: + # ASSIGN + lw $a0, -296($fp) + sw $a0, -268($fp) + + # GOTO + j _cil_label_LABEL_29 + +_cil_label_LABEL_28: + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -768($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -768($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -772($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -780($fp) + + # PUSHPARAM + lw $a0, -780($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -780($fp) + lw $a0 0($a1) + sw $a0 -784($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -784($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -788($fp) + lw $a2, -784($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -788($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -768($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 9 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -776($fp) + li $a2, 9 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -776($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -776($fp) + sw $a0, -268($fp) + +_cil_label_LABEL_29: + # ASSIGN + lw $a0, -268($fp) + sw $a0, -240($fp) + + # GOTO + j _cil_label_LABEL_27 + +_cil_label_LABEL_26: + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -792($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -792($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -796($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -804($fp) + + # PUSHPARAM + lw $a0, -804($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -804($fp) + lw $a0 0($a1) + sw $a0 -808($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -808($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -812($fp) + lw $a2, -808($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -812($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -792($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 8 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -800($fp) + li $a2, 8 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -800($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -800($fp) + sw $a0, -240($fp) + +_cil_label_LABEL_27: + # ASSIGN + lw $a0, -240($fp) + sw $a0, -212($fp) + + # GOTO + j _cil_label_LABEL_25 + +_cil_label_LABEL_24: + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -816($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -816($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -820($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -828($fp) + + # PUSHPARAM + lw $a0, -828($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -828($fp) + lw $a0 0($a1) + sw $a0 -832($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -832($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -836($fp) + lw $a2, -832($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -836($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -816($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 7 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -824($fp) + li $a2, 7 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -824($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -824($fp) + sw $a0, -212($fp) + +_cil_label_LABEL_25: + # ASSIGN + lw $a0, -212($fp) + sw $a0, -184($fp) + + # GOTO + j _cil_label_LABEL_23 + +_cil_label_LABEL_22: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -840($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -840($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -844($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -856($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -856($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -860($fp) + lw $a2, -856($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -860($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -840($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -840($fp) + lw $a0 0($a1) + sw $a0 -848($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -848($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -852($fp) + lw $a2, -848($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -852($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -864($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -864($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -868($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -880($fp) + + # PUSHPARAM + lw $a0, -880($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -880($fp) + lw $a0 0($a1) + sw $a0 -884($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -884($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -888($fp) + lw $a2, -884($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -888($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -892($fp) + + # PUSHPARAM + lw $a0, -892($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -892($fp) + lw $a0 0($a1) + sw $a0 -896($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -896($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -900($fp) + lw $a2, -896($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -900($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -864($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -864($fp) + lw $a0 0($a1) + sw $a0 -872($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -872($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -876($fp) + lw $a2, -872($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -876($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -876($fp) + sw $a0, -184($fp) + +_cil_label_LABEL_23: + # ASSIGN + lw $a0, -184($fp) + sw $a0, -156($fp) + + # GOTO + j _cil_label_LABEL_21 + +_cil_label_LABEL_20: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -916($fp) + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -908($fp) + + # PUSHPARAM + li $a0, 9 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -908($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -904($fp) + bnez $a0, _cil_label_LABEL_40 + + # PUSHPARAM + li $a0, 7 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -908($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -904($fp) + bnez $a0, _cil_label_LABEL_41 + + # PUSHPARAM + li $a0, 1 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -908($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -904($fp) + bnez $a0, _cil_label_LABEL_42 + +_cil_label_LABEL_40: + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -928($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -928($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -932($fp) + lw $a2, -928($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -932($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -920($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -920($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -924($fp) + lw $a2, -920($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -924($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -924($fp) + sw $a0, -912($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_41: + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -944($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -944($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -948($fp) + lw $a2, -944($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -948($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -936($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -936($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -940($fp) + lw $a2, -936($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -940($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -940($fp) + sw $a0, -912($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_42: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -964($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -964($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -960($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -960($fp) + lw $a0 -964($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -960($fp) + la $a0, data_26 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -960($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -952($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -952($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -956($fp) + lw $a2, -952($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -968($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -968($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -972($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -988($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -988($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -984($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -984($fp) + lw $a0 -988($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -984($fp) + la $a0, data_45 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -984($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -968($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -968($fp) + lw $a0 0($a1) + sw $a0 -976($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -976($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -980($fp) + lw $a2, -976($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -992($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -992($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -996($fp) + lw $a2, -992($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1000($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -1000($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -1000($fp) + sw $a0, -912($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_43: + # ASSIGN + lw $a0, -912($fp) + sw $a0, -156($fp) + +_cil_label_LABEL_21: + # ASSIGN + lw $a0, -156($fp) + sw $a0, -128($fp) + + # GOTO + j _cil_label_LABEL_19 + +_cil_label_LABEL_18: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1004($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -1004($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1008($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -1020($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1020($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1024($fp) + lw $a2, -1020($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -1024($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -1004($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1004($fp) + lw $a0 0($a1) + sw $a0 -1012($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1012($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1016($fp) + lw $a2, -1012($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -1016($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1028($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -1028($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1032($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -1044($fp) + + # PUSHPARAM + lw $a0, -1044($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1044($fp) + lw $a0 0($a1) + sw $a0 -1048($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1048($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1052($fp) + lw $a2, -1048($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -1052($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -1056($fp) + + # PUSHPARAM + lw $a0, -1056($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1056($fp) + lw $a0 0($a1) + sw $a0 -1060($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1060($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1064($fp) + lw $a2, -1060($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -1064($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -1028($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1028($fp) + lw $a0 0($a1) + sw $a0 -1036($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1036($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1040($fp) + lw $a2, -1036($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -1040($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -1040($fp) + sw $a0, -128($fp) + +_cil_label_LABEL_19: + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_15: + # ALLOCATE + la $v0 type_void + sw $v0 -8($fp) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 1068 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A_value: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A_set_var: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A_method1: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A_method2: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # + + lw $a0, -8($fp) + lw $a1, -12($fp) + add $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_A_method3: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # - + li $a0 0 + lw $a1, -4($fp) + sub $a0, $a0, $a1 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -12($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_A_method4: + move $fp, $sp + subu $sp, $sp, 96 + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_44 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # - + lw $a0, -32($fp) + lw $a1, -36($fp) + sub $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -40($fp) + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -56($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_45 + +_cil_label_LABEL_44: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # - + lw $a0, -68($fp) + lw $a1, -72($fp) + sub $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -76($fp) + sw $a0, -60($fp) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -80($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -92($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_45: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 96 + jr $ra + +function_A_method5: + move $fp, $sp + subu $sp, $sp, 84 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + li $a0, 1 + sw $a0 12($a1) + +_cil_label_LABEL_46: + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # <= + lw $a1, -20($fp) + lw $a2, -24($fp) + sle $a0, $a1, $a2 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -28($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # IF GOTO + lw $a0, -12($fp) + bnez $a0, _cil_label_LABEL_47 + + # GOTO + j _cil_label_LABEL_48 + +_cil_label_LABEL_47: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # * + lw $a0, -36($fp) + lw $a1, -40($fp) + mul $a0, $a0, $a1 + sw $a0, -32($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -44($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # + + lw $a0, -52($fp) + lw $a1, -56($fp) + add $a0, $a0, $a1 + sw $a0, -48($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -4($fp) + + # GOTO + j _cil_label_LABEL_46 + +_cil_label_LABEL_48: + # ALLOCATE + la $v0 type_void + sw $v0 -8($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -68($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -80($fp) + addiu $sp, $sp, 84 + jr $ra + +function_B__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_B_method5: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # * + lw $a0, -8($fp) + lw $a1, -12($fp) + mul $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_C__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_C_method6: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # - + li $a0 0 + lw $a1, -4($fp) + sub $a0, $a0, $a1 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -12($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_C_method5: + move $fp, $sp + subu $sp, $sp, 52 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # * + lw $a0, -24($fp) + lw $a1, -28($fp) + mul $a0, $a0, $a1 + sw $a0, -20($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # * + lw $a0, -8($fp) + lw $a1, -12($fp) + mul $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -48($fp) + addiu $sp, $sp, 52 + jr $ra + +function_D__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_D_method7: + move $fp, $sp + subu $sp, $sp, 148 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_49 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -44($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_13_ + beq $t1 $zero _eq_false_13_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_13 + li $a2 5 + beq $a0 $a2 _eq_int_bool_13 + li $a2 6 + bne $a0 $a2 _not_basic_type_13_ +_eq_str_13_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_13_ + beq $t3 $0 _eq_true_13_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_13_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_13_ + b _eq_true_13_ +_not_basic_type_13_: + bne $t0 $t1 _eq_false_13_ + b _eq_true_13_ +_eq_int_bool_13: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_13_ +_eq_true_13_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_13_ +_eq_false_13_: + li $a0 0 + sw $a0 -36($fp) +end_equal_13_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_51 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -64($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_14_ + beq $t1 $zero _eq_false_14_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_14 + li $a2 5 + beq $a0 $a2 _eq_int_bool_14 + li $a2 6 + bne $a0 $a2 _not_basic_type_14_ +_eq_str_14_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_14_ + beq $t3 $0 _eq_true_14_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_14_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_14_ + b _eq_true_14_ +_not_basic_type_14_: + bne $t0 $t1 _eq_false_14_ + b _eq_true_14_ +_eq_int_bool_14: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_14_ +_eq_true_14_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_14_ +_eq_false_14_: + li $a0 0 + sw $a0 -56($fp) +end_equal_14_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_53 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 -84($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_15_ + beq $t1 $zero _eq_false_15_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_15 + li $a2 5 + beq $a0 $a2 _eq_int_bool_15 + li $a2 6 + bne $a0 $a2 _not_basic_type_15_ +_eq_str_15_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_15_ + beq $t3 $0 _eq_true_15_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_15_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_15_ + b _eq_true_15_ +_not_basic_type_15_: + bne $t0 $t1 _eq_false_15_ + b _eq_true_15_ +_eq_int_bool_15: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_15_ +_eq_true_15_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_15_ +_eq_false_15_: + li $a0 0 + sw $a0 -76($fp) +end_equal_15_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_55 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 3 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # - + lw $a0, -100($fp) + lw $a1, -104($fp) + sub $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -92($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_56 + +_cil_label_LABEL_55: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -116($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_56: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_54 + +_cil_label_LABEL_53: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_54: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_52 + +_cil_label_LABEL_51: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -124($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_52: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_50 + +_cil_label_LABEL_49: + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # - + li $a0 0 + lw $a1, -136($fp) + sub $a0, $a0, $a1 + sw $a0, -140($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -128($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -128($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + lw $a2, -128($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -132($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_50: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 148 + jr $ra + +function_E__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_E_method6: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 8 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # / + lw $a0, -8($fp) + lw $a1, -12($fp) + beqz $a1 _div_error_16_ + div $a0, $a0, $a1 + sw $a0, -4($fp) + b _div_end_16_ +_div_error_16_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_16_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 40 + jr $ra + +function_A2I__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A2I_c2i: + move $fp, $sp + subu $sp, $sp, 316 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_46 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_17_ + beq $t1 $zero _eq_false_17_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_17 + li $a2 5 + beq $a0 $a2 _eq_int_bool_17 + li $a2 6 + bne $a0 $a2 _not_basic_type_17_ +_eq_str_17_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_17_ + beq $t3 $0 _eq_true_17_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_17_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_17_ + b _eq_true_17_ +_not_basic_type_17_: + bne $t0 $t1 _eq_false_17_ + b _eq_true_17_ +_eq_int_bool_17: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_17_ +_eq_true_17_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_17_ +_eq_false_17_: + li $a0 0 + sw $a0 -8($fp) +end_equal_17_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_57 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_47 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_18_ + beq $t1 $zero _eq_false_18_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_18 + li $a2 5 + beq $a0 $a2 _eq_int_bool_18 + li $a2 6 + bne $a0 $a2 _not_basic_type_18_ +_eq_str_18_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_18_ + beq $t3 $0 _eq_true_18_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_18_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_18_ + b _eq_true_18_ +_not_basic_type_18_: + bne $t0 $t1 _eq_false_18_ + b _eq_true_18_ +_eq_int_bool_18: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_18_ +_eq_true_18_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_18_ +_eq_false_18_: + li $a0 0 + sw $a0 -32($fp) +end_equal_18_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_59 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_48 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_19_ + beq $t1 $zero _eq_false_19_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_19 + li $a2 5 + beq $a0 $a2 _eq_int_bool_19 + li $a2 6 + bne $a0 $a2 _not_basic_type_19_ +_eq_str_19_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_19_ + beq $t3 $0 _eq_true_19_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_19_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_19_ + b _eq_true_19_ +_not_basic_type_19_: + bne $t0 $t1 _eq_false_19_ + b _eq_true_19_ +_eq_int_bool_19: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_19_ +_eq_true_19_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_19_ +_eq_false_19_: + li $a0 0 + sw $a0 -56($fp) +end_equal_19_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_61 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_49 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_20_ + beq $t1 $zero _eq_false_20_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_20 + li $a2 5 + beq $a0 $a2 _eq_int_bool_20 + li $a2 6 + bne $a0 $a2 _not_basic_type_20_ +_eq_str_20_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_20_ + beq $t3 $0 _eq_true_20_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_20_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_20_ + b _eq_true_20_ +_not_basic_type_20_: + bne $t0 $t1 _eq_false_20_ + b _eq_true_20_ +_eq_int_bool_20: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_20_ +_eq_true_20_: + li $a0 1 + sw $a0 -80($fp) + b end_equal_20_ +_eq_false_20_: + li $a0 0 + sw $a0 -80($fp) +end_equal_20_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_63 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_50 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_21_ + beq $t1 $zero _eq_false_21_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_21 + li $a2 5 + beq $a0 $a2 _eq_int_bool_21 + li $a2 6 + bne $a0 $a2 _not_basic_type_21_ +_eq_str_21_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_21_ + beq $t3 $0 _eq_true_21_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_21_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_21_ + b _eq_true_21_ +_not_basic_type_21_: + bne $t0 $t1 _eq_false_21_ + b _eq_true_21_ +_eq_int_bool_21: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_21_ +_eq_true_21_: + li $a0 1 + sw $a0 -104($fp) + b end_equal_21_ +_eq_false_21_: + li $a0 0 + sw $a0 -104($fp) +end_equal_21_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # IF GOTO + lw $a0, -100($fp) + bnez $a0, _cil_label_LABEL_65 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_51 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_22_ + beq $t1 $zero _eq_false_22_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_22 + li $a2 5 + beq $a0 $a2 _eq_int_bool_22 + li $a2 6 + bne $a0 $a2 _not_basic_type_22_ +_eq_str_22_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_22_ + beq $t3 $0 _eq_true_22_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_22_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_22_ + b _eq_true_22_ +_not_basic_type_22_: + bne $t0 $t1 _eq_false_22_ + b _eq_true_22_ +_eq_int_bool_22: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_22_ +_eq_true_22_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_22_ +_eq_false_22_: + li $a0 0 + sw $a0 -128($fp) +end_equal_22_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_67 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -160($fp) + la $a0, data_52 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -160($fp) + beq $t0 $zero _eq_false_23_ + beq $t1 $zero _eq_false_23_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_23 + li $a2 5 + beq $a0 $a2 _eq_int_bool_23 + li $a2 6 + bne $a0 $a2 _not_basic_type_23_ +_eq_str_23_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_23_ + beq $t3 $0 _eq_true_23_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_23_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_23_ + b _eq_true_23_ +_not_basic_type_23_: + bne $t0 $t1 _eq_false_23_ + b _eq_true_23_ +_eq_int_bool_23: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_23_ +_eq_true_23_: + li $a0 1 + sw $a0 -152($fp) + b end_equal_23_ +_eq_false_23_: + li $a0 0 + sw $a0 -152($fp) +end_equal_23_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -148($fp) + + # IF GOTO + lw $a0, -148($fp) + bnez $a0, _cil_label_LABEL_69 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_53 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -184($fp) + beq $t0 $zero _eq_false_24_ + beq $t1 $zero _eq_false_24_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_24 + li $a2 5 + beq $a0 $a2 _eq_int_bool_24 + li $a2 6 + bne $a0 $a2 _not_basic_type_24_ +_eq_str_24_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_24_ + beq $t3 $0 _eq_true_24_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_24_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_24_ + b _eq_true_24_ +_not_basic_type_24_: + bne $t0 $t1 _eq_false_24_ + b _eq_true_24_ +_eq_int_bool_24: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_24_ +_eq_true_24_: + li $a0 1 + sw $a0 -176($fp) + b end_equal_24_ +_eq_false_24_: + li $a0 0 + sw $a0 -176($fp) +end_equal_24_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # IF GOTO + lw $a0, -172($fp) + bnez $a0, _cil_label_LABEL_71 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_54 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -208($fp) + beq $t0 $zero _eq_false_25_ + beq $t1 $zero _eq_false_25_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_25 + li $a2 5 + beq $a0 $a2 _eq_int_bool_25 + li $a2 6 + bne $a0 $a2 _not_basic_type_25_ +_eq_str_25_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_25_ + beq $t3 $0 _eq_true_25_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_25_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_25_ + b _eq_true_25_ +_not_basic_type_25_: + bne $t0 $t1 _eq_false_25_ + b _eq_true_25_ +_eq_int_bool_25: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_25_ +_eq_true_25_: + li $a0 1 + sw $a0 -200($fp) + b end_equal_25_ +_eq_false_25_: + li $a0 0 + sw $a0 -200($fp) +end_equal_25_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -200($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # IF GOTO + lw $a0, -196($fp) + bnez $a0, _cil_label_LABEL_73 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_55 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_26_ + beq $t1 $zero _eq_false_26_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_26_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_26 + li $a2 5 + beq $a0 $a2 _eq_int_bool_26 + li $a2 6 + bne $a0 $a2 _not_basic_type_26_ +_eq_str_26_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_26_ + beq $t3 $0 _eq_true_26_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_26_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_26_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_26_ + b _eq_true_26_ +_not_basic_type_26_: + bne $t0 $t1 _eq_false_26_ + b _eq_true_26_ +_eq_int_bool_26: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_26_ +_eq_true_26_: + li $a0 1 + sw $a0 -224($fp) + b end_equal_26_ +_eq_false_26_: + li $a0 0 + sw $a0 -224($fp) +end_equal_26_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -224($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -228($fp) + lw $a0 12($a1) + sw $a0 -220($fp) + + # IF GOTO + lw $a0, -220($fp) + bnez $a0, _cil_label_LABEL_75 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -240($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_56 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -256($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -240($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -240($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -264($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -264($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + lw $a2, -264($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -216($fp) + + # GOTO + j _cil_label_LABEL_76 + +_cil_label_LABEL_75: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 9 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -276($fp) + sw $a0, -216($fp) + +_cil_label_LABEL_76: + # ASSIGN + lw $a0, -216($fp) + sw $a0, -192($fp) + + # GOTO + j _cil_label_LABEL_74 + +_cil_label_LABEL_73: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + li $a0, 8 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -192($fp) + +_cil_label_LABEL_74: + # ASSIGN + lw $a0, -192($fp) + sw $a0, -168($fp) + + # GOTO + j _cil_label_LABEL_72 + +_cil_label_LABEL_71: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 7 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -284($fp) + sw $a0, -168($fp) + +_cil_label_LABEL_72: + # ASSIGN + lw $a0, -168($fp) + sw $a0, -144($fp) + + # GOTO + j _cil_label_LABEL_70 + +_cil_label_LABEL_69: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + li $a0, 6 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, -144($fp) + +_cil_label_LABEL_70: + # ASSIGN + lw $a0, -144($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_68 + +_cil_label_LABEL_67: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 5 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -292($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_68: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -96($fp) + + # GOTO + j _cil_label_LABEL_66 + +_cil_label_LABEL_65: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -296($fp) + li $a0, 4 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -296($fp) + sw $a0, -96($fp) + +_cil_label_LABEL_66: + # ASSIGN + lw $a0, -96($fp) + sw $a0, -72($fp) + + # GOTO + j _cil_label_LABEL_64 + +_cil_label_LABEL_63: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + li $a0, 3 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -300($fp) + sw $a0, -72($fp) + +_cil_label_LABEL_64: + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_62 + +_cil_label_LABEL_61: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 2 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_62: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_60 + +_cil_label_LABEL_59: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -308($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_60: + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_58 + +_cil_label_LABEL_57: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -312($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -312($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_58: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 316 + jr $ra + +function_A2I_i2c: + move $fp, $sp + subu $sp, $sp, 320 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_27_ + beq $t1 $zero _eq_false_27_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_27_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_27 + li $a2 5 + beq $a0 $a2 _eq_int_bool_27 + li $a2 6 + bne $a0 $a2 _not_basic_type_27_ +_eq_str_27_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_27_ + beq $t3 $0 _eq_true_27_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_27_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_27_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_27_ + b _eq_true_27_ +_not_basic_type_27_: + bne $t0 $t1 _eq_false_27_ + b _eq_true_27_ +_eq_int_bool_27: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_27_ +_eq_true_27_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_27_ +_eq_false_27_: + li $a0 0 + sw $a0 -8($fp) +end_equal_27_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_77 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -36($fp) + beq $t0 $zero _eq_false_28_ + beq $t1 $zero _eq_false_28_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_28_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_28 + li $a2 5 + beq $a0 $a2 _eq_int_bool_28 + li $a2 6 + bne $a0 $a2 _not_basic_type_28_ +_eq_str_28_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_28_ + beq $t3 $0 _eq_true_28_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_28_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_28_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_28_ + b _eq_true_28_ +_not_basic_type_28_: + bne $t0 $t1 _eq_false_28_ + b _eq_true_28_ +_eq_int_bool_28: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_28_ +_eq_true_28_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_28_ +_eq_false_28_: + li $a0 0 + sw $a0 -28($fp) +end_equal_28_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_79 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_29_ + beq $t1 $zero _eq_false_29_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_29_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_29 + li $a2 5 + beq $a0 $a2 _eq_int_bool_29 + li $a2 6 + bne $a0 $a2 _not_basic_type_29_ +_eq_str_29_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_29_ + beq $t3 $0 _eq_true_29_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_29_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_29_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_29_ + b _eq_true_29_ +_not_basic_type_29_: + bne $t0 $t1 _eq_false_29_ + b _eq_true_29_ +_eq_int_bool_29: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_29_ +_eq_true_29_: + li $a0 1 + sw $a0 -48($fp) + b end_equal_29_ +_eq_false_29_: + li $a0 0 + sw $a0 -48($fp) +end_equal_29_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_81 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 3 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -76($fp) + beq $t0 $zero _eq_false_30_ + beq $t1 $zero _eq_false_30_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_30_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_30 + li $a2 5 + beq $a0 $a2 _eq_int_bool_30 + li $a2 6 + bne $a0 $a2 _not_basic_type_30_ +_eq_str_30_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_30_ + beq $t3 $0 _eq_true_30_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_30_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_30_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_30_ + b _eq_true_30_ +_not_basic_type_30_: + bne $t0 $t1 _eq_false_30_ + b _eq_true_30_ +_eq_int_bool_30: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_30_ +_eq_true_30_: + li $a0 1 + sw $a0 -68($fp) + b end_equal_30_ +_eq_false_30_: + li $a0 0 + sw $a0 -68($fp) +end_equal_30_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # IF GOTO + lw $a0, -64($fp) + bnez $a0, _cil_label_LABEL_83 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 4 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -96($fp) + beq $t0 $zero _eq_false_31_ + beq $t1 $zero _eq_false_31_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_31_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_31 + li $a2 5 + beq $a0 $a2 _eq_int_bool_31 + li $a2 6 + bne $a0 $a2 _not_basic_type_31_ +_eq_str_31_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_31_ + beq $t3 $0 _eq_true_31_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_31_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_31_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_31_ + b _eq_true_31_ +_not_basic_type_31_: + bne $t0 $t1 _eq_false_31_ + b _eq_true_31_ +_eq_int_bool_31: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_31_ +_eq_true_31_: + li $a0 1 + sw $a0 -88($fp) + b end_equal_31_ +_eq_false_31_: + li $a0 0 + sw $a0 -88($fp) +end_equal_31_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # IF GOTO + lw $a0, -84($fp) + bnez $a0, _cil_label_LABEL_85 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 5 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -116($fp) + beq $t0 $zero _eq_false_32_ + beq $t1 $zero _eq_false_32_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_32_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_32 + li $a2 5 + beq $a0 $a2 _eq_int_bool_32 + li $a2 6 + bne $a0 $a2 _not_basic_type_32_ +_eq_str_32_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_32_ + beq $t3 $0 _eq_true_32_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_32_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_32_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_32_ + b _eq_true_32_ +_not_basic_type_32_: + bne $t0 $t1 _eq_false_32_ + b _eq_true_32_ +_eq_int_bool_32: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_32_ +_eq_true_32_: + li $a0 1 + sw $a0 -108($fp) + b end_equal_32_ +_eq_false_32_: + li $a0 0 + sw $a0 -108($fp) +end_equal_32_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # IF GOTO + lw $a0, -104($fp) + bnez $a0, _cil_label_LABEL_87 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 6 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_33_ + beq $t1 $zero _eq_false_33_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_33_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_33 + li $a2 5 + beq $a0 $a2 _eq_int_bool_33 + li $a2 6 + bne $a0 $a2 _not_basic_type_33_ +_eq_str_33_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_33_ + beq $t3 $0 _eq_true_33_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_33_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_33_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_33_ + b _eq_true_33_ +_not_basic_type_33_: + bne $t0 $t1 _eq_false_33_ + b _eq_true_33_ +_eq_int_bool_33: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_33_ +_eq_true_33_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_33_ +_eq_false_33_: + li $a0 0 + sw $a0 -128($fp) +end_equal_33_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_89 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 7 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -156($fp) + beq $t0 $zero _eq_false_34_ + beq $t1 $zero _eq_false_34_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_34_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_34 + li $a2 5 + beq $a0 $a2 _eq_int_bool_34 + li $a2 6 + bne $a0 $a2 _not_basic_type_34_ +_eq_str_34_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_34_ + beq $t3 $0 _eq_true_34_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_34_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_34_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_34_ + b _eq_true_34_ +_not_basic_type_34_: + bne $t0 $t1 _eq_false_34_ + b _eq_true_34_ +_eq_int_bool_34: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_34_ +_eq_true_34_: + li $a0 1 + sw $a0 -148($fp) + b end_equal_34_ +_eq_false_34_: + li $a0 0 + sw $a0 -148($fp) +end_equal_34_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -144($fp) + + # IF GOTO + lw $a0, -144($fp) + bnez $a0, _cil_label_LABEL_91 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 8 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_35_ + beq $t1 $zero _eq_false_35_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_35_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_35 + li $a2 5 + beq $a0 $a2 _eq_int_bool_35 + li $a2 6 + bne $a0 $a2 _not_basic_type_35_ +_eq_str_35_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_35_ + beq $t3 $0 _eq_true_35_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_35_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_35_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_35_ + b _eq_true_35_ +_not_basic_type_35_: + bne $t0 $t1 _eq_false_35_ + b _eq_true_35_ +_eq_int_bool_35: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_35_ +_eq_true_35_: + li $a0 1 + sw $a0 -168($fp) + b end_equal_35_ +_eq_false_35_: + li $a0 0 + sw $a0 -168($fp) +end_equal_35_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # IF GOTO + lw $a0, -164($fp) + bnez $a0, _cil_label_LABEL_93 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + li $a0, 9 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -196($fp) + beq $t0 $zero _eq_false_36_ + beq $t1 $zero _eq_false_36_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_36_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_36 + li $a2 5 + beq $a0 $a2 _eq_int_bool_36 + li $a2 6 + bne $a0 $a2 _not_basic_type_36_ +_eq_str_36_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_36_ + beq $t3 $0 _eq_true_36_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_36_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_36_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_36_ + b _eq_true_36_ +_not_basic_type_36_: + bne $t0 $t1 _eq_false_36_ + b _eq_true_36_ +_eq_int_bool_36: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_36_ +_eq_true_36_: + li $a0 1 + sw $a0 -188($fp) + b end_equal_36_ +_eq_false_36_: + li $a0 0 + sw $a0 -188($fp) +end_equal_36_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -192($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -192($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -192($fp) + lw $a0 12($a1) + sw $a0 -184($fp) + + # IF GOTO + lw $a0, -184($fp) + bnez $a0, _cil_label_LABEL_95 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -200($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -200($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -216($fp) + la $a0, data_56 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -216($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -200($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -200($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -224($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -224($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + lw $a2, -224($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -232($fp) + sw $a0, -180($fp) + + # GOTO + j _cil_label_LABEL_96 + +_cil_label_LABEL_95: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -244($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + lw $a0 -244($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -240($fp) + la $a0, data_55 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -240($fp) + sw $a0, -180($fp) + +_cil_label_LABEL_96: + # ASSIGN + lw $a0, -180($fp) + sw $a0, -160($fp) + + # GOTO + j _cil_label_LABEL_94 + +_cil_label_LABEL_93: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + lw $a0 -252($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -248($fp) + la $a0, data_54 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -248($fp) + sw $a0, -160($fp) + +_cil_label_LABEL_94: + # ASSIGN + lw $a0, -160($fp) + sw $a0, -140($fp) + + # GOTO + j _cil_label_LABEL_92 + +_cil_label_LABEL_91: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_53 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -256($fp) + sw $a0, -140($fp) + +_cil_label_LABEL_92: + # ASSIGN + lw $a0, -140($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_90 + +_cil_label_LABEL_89: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + lw $a0 -268($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -264($fp) + la $a0, data_52 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_90: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -100($fp) + + # GOTO + j _cil_label_LABEL_88 + +_cil_label_LABEL_87: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -272($fp) + la $a0, data_51 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -100($fp) + +_cil_label_LABEL_88: + # ASSIGN + lw $a0, -100($fp) + sw $a0, -80($fp) + + # GOTO + j _cil_label_LABEL_86 + +_cil_label_LABEL_85: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + lw $a0 -284($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -280($fp) + la $a0, data_50 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -80($fp) + +_cil_label_LABEL_86: + # ASSIGN + lw $a0, -80($fp) + sw $a0, -60($fp) + + # GOTO + j _cil_label_LABEL_84 + +_cil_label_LABEL_83: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + lw $a0 -292($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -288($fp) + la $a0, data_49 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, -60($fp) + +_cil_label_LABEL_84: + # ASSIGN + lw $a0, -60($fp) + sw $a0, -40($fp) + + # GOTO + j _cil_label_LABEL_82 + +_cil_label_LABEL_81: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -296($fp) + lw $a0 -300($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -296($fp) + la $a0, data_48 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -296($fp) + sw $a0, -40($fp) + +_cil_label_LABEL_82: + # ASSIGN + lw $a0, -40($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_80 + +_cil_label_LABEL_79: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + lw $a0 -308($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -304($fp) + la $a0, data_47 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_80: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_78 + +_cil_label_LABEL_77: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -312($fp) + lw $a0 -316($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -312($fp) + la $a0, data_46 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -312($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_78: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 320 + jr $ra + +function_A2I_a2i: + move $fp, $sp + subu $sp, $sp, 228 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_37_ + beq $t1 $zero _eq_false_37_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_37_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_37 + li $a2 5 + beq $a0 $a2 _eq_int_bool_37 + li $a2 6 + bne $a0 $a2 _not_basic_type_37_ +_eq_str_37_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_37_ + beq $t3 $0 _eq_true_37_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_37_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_37_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_37_ + b _eq_true_37_ +_not_basic_type_37_: + bne $t0 $t1 _eq_false_37_ + b _eq_true_37_ +_eq_int_bool_37: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_37_ +_eq_true_37_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_37_ +_eq_false_37_: + li $a0 0 + sw $a0 -8($fp) +end_equal_37_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_97 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_57 + sw $a0 16($a1) + + lw $t0 -48($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_38_ + beq $t1 $zero _eq_false_38_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_38_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_38 + li $a2 5 + beq $a0 $a2 _eq_int_bool_38 + li $a2 6 + bne $a0 $a2 _not_basic_type_38_ +_eq_str_38_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_38_ + beq $t3 $0 _eq_true_38_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_38_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_38_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_38_ + b _eq_true_38_ +_not_basic_type_38_: + bne $t0 $t1 _eq_false_38_ + b _eq_true_38_ +_eq_int_bool_38: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_38_ +_eq_true_38_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_38_ +_eq_false_38_: + li $a0 0 + sw $a0 -36($fp) +end_equal_38_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_99 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_58 + sw $a0 16($a1) + + lw $t0 -88($fp) + lw $t1 -100($fp) + beq $t0 $zero _eq_false_39_ + beq $t1 $zero _eq_false_39_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_39_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_39 + li $a2 5 + beq $a0 $a2 _eq_int_bool_39 + li $a2 6 + bne $a0 $a2 _not_basic_type_39_ +_eq_str_39_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_39_ + beq $t3 $0 _eq_true_39_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_39_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_39_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_39_ + b _eq_true_39_ +_not_basic_type_39_: + bne $t0 $t1 _eq_false_39_ + b _eq_true_39_ +_eq_int_bool_39: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_39_ +_eq_true_39_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_39_ +_eq_false_39_: + li $a0 0 + sw $a0 -76($fp) +end_equal_39_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_101 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -112($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_102 + +_cil_label_LABEL_101: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -140($fp) + + # - + lw $a0, -136($fp) + lw $a1, -140($fp) + sub $a0, $a0, $a1 + sw $a0, -132($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -132($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -124($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -124($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + lw $a2, -124($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -128($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_102: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_100 + +_cil_label_LABEL_99: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -212($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # GETATTR + lw $a1 -216($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # - + lw $a0, -196($fp) + lw $a1, -200($fp) + sub $a0, $a0, $a1 + sw $a0, -192($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -204($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -220($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -184($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -184($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + lw $a2, -184($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -188($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # - + li $a0 0 + lw $a1, -164($fp) + sub $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_100: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_98 + +_cil_label_LABEL_97: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_98: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 228 + jr $ra + +function_A2I_a2i_aux: + move $fp, $sp + subu $sp, $sp, 116 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_103: + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_104 + + # GOTO + j _cil_label_LABEL_105 + +_cil_label_LABEL_104: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # * + lw $a0, -60($fp) + lw $a1, -64($fp) + mul $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # + + lw $a0, -44($fp) + lw $a1, -48($fp) + add $a0, $a0, $a1 + sw $a0, -40($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_103 + +_cil_label_LABEL_105: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 116 + jr $ra + +function_A2I_i2a: + move $fp, $sp + subu $sp, $sp, 120 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_40_ + beq $t1 $zero _eq_false_40_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_40_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_40 + li $a2 5 + beq $a0 $a2 _eq_int_bool_40 + li $a2 6 + bne $a0 $a2 _not_basic_type_40_ +_eq_str_40_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_40_ + beq $t3 $0 _eq_true_40_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_40_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_40_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_40_ + b _eq_true_40_ +_not_basic_type_40_: + bne $t0 $t1 _eq_false_40_ + b _eq_true_40_ +_eq_int_bool_40: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_40_ +_eq_true_40_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_40_ +_eq_false_40_: + li $a0 0 + sw $a0 -8($fp) +end_equal_40_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_106 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # < + lw $a1, -32($fp) + lw $a2, -36($fp) + slt $a0, $a1, $a2 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_108 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_57 + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # - + li $a0 0 + lw $a1, -88($fp) + sub $a0, $a0, $a1 + sw $a0, -92($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # * + lw $a0, -76($fp) + lw $a1, -80($fp) + mul $a0, $a0, $a1 + sw $a0, -72($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_109 + +_cil_label_LABEL_108: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_109: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_107 + +_cil_label_LABEL_106: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_46 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_107: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 120 + jr $ra + +function_A2I_i2a_aux: + move $fp, $sp + subu $sp, $sp, 108 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_41_ + beq $t1 $zero _eq_false_41_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_41_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_41 + li $a2 5 + beq $a0 $a2 _eq_int_bool_41 + li $a2 6 + bne $a0 $a2 _not_basic_type_41_ +_eq_str_41_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_41_ + beq $t3 $0 _eq_true_41_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_41_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_41_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_41_ + b _eq_true_41_ +_not_basic_type_41_: + bne $t0 $t1 _eq_false_41_ + b _eq_true_41_ +_eq_int_bool_41: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_41_ +_eq_true_41_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_41_ +_eq_false_41_: + li $a0 0 + sw $a0 -8($fp) +end_equal_41_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_110 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # / + lw $a0, -24($fp) + lw $a1, -28($fp) + beqz $a1 _div_error_42_ + div $a0, $a0, $a1 + sw $a0, -20($fp) + b _div_end_42_ +_div_error_42_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_42_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # * + lw $a0, -84($fp) + lw $a1, -88($fp) + mul $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # - + lw $a0, -68($fp) + lw $a1, -72($fp) + sub $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_111 + +_cil_label_LABEL_110: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_111: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 108 + jr $ra + + +##################################### + diff --git a/tests/codegen/arith.s b/tests/codegen/arith.s new file mode 100644 index 00000000..1e22c4c7 --- /dev/null +++ b/tests/codegen/arith.s @@ -0,0 +1,18736 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n\tTo add a number to " + data_2: .align 2 + .asciiz "...enter a:\n" + data_3: .align 2 + .asciiz "\tTo negate " + data_4: .align 2 + .asciiz "...enter b:\n" + data_5: .align 2 + .asciiz "\tTo find the difference between " + data_6: .align 2 + .asciiz "and another number...enter c:\n" + data_7: .align 2 + .asciiz "\tTo find the factorial of " + data_8: .align 2 + .asciiz "...enter d:\n" + data_9: .align 2 + .asciiz "\tTo square " + data_10: .align 2 + .asciiz "...enter e:\n" + data_11: .align 2 + .asciiz "\tTo cube " + data_12: .align 2 + .asciiz "...enter f:\n" + data_13: .align 2 + .asciiz "\tTo find out if " + data_14: .align 2 + .asciiz "is a multiple of 3...enter g:\n" + data_15: .align 2 + .asciiz "\tTo divide " + data_16: .align 2 + .asciiz "by 8...enter h:\n" + data_17: .align 2 + .asciiz "\tTo get a new number...enter j:\n" + data_18: .align 2 + .asciiz "\tTo quit...enter q:\n\n" + data_19: .align 2 + .asciiz "\n" + data_20: .align 2 + .asciiz "Please enter a number... " + data_21: .align 2 + .asciiz "Class type is now E\n" + data_22: .align 2 + .asciiz "Class type is now C\n" + data_23: .align 2 + .asciiz "Class type is now D\n" + data_24: .align 2 + .asciiz "Class type is now B\n" + data_25: .align 2 + .asciiz "Class type is now A\n" + data_26: .align 2 + .asciiz "Oooops\n" + data_27: .align 2 + .asciiz " " + data_28: .align 2 + .asciiz "number " + data_29: .align 2 + .asciiz "is odd!\n" + data_30: .align 2 + .asciiz "is even!\n" + data_31: .align 2 + .asciiz "a" + data_32: .align 2 + .asciiz "b" + data_33: .align 2 + .asciiz "c" + data_34: .align 2 + .asciiz "d" + data_35: .align 2 + .asciiz "e" + data_36: .align 2 + .asciiz "f" + data_37: .align 2 + .asciiz "g" + data_38: .align 2 + .asciiz "h" + data_39: .align 2 + .asciiz "j" + data_40: .align 2 + .asciiz "q" + data_41: .align 2 + .asciiz "is equal to " + data_42: .align 2 + .asciiz "times 8 with a remainder of " + data_43: .align 2 + .asciiz "is not divisible by 3.\n" + data_44: .align 2 + .asciiz "is divisible by 3.\n" + data_45: .align 2 + .asciiz "0" + data_46: .align 2 + .asciiz "1" + data_47: .align 2 + .asciiz "2" + data_48: .align 2 + .asciiz "3" + data_49: .align 2 + .asciiz "4" + data_50: .align 2 + .asciiz "5" + data_51: .align 2 + .asciiz "6" + data_52: .align 2 + .asciiz "7" + data_53: .align 2 + .asciiz "8" + data_54: .align 2 + .asciiz "9" + data_55: .align 2 + .asciiz "-" + data_56: .align 2 + .asciiz "+" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_A: .align 2 + .asciiz "A" + classname_B: .align 2 + .asciiz "B" + classname_C: .align 2 + .asciiz "C" + classname_D: .align 2 + .asciiz "D" + classname_E: .align 2 + .asciiz "E" + classname_A2I: .align 2 + .asciiz "A2I" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 52 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_A + sw $t1 28($s1) + la $t1 classname_B + sw $t1 32($s1) + la $t1 classname_C + sw $t1 36($s1) + la $t1 classname_D + sw $t1 40($s1) + la $t1 classname_E + sw $t1 44($s1) + la $t1 classname_A2I + sw $t1 48($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 104 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 28 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 28 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type A + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type B + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type C + li $a0 16 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type D + li $a0 16 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 80($s0) + + # Type E + li $a0 16 + li $v0 9 + syscall + li $a0 11 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 88($s0) + + # Type A2I + li $a0 12 + li $v0 9 + syscall + li $a0 12 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 96($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 56 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_menu + sw $t1 28($v0) + la $t1 function_Main_prompt + sw $t1 32($v0) + la $t1 function_Main_get_int + sw $t1 36($v0) + la $t1 function_Main_is_even + sw $t1 40($v0) + la $t1 function_Main_class_type + sw $t1 44($v0) + la $t1 function_Main_print + sw $t1 48($v0) + la $t1 function_Main_main + sw $t1 52($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type A + li $a0 40 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_A_method5 + sw $t1 36($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type B + li $a0 44 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_A_method5 + sw $t1 36($v0) + la $t1 function_B_method5 + sw $t1 40($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type C + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_B_method5 + sw $t1 36($v0) + la $t1 function_C_method6 + sw $t1 40($v0) + la $t1 function_C_method5 + sw $t1 44($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type D + li $a0 44 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_B_method5 + sw $t1 36($v0) + la $t1 function_D_method7 + sw $t1 40($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + # Type E + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_value + sw $t1 12($v0) + la $t1 function_A_set_var + sw $t1 16($v0) + la $t1 function_A_method1 + sw $t1 20($v0) + la $t1 function_A_method2 + sw $t1 24($v0) + la $t1 function_A_method3 + sw $t1 28($v0) + la $t1 function_A_method4 + sw $t1 32($v0) + la $t1 function_B_method5 + sw $t1 36($v0) + la $t1 function_D_method7 + sw $t1 40($v0) + la $t1 function_E_method6 + sw $t1 44($v0) + lw $t0 88($s0) + sw $v0 8($t0) + + # Type A2I + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A2I_c2i + sw $t1 12($v0) + la $t1 function_A2I_i2c + sw $t1 16($v0) + la $t1 function_A2I_a2i + sw $t1 20($v0) + la $t1 function_A2I_a2i_aux + sw $t1 24($v0) + la $t1 function_A2I_i2a + sw $t1 28($v0) + la $t1 function_A2I_i2a_aux + sw $t1 32($v0) + lw $t0 96($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 52 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 12 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 7 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 8 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 8 + sw $t1 0($t0) + + li $t0 11 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 10 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -8($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 24($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main_menu: + move $fp, $sp + subu $sp, $sp, 392 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 32 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -100($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -96($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -112($fp) + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -124($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -144($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -140($fp) + la $a0, data_7 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -140($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -132($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -132($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + lw $a2, -132($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -156($fp) + + # PUSHPARAM + lw $a0, -156($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + lw $a0 -172($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -168($fp) + la $a0, data_8 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -168($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -160($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -160($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + lw $a2, -160($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_9 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -184($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -200($fp) + + # PUSHPARAM + lw $a0, -200($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -192($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -192($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + lw $a2, -192($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + lw $a0 -216($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -212($fp) + la $a0, data_10 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -212($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -204($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -204($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + lw $a2, -204($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + li $a0, 9 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -232($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -228($fp) + la $a0, data_11 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -228($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -220($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -220($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + lw $a2, -220($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -244($fp) + + # PUSHPARAM + lw $a0, -244($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -236($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -236($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + lw $a2, -236($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_12 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -256($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 16 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -272($fp) + la $a0, data_13 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -272($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -264($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -264($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + lw $a2, -264($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -288($fp) + + # PUSHPARAM + lw $a0, -288($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -280($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -280($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + lw $a2, -280($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + lw $a0 -304($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -300($fp) + la $a0, data_14 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -300($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -292($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -292($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + lw $a2, -292($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -320($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -320($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + lw $a0 -320($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -316($fp) + la $a0, data_15 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -316($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -308($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -308($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + lw $a2, -308($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -332($fp) + + # PUSHPARAM + lw $a0, -332($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -324($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -324($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -328($fp) + lw $a2, -324($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + li $a0, 16 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -344($fp) + lw $a0 -348($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -344($fp) + la $a0, data_16 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -344($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -336($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -336($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -340($fp) + lw $a2, -336($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -364($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -364($fp) + li $a0, 32 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -360($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -360($fp) + lw $a0 -364($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -360($fp) + la $a0, data_17 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -360($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -352($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -352($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -356($fp) + lw $a2, -352($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -380($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -380($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + lw $a0 -380($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -376($fp) + la $a0, data_18 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -376($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -368($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -368($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + lw $a2, -368($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -384($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -384($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -388($fp) + lw $a2, -384($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -388($fp) + addiu $sp, $sp, 392 + jr $ra + +function_Main_prompt: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_19 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -24($fp) + la $a0, data_20 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 40 + jr $ra + +function_Main_get_int: + move $fp, $sp + subu $sp, $sp, 24 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -20($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Main_is_even: + move $fp, $sp + subu $sp, $sp, 124 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -44($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -36($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -64($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -56($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 2 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # - + lw $a0, -80($fp) + lw $a1, -84($fp) + sub $a0, $a0, $a1 + sw $a0, -76($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # - + li $a0 0 + lw $a1, -112($fp) + sub $a0, $a0, $a1 + sw $a0, -116($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -120($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 124 + jr $ra + +function_Main_class_type: + move $fp, $sp + subu $sp, $sp, 108 + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # PUSHPARAM + li $a0, 11 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_6 + + # PUSHPARAM + li $a0, 9 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_7 + + # PUSHPARAM + li $a0, 10 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_8 + + # PUSHPARAM + li $a0, 8 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_9 + + # PUSHPARAM + li $a0, 7 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_10 + + # PUSHPARAM + li $a0, 1 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_11 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -20($fp) + la $a0, data_21 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -16($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_7: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_22 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -32($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_23 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -48($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_9: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -68($fp) + la $a0, data_24 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -64($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_25 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_11: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_26 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_12: + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 108 + jr $ra + +function_Main_print: + move $fp, $sp + subu $sp, $sp, 48 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_27 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 48 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 1044 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 16($a1) + +_cil_label_LABEL_13: + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -16($fp) + + # GETATTR + lw $a1 -16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # IF GOTO + lw $a0, -12($fp) + bnez $a0, _cil_label_LABEL_14 + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_14: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -28($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -64($fp) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -64($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_16 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 8 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_29 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 9 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_30 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_17: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -116($fp) + + # PUSHPARAM + lw $a0, -116($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -120($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -120($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + lw $a2, -120($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -124($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -144($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -148($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -148($fp) + la $a0, data_31 + sw $a0 16($a1) + + lw $t0 -144($fp) + lw $t1 -148($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -136($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -136($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -132($fp) + + # IF GOTO + lw $a0, -132($fp) + bnez $a0, _cil_label_LABEL_18 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + lw $a0 -180($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -176($fp) + la $a0, data_32 + sw $a0 16($a1) + + lw $t0 -172($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_4 + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -164($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -164($fp) +end_equal_4_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -168($fp) + lw $a0 12($a1) + sw $a0 -160($fp) + + # IF GOTO + lw $a0, -160($fp) + bnez $a0, _cil_label_LABEL_20 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -208($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -204($fp) + la $a0, data_33 + sw $a0 16($a1) + + lw $t0 -200($fp) + lw $t1 -204($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_5 + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -192($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -192($fp) +end_equal_5_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -196($fp) + lw $a0 12($a1) + sw $a0 -188($fp) + + # IF GOTO + lw $a0, -188($fp) + bnez $a0, _cil_label_LABEL_22 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -228($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_34 + sw $a0 16($a1) + + lw $t0 -228($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_6 + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -220($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -220($fp) +end_equal_6_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -224($fp) + lw $a0 12($a1) + sw $a0 -216($fp) + + # IF GOTO + lw $a0, -216($fp) + bnez $a0, _cil_label_LABEL_24 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -256($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + lw $a0 -264($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -260($fp) + la $a0, data_35 + sw $a0 16($a1) + + lw $t0 -256($fp) + lw $t1 -260($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_7 + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 -248($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 -248($fp) +end_equal_7_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + lw $a0 -248($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -252($fp) + lw $a0 12($a1) + sw $a0 -244($fp) + + # IF GOTO + lw $a0, -244($fp) + bnez $a0, _cil_label_LABEL_26 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -284($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + lw $a0 -292($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -288($fp) + la $a0, data_36 + sw $a0 16($a1) + + lw $t0 -284($fp) + lw $t1 -288($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_8 + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 -276($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 -276($fp) +end_equal_8_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -280($fp) + lw $a0 12($a1) + sw $a0 -272($fp) + + # IF GOTO + lw $a0, -272($fp) + bnez $a0, _cil_label_LABEL_28 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -312($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -320($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -320($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + lw $a0 -320($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -316($fp) + la $a0, data_37 + sw $a0 16($a1) + + lw $t0 -312($fp) + lw $t1 -316($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_9 + li $a2 5 + beq $a0 $a2 _eq_int_bool_9 + li $a2 6 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -304($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -304($fp) +end_equal_9_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + lw $a0 -304($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -308($fp) + lw $a0 12($a1) + sw $a0 -300($fp) + + # IF GOTO + lw $a0, -300($fp) + bnez $a0, _cil_label_LABEL_30 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -340($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -344($fp) + lw $a0 -348($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -344($fp) + la $a0, data_38 + sw $a0 16($a1) + + lw $t0 -340($fp) + lw $t1 -344($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_10 + li $a2 5 + beq $a0 $a2 _eq_int_bool_10 + li $a2 6 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -332($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -332($fp) +end_equal_10_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -336($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -336($fp) + lw $a0 -332($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -336($fp) + lw $a0 12($a1) + sw $a0 -328($fp) + + # IF GOTO + lw $a0, -328($fp) + bnez $a0, _cil_label_LABEL_32 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -368($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -372($fp) + lw $a0 -376($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -372($fp) + la $a0, data_39 + sw $a0 16($a1) + + lw $t0 -368($fp) + lw $t1 -372($fp) + beq $t0 $zero _eq_false_11_ + beq $t1 $zero _eq_false_11_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_11 + li $a2 5 + beq $a0 $a2 _eq_int_bool_11 + li $a2 6 + bne $a0 $a2 _not_basic_type_11_ +_eq_str_11_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_11_ + beq $t3 $0 _eq_true_11_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_11_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_11_ + b _eq_true_11_ +_not_basic_type_11_: + bne $t0 $t1 _eq_false_11_ + b _eq_true_11_ +_eq_int_bool_11: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_11_ +_eq_true_11_: + li $a0 1 + sw $a0 -360($fp) + b end_equal_11_ +_eq_false_11_: + li $a0 0 + sw $a0 -360($fp) +end_equal_11_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -364($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -364($fp) + lw $a0 -360($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -364($fp) + lw $a0 12($a1) + sw $a0 -356($fp) + + # IF GOTO + lw $a0, -356($fp) + bnez $a0, _cil_label_LABEL_34 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -396($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -404($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -404($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -400($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -400($fp) + lw $a0 -404($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -400($fp) + la $a0, data_40 + sw $a0 16($a1) + + lw $t0 -396($fp) + lw $t1 -400($fp) + beq $t0 $zero _eq_false_12_ + beq $t1 $zero _eq_false_12_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_12 + li $a2 5 + beq $a0 $a2 _eq_int_bool_12 + li $a2 6 + bne $a0 $a2 _not_basic_type_12_ +_eq_str_12_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_12_ + beq $t3 $0 _eq_true_12_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_12_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_12_ + b _eq_true_12_ +_not_basic_type_12_: + bne $t0 $t1 _eq_false_12_ + b _eq_true_12_ +_eq_int_bool_12: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_12_ +_eq_true_12_: + li $a0 1 + sw $a0 -388($fp) + b end_equal_12_ +_eq_false_12_: + li $a0 0 + sw $a0 -388($fp) +end_equal_12_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -392($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -392($fp) + lw $a0 -388($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -392($fp) + lw $a0 12($a1) + sw $a0 -384($fp) + + # IF GOTO + lw $a0, -384($fp) + bnez $a0, _cil_label_LABEL_36 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -408($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -408($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -412($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -424($fp) + + # PUSHPARAM + lw $a0, -424($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -424($fp) + lw $a0 0($a1) + sw $a0 -428($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -428($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -432($fp) + lw $a2, -428($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -432($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -408($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -408($fp) + lw $a0 0($a1) + sw $a0 -416($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -416($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -420($fp) + lw $a2, -416($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -420($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -420($fp) + sw $a0, -380($fp) + + # GOTO + j _cil_label_LABEL_37 + +_cil_label_LABEL_36: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -436($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -436($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -436($fp) + sw $a0 24($a1) + + # ASSIGN + lw $a0, -436($fp) + sw $a0, -380($fp) + +_cil_label_LABEL_37: + # ASSIGN + lw $a0, -380($fp) + sw $a0, -352($fp) + + # GOTO + j _cil_label_LABEL_35 + +_cil_label_LABEL_34: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -440($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -440($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -444($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -440($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -440($fp) + sw $a0, -352($fp) + +_cil_label_LABEL_35: + # ASSIGN + lw $a0, -352($fp) + sw $a0, -324($fp) + + # GOTO + j _cil_label_LABEL_33 + +_cil_label_LABEL_32: + # ALLOCATE + la $v0 type_void + sw $v0 -448($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -452($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -452($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -456($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -468($fp) + + # PUSHPARAM + lw $a0, -468($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -468($fp) + lw $a0 0($a1) + sw $a0 -472($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -472($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -476($fp) + lw $a2, -472($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -476($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -452($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -452($fp) + lw $a0 0($a1) + sw $a0 -460($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -460($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -464($fp) + lw $a2, -460($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -464($fp) + sw $a0, -448($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -496($fp) + + # PUSHPARAM + lw $a0, -496($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -496($fp) + lw $a0 0($a1) + sw $a0 -500($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -500($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -504($fp) + lw $a2, -500($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -448($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -448($fp) + lw $a0 0($a1) + sw $a0 -524($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -524($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -528($fp) + lw $a2, -524($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -532($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -532($fp) + li $a0, 8 + sw $a0 12($a1) + + # GETATTR + lw $a1 -528($fp) + lw $a0 12($a1) + sw $a0 -512($fp) + + # GETATTR + lw $a1 -532($fp) + lw $a0 12($a1) + sw $a0 -516($fp) + + # * + lw $a0, -512($fp) + lw $a1, -516($fp) + mul $a0, $a0, $a1 + sw $a0, -508($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -520($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -520($fp) + lw $a0 -508($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -504($fp) + lw $a0 12($a1) + sw $a0 -484($fp) + + # GETATTR + lw $a1 -520($fp) + lw $a0 12($a1) + sw $a0 -488($fp) + + # - + lw $a0, -484($fp) + lw $a1, -488($fp) + sub $a0, $a0, $a1 + sw $a0, -480($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -492($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -492($fp) + lw $a0 -480($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -548($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -548($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -544($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -544($fp) + lw $a0 -548($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -544($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -544($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -536($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -536($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -540($fp) + lw $a2, -536($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -560($fp) + + # PUSHPARAM + lw $a0, -560($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -552($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -552($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -556($fp) + lw $a2, -552($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -576($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -576($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -572($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -572($fp) + lw $a0 -576($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -572($fp) + la $a0, data_41 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -572($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -564($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -564($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -568($fp) + lw $a2, -564($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -448($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -580($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -580($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -584($fp) + lw $a2, -580($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -600($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -600($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -596($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -596($fp) + lw $a0 -600($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -596($fp) + la $a0, data_42 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -596($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -588($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -588($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -592($fp) + lw $a2, -588($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -604($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -604($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -608($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -492($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -604($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -604($fp) + lw $a0 0($a1) + sw $a0 -620($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -620($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -624($fp) + lw $a2, -620($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -624($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -612($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -612($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -616($fp) + lw $a2, -612($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -640($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -640($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -636($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -636($fp) + lw $a0 -640($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -636($fp) + la $a0, data_19 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -636($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -628($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -628($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -632($fp) + lw $a2, -628($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -448($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -448($fp) + sw $a0, -324($fp) + +_cil_label_LABEL_33: + # ASSIGN + lw $a0, -324($fp) + sw $a0, -296($fp) + + # GOTO + j _cil_label_LABEL_31 + +_cil_label_LABEL_30: + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -652($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -652($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -656($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -668($fp) + + # PUSHPARAM + lw $a0, -668($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -668($fp) + lw $a0 0($a1) + sw $a0 -672($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -672($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -676($fp) + lw $a2, -672($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -676($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -652($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -652($fp) + lw $a0 0($a1) + sw $a0 -660($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -660($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -664($fp) + lw $a2, -660($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -664($fp) + lw $a0 12($a1) + sw $a0 -648($fp) + + # IF GOTO + lw $a0, -648($fp) + bnez $a0, _cil_label_LABEL_38 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -692($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -692($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -688($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -688($fp) + lw $a0 -692($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -688($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -688($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -680($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -680($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -684($fp) + lw $a2, -680($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -704($fp) + + # PUSHPARAM + lw $a0, -704($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -696($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -696($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -700($fp) + lw $a2, -696($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -720($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -720($fp) + li $a0, 23 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -716($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -716($fp) + lw $a0 -720($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -716($fp) + la $a0, data_43 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -716($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -708($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -708($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -712($fp) + lw $a2, -708($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -712($fp) + sw $a0, -644($fp) + + # GOTO + j _cil_label_LABEL_39 + +_cil_label_LABEL_38: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -736($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -736($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -732($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -732($fp) + lw $a0 -736($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -732($fp) + la $a0, data_28 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -732($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -724($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -724($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -728($fp) + lw $a2, -724($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -748($fp) + + # PUSHPARAM + lw $a0, -748($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -740($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -740($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -744($fp) + lw $a2, -740($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -764($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -764($fp) + li $a0, 19 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -760($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -760($fp) + lw $a0 -764($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -760($fp) + la $a0, data_44 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -760($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -752($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -752($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -756($fp) + lw $a2, -752($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -756($fp) + sw $a0, -644($fp) + +_cil_label_LABEL_39: + # ASSIGN + lw $a0, -644($fp) + sw $a0, -296($fp) + +_cil_label_LABEL_31: + # ASSIGN + lw $a0, -296($fp) + sw $a0, -268($fp) + + # GOTO + j _cil_label_LABEL_29 + +_cil_label_LABEL_28: + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -768($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -768($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -772($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -780($fp) + + # PUSHPARAM + lw $a0, -780($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -780($fp) + lw $a0 0($a1) + sw $a0 -784($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -784($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -788($fp) + lw $a2, -784($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -788($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -768($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 9 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -776($fp) + li $a2, 9 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -776($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -776($fp) + sw $a0, -268($fp) + +_cil_label_LABEL_29: + # ASSIGN + lw $a0, -268($fp) + sw $a0, -240($fp) + + # GOTO + j _cil_label_LABEL_27 + +_cil_label_LABEL_26: + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -792($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -792($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -796($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -804($fp) + + # PUSHPARAM + lw $a0, -804($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -804($fp) + lw $a0 0($a1) + sw $a0 -808($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -808($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -812($fp) + lw $a2, -808($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -812($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -792($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 8 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -800($fp) + li $a2, 8 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -800($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -800($fp) + sw $a0, -240($fp) + +_cil_label_LABEL_27: + # ASSIGN + lw $a0, -240($fp) + sw $a0, -212($fp) + + # GOTO + j _cil_label_LABEL_25 + +_cil_label_LABEL_24: + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -816($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -816($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -820($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -828($fp) + + # PUSHPARAM + lw $a0, -828($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -828($fp) + lw $a0 0($a1) + sw $a0 -832($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -832($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -836($fp) + lw $a2, -832($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -836($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -816($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 7 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -824($fp) + li $a2, 7 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -824($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -824($fp) + sw $a0, -212($fp) + +_cil_label_LABEL_25: + # ASSIGN + lw $a0, -212($fp) + sw $a0, -184($fp) + + # GOTO + j _cil_label_LABEL_23 + +_cil_label_LABEL_22: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -840($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -840($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -844($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -856($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -856($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -860($fp) + lw $a2, -856($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -860($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -840($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -840($fp) + lw $a0 0($a1) + sw $a0 -848($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -848($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -852($fp) + lw $a2, -848($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -852($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -864($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -864($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -868($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -880($fp) + + # PUSHPARAM + lw $a0, -880($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -880($fp) + lw $a0 0($a1) + sw $a0 -884($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -884($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -888($fp) + lw $a2, -884($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -888($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -892($fp) + + # PUSHPARAM + lw $a0, -892($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -892($fp) + lw $a0 0($a1) + sw $a0 -896($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -896($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -900($fp) + lw $a2, -896($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -900($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -864($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -864($fp) + lw $a0 0($a1) + sw $a0 -872($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -872($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -876($fp) + lw $a2, -872($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -876($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -876($fp) + sw $a0, -184($fp) + +_cil_label_LABEL_23: + # ASSIGN + lw $a0, -184($fp) + sw $a0, -156($fp) + + # GOTO + j _cil_label_LABEL_21 + +_cil_label_LABEL_20: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -916($fp) + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -908($fp) + + # PUSHPARAM + li $a0, 9 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -908($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -904($fp) + bnez $a0, _cil_label_LABEL_40 + + # PUSHPARAM + li $a0, 7 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -908($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -904($fp) + bnez $a0, _cil_label_LABEL_41 + + # PUSHPARAM + li $a0, 1 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -908($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -904($fp) + bnez $a0, _cil_label_LABEL_42 + +_cil_label_LABEL_40: + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -928($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -928($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -932($fp) + lw $a2, -928($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -932($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -920($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -920($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -924($fp) + lw $a2, -920($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -924($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -924($fp) + sw $a0, -912($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_41: + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -944($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -944($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -948($fp) + lw $a2, -944($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -948($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -916($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -916($fp) + lw $a0 0($a1) + sw $a0 -936($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -936($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -940($fp) + lw $a2, -936($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -940($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -940($fp) + sw $a0, -912($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_42: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -964($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -964($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -960($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -960($fp) + lw $a0 -964($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -960($fp) + la $a0, data_26 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -960($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -952($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -952($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -956($fp) + lw $a2, -952($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -968($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -968($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -972($fp) + lw $a2, -968($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -976($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -976($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -976($fp) + sw $a0, -912($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_43: + # ASSIGN + lw $a0, -912($fp) + sw $a0, -156($fp) + +_cil_label_LABEL_21: + # ASSIGN + lw $a0, -156($fp) + sw $a0, -128($fp) + + # GOTO + j _cil_label_LABEL_19 + +_cil_label_LABEL_18: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -980($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -980($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -984($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -996($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -996($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1000($fp) + lw $a2, -996($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -1000($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -980($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -980($fp) + lw $a0 0($a1) + sw $a0 -988($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -988($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -992($fp) + lw $a2, -988($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -992($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1004($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -1004($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1008($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -1020($fp) + + # PUSHPARAM + lw $a0, -1020($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1020($fp) + lw $a0 0($a1) + sw $a0 -1024($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1024($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1028($fp) + lw $a2, -1024($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -1028($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -1032($fp) + + # PUSHPARAM + lw $a0, -1032($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1032($fp) + lw $a0 0($a1) + sw $a0 -1036($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1036($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1040($fp) + lw $a2, -1036($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -1040($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -1004($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -1004($fp) + lw $a0 0($a1) + sw $a0 -1012($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -1012($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -1016($fp) + lw $a2, -1012($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -1016($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -1016($fp) + sw $a0, -128($fp) + +_cil_label_LABEL_19: + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_15: + # ALLOCATE + la $v0 type_void + sw $v0 -8($fp) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 1044 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A_value: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A_set_var: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A_method1: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A_method2: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # + + lw $a0, -8($fp) + lw $a1, -12($fp) + add $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_A_method3: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # - + li $a0 0 + lw $a1, -4($fp) + sub $a0, $a0, $a1 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -12($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_A_method4: + move $fp, $sp + subu $sp, $sp, 96 + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_44 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # - + lw $a0, -32($fp) + lw $a1, -36($fp) + sub $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -40($fp) + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -56($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_45 + +_cil_label_LABEL_44: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 20($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # - + lw $a0, -68($fp) + lw $a1, -72($fp) + sub $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -76($fp) + sw $a0, -60($fp) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -80($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -92($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_45: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 96 + jr $ra + +function_A_method5: + move $fp, $sp + subu $sp, $sp, 84 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + li $a0, 1 + sw $a0 12($a1) + +_cil_label_LABEL_46: + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # <= + lw $a1, -20($fp) + lw $a2, -24($fp) + sle $a0, $a1, $a2 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -28($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # IF GOTO + lw $a0, -12($fp) + bnez $a0, _cil_label_LABEL_47 + + # GOTO + j _cil_label_LABEL_48 + +_cil_label_LABEL_47: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # * + lw $a0, -36($fp) + lw $a1, -40($fp) + mul $a0, $a0, $a1 + sw $a0, -32($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -44($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # + + lw $a0, -52($fp) + lw $a1, -56($fp) + add $a0, $a0, $a1 + sw $a0, -48($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -4($fp) + + # GOTO + j _cil_label_LABEL_46 + +_cil_label_LABEL_48: + # ALLOCATE + la $v0 type_void + sw $v0 -8($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -68($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -80($fp) + addiu $sp, $sp, 84 + jr $ra + +function_B__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_B_method5: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # * + lw $a0, -8($fp) + lw $a1, -12($fp) + mul $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_C__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_C_method6: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # - + li $a0 0 + lw $a1, -4($fp) + sub $a0, $a0, $a1 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -12($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_C_method5: + move $fp, $sp + subu $sp, $sp, 52 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # * + lw $a0, -24($fp) + lw $a1, -28($fp) + mul $a0, $a0, $a1 + sw $a0, -20($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # * + lw $a0, -8($fp) + lw $a1, -12($fp) + mul $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_E__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -48($fp) + addiu $sp, $sp, 52 + jr $ra + +function_D__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_D_method7: + move $fp, $sp + subu $sp, $sp, 148 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_49 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -44($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_13_ + beq $t1 $zero _eq_false_13_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_13 + li $a2 5 + beq $a0 $a2 _eq_int_bool_13 + li $a2 6 + bne $a0 $a2 _not_basic_type_13_ +_eq_str_13_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_13_ + beq $t3 $0 _eq_true_13_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_13_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_13_ + b _eq_true_13_ +_not_basic_type_13_: + bne $t0 $t1 _eq_false_13_ + b _eq_true_13_ +_eq_int_bool_13: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_13_ +_eq_true_13_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_13_ +_eq_false_13_: + li $a0 0 + sw $a0 -36($fp) +end_equal_13_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_51 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -64($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_14_ + beq $t1 $zero _eq_false_14_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_14 + li $a2 5 + beq $a0 $a2 _eq_int_bool_14 + li $a2 6 + bne $a0 $a2 _not_basic_type_14_ +_eq_str_14_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_14_ + beq $t3 $0 _eq_true_14_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_14_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_14_ + b _eq_true_14_ +_not_basic_type_14_: + bne $t0 $t1 _eq_false_14_ + b _eq_true_14_ +_eq_int_bool_14: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_14_ +_eq_true_14_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_14_ +_eq_false_14_: + li $a0 0 + sw $a0 -56($fp) +end_equal_14_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_53 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 -84($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_15_ + beq $t1 $zero _eq_false_15_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_15 + li $a2 5 + beq $a0 $a2 _eq_int_bool_15 + li $a2 6 + bne $a0 $a2 _not_basic_type_15_ +_eq_str_15_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_15_ + beq $t3 $0 _eq_true_15_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_15_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_15_ + b _eq_true_15_ +_not_basic_type_15_: + bne $t0 $t1 _eq_false_15_ + b _eq_true_15_ +_eq_int_bool_15: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_15_ +_eq_true_15_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_15_ +_eq_false_15_: + li $a0 0 + sw $a0 -76($fp) +end_equal_15_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_55 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 3 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # - + lw $a0, -100($fp) + lw $a1, -104($fp) + sub $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -92($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_56 + +_cil_label_LABEL_55: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -116($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_56: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_54 + +_cil_label_LABEL_53: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_54: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_52 + +_cil_label_LABEL_51: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -124($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_52: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_50 + +_cil_label_LABEL_49: + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # - + li $a0 0 + lw $a1, -136($fp) + sub $a0, $a0, $a1 + sw $a0, -140($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -128($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -128($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + lw $a2, -128($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -132($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_50: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 148 + jr $ra + +function_E__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_E_method6: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 8 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # / + lw $a0, -8($fp) + lw $a1, -12($fp) + beqz $a1 _div_error_16_ + div $a0, $a0, $a1 + sw $a0, -4($fp) + b _div_end_16_ +_div_error_16_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_16_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -16($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 40 + jr $ra + +function_A2I__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A2I_c2i: + move $fp, $sp + subu $sp, $sp, 292 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_45 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_17_ + beq $t1 $zero _eq_false_17_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_17 + li $a2 5 + beq $a0 $a2 _eq_int_bool_17 + li $a2 6 + bne $a0 $a2 _not_basic_type_17_ +_eq_str_17_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_17_ + beq $t3 $0 _eq_true_17_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_17_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_17_ + b _eq_true_17_ +_not_basic_type_17_: + bne $t0 $t1 _eq_false_17_ + b _eq_true_17_ +_eq_int_bool_17: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_17_ +_eq_true_17_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_17_ +_eq_false_17_: + li $a0 0 + sw $a0 -8($fp) +end_equal_17_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_57 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_46 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_18_ + beq $t1 $zero _eq_false_18_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_18 + li $a2 5 + beq $a0 $a2 _eq_int_bool_18 + li $a2 6 + bne $a0 $a2 _not_basic_type_18_ +_eq_str_18_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_18_ + beq $t3 $0 _eq_true_18_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_18_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_18_ + b _eq_true_18_ +_not_basic_type_18_: + bne $t0 $t1 _eq_false_18_ + b _eq_true_18_ +_eq_int_bool_18: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_18_ +_eq_true_18_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_18_ +_eq_false_18_: + li $a0 0 + sw $a0 -32($fp) +end_equal_18_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_59 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_47 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_19_ + beq $t1 $zero _eq_false_19_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_19 + li $a2 5 + beq $a0 $a2 _eq_int_bool_19 + li $a2 6 + bne $a0 $a2 _not_basic_type_19_ +_eq_str_19_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_19_ + beq $t3 $0 _eq_true_19_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_19_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_19_ + b _eq_true_19_ +_not_basic_type_19_: + bne $t0 $t1 _eq_false_19_ + b _eq_true_19_ +_eq_int_bool_19: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_19_ +_eq_true_19_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_19_ +_eq_false_19_: + li $a0 0 + sw $a0 -56($fp) +end_equal_19_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_61 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_48 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_20_ + beq $t1 $zero _eq_false_20_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_20 + li $a2 5 + beq $a0 $a2 _eq_int_bool_20 + li $a2 6 + bne $a0 $a2 _not_basic_type_20_ +_eq_str_20_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_20_ + beq $t3 $0 _eq_true_20_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_20_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_20_ + b _eq_true_20_ +_not_basic_type_20_: + bne $t0 $t1 _eq_false_20_ + b _eq_true_20_ +_eq_int_bool_20: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_20_ +_eq_true_20_: + li $a0 1 + sw $a0 -80($fp) + b end_equal_20_ +_eq_false_20_: + li $a0 0 + sw $a0 -80($fp) +end_equal_20_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_63 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_49 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_21_ + beq $t1 $zero _eq_false_21_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_21 + li $a2 5 + beq $a0 $a2 _eq_int_bool_21 + li $a2 6 + bne $a0 $a2 _not_basic_type_21_ +_eq_str_21_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_21_ + beq $t3 $0 _eq_true_21_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_21_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_21_ + b _eq_true_21_ +_not_basic_type_21_: + bne $t0 $t1 _eq_false_21_ + b _eq_true_21_ +_eq_int_bool_21: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_21_ +_eq_true_21_: + li $a0 1 + sw $a0 -104($fp) + b end_equal_21_ +_eq_false_21_: + li $a0 0 + sw $a0 -104($fp) +end_equal_21_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # IF GOTO + lw $a0, -100($fp) + bnez $a0, _cil_label_LABEL_65 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_50 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_22_ + beq $t1 $zero _eq_false_22_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_22 + li $a2 5 + beq $a0 $a2 _eq_int_bool_22 + li $a2 6 + bne $a0 $a2 _not_basic_type_22_ +_eq_str_22_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_22_ + beq $t3 $0 _eq_true_22_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_22_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_22_ + b _eq_true_22_ +_not_basic_type_22_: + bne $t0 $t1 _eq_false_22_ + b _eq_true_22_ +_eq_int_bool_22: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_22_ +_eq_true_22_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_22_ +_eq_false_22_: + li $a0 0 + sw $a0 -128($fp) +end_equal_22_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_67 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -160($fp) + la $a0, data_51 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -160($fp) + beq $t0 $zero _eq_false_23_ + beq $t1 $zero _eq_false_23_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_23 + li $a2 5 + beq $a0 $a2 _eq_int_bool_23 + li $a2 6 + bne $a0 $a2 _not_basic_type_23_ +_eq_str_23_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_23_ + beq $t3 $0 _eq_true_23_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_23_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_23_ + b _eq_true_23_ +_not_basic_type_23_: + bne $t0 $t1 _eq_false_23_ + b _eq_true_23_ +_eq_int_bool_23: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_23_ +_eq_true_23_: + li $a0 1 + sw $a0 -152($fp) + b end_equal_23_ +_eq_false_23_: + li $a0 0 + sw $a0 -152($fp) +end_equal_23_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -148($fp) + + # IF GOTO + lw $a0, -148($fp) + bnez $a0, _cil_label_LABEL_69 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_52 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -184($fp) + beq $t0 $zero _eq_false_24_ + beq $t1 $zero _eq_false_24_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_24 + li $a2 5 + beq $a0 $a2 _eq_int_bool_24 + li $a2 6 + bne $a0 $a2 _not_basic_type_24_ +_eq_str_24_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_24_ + beq $t3 $0 _eq_true_24_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_24_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_24_ + b _eq_true_24_ +_not_basic_type_24_: + bne $t0 $t1 _eq_false_24_ + b _eq_true_24_ +_eq_int_bool_24: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_24_ +_eq_true_24_: + li $a0 1 + sw $a0 -176($fp) + b end_equal_24_ +_eq_false_24_: + li $a0 0 + sw $a0 -176($fp) +end_equal_24_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # IF GOTO + lw $a0, -172($fp) + bnez $a0, _cil_label_LABEL_71 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_53 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -208($fp) + beq $t0 $zero _eq_false_25_ + beq $t1 $zero _eq_false_25_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_25 + li $a2 5 + beq $a0 $a2 _eq_int_bool_25 + li $a2 6 + bne $a0 $a2 _not_basic_type_25_ +_eq_str_25_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_25_ + beq $t3 $0 _eq_true_25_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_25_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_25_ + b _eq_true_25_ +_not_basic_type_25_: + bne $t0 $t1 _eq_false_25_ + b _eq_true_25_ +_eq_int_bool_25: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_25_ +_eq_true_25_: + li $a0 1 + sw $a0 -200($fp) + b end_equal_25_ +_eq_false_25_: + li $a0 0 + sw $a0 -200($fp) +end_equal_25_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -200($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # IF GOTO + lw $a0, -196($fp) + bnez $a0, _cil_label_LABEL_73 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_54 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_26_ + beq $t1 $zero _eq_false_26_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_26_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_26 + li $a2 5 + beq $a0 $a2 _eq_int_bool_26 + li $a2 6 + bne $a0 $a2 _not_basic_type_26_ +_eq_str_26_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_26_ + beq $t3 $0 _eq_true_26_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_26_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_26_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_26_ + b _eq_true_26_ +_not_basic_type_26_: + bne $t0 $t1 _eq_false_26_ + b _eq_true_26_ +_eq_int_bool_26: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_26_ +_eq_true_26_: + li $a0 1 + sw $a0 -224($fp) + b end_equal_26_ +_eq_false_26_: + li $a0 0 + sw $a0 -224($fp) +end_equal_26_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -224($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -228($fp) + lw $a0 12($a1) + sw $a0 -220($fp) + + # IF GOTO + lw $a0, -220($fp) + bnez $a0, _cil_label_LABEL_75 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -240($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -240($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + lw $a2, -240($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -248($fp) + sw $a0, -216($fp) + + # GOTO + j _cil_label_LABEL_76 + +_cil_label_LABEL_75: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + li $a0, 9 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -252($fp) + sw $a0, -216($fp) + +_cil_label_LABEL_76: + # ASSIGN + lw $a0, -216($fp) + sw $a0, -192($fp) + + # GOTO + j _cil_label_LABEL_74 + +_cil_label_LABEL_73: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + li $a0, 8 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -256($fp) + sw $a0, -192($fp) + +_cil_label_LABEL_74: + # ASSIGN + lw $a0, -192($fp) + sw $a0, -168($fp) + + # GOTO + j _cil_label_LABEL_72 + +_cil_label_LABEL_71: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 7 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -260($fp) + sw $a0, -168($fp) + +_cil_label_LABEL_72: + # ASSIGN + lw $a0, -168($fp) + sw $a0, -144($fp) + + # GOTO + j _cil_label_LABEL_70 + +_cil_label_LABEL_69: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + li $a0, 6 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -144($fp) + +_cil_label_LABEL_70: + # ASSIGN + lw $a0, -144($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_68 + +_cil_label_LABEL_67: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 5 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -268($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_68: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -96($fp) + + # GOTO + j _cil_label_LABEL_66 + +_cil_label_LABEL_65: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + li $a0, 4 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -96($fp) + +_cil_label_LABEL_66: + # ASSIGN + lw $a0, -96($fp) + sw $a0, -72($fp) + + # GOTO + j _cil_label_LABEL_64 + +_cil_label_LABEL_63: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 3 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -276($fp) + sw $a0, -72($fp) + +_cil_label_LABEL_64: + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_62 + +_cil_label_LABEL_61: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + li $a0, 2 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_62: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_60 + +_cil_label_LABEL_59: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -284($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_60: + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_58 + +_cil_label_LABEL_57: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_58: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 292 + jr $ra + +function_A2I_i2c: + move $fp, $sp + subu $sp, $sp, 296 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_27_ + beq $t1 $zero _eq_false_27_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_27_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_27 + li $a2 5 + beq $a0 $a2 _eq_int_bool_27 + li $a2 6 + bne $a0 $a2 _not_basic_type_27_ +_eq_str_27_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_27_ + beq $t3 $0 _eq_true_27_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_27_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_27_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_27_ + b _eq_true_27_ +_not_basic_type_27_: + bne $t0 $t1 _eq_false_27_ + b _eq_true_27_ +_eq_int_bool_27: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_27_ +_eq_true_27_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_27_ +_eq_false_27_: + li $a0 0 + sw $a0 -8($fp) +end_equal_27_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_77 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -36($fp) + beq $t0 $zero _eq_false_28_ + beq $t1 $zero _eq_false_28_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_28_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_28 + li $a2 5 + beq $a0 $a2 _eq_int_bool_28 + li $a2 6 + bne $a0 $a2 _not_basic_type_28_ +_eq_str_28_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_28_ + beq $t3 $0 _eq_true_28_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_28_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_28_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_28_ + b _eq_true_28_ +_not_basic_type_28_: + bne $t0 $t1 _eq_false_28_ + b _eq_true_28_ +_eq_int_bool_28: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_28_ +_eq_true_28_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_28_ +_eq_false_28_: + li $a0 0 + sw $a0 -28($fp) +end_equal_28_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_79 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_29_ + beq $t1 $zero _eq_false_29_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_29_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_29 + li $a2 5 + beq $a0 $a2 _eq_int_bool_29 + li $a2 6 + bne $a0 $a2 _not_basic_type_29_ +_eq_str_29_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_29_ + beq $t3 $0 _eq_true_29_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_29_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_29_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_29_ + b _eq_true_29_ +_not_basic_type_29_: + bne $t0 $t1 _eq_false_29_ + b _eq_true_29_ +_eq_int_bool_29: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_29_ +_eq_true_29_: + li $a0 1 + sw $a0 -48($fp) + b end_equal_29_ +_eq_false_29_: + li $a0 0 + sw $a0 -48($fp) +end_equal_29_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_81 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 3 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -76($fp) + beq $t0 $zero _eq_false_30_ + beq $t1 $zero _eq_false_30_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_30_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_30 + li $a2 5 + beq $a0 $a2 _eq_int_bool_30 + li $a2 6 + bne $a0 $a2 _not_basic_type_30_ +_eq_str_30_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_30_ + beq $t3 $0 _eq_true_30_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_30_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_30_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_30_ + b _eq_true_30_ +_not_basic_type_30_: + bne $t0 $t1 _eq_false_30_ + b _eq_true_30_ +_eq_int_bool_30: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_30_ +_eq_true_30_: + li $a0 1 + sw $a0 -68($fp) + b end_equal_30_ +_eq_false_30_: + li $a0 0 + sw $a0 -68($fp) +end_equal_30_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # IF GOTO + lw $a0, -64($fp) + bnez $a0, _cil_label_LABEL_83 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 4 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -96($fp) + beq $t0 $zero _eq_false_31_ + beq $t1 $zero _eq_false_31_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_31_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_31 + li $a2 5 + beq $a0 $a2 _eq_int_bool_31 + li $a2 6 + bne $a0 $a2 _not_basic_type_31_ +_eq_str_31_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_31_ + beq $t3 $0 _eq_true_31_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_31_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_31_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_31_ + b _eq_true_31_ +_not_basic_type_31_: + bne $t0 $t1 _eq_false_31_ + b _eq_true_31_ +_eq_int_bool_31: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_31_ +_eq_true_31_: + li $a0 1 + sw $a0 -88($fp) + b end_equal_31_ +_eq_false_31_: + li $a0 0 + sw $a0 -88($fp) +end_equal_31_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # IF GOTO + lw $a0, -84($fp) + bnez $a0, _cil_label_LABEL_85 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 5 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -116($fp) + beq $t0 $zero _eq_false_32_ + beq $t1 $zero _eq_false_32_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_32_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_32 + li $a2 5 + beq $a0 $a2 _eq_int_bool_32 + li $a2 6 + bne $a0 $a2 _not_basic_type_32_ +_eq_str_32_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_32_ + beq $t3 $0 _eq_true_32_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_32_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_32_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_32_ + b _eq_true_32_ +_not_basic_type_32_: + bne $t0 $t1 _eq_false_32_ + b _eq_true_32_ +_eq_int_bool_32: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_32_ +_eq_true_32_: + li $a0 1 + sw $a0 -108($fp) + b end_equal_32_ +_eq_false_32_: + li $a0 0 + sw $a0 -108($fp) +end_equal_32_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # IF GOTO + lw $a0, -104($fp) + bnez $a0, _cil_label_LABEL_87 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 6 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_33_ + beq $t1 $zero _eq_false_33_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_33_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_33 + li $a2 5 + beq $a0 $a2 _eq_int_bool_33 + li $a2 6 + bne $a0 $a2 _not_basic_type_33_ +_eq_str_33_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_33_ + beq $t3 $0 _eq_true_33_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_33_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_33_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_33_ + b _eq_true_33_ +_not_basic_type_33_: + bne $t0 $t1 _eq_false_33_ + b _eq_true_33_ +_eq_int_bool_33: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_33_ +_eq_true_33_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_33_ +_eq_false_33_: + li $a0 0 + sw $a0 -128($fp) +end_equal_33_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_89 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 7 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -156($fp) + beq $t0 $zero _eq_false_34_ + beq $t1 $zero _eq_false_34_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_34_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_34 + li $a2 5 + beq $a0 $a2 _eq_int_bool_34 + li $a2 6 + bne $a0 $a2 _not_basic_type_34_ +_eq_str_34_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_34_ + beq $t3 $0 _eq_true_34_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_34_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_34_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_34_ + b _eq_true_34_ +_not_basic_type_34_: + bne $t0 $t1 _eq_false_34_ + b _eq_true_34_ +_eq_int_bool_34: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_34_ +_eq_true_34_: + li $a0 1 + sw $a0 -148($fp) + b end_equal_34_ +_eq_false_34_: + li $a0 0 + sw $a0 -148($fp) +end_equal_34_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -144($fp) + + # IF GOTO + lw $a0, -144($fp) + bnez $a0, _cil_label_LABEL_91 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 8 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_35_ + beq $t1 $zero _eq_false_35_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_35_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_35 + li $a2 5 + beq $a0 $a2 _eq_int_bool_35 + li $a2 6 + bne $a0 $a2 _not_basic_type_35_ +_eq_str_35_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_35_ + beq $t3 $0 _eq_true_35_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_35_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_35_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_35_ + b _eq_true_35_ +_not_basic_type_35_: + bne $t0 $t1 _eq_false_35_ + b _eq_true_35_ +_eq_int_bool_35: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_35_ +_eq_true_35_: + li $a0 1 + sw $a0 -168($fp) + b end_equal_35_ +_eq_false_35_: + li $a0 0 + sw $a0 -168($fp) +end_equal_35_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # IF GOTO + lw $a0, -164($fp) + bnez $a0, _cil_label_LABEL_93 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + li $a0, 9 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -196($fp) + beq $t0 $zero _eq_false_36_ + beq $t1 $zero _eq_false_36_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_36_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_36 + li $a2 5 + beq $a0 $a2 _eq_int_bool_36 + li $a2 6 + bne $a0 $a2 _not_basic_type_36_ +_eq_str_36_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_36_ + beq $t3 $0 _eq_true_36_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_36_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_36_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_36_ + b _eq_true_36_ +_not_basic_type_36_: + bne $t0 $t1 _eq_false_36_ + b _eq_true_36_ +_eq_int_bool_36: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_36_ +_eq_true_36_: + li $a0 1 + sw $a0 -188($fp) + b end_equal_36_ +_eq_false_36_: + li $a0 0 + sw $a0 -188($fp) +end_equal_36_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -192($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -192($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -192($fp) + lw $a0 12($a1) + sw $a0 -184($fp) + + # IF GOTO + lw $a0, -184($fp) + bnez $a0, _cil_label_LABEL_95 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -200($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -200($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + lw $a2, -200($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -208($fp) + sw $a0, -180($fp) + + # GOTO + j _cil_label_LABEL_96 + +_cil_label_LABEL_95: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -216($fp) + la $a0, data_54 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -216($fp) + sw $a0, -180($fp) + +_cil_label_LABEL_96: + # ASSIGN + lw $a0, -180($fp) + sw $a0, -160($fp) + + # GOTO + j _cil_label_LABEL_94 + +_cil_label_LABEL_93: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + lw $a0 -228($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -224($fp) + la $a0, data_53 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, -160($fp) + +_cil_label_LABEL_94: + # ASSIGN + lw $a0, -160($fp) + sw $a0, -140($fp) + + # GOTO + j _cil_label_LABEL_92 + +_cil_label_LABEL_91: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_52 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -232($fp) + sw $a0, -140($fp) + +_cil_label_LABEL_92: + # ASSIGN + lw $a0, -140($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_90 + +_cil_label_LABEL_89: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -244($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + lw $a0 -244($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -240($fp) + la $a0, data_51 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -240($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_90: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -100($fp) + + # GOTO + j _cil_label_LABEL_88 + +_cil_label_LABEL_87: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + lw $a0 -252($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -248($fp) + la $a0, data_50 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -248($fp) + sw $a0, -100($fp) + +_cil_label_LABEL_88: + # ASSIGN + lw $a0, -100($fp) + sw $a0, -80($fp) + + # GOTO + j _cil_label_LABEL_86 + +_cil_label_LABEL_85: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_49 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -256($fp) + sw $a0, -80($fp) + +_cil_label_LABEL_86: + # ASSIGN + lw $a0, -80($fp) + sw $a0, -60($fp) + + # GOTO + j _cil_label_LABEL_84 + +_cil_label_LABEL_83: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + lw $a0 -268($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -264($fp) + la $a0, data_48 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -60($fp) + +_cil_label_LABEL_84: + # ASSIGN + lw $a0, -60($fp) + sw $a0, -40($fp) + + # GOTO + j _cil_label_LABEL_82 + +_cil_label_LABEL_81: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -272($fp) + la $a0, data_47 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -40($fp) + +_cil_label_LABEL_82: + # ASSIGN + lw $a0, -40($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_80 + +_cil_label_LABEL_79: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + lw $a0 -284($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -280($fp) + la $a0, data_46 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_80: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_78 + +_cil_label_LABEL_77: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + lw $a0 -292($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -288($fp) + la $a0, data_45 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_78: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 296 + jr $ra + +function_A2I_a2i: + move $fp, $sp + subu $sp, $sp, 228 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_37_ + beq $t1 $zero _eq_false_37_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_37_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_37 + li $a2 5 + beq $a0 $a2 _eq_int_bool_37 + li $a2 6 + bne $a0 $a2 _not_basic_type_37_ +_eq_str_37_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_37_ + beq $t3 $0 _eq_true_37_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_37_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_37_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_37_ + b _eq_true_37_ +_not_basic_type_37_: + bne $t0 $t1 _eq_false_37_ + b _eq_true_37_ +_eq_int_bool_37: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_37_ +_eq_true_37_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_37_ +_eq_false_37_: + li $a0 0 + sw $a0 -8($fp) +end_equal_37_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_97 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_55 + sw $a0 16($a1) + + lw $t0 -48($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_38_ + beq $t1 $zero _eq_false_38_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_38_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_38 + li $a2 5 + beq $a0 $a2 _eq_int_bool_38 + li $a2 6 + bne $a0 $a2 _not_basic_type_38_ +_eq_str_38_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_38_ + beq $t3 $0 _eq_true_38_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_38_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_38_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_38_ + b _eq_true_38_ +_not_basic_type_38_: + bne $t0 $t1 _eq_false_38_ + b _eq_true_38_ +_eq_int_bool_38: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_38_ +_eq_true_38_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_38_ +_eq_false_38_: + li $a0 0 + sw $a0 -36($fp) +end_equal_38_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_99 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_56 + sw $a0 16($a1) + + lw $t0 -88($fp) + lw $t1 -100($fp) + beq $t0 $zero _eq_false_39_ + beq $t1 $zero _eq_false_39_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_39_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_39 + li $a2 5 + beq $a0 $a2 _eq_int_bool_39 + li $a2 6 + bne $a0 $a2 _not_basic_type_39_ +_eq_str_39_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_39_ + beq $t3 $0 _eq_true_39_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_39_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_39_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_39_ + b _eq_true_39_ +_not_basic_type_39_: + bne $t0 $t1 _eq_false_39_ + b _eq_true_39_ +_eq_int_bool_39: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_39_ +_eq_true_39_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_39_ +_eq_false_39_: + li $a0 0 + sw $a0 -76($fp) +end_equal_39_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_101 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -112($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_102 + +_cil_label_LABEL_101: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -140($fp) + + # - + lw $a0, -136($fp) + lw $a1, -140($fp) + sub $a0, $a0, $a1 + sw $a0, -132($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -132($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -124($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -124($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + lw $a2, -124($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -128($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_102: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_100 + +_cil_label_LABEL_99: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -212($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # GETATTR + lw $a1 -216($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # - + lw $a0, -196($fp) + lw $a1, -200($fp) + sub $a0, $a0, $a1 + sw $a0, -192($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -204($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -220($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -184($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -184($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + lw $a2, -184($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -188($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # - + li $a0 0 + lw $a1, -164($fp) + sub $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_100: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_98 + +_cil_label_LABEL_97: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_98: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 228 + jr $ra + +function_A2I_a2i_aux: + move $fp, $sp + subu $sp, $sp, 116 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_103: + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_104 + + # GOTO + j _cil_label_LABEL_105 + +_cil_label_LABEL_104: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # * + lw $a0, -60($fp) + lw $a1, -64($fp) + mul $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # + + lw $a0, -44($fp) + lw $a1, -48($fp) + add $a0, $a0, $a1 + sw $a0, -40($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_103 + +_cil_label_LABEL_105: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 116 + jr $ra + +function_A2I_i2a: + move $fp, $sp + subu $sp, $sp, 120 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_40_ + beq $t1 $zero _eq_false_40_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_40_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_40 + li $a2 5 + beq $a0 $a2 _eq_int_bool_40 + li $a2 6 + bne $a0 $a2 _not_basic_type_40_ +_eq_str_40_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_40_ + beq $t3 $0 _eq_true_40_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_40_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_40_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_40_ + b _eq_true_40_ +_not_basic_type_40_: + bne $t0 $t1 _eq_false_40_ + b _eq_true_40_ +_eq_int_bool_40: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_40_ +_eq_true_40_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_40_ +_eq_false_40_: + li $a0 0 + sw $a0 -8($fp) +end_equal_40_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_106 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # < + lw $a1, -32($fp) + lw $a2, -36($fp) + slt $a0, $a1, $a2 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_108 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_55 + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # - + li $a0 0 + lw $a1, -88($fp) + sub $a0, $a0, $a1 + sw $a0, -92($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # * + lw $a0, -76($fp) + lw $a1, -80($fp) + mul $a0, $a0, $a1 + sw $a0, -72($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_109 + +_cil_label_LABEL_108: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_109: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_107 + +_cil_label_LABEL_106: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_45 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_107: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 120 + jr $ra + +function_A2I_i2a_aux: + move $fp, $sp + subu $sp, $sp, 108 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_41_ + beq $t1 $zero _eq_false_41_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_41_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_41 + li $a2 5 + beq $a0 $a2 _eq_int_bool_41 + li $a2 6 + bne $a0 $a2 _not_basic_type_41_ +_eq_str_41_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_41_ + beq $t3 $0 _eq_true_41_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_41_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_41_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_41_ + b _eq_true_41_ +_not_basic_type_41_: + bne $t0 $t1 _eq_false_41_ + b _eq_true_41_ +_eq_int_bool_41: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_41_ +_eq_true_41_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_41_ +_eq_false_41_: + li $a0 0 + sw $a0 -8($fp) +end_equal_41_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_110 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # / + lw $a0, -24($fp) + lw $a1, -28($fp) + beqz $a1 _div_error_42_ + div $a0, $a0, $a1 + sw $a0, -20($fp) + b _div_end_42_ +_div_error_42_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_42_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # * + lw $a0, -84($fp) + lw $a1, -88($fp) + mul $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # - + lw $a0, -68($fp) + lw $a1, -72($fp) + sub $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_111 + +_cil_label_LABEL_110: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_111: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 108 + jr $ra + + +##################################### + diff --git a/tests/codegen/arith_input.txt b/tests/codegen/arith_input.txt new file mode 100644 index 00000000..83e05b1e --- /dev/null +++ b/tests/codegen/arith_input.txt @@ -0,0 +1,13 @@ +a +1 +b +c +0 +d +e +f +g +h +j +5 +q diff --git a/tests/codegen/arith_output.txt b/tests/codegen/arith_output.txt new file mode 100644 index 00000000..44b4ce73 --- /dev/null +++ b/tests/codegen/arith_output.txt @@ -0,0 +1,158 @@ +number 0 is even! +Class type is now A + + To add a number to 0 ...enter a: + To negate 0 ...enter b: + To find the difference between 0 and another number...enter c: + To find the factorial of 0 ...enter d: + To square 0 ...enter e: + To cube 0 ...enter f: + To find out if 0 is a multiple of 3...enter g: + To divide 0 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + + +Please enter a number... number 1 is odd! +Class type is now B + + To add a number to 1 ...enter a: + To negate 1 ...enter b: + To find the difference between 1 and another number...enter c: + To find the factorial of 1 ...enter d: + To square 1 ...enter e: + To cube 1 ...enter f: + To find out if 1 is a multiple of 3...enter g: + To divide 1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number -1 is odd! +Class type is now C + + To add a number to -1 ...enter a: + To negate -1 ...enter b: + To find the difference between -1 and another number...enter c: + To find the factorial of -1 ...enter d: + To square -1 ...enter e: + To cube -1 ...enter f: + To find out if -1 is a multiple of 3...enter g: + To divide -1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + + +Please enter a number... number 1 is odd! +Class type is now D + + To add a number to 1 ...enter a: + To negate 1 ...enter b: + To find the difference between 1 and another number...enter c: + To find the factorial of 1 ...enter d: + To square 1 ...enter e: + To cube 1 ...enter f: + To find out if 1 is a multiple of 3...enter g: + To divide 1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 1 is odd! +Class type is now E + + To add a number to 1 ...enter a: + To negate 1 ...enter b: + To find the difference between 1 and another number...enter c: + To find the factorial of 1 ...enter d: + To square 1 ...enter e: + To cube 1 ...enter f: + To find out if 1 is a multiple of 3...enter g: + To divide 1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 1 is odd! +Class type is now E + + To add a number to 1 ...enter a: + To negate 1 ...enter b: + To find the difference between 1 and another number...enter c: + To find the factorial of 1 ...enter d: + To square 1 ...enter e: + To cube 1 ...enter f: + To find out if 1 is a multiple of 3...enter g: + To divide 1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 1 is odd! +Class type is now E + + To add a number to 1 ...enter a: + To negate 1 ...enter b: + To find the difference between 1 and another number...enter c: + To find the factorial of 1 ...enter d: + To square 1 ...enter e: + To cube 1 ...enter f: + To find out if 1 is a multiple of 3...enter g: + To divide 1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 1 is not divisible by 3. +number 1 is odd! +Class type is now E + + To add a number to 1 ...enter a: + To negate 1 ...enter b: + To find the difference between 1 and another number...enter c: + To find the factorial of 1 ...enter d: + To square 1 ...enter e: + To cube 1 ...enter f: + To find out if 1 is a multiple of 3...enter g: + To divide 1 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 1 is equal to 0 times 8 with a remainder of 1 +number 0 is even! +Class type is now A + + To add a number to 0 ...enter a: + To negate 0 ...enter b: + To find the difference between 0 and another number...enter c: + To find the factorial of 0 ...enter d: + To square 0 ...enter e: + To cube 0 ...enter f: + To find out if 0 is a multiple of 3...enter g: + To divide 0 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 0 is even! +Class type is now A + + To add a number to 0 ...enter a: + To negate 0 ...enter b: + To find the difference between 0 and another number...enter c: + To find the factorial of 0 ...enter d: + To square 0 ...enter e: + To cube 0 ...enter f: + To find out if 0 is a multiple of 3...enter g: + To divide 0 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + +number 0 is even! +Class type is now A + + To add a number to 0 ...enter a: + To negate 0 ...enter b: + To find the difference between 0 and another number...enter c: + To find the factorial of 0 ...enter d: + To square 0 ...enter e: + To cube 0 ...enter f: + To find out if 0 is a multiple of 3...enter g: + To divide 0 by 8...enter h: + To get a new number...enter j: + To quit...enter q: + diff --git a/tests/codegen/atoi.mips b/tests/codegen/atoi.mips new file mode 100644 index 00000000..eeed088a --- /dev/null +++ b/tests/codegen/atoi.mips @@ -0,0 +1,7719 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "678987" + data_2: .align 2 + .asciiz " == " + data_3: .align 2 + .asciiz "\n" + data_4: .align 2 + .asciiz "0" + data_5: .align 2 + .asciiz "1" + data_6: .align 2 + .asciiz "2" + data_7: .align 2 + .asciiz "3" + data_8: .align 2 + .asciiz "4" + data_9: .align 2 + .asciiz "5" + data_10: .align 2 + .asciiz "6" + data_11: .align 2 + .asciiz "7" + data_12: .align 2 + .asciiz "8" + data_13: .align 2 + .asciiz "9" + data_14: .align 2 + .asciiz "Abort called from class A2I\n" + data_15: .align 2 + .asciiz "-" + data_16: .align 2 + .asciiz "+" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_A2I: .align 2 + .asciiz "A2I" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_A2I + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type A2I + li $a0 12 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type A2I + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A2I_c2i + sw $t1 12($v0) + la $t1 function_A2I_i2c + sw $t1 16($v0) + la $t1 function_A2I_a2i + sw $t1 20($v0) + la $t1 function_A2I_a2i_aux + sw $t1 24($v0) + la $t1 function_A2I_i2a + sw $t1 28($v0) + la $t1 function_A2I_i2a_aux + sw $t1 32($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 92 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 6 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 678987 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -80($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A2I__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A2I_c2i: + move $fp, $sp + subu $sp, $sp, 316 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_4 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -8($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_5 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -32($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_6 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -56($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_7 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_4 + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -80($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -80($fp) +end_equal_4_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_8 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_5 + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -104($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -104($fp) +end_equal_5_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # IF GOTO + lw $a0, -100($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_9 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_6 + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -128($fp) +end_equal_6_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -160($fp) + la $a0, data_10 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -160($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_7 + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 -152($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 -152($fp) +end_equal_7_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -148($fp) + + # IF GOTO + lw $a0, -148($fp) + bnez $a0, _cil_label_LABEL_12 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_11 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -184($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_8 + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 -176($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 -176($fp) +end_equal_8_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # IF GOTO + lw $a0, -172($fp) + bnez $a0, _cil_label_LABEL_14 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_12 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -208($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_9 + li $a2 5 + beq $a0 $a2 _eq_int_bool_9 + li $a2 6 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -200($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -200($fp) +end_equal_9_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -200($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # IF GOTO + lw $a0, -196($fp) + bnez $a0, _cil_label_LABEL_16 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_13 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_10 + li $a2 5 + beq $a0 $a2 _eq_int_bool_10 + li $a2 6 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -224($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -224($fp) +end_equal_10_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -224($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -228($fp) + lw $a0 12($a1) + sw $a0 -220($fp) + + # IF GOTO + lw $a0, -220($fp) + bnez $a0, _cil_label_LABEL_18 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -240($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_14 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -256($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -240($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -240($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -264($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -264($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + lw $a2, -264($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -216($fp) + + # GOTO + j _cil_label_LABEL_19 + +_cil_label_LABEL_18: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 9 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -276($fp) + sw $a0, -216($fp) + +_cil_label_LABEL_19: + # ASSIGN + lw $a0, -216($fp) + sw $a0, -192($fp) + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + li $a0, 8 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -192($fp) + +_cil_label_LABEL_17: + # ASSIGN + lw $a0, -192($fp) + sw $a0, -168($fp) + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_14: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 7 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -284($fp) + sw $a0, -168($fp) + +_cil_label_LABEL_15: + # ASSIGN + lw $a0, -168($fp) + sw $a0, -144($fp) + + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_12: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + li $a0, 6 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, -144($fp) + +_cil_label_LABEL_13: + # ASSIGN + lw $a0, -144($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 5 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -292($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_11: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -96($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -296($fp) + li $a0, 4 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -296($fp) + sw $a0, -96($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -96($fp) + sw $a0, -72($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + li $a0, 3 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -300($fp) + sw $a0, -72($fp) + +_cil_label_LABEL_7: + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 2 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -308($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -312($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -312($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 316 + jr $ra + +function_A2I_i2c: + move $fp, $sp + subu $sp, $sp, 320 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_11_ + beq $t1 $zero _eq_false_11_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_11 + li $a2 5 + beq $a0 $a2 _eq_int_bool_11 + li $a2 6 + bne $a0 $a2 _not_basic_type_11_ +_eq_str_11_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_11_ + beq $t3 $0 _eq_true_11_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_11_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_11_ + b _eq_true_11_ +_not_basic_type_11_: + bne $t0 $t1 _eq_false_11_ + b _eq_true_11_ +_eq_int_bool_11: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_11_ +_eq_true_11_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_11_ +_eq_false_11_: + li $a0 0 + sw $a0 -8($fp) +end_equal_11_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_20 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -36($fp) + beq $t0 $zero _eq_false_12_ + beq $t1 $zero _eq_false_12_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_12 + li $a2 5 + beq $a0 $a2 _eq_int_bool_12 + li $a2 6 + bne $a0 $a2 _not_basic_type_12_ +_eq_str_12_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_12_ + beq $t3 $0 _eq_true_12_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_12_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_12_ + b _eq_true_12_ +_not_basic_type_12_: + bne $t0 $t1 _eq_false_12_ + b _eq_true_12_ +_eq_int_bool_12: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_12_ +_eq_true_12_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_12_ +_eq_false_12_: + li $a0 0 + sw $a0 -28($fp) +end_equal_12_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_22 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_13_ + beq $t1 $zero _eq_false_13_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_13 + li $a2 5 + beq $a0 $a2 _eq_int_bool_13 + li $a2 6 + bne $a0 $a2 _not_basic_type_13_ +_eq_str_13_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_13_ + beq $t3 $0 _eq_true_13_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_13_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_13_ + b _eq_true_13_ +_not_basic_type_13_: + bne $t0 $t1 _eq_false_13_ + b _eq_true_13_ +_eq_int_bool_13: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_13_ +_eq_true_13_: + li $a0 1 + sw $a0 -48($fp) + b end_equal_13_ +_eq_false_13_: + li $a0 0 + sw $a0 -48($fp) +end_equal_13_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_24 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 3 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -76($fp) + beq $t0 $zero _eq_false_14_ + beq $t1 $zero _eq_false_14_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_14 + li $a2 5 + beq $a0 $a2 _eq_int_bool_14 + li $a2 6 + bne $a0 $a2 _not_basic_type_14_ +_eq_str_14_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_14_ + beq $t3 $0 _eq_true_14_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_14_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_14_ + b _eq_true_14_ +_not_basic_type_14_: + bne $t0 $t1 _eq_false_14_ + b _eq_true_14_ +_eq_int_bool_14: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_14_ +_eq_true_14_: + li $a0 1 + sw $a0 -68($fp) + b end_equal_14_ +_eq_false_14_: + li $a0 0 + sw $a0 -68($fp) +end_equal_14_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # IF GOTO + lw $a0, -64($fp) + bnez $a0, _cil_label_LABEL_26 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 4 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -96($fp) + beq $t0 $zero _eq_false_15_ + beq $t1 $zero _eq_false_15_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_15 + li $a2 5 + beq $a0 $a2 _eq_int_bool_15 + li $a2 6 + bne $a0 $a2 _not_basic_type_15_ +_eq_str_15_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_15_ + beq $t3 $0 _eq_true_15_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_15_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_15_ + b _eq_true_15_ +_not_basic_type_15_: + bne $t0 $t1 _eq_false_15_ + b _eq_true_15_ +_eq_int_bool_15: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_15_ +_eq_true_15_: + li $a0 1 + sw $a0 -88($fp) + b end_equal_15_ +_eq_false_15_: + li $a0 0 + sw $a0 -88($fp) +end_equal_15_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # IF GOTO + lw $a0, -84($fp) + bnez $a0, _cil_label_LABEL_28 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 5 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -116($fp) + beq $t0 $zero _eq_false_16_ + beq $t1 $zero _eq_false_16_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_16_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_16 + li $a2 5 + beq $a0 $a2 _eq_int_bool_16 + li $a2 6 + bne $a0 $a2 _not_basic_type_16_ +_eq_str_16_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_16_ + beq $t3 $0 _eq_true_16_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_16_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_16_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_16_ + b _eq_true_16_ +_not_basic_type_16_: + bne $t0 $t1 _eq_false_16_ + b _eq_true_16_ +_eq_int_bool_16: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_16_ +_eq_true_16_: + li $a0 1 + sw $a0 -108($fp) + b end_equal_16_ +_eq_false_16_: + li $a0 0 + sw $a0 -108($fp) +end_equal_16_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # IF GOTO + lw $a0, -104($fp) + bnez $a0, _cil_label_LABEL_30 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 6 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_17_ + beq $t1 $zero _eq_false_17_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_17 + li $a2 5 + beq $a0 $a2 _eq_int_bool_17 + li $a2 6 + bne $a0 $a2 _not_basic_type_17_ +_eq_str_17_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_17_ + beq $t3 $0 _eq_true_17_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_17_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_17_ + b _eq_true_17_ +_not_basic_type_17_: + bne $t0 $t1 _eq_false_17_ + b _eq_true_17_ +_eq_int_bool_17: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_17_ +_eq_true_17_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_17_ +_eq_false_17_: + li $a0 0 + sw $a0 -128($fp) +end_equal_17_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_32 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 7 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -156($fp) + beq $t0 $zero _eq_false_18_ + beq $t1 $zero _eq_false_18_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_18 + li $a2 5 + beq $a0 $a2 _eq_int_bool_18 + li $a2 6 + bne $a0 $a2 _not_basic_type_18_ +_eq_str_18_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_18_ + beq $t3 $0 _eq_true_18_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_18_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_18_ + b _eq_true_18_ +_not_basic_type_18_: + bne $t0 $t1 _eq_false_18_ + b _eq_true_18_ +_eq_int_bool_18: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_18_ +_eq_true_18_: + li $a0 1 + sw $a0 -148($fp) + b end_equal_18_ +_eq_false_18_: + li $a0 0 + sw $a0 -148($fp) +end_equal_18_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -144($fp) + + # IF GOTO + lw $a0, -144($fp) + bnez $a0, _cil_label_LABEL_34 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 8 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_19_ + beq $t1 $zero _eq_false_19_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_19 + li $a2 5 + beq $a0 $a2 _eq_int_bool_19 + li $a2 6 + bne $a0 $a2 _not_basic_type_19_ +_eq_str_19_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_19_ + beq $t3 $0 _eq_true_19_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_19_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_19_ + b _eq_true_19_ +_not_basic_type_19_: + bne $t0 $t1 _eq_false_19_ + b _eq_true_19_ +_eq_int_bool_19: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_19_ +_eq_true_19_: + li $a0 1 + sw $a0 -168($fp) + b end_equal_19_ +_eq_false_19_: + li $a0 0 + sw $a0 -168($fp) +end_equal_19_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # IF GOTO + lw $a0, -164($fp) + bnez $a0, _cil_label_LABEL_36 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + li $a0, 9 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -196($fp) + beq $t0 $zero _eq_false_20_ + beq $t1 $zero _eq_false_20_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_20 + li $a2 5 + beq $a0 $a2 _eq_int_bool_20 + li $a2 6 + bne $a0 $a2 _not_basic_type_20_ +_eq_str_20_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_20_ + beq $t3 $0 _eq_true_20_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_20_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_20_ + b _eq_true_20_ +_not_basic_type_20_: + bne $t0 $t1 _eq_false_20_ + b _eq_true_20_ +_eq_int_bool_20: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_20_ +_eq_true_20_: + li $a0 1 + sw $a0 -188($fp) + b end_equal_20_ +_eq_false_20_: + li $a0 0 + sw $a0 -188($fp) +end_equal_20_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -192($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -192($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -192($fp) + lw $a0 12($a1) + sw $a0 -184($fp) + + # IF GOTO + lw $a0, -184($fp) + bnez $a0, _cil_label_LABEL_38 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -200($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -200($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -216($fp) + la $a0, data_14 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -216($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -200($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -200($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -224($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -224($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + lw $a2, -224($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -232($fp) + sw $a0, -180($fp) + + # GOTO + j _cil_label_LABEL_39 + +_cil_label_LABEL_38: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -244($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + lw $a0 -244($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -240($fp) + la $a0, data_13 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -240($fp) + sw $a0, -180($fp) + +_cil_label_LABEL_39: + # ASSIGN + lw $a0, -180($fp) + sw $a0, -160($fp) + + # GOTO + j _cil_label_LABEL_37 + +_cil_label_LABEL_36: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + lw $a0 -252($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -248($fp) + la $a0, data_12 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -248($fp) + sw $a0, -160($fp) + +_cil_label_LABEL_37: + # ASSIGN + lw $a0, -160($fp) + sw $a0, -140($fp) + + # GOTO + j _cil_label_LABEL_35 + +_cil_label_LABEL_34: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_11 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -256($fp) + sw $a0, -140($fp) + +_cil_label_LABEL_35: + # ASSIGN + lw $a0, -140($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_33 + +_cil_label_LABEL_32: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + lw $a0 -268($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -264($fp) + la $a0, data_10 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_33: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -100($fp) + + # GOTO + j _cil_label_LABEL_31 + +_cil_label_LABEL_30: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -272($fp) + la $a0, data_9 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -100($fp) + +_cil_label_LABEL_31: + # ASSIGN + lw $a0, -100($fp) + sw $a0, -80($fp) + + # GOTO + j _cil_label_LABEL_29 + +_cil_label_LABEL_28: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + lw $a0 -284($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -280($fp) + la $a0, data_8 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -80($fp) + +_cil_label_LABEL_29: + # ASSIGN + lw $a0, -80($fp) + sw $a0, -60($fp) + + # GOTO + j _cil_label_LABEL_27 + +_cil_label_LABEL_26: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + lw $a0 -292($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -288($fp) + la $a0, data_7 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, -60($fp) + +_cil_label_LABEL_27: + # ASSIGN + lw $a0, -60($fp) + sw $a0, -40($fp) + + # GOTO + j _cil_label_LABEL_25 + +_cil_label_LABEL_24: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -296($fp) + lw $a0 -300($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -296($fp) + la $a0, data_6 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -296($fp) + sw $a0, -40($fp) + +_cil_label_LABEL_25: + # ASSIGN + lw $a0, -40($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_23 + +_cil_label_LABEL_22: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + lw $a0 -308($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -304($fp) + la $a0, data_5 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_23: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_21 + +_cil_label_LABEL_20: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -312($fp) + lw $a0 -316($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -312($fp) + la $a0, data_4 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -312($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_21: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 320 + jr $ra + +function_A2I_a2i: + move $fp, $sp + subu $sp, $sp, 228 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_21_ + beq $t1 $zero _eq_false_21_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_21 + li $a2 5 + beq $a0 $a2 _eq_int_bool_21 + li $a2 6 + bne $a0 $a2 _not_basic_type_21_ +_eq_str_21_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_21_ + beq $t3 $0 _eq_true_21_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_21_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_21_ + b _eq_true_21_ +_not_basic_type_21_: + bne $t0 $t1 _eq_false_21_ + b _eq_true_21_ +_eq_int_bool_21: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_21_ +_eq_true_21_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_21_ +_eq_false_21_: + li $a0 0 + sw $a0 -8($fp) +end_equal_21_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_40 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_15 + sw $a0 16($a1) + + lw $t0 -48($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_22_ + beq $t1 $zero _eq_false_22_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_22 + li $a2 5 + beq $a0 $a2 _eq_int_bool_22 + li $a2 6 + bne $a0 $a2 _not_basic_type_22_ +_eq_str_22_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_22_ + beq $t3 $0 _eq_true_22_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_22_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_22_ + b _eq_true_22_ +_not_basic_type_22_: + bne $t0 $t1 _eq_false_22_ + b _eq_true_22_ +_eq_int_bool_22: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_22_ +_eq_true_22_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_22_ +_eq_false_22_: + li $a0 0 + sw $a0 -36($fp) +end_equal_22_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_42 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_16 + sw $a0 16($a1) + + lw $t0 -88($fp) + lw $t1 -100($fp) + beq $t0 $zero _eq_false_23_ + beq $t1 $zero _eq_false_23_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_23 + li $a2 5 + beq $a0 $a2 _eq_int_bool_23 + li $a2 6 + bne $a0 $a2 _not_basic_type_23_ +_eq_str_23_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_23_ + beq $t3 $0 _eq_true_23_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_23_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_23_ + b _eq_true_23_ +_not_basic_type_23_: + bne $t0 $t1 _eq_false_23_ + b _eq_true_23_ +_eq_int_bool_23: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_23_ +_eq_true_23_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_23_ +_eq_false_23_: + li $a0 0 + sw $a0 -76($fp) +end_equal_23_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_44 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -112($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_45 + +_cil_label_LABEL_44: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -140($fp) + + # - + lw $a0, -136($fp) + lw $a1, -140($fp) + sub $a0, $a0, $a1 + sw $a0, -132($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -132($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -124($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -124($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + lw $a2, -124($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -128($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_45: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_42: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -212($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # GETATTR + lw $a1 -216($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # - + lw $a0, -196($fp) + lw $a1, -200($fp) + sub $a0, $a0, $a1 + sw $a0, -192($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -204($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -220($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -184($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -184($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + lw $a2, -184($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -188($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # - + li $a0 0 + lw $a1, -164($fp) + sub $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_43: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_41 + +_cil_label_LABEL_40: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_41: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 228 + jr $ra + +function_A2I_a2i_aux: + move $fp, $sp + subu $sp, $sp, 116 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_46: + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_47 + + # GOTO + j _cil_label_LABEL_48 + +_cil_label_LABEL_47: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # * + lw $a0, -60($fp) + lw $a1, -64($fp) + mul $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # + + lw $a0, -44($fp) + lw $a1, -48($fp) + add $a0, $a0, $a1 + sw $a0, -40($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_46 + +_cil_label_LABEL_48: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 116 + jr $ra + +function_A2I_i2a: + move $fp, $sp + subu $sp, $sp, 120 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_24_ + beq $t1 $zero _eq_false_24_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_24 + li $a2 5 + beq $a0 $a2 _eq_int_bool_24 + li $a2 6 + bne $a0 $a2 _not_basic_type_24_ +_eq_str_24_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_24_ + beq $t3 $0 _eq_true_24_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_24_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_24_ + b _eq_true_24_ +_not_basic_type_24_: + bne $t0 $t1 _eq_false_24_ + b _eq_true_24_ +_eq_int_bool_24: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_24_ +_eq_true_24_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_24_ +_eq_false_24_: + li $a0 0 + sw $a0 -8($fp) +end_equal_24_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_49 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # < + lw $a1, -32($fp) + lw $a2, -36($fp) + slt $a0, $a1, $a2 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_51 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_15 + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # - + li $a0 0 + lw $a1, -88($fp) + sub $a0, $a0, $a1 + sw $a0, -92($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # * + lw $a0, -76($fp) + lw $a1, -80($fp) + mul $a0, $a0, $a1 + sw $a0, -72($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_52 + +_cil_label_LABEL_51: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_52: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_50 + +_cil_label_LABEL_49: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_4 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_50: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 120 + jr $ra + +function_A2I_i2a_aux: + move $fp, $sp + subu $sp, $sp, 108 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_25_ + beq $t1 $zero _eq_false_25_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_25 + li $a2 5 + beq $a0 $a2 _eq_int_bool_25 + li $a2 6 + bne $a0 $a2 _not_basic_type_25_ +_eq_str_25_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_25_ + beq $t3 $0 _eq_true_25_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_25_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_25_ + b _eq_true_25_ +_not_basic_type_25_: + bne $t0 $t1 _eq_false_25_ + b _eq_true_25_ +_eq_int_bool_25: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_25_ +_eq_true_25_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_25_ +_eq_false_25_: + li $a0 0 + sw $a0 -8($fp) +end_equal_25_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_53 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # / + lw $a0, -24($fp) + lw $a1, -28($fp) + beqz $a1 _div_error_26_ + div $a0, $a0, $a1 + sw $a0, -20($fp) + b _div_end_26_ +_div_error_26_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_26_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # * + lw $a0, -84($fp) + lw $a1, -88($fp) + mul $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # - + lw $a0, -68($fp) + lw $a1, -72($fp) + sub $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_54 + +_cil_label_LABEL_53: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_54: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 108 + jr $ra + + +##################################### + diff --git a/tests/codegen/atoi.s b/tests/codegen/atoi.s new file mode 100644 index 00000000..a6452e38 --- /dev/null +++ b/tests/codegen/atoi.s @@ -0,0 +1,7469 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "678987" + data_2: .align 2 + .asciiz " == " + data_3: .align 2 + .asciiz "\n" + data_4: .align 2 + .asciiz "0" + data_5: .align 2 + .asciiz "1" + data_6: .align 2 + .asciiz "2" + data_7: .align 2 + .asciiz "3" + data_8: .align 2 + .asciiz "4" + data_9: .align 2 + .asciiz "5" + data_10: .align 2 + .asciiz "6" + data_11: .align 2 + .asciiz "7" + data_12: .align 2 + .asciiz "8" + data_13: .align 2 + .asciiz "9" + data_14: .align 2 + .asciiz "-" + data_15: .align 2 + .asciiz "+" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_A2I: .align 2 + .asciiz "A2I" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_A2I + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type A2I + li $a0 12 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type A2I + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A2I_c2i + sw $t1 12($v0) + la $t1 function_A2I_i2c + sw $t1 16($v0) + la $t1 function_A2I_a2i + sw $t1 20($v0) + la $t1 function_A2I_a2i_aux + sw $t1 24($v0) + la $t1 function_A2I_i2a + sw $t1 28($v0) + la $t1 function_A2I_i2a_aux + sw $t1 32($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 92 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 6 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A2I__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 678987 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -80($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A2I__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_A2I_c2i: + move $fp, $sp + subu $sp, $sp, 292 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_4 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -8($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_5 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -32($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_6 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -56($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_7 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_4 + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -80($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -80($fp) +end_equal_4_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_8 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_5 + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -104($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -104($fp) +end_equal_5_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # IF GOTO + lw $a0, -100($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_9 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_6 + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -128($fp) +end_equal_6_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -160($fp) + la $a0, data_10 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -160($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_7 + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 -152($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 -152($fp) +end_equal_7_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -148($fp) + + # IF GOTO + lw $a0, -148($fp) + bnez $a0, _cil_label_LABEL_12 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_11 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -184($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_8 + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 -176($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 -176($fp) +end_equal_8_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # IF GOTO + lw $a0, -172($fp) + bnez $a0, _cil_label_LABEL_14 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_12 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -208($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_9 + li $a2 5 + beq $a0 $a2 _eq_int_bool_9 + li $a2 6 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -200($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -200($fp) +end_equal_9_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -200($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # IF GOTO + lw $a0, -196($fp) + bnez $a0, _cil_label_LABEL_16 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_13 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_10 + li $a2 5 + beq $a0 $a2 _eq_int_bool_10 + li $a2 6 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -224($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -224($fp) +end_equal_10_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -224($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -228($fp) + lw $a0 12($a1) + sw $a0 -220($fp) + + # IF GOTO + lw $a0, -220($fp) + bnez $a0, _cil_label_LABEL_18 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -240($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -240($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + lw $a2, -240($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -248($fp) + sw $a0, -216($fp) + + # GOTO + j _cil_label_LABEL_19 + +_cil_label_LABEL_18: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + li $a0, 9 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -252($fp) + sw $a0, -216($fp) + +_cil_label_LABEL_19: + # ASSIGN + lw $a0, -216($fp) + sw $a0, -192($fp) + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + li $a0, 8 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -256($fp) + sw $a0, -192($fp) + +_cil_label_LABEL_17: + # ASSIGN + lw $a0, -192($fp) + sw $a0, -168($fp) + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_14: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 7 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -260($fp) + sw $a0, -168($fp) + +_cil_label_LABEL_15: + # ASSIGN + lw $a0, -168($fp) + sw $a0, -144($fp) + + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_12: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + li $a0, 6 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -144($fp) + +_cil_label_LABEL_13: + # ASSIGN + lw $a0, -144($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 5 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -268($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_11: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -96($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + li $a0, 4 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -96($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -96($fp) + sw $a0, -72($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 3 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -276($fp) + sw $a0, -72($fp) + +_cil_label_LABEL_7: + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + li $a0, 2 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -284($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 292 + jr $ra + +function_A2I_i2c: + move $fp, $sp + subu $sp, $sp, 296 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_11_ + beq $t1 $zero _eq_false_11_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_11 + li $a2 5 + beq $a0 $a2 _eq_int_bool_11 + li $a2 6 + bne $a0 $a2 _not_basic_type_11_ +_eq_str_11_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_11_ + beq $t3 $0 _eq_true_11_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_11_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_11_ + b _eq_true_11_ +_not_basic_type_11_: + bne $t0 $t1 _eq_false_11_ + b _eq_true_11_ +_eq_int_bool_11: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_11_ +_eq_true_11_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_11_ +_eq_false_11_: + li $a0 0 + sw $a0 -8($fp) +end_equal_11_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_20 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -36($fp) + beq $t0 $zero _eq_false_12_ + beq $t1 $zero _eq_false_12_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_12 + li $a2 5 + beq $a0 $a2 _eq_int_bool_12 + li $a2 6 + bne $a0 $a2 _not_basic_type_12_ +_eq_str_12_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_12_ + beq $t3 $0 _eq_true_12_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_12_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_12_ + b _eq_true_12_ +_not_basic_type_12_: + bne $t0 $t1 _eq_false_12_ + b _eq_true_12_ +_eq_int_bool_12: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_12_ +_eq_true_12_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_12_ +_eq_false_12_: + li $a0 0 + sw $a0 -28($fp) +end_equal_12_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_22 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_13_ + beq $t1 $zero _eq_false_13_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_13 + li $a2 5 + beq $a0 $a2 _eq_int_bool_13 + li $a2 6 + bne $a0 $a2 _not_basic_type_13_ +_eq_str_13_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_13_ + beq $t3 $0 _eq_true_13_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_13_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_13_ + b _eq_true_13_ +_not_basic_type_13_: + bne $t0 $t1 _eq_false_13_ + b _eq_true_13_ +_eq_int_bool_13: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_13_ +_eq_true_13_: + li $a0 1 + sw $a0 -48($fp) + b end_equal_13_ +_eq_false_13_: + li $a0 0 + sw $a0 -48($fp) +end_equal_13_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_24 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 3 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -76($fp) + beq $t0 $zero _eq_false_14_ + beq $t1 $zero _eq_false_14_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_14 + li $a2 5 + beq $a0 $a2 _eq_int_bool_14 + li $a2 6 + bne $a0 $a2 _not_basic_type_14_ +_eq_str_14_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_14_ + beq $t3 $0 _eq_true_14_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_14_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_14_ + b _eq_true_14_ +_not_basic_type_14_: + bne $t0 $t1 _eq_false_14_ + b _eq_true_14_ +_eq_int_bool_14: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_14_ +_eq_true_14_: + li $a0 1 + sw $a0 -68($fp) + b end_equal_14_ +_eq_false_14_: + li $a0 0 + sw $a0 -68($fp) +end_equal_14_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # IF GOTO + lw $a0, -64($fp) + bnez $a0, _cil_label_LABEL_26 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 4 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -96($fp) + beq $t0 $zero _eq_false_15_ + beq $t1 $zero _eq_false_15_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_15 + li $a2 5 + beq $a0 $a2 _eq_int_bool_15 + li $a2 6 + bne $a0 $a2 _not_basic_type_15_ +_eq_str_15_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_15_ + beq $t3 $0 _eq_true_15_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_15_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_15_ + b _eq_true_15_ +_not_basic_type_15_: + bne $t0 $t1 _eq_false_15_ + b _eq_true_15_ +_eq_int_bool_15: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_15_ +_eq_true_15_: + li $a0 1 + sw $a0 -88($fp) + b end_equal_15_ +_eq_false_15_: + li $a0 0 + sw $a0 -88($fp) +end_equal_15_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # IF GOTO + lw $a0, -84($fp) + bnez $a0, _cil_label_LABEL_28 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 5 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -116($fp) + beq $t0 $zero _eq_false_16_ + beq $t1 $zero _eq_false_16_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_16_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_16 + li $a2 5 + beq $a0 $a2 _eq_int_bool_16 + li $a2 6 + bne $a0 $a2 _not_basic_type_16_ +_eq_str_16_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_16_ + beq $t3 $0 _eq_true_16_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_16_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_16_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_16_ + b _eq_true_16_ +_not_basic_type_16_: + bne $t0 $t1 _eq_false_16_ + b _eq_true_16_ +_eq_int_bool_16: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_16_ +_eq_true_16_: + li $a0 1 + sw $a0 -108($fp) + b end_equal_16_ +_eq_false_16_: + li $a0 0 + sw $a0 -108($fp) +end_equal_16_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # IF GOTO + lw $a0, -104($fp) + bnez $a0, _cil_label_LABEL_30 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 6 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_17_ + beq $t1 $zero _eq_false_17_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_17 + li $a2 5 + beq $a0 $a2 _eq_int_bool_17 + li $a2 6 + bne $a0 $a2 _not_basic_type_17_ +_eq_str_17_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_17_ + beq $t3 $0 _eq_true_17_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_17_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_17_ + b _eq_true_17_ +_not_basic_type_17_: + bne $t0 $t1 _eq_false_17_ + b _eq_true_17_ +_eq_int_bool_17: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_17_ +_eq_true_17_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_17_ +_eq_false_17_: + li $a0 0 + sw $a0 -128($fp) +end_equal_17_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_32 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 7 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -156($fp) + beq $t0 $zero _eq_false_18_ + beq $t1 $zero _eq_false_18_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_18 + li $a2 5 + beq $a0 $a2 _eq_int_bool_18 + li $a2 6 + bne $a0 $a2 _not_basic_type_18_ +_eq_str_18_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_18_ + beq $t3 $0 _eq_true_18_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_18_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_18_ + b _eq_true_18_ +_not_basic_type_18_: + bne $t0 $t1 _eq_false_18_ + b _eq_true_18_ +_eq_int_bool_18: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_18_ +_eq_true_18_: + li $a0 1 + sw $a0 -148($fp) + b end_equal_18_ +_eq_false_18_: + li $a0 0 + sw $a0 -148($fp) +end_equal_18_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -144($fp) + + # IF GOTO + lw $a0, -144($fp) + bnez $a0, _cil_label_LABEL_34 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 8 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_19_ + beq $t1 $zero _eq_false_19_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_19 + li $a2 5 + beq $a0 $a2 _eq_int_bool_19 + li $a2 6 + bne $a0 $a2 _not_basic_type_19_ +_eq_str_19_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_19_ + beq $t3 $0 _eq_true_19_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_19_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_19_ + b _eq_true_19_ +_not_basic_type_19_: + bne $t0 $t1 _eq_false_19_ + b _eq_true_19_ +_eq_int_bool_19: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_19_ +_eq_true_19_: + li $a0 1 + sw $a0 -168($fp) + b end_equal_19_ +_eq_false_19_: + li $a0 0 + sw $a0 -168($fp) +end_equal_19_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # IF GOTO + lw $a0, -164($fp) + bnez $a0, _cil_label_LABEL_36 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + li $a0, 9 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -196($fp) + beq $t0 $zero _eq_false_20_ + beq $t1 $zero _eq_false_20_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_20 + li $a2 5 + beq $a0 $a2 _eq_int_bool_20 + li $a2 6 + bne $a0 $a2 _not_basic_type_20_ +_eq_str_20_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_20_ + beq $t3 $0 _eq_true_20_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_20_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_20_ + b _eq_true_20_ +_not_basic_type_20_: + bne $t0 $t1 _eq_false_20_ + b _eq_true_20_ +_eq_int_bool_20: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_20_ +_eq_true_20_: + li $a0 1 + sw $a0 -188($fp) + b end_equal_20_ +_eq_false_20_: + li $a0 0 + sw $a0 -188($fp) +end_equal_20_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -192($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -192($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -192($fp) + lw $a0 12($a1) + sw $a0 -184($fp) + + # IF GOTO + lw $a0, -184($fp) + bnez $a0, _cil_label_LABEL_38 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -200($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -200($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + lw $a2, -200($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -208($fp) + sw $a0, -180($fp) + + # GOTO + j _cil_label_LABEL_39 + +_cil_label_LABEL_38: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -216($fp) + la $a0, data_13 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -216($fp) + sw $a0, -180($fp) + +_cil_label_LABEL_39: + # ASSIGN + lw $a0, -180($fp) + sw $a0, -160($fp) + + # GOTO + j _cil_label_LABEL_37 + +_cil_label_LABEL_36: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + lw $a0 -228($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -224($fp) + la $a0, data_12 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, -160($fp) + +_cil_label_LABEL_37: + # ASSIGN + lw $a0, -160($fp) + sw $a0, -140($fp) + + # GOTO + j _cil_label_LABEL_35 + +_cil_label_LABEL_34: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_11 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -232($fp) + sw $a0, -140($fp) + +_cil_label_LABEL_35: + # ASSIGN + lw $a0, -140($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_33 + +_cil_label_LABEL_32: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -244($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + lw $a0 -244($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -240($fp) + la $a0, data_10 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -240($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_33: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -100($fp) + + # GOTO + j _cil_label_LABEL_31 + +_cil_label_LABEL_30: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + lw $a0 -252($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -248($fp) + la $a0, data_9 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -248($fp) + sw $a0, -100($fp) + +_cil_label_LABEL_31: + # ASSIGN + lw $a0, -100($fp) + sw $a0, -80($fp) + + # GOTO + j _cil_label_LABEL_29 + +_cil_label_LABEL_28: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_8 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -256($fp) + sw $a0, -80($fp) + +_cil_label_LABEL_29: + # ASSIGN + lw $a0, -80($fp) + sw $a0, -60($fp) + + # GOTO + j _cil_label_LABEL_27 + +_cil_label_LABEL_26: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + lw $a0 -268($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -264($fp) + la $a0, data_7 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -60($fp) + +_cil_label_LABEL_27: + # ASSIGN + lw $a0, -60($fp) + sw $a0, -40($fp) + + # GOTO + j _cil_label_LABEL_25 + +_cil_label_LABEL_24: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -276($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -272($fp) + la $a0, data_6 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -40($fp) + +_cil_label_LABEL_25: + # ASSIGN + lw $a0, -40($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_23 + +_cil_label_LABEL_22: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + lw $a0 -284($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -280($fp) + la $a0, data_5 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_23: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_21 + +_cil_label_LABEL_20: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + lw $a0 -292($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -288($fp) + la $a0, data_4 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_21: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 296 + jr $ra + +function_A2I_a2i: + move $fp, $sp + subu $sp, $sp, 228 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_21_ + beq $t1 $zero _eq_false_21_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_21 + li $a2 5 + beq $a0 $a2 _eq_int_bool_21 + li $a2 6 + bne $a0 $a2 _not_basic_type_21_ +_eq_str_21_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_21_ + beq $t3 $0 _eq_true_21_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_21_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_21_ + b _eq_true_21_ +_not_basic_type_21_: + bne $t0 $t1 _eq_false_21_ + b _eq_true_21_ +_eq_int_bool_21: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_21_ +_eq_true_21_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_21_ +_eq_false_21_: + li $a0 0 + sw $a0 -8($fp) +end_equal_21_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_40 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_14 + sw $a0 16($a1) + + lw $t0 -48($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_22_ + beq $t1 $zero _eq_false_22_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_22 + li $a2 5 + beq $a0 $a2 _eq_int_bool_22 + li $a2 6 + bne $a0 $a2 _not_basic_type_22_ +_eq_str_22_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_22_ + beq $t3 $0 _eq_true_22_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_22_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_22_ + b _eq_true_22_ +_not_basic_type_22_: + bne $t0 $t1 _eq_false_22_ + b _eq_true_22_ +_eq_int_bool_22: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_22_ +_eq_true_22_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_22_ +_eq_false_22_: + li $a0 0 + sw $a0 -36($fp) +end_equal_22_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_42 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_15 + sw $a0 16($a1) + + lw $t0 -88($fp) + lw $t1 -100($fp) + beq $t0 $zero _eq_false_23_ + beq $t1 $zero _eq_false_23_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_23 + li $a2 5 + beq $a0 $a2 _eq_int_bool_23 + li $a2 6 + bne $a0 $a2 _not_basic_type_23_ +_eq_str_23_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_23_ + beq $t3 $0 _eq_true_23_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_23_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_23_ + b _eq_true_23_ +_not_basic_type_23_: + bne $t0 $t1 _eq_false_23_ + b _eq_true_23_ +_eq_int_bool_23: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_23_ +_eq_true_23_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_23_ +_eq_false_23_: + li $a0 0 + sw $a0 -76($fp) +end_equal_23_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_44 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -112($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_45 + +_cil_label_LABEL_44: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -140($fp) + + # - + lw $a0, -136($fp) + lw $a1, -140($fp) + sub $a0, $a0, $a1 + sw $a0, -132($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -132($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -124($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -124($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + lw $a2, -124($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -128($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_45: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_43 + +_cil_label_LABEL_42: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -212($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # GETATTR + lw $a1 -216($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # - + lw $a0, -196($fp) + lw $a1, -200($fp) + sub $a0, $a0, $a1 + sw $a0, -192($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -204($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -220($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -184($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -184($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + lw $a2, -184($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -188($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # - + li $a0 0 + lw $a1, -164($fp) + sub $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_43: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_41 + +_cil_label_LABEL_40: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_41: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 228 + jr $ra + +function_A2I_a2i_aux: + move $fp, $sp + subu $sp, $sp, 116 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_46: + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_47 + + # GOTO + j _cil_label_LABEL_48 + +_cil_label_LABEL_47: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # * + lw $a0, -60($fp) + lw $a1, -64($fp) + mul $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # + + lw $a0, -44($fp) + lw $a1, -48($fp) + add $a0, $a0, $a1 + sw $a0, -40($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_46 + +_cil_label_LABEL_48: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 116 + jr $ra + +function_A2I_i2a: + move $fp, $sp + subu $sp, $sp, 120 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_24_ + beq $t1 $zero _eq_false_24_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_24 + li $a2 5 + beq $a0 $a2 _eq_int_bool_24 + li $a2 6 + bne $a0 $a2 _not_basic_type_24_ +_eq_str_24_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_24_ + beq $t3 $0 _eq_true_24_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_24_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_24_ + b _eq_true_24_ +_not_basic_type_24_: + bne $t0 $t1 _eq_false_24_ + b _eq_true_24_ +_eq_int_bool_24: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_24_ +_eq_true_24_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_24_ +_eq_false_24_: + li $a0 0 + sw $a0 -8($fp) +end_equal_24_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_49 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # < + lw $a1, -32($fp) + lw $a2, -36($fp) + slt $a0, $a1, $a2 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_51 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_14 + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # - + li $a0 0 + lw $a1, -88($fp) + sub $a0, $a0, $a1 + sw $a0, -92($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # * + lw $a0, -76($fp) + lw $a1, -80($fp) + mul $a0, $a0, $a1 + sw $a0, -72($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_52 + +_cil_label_LABEL_51: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_52: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_50 + +_cil_label_LABEL_49: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_4 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_50: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 120 + jr $ra + +function_A2I_i2a_aux: + move $fp, $sp + subu $sp, $sp, 108 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_25_ + beq $t1 $zero _eq_false_25_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_25 + li $a2 5 + beq $a0 $a2 _eq_int_bool_25 + li $a2 6 + bne $a0 $a2 _not_basic_type_25_ +_eq_str_25_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_25_ + beq $t3 $0 _eq_true_25_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_25_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_25_ + b _eq_true_25_ +_not_basic_type_25_: + bne $t0 $t1 _eq_false_25_ + b _eq_true_25_ +_eq_int_bool_25: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_25_ +_eq_true_25_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_25_ +_eq_false_25_: + li $a0 0 + sw $a0 -8($fp) +end_equal_25_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_53 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # / + lw $a0, -24($fp) + lw $a1, -28($fp) + beqz $a1 _div_error_26_ + div $a0, $a0, $a1 + sw $a0, -20($fp) + b _div_end_26_ +_div_error_26_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_26_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # * + lw $a0, -84($fp) + lw $a1, -88($fp) + mul $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # - + lw $a0, -68($fp) + lw $a1, -72($fp) + sub $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_54 + +_cil_label_LABEL_53: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_54: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 108 + jr $ra + + +##################################### + diff --git a/tests/codegen/atoi2.cl b/tests/codegen/atoi2.cl deleted file mode 100644 index 577aa29f..00000000 --- a/tests/codegen/atoi2.cl +++ /dev/null @@ -1,92 +0,0 @@ -class JustThere { -- class can have no features. -}; - -class A2I { - - c2i(char : String) : Int { - if char = "0" then 0 else - if char = "1" then 1 else - if char = "2" then 2 else - if char = "3" then 3 else - if char = "4" then 4 else - if char = "5" then 5 else - if char = "6" then 6 else - if char = "7" then 7 else - if char = "8" then 8 else - if char = "9" then 9 else - { abort(); 0; } -- Here the formal list is optional. - fi fi fi fi fi fi fi fi fi fi - }; - - - i2c(i : Int) : String { - if i = 0 then "0" else - if i = 1 then "1" else - if i = 2 then "2" else - if i = 3 then "3" else - if i = 4 then "4" else - if i = 5 then "5" else - if i = 6 then "6" else - if i = 7 then "7" else - if i = 8 then "8" else - if i = 9 then "9" else - { abort(); ""; } -- demonstrates an expression block - fi fi fi fi fi fi fi fi fi fi - }; - - a2i(s : String) : Int { - if s.length() = 0 then 0 else - if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else - if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else - a2i_aux(s) - fi fi fi - }; - - a2i_aux(s : String) : Int { - (let int : Int <- 0 in - { - (let j : Int <- s.length() in - (let i : Int <- 0 in - while i < j loop - { - int <- int * 10 + c2i(s.substr(i,1)); -- demonstrates dispatch - i <- i + 1; - } - pool - ) - ); - int; - } - ) - }; - - i2a(i : Int) : String { - if i = 0 then "0" else - if 0 < i then i2a_aux(i) else - "-".concat(i2a_aux(i * ~1)) - fi fi - }; - - - i2a_aux(i : Int) : String { - if i = 0 then "" else - (let next : Int <- i / 10 in - i2a_aux(next).concat(i2c(i - next * 10)) - ) - fi - }; - -}; - -class Main inherits IO { - main () : Object { - let a : Int <- (new A2I).a2i("678987"), - b : String <- (new A2I).i2a(678987) in -- the let expression. Translated to let a: ... in let b: ... in expr. - { - out_int(a) ; - out_string(" == ") ; - out_string(b) ; - out_string("\n"); - } - } ; -} ; diff --git a/tests/codegen/atoi_input.txt b/tests/codegen/atoi_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/atoi_output.txt b/tests/codegen/atoi_output.txt new file mode 100644 index 00000000..51b815a4 --- /dev/null +++ b/tests/codegen/atoi_output.txt @@ -0,0 +1 @@ +678987 == 678987 diff --git a/tests/codegen/book_list.mips b/tests/codegen/book_list.mips new file mode 100644 index 00000000..8eaec30c --- /dev/null +++ b/tests/codegen/book_list.mips @@ -0,0 +1,4157 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "title: " + data_2: .align 2 + .asciiz "\n" + data_3: .align 2 + .asciiz "author: " + data_4: .align 2 + .asciiz "periodical: " + data_5: .align 2 + .asciiz "Abort called from class BookList\n" + data_6: .align 2 + .asciiz "- dynamic type was Article -\n" + data_7: .align 2 + .asciiz "- dynamic type was Book -\n" + data_8: .align 2 + .asciiz "Aho, Sethi, and Ullman" + data_9: .align 2 + .asciiz "Compilers, Principles, Techniques, and Tools" + data_10: .align 2 + .asciiz "PC Magazine" + data_11: .align 2 + .asciiz "Ulanoff" + data_12: .align 2 + .asciiz "The Top 100 CD_ROMs" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Book: .align 2 + .asciiz "Book" + classname_Article: .align 2 + .asciiz "Article" + classname_BookList: .align 2 + .asciiz "BookList" + classname_Cons: .align 2 + .asciiz "Cons" + classname_Nil: .align 2 + .asciiz "Nil" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Main: .align 2 + .asciiz "Main" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 48 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Book + sw $t1 12($s1) + la $t1 classname_Article + sw $t1 16($s1) + la $t1 classname_BookList + sw $t1 20($s1) + la $t1 classname_Cons + sw $t1 24($s1) + la $t1 classname_Nil + sw $t1 28($s1) + la $t1 classname_Int + sw $t1 32($s1) + la $t1 classname_Bool + sw $t1 36($s1) + la $t1 classname_String + sw $t1 40($s1) + la $t1 classname_Main + sw $t1 44($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 96 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Book + li $a0 20 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Article + li $a0 24 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 24 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type BookList + li $a0 12 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Cons + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Nil + li $a0 12 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 80($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 11 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 88($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Book + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Book_initBook + sw $t1 28($v0) + la $t1 function_Book_print + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Article + li $a0 40 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Book_initBook + sw $t1 28($v0) + la $t1 function_Article_print + sw $t1 32($v0) + la $t1 function_Article_initArticle + sw $t1 36($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type BookList + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_BookList_isNil + sw $t1 28($v0) + la $t1 function_BookList_cons + sw $t1 32($v0) + la $t1 function_BookList_car + sw $t1 36($v0) + la $t1 function_BookList_cdr + sw $t1 40($v0) + la $t1 function_BookList_print_list + sw $t1 44($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Cons + li $a0 52 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Cons_isNil + sw $t1 28($v0) + la $t1 function_BookList_cons + sw $t1 32($v0) + la $t1 function_Cons_car + sw $t1 36($v0) + la $t1 function_Cons_cdr + sw $t1 40($v0) + la $t1 function_Cons_print_list + sw $t1 44($v0) + la $t1 function_Cons_init + sw $t1 48($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Nil + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Nil_isNil + sw $t1 28($v0) + la $t1 function_BookList_cons + sw $t1 32($v0) + la $t1 function_BookList_car + sw $t1 36($v0) + la $t1 function_BookList_cdr + sw $t1 40($v0) + la $t1 function_Nil_print_list + sw $t1 44($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Main_main + sw $t1 12($v0) + lw $t0 88($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 48 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 11 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 5 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 5 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Book__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Book_initBook: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Book_print: + move $fp, $sp + subu $sp, $sp, 88 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -4($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -64($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 88 + jr $ra + +function_Article__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Book__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Article_initArticle: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 24($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Article_print: + move $fp, $sp + subu $sp, $sp, 48 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 3 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + li $a2, 3 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 13 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -28($fp) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 48 + jr $ra + +function_BookList__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_BookList_isNil: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 33 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_BookList_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_BookList_car: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 33 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Book__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 40 + jr $ra + +function_BookList_cdr: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 33 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BookList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 40 + jr $ra + +function_BookList_print_list: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 33 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_Cons__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BookList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Cons_car: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_cdr: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_print_list: + move $fp, $sp + subu $sp, $sp, 68 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # PUSHPARAM + li $a0, 4 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + li $a0, 3 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -32($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -28($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_1: + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_7 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -44($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -56($fp) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -64($fp) + addiu $sp, $sp, 68 + jr $ra + +function_Nil__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BookList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Nil_print_list: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 108 + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Book__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 22 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_8 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 44 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -24($fp) + la $a0, data_9 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Article__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_10 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -56($fp) + la $a0, data_11 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 19 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_12 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -32($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Nil__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -72($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -84($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -96($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -104($fp) + addiu $sp, $sp, 108 + jr $ra + + +##################################### + diff --git a/tests/codegen/book_list.s b/tests/codegen/book_list.s new file mode 100644 index 00000000..f2237add --- /dev/null +++ b/tests/codegen/book_list.s @@ -0,0 +1,3796 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "title: " + data_2: .align 2 + .asciiz "\n" + data_3: .align 2 + .asciiz "author: " + data_4: .align 2 + .asciiz "periodical: " + data_5: .align 2 + .asciiz "- dynamic type was Article -\n" + data_6: .align 2 + .asciiz "- dynamic type was Book -\n" + data_7: .align 2 + .asciiz "Aho, Sethi, and Ullman" + data_8: .align 2 + .asciiz "Compilers, Principles, Techniques, and Tools" + data_9: .align 2 + .asciiz "PC Magazine" + data_10: .align 2 + .asciiz "Ulanoff" + data_11: .align 2 + .asciiz "The Top 100 CD_ROMs" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Book: .align 2 + .asciiz "Book" + classname_Article: .align 2 + .asciiz "Article" + classname_BookList: .align 2 + .asciiz "BookList" + classname_Cons: .align 2 + .asciiz "Cons" + classname_Nil: .align 2 + .asciiz "Nil" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Main: .align 2 + .asciiz "Main" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 48 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Book + sw $t1 12($s1) + la $t1 classname_Article + sw $t1 16($s1) + la $t1 classname_BookList + sw $t1 20($s1) + la $t1 classname_Cons + sw $t1 24($s1) + la $t1 classname_Nil + sw $t1 28($s1) + la $t1 classname_Int + sw $t1 32($s1) + la $t1 classname_Bool + sw $t1 36($s1) + la $t1 classname_String + sw $t1 40($s1) + la $t1 classname_Main + sw $t1 44($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 96 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Book + li $a0 20 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Article + li $a0 24 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 24 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type BookList + li $a0 12 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Cons + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Nil + li $a0 12 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 80($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 11 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 88($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Book + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Book_initBook + sw $t1 28($v0) + la $t1 function_Book_print + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Article + li $a0 44 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Book_initBook + sw $t1 28($v0) + la $t1 function_Book_print + sw $t1 32($v0) + la $t1 function_Article_initArticle + sw $t1 36($v0) + la $t1 function_Article_print + sw $t1 40($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type BookList + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_BookList_isNil + sw $t1 28($v0) + la $t1 function_BookList_cons + sw $t1 32($v0) + la $t1 function_BookList_car + sw $t1 36($v0) + la $t1 function_BookList_cdr + sw $t1 40($v0) + la $t1 function_BookList_print_list + sw $t1 44($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Cons + li $a0 68 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_BookList_isNil + sw $t1 28($v0) + la $t1 function_BookList_cons + sw $t1 32($v0) + la $t1 function_BookList_car + sw $t1 36($v0) + la $t1 function_BookList_cdr + sw $t1 40($v0) + la $t1 function_BookList_print_list + sw $t1 44($v0) + la $t1 function_Cons_isNil + sw $t1 48($v0) + la $t1 function_Cons_init + sw $t1 52($v0) + la $t1 function_Cons_car + sw $t1 56($v0) + la $t1 function_Cons_cdr + sw $t1 60($v0) + la $t1 function_Cons_print_list + sw $t1 64($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Nil + li $a0 56 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_BookList_isNil + sw $t1 28($v0) + la $t1 function_BookList_cons + sw $t1 32($v0) + la $t1 function_BookList_car + sw $t1 36($v0) + la $t1 function_BookList_cdr + sw $t1 40($v0) + la $t1 function_BookList_print_list + sw $t1 44($v0) + la $t1 function_Nil_isNil + sw $t1 48($v0) + la $t1 function_Nil_print_list + sw $t1 52($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Main_main + sw $t1 12($v0) + lw $t0 88($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 48 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 11 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 5 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 5 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Book__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Book_initBook: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Book_print: + move $fp, $sp + subu $sp, $sp, 88 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -4($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -64($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 88 + jr $ra + +function_Article__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Book__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Article_initArticle: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 24($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Article_print: + move $fp, $sp + subu $sp, $sp, 48 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 3 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + li $a2, 3 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 13 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -28($fp) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 48 + jr $ra + +function_BookList__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_BookList_isNil: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_BookList_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_BookList_car: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Book__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 16 + jr $ra + +function_BookList_cdr: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BookList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 16 + jr $ra + +function_BookList_print_list: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BookList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Cons_car: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_cdr: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_print_list: + move $fp, $sp + subu $sp, $sp, 68 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # PUSHPARAM + li $a0, 4 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + li $a0, 3 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -32($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -28($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_1: + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -44($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -56($fp) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -64($fp) + addiu $sp, $sp, 68 + jr $ra + +function_Nil__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BookList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Nil_print_list: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 108 + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Book__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 22 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_7 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 44 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -24($fp) + la $a0, data_8 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Article__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_9 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 7 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -56($fp) + la $a0, data_10 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 19 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_11 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -32($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Nil__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -72($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -84($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -96($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -104($fp) + addiu $sp, $sp, 108 + jr $ra + + +##################################### + diff --git a/tests/codegen/book_list_input.txt b/tests/codegen/book_list_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/book_list_output.txt b/tests/codegen/book_list_output.txt new file mode 100644 index 00000000..3408320b --- /dev/null +++ b/tests/codegen/book_list_output.txt @@ -0,0 +1,7 @@ +title: The Top 100 CD_ROMs +author: Ulanoff +periodical: PC Magazine +- dynamic type was Article - +title: Compilers, Principles, Techniques, and Tools +author: Aho, Sethi, and Ullman +- dynamic type was Book - diff --git a/tests/codegen/cells.mips b/tests/codegen/cells.mips new file mode 100644 index 00000000..7729f2fd --- /dev/null +++ b/tests/codegen/cells.mips @@ -0,0 +1,3788 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n" + data_2: .align 2 + .asciiz "X" + data_3: .align 2 + .asciiz "." + data_4: .align 2 + .asciiz " X " + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_CellularAutomaton: .align 2 + .asciiz "CellularAutomaton" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Main: .align 2 + .asciiz "Main" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_CellularAutomaton + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_Main + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type CellularAutomaton + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type CellularAutomaton + li $a0 60 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_CellularAutomaton_init + sw $t1 28($v0) + la $t1 function_CellularAutomaton_print + sw $t1 32($v0) + la $t1 function_CellularAutomaton_num_cells + sw $t1 36($v0) + la $t1 function_CellularAutomaton_cell + sw $t1 40($v0) + la $t1 function_CellularAutomaton_cell_left_neighbor + sw $t1 44($v0) + la $t1 function_CellularAutomaton_cell_right_neighbor + sw $t1 48($v0) + la $t1 function_CellularAutomaton_cell_at_next_evolution + sw $t1 52($v0) + la $t1 function_CellularAutomaton_evolve + sw $t1 56($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Main_main + sw $t1 12($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_CellularAutomaton__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_CellularAutomaton_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_CellularAutomaton_print: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -20($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_CellularAutomaton_num_cells: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_CellularAutomaton_cell: + move $fp, $sp + subu $sp, $sp, 16 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 16 + jr $ra + +function_CellularAutomaton_cell_left_neighbor: + move $fp, $sp + subu $sp, $sp, 84 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -8($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # - + lw $a0, -32($fp) + lw $a1, -36($fp) + sub $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -76($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # - + lw $a0, -60($fp) + lw $a1, -64($fp) + sub $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 84 + jr $ra + +function_CellularAutomaton_cell_right_neighbor: + move $fp, $sp + subu $sp, $sp, 84 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # - + lw $a0, -20($fp) + lw $a1, -24($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -28($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -8($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # + + lw $a0, -56($fp) + lw $a1, -60($fp) + add $a0, $a0, $a1 + sw $a0, -52($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -48($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -76($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_3: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 84 + jr $ra + +function_CellularAutomaton_cell_at_next_evolution: + move $fp, $sp + subu $sp, $sp, 188 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -68($fp) + lw $t1 -72($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -56($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -84($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_7: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -108($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_4 + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -96($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -96($fp) +end_equal_4_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # IF GOTO + lw $a0, -92($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -88($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -124($fp) + sw $a0, -88($fp) + +_cil_label_LABEL_9: + # GETATTR + lw $a1 -48($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -88($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # + + lw $a0, -36($fp) + lw $a1, -40($fp) + add $a0, $a0, $a1 + sw $a0, -32($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -156($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -152($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -148($fp) + lw $t1 -152($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_5 + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -136($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -136($fp) +end_equal_5_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -132($fp) + + # IF GOTO + lw $a0, -132($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -160($fp) + sw $a0, -128($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -164($fp) + sw $a0, -128($fp) + +_cil_label_LABEL_11: + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # + + lw $a0, -20($fp) + lw $a1, -24($fp) + add $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -28($fp) + lw $t1 -168($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_6 + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -8($fp) +end_equal_6_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -172($fp) + la $a0, data_3 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -184($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -180($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -180($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_5: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 188 + jr $ra + +function_CellularAutomaton_evolve: + move $fp, $sp + subu $sp, $sp, 76 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_12: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_13 + + # GOTO + j _cil_label_LABEL_14 + +_cil_label_LABEL_13: + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -44($fp) + sw $a0, -12($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # + + lw $a0, -60($fp) + lw $a1, -64($fp) + add $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_14: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 76 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 112 + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_CellularAutomaton__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 19 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 20 + sw $a0 12($a1) + +_cil_label_LABEL_15: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # < + lw $a1, -52($fp) + lw $a2, -56($fp) + slt $a0, $a1, $a2 + sw $a0, -48($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_16 + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -68($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -80($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # - + lw $a0, -96($fp) + lw $a1, -100($fp) + sub $a0, $a0, $a1 + sw $a0, -92($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -104($fp) + sw $a0, -36($fp) + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_17: + # ALLOCATE + la $v0 type_void + sw $v0 -40($fp) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 112 + jr $ra + + +##################################### + diff --git a/tests/codegen/cells.s b/tests/codegen/cells.s new file mode 100644 index 00000000..25bb8de3 --- /dev/null +++ b/tests/codegen/cells.s @@ -0,0 +1,3784 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n" + data_2: .align 2 + .asciiz "X" + data_3: .align 2 + .asciiz "." + data_4: .align 2 + .asciiz " X " + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_CellularAutomaton: .align 2 + .asciiz "CellularAutomaton" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Main: .align 2 + .asciiz "Main" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_CellularAutomaton + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_Main + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type CellularAutomaton + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type CellularAutomaton + li $a0 60 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_CellularAutomaton_init + sw $t1 28($v0) + la $t1 function_CellularAutomaton_print + sw $t1 32($v0) + la $t1 function_CellularAutomaton_num_cells + sw $t1 36($v0) + la $t1 function_CellularAutomaton_cell + sw $t1 40($v0) + la $t1 function_CellularAutomaton_cell_left_neighbor + sw $t1 44($v0) + la $t1 function_CellularAutomaton_cell_right_neighbor + sw $t1 48($v0) + la $t1 function_CellularAutomaton_cell_at_next_evolution + sw $t1 52($v0) + la $t1 function_CellularAutomaton_evolve + sw $t1 56($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Main_main + sw $t1 12($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_CellularAutomaton__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_CellularAutomaton_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_CellularAutomaton_print: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -20($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_CellularAutomaton_num_cells: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_CellularAutomaton_cell: + move $fp, $sp + subu $sp, $sp, 16 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 16 + jr $ra + +function_CellularAutomaton_cell_left_neighbor: + move $fp, $sp + subu $sp, $sp, 84 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -8($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # - + lw $a0, -32($fp) + lw $a1, -36($fp) + sub $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -76($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # - + lw $a0, -60($fp) + lw $a1, -64($fp) + sub $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 84 + jr $ra + +function_CellularAutomaton_cell_right_neighbor: + move $fp, $sp + subu $sp, $sp, 84 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # - + lw $a0, -20($fp) + lw $a1, -24($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -28($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -8($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # + + lw $a0, -56($fp) + lw $a1, -60($fp) + add $a0, $a0, $a1 + sw $a0, -52($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -48($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -76($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_3: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 84 + jr $ra + +function_CellularAutomaton_cell_at_next_evolution: + move $fp, $sp + subu $sp, $sp, 188 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -68($fp) + lw $t1 -72($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -56($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -84($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_7: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -108($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_4 + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -96($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -96($fp) +end_equal_4_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # IF GOTO + lw $a0, -92($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -88($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -124($fp) + sw $a0, -88($fp) + +_cil_label_LABEL_9: + # GETATTR + lw $a1 -48($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -88($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # + + lw $a0, -36($fp) + lw $a1, -40($fp) + add $a0, $a0, $a1 + sw $a0, -32($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -156($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -152($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -148($fp) + lw $t1 -152($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_5 + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -136($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -136($fp) +end_equal_5_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -132($fp) + + # IF GOTO + lw $a0, -132($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -160($fp) + sw $a0, -128($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -164($fp) + sw $a0, -128($fp) + +_cil_label_LABEL_11: + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # + + lw $a0, -20($fp) + lw $a1, -24($fp) + add $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -28($fp) + lw $t1 -168($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_6 + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -8($fp) +end_equal_6_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -172($fp) + la $a0, data_3 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -184($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -180($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -180($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_5: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 188 + jr $ra + +function_CellularAutomaton_evolve: + move $fp, $sp + subu $sp, $sp, 76 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_12: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_13 + + # GOTO + j _cil_label_LABEL_14 + +_cil_label_LABEL_13: + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -44($fp) + sw $a0, -12($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # + + lw $a0, -60($fp) + lw $a1, -64($fp) + add $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_14: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 76 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 112 + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_CellularAutomaton__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 19 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 20 + sw $a0 12($a1) + +_cil_label_LABEL_15: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # < + lw $a1, -52($fp) + lw $a2, -56($fp) + slt $a0, $a1, $a2 + sw $a0, -48($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_16 + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -68($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -80($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # - + lw $a0, -96($fp) + lw $a1, -100($fp) + sub $a0, $a0, $a1 + sw $a0, -92($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -104($fp) + sw $a0, -36($fp) + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_17: + # ALLOCATE + la $v0 type_void + sw $v0 -40($fp) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 112 + jr $ra + + +##################################### + diff --git a/tests/codegen/cells_input.txt b/tests/codegen/cells_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/cells_output.txt b/tests/codegen/cells_output.txt new file mode 100644 index 00000000..6304902c --- /dev/null +++ b/tests/codegen/cells_output.txt @@ -0,0 +1,21 @@ + X +........XXX........ +.......X...X....... +......XXX.XXX...... +.....X.......X..... +....XXX.....XXX.... +...X...X...X...X... +..XXX.XXX.XXX.XXX.. +.X...............X. +XXX.............XXX +...X...........X... +..XXX.........XXX.. +.X...X.......X...X. +XXX.XXX.....XXX.XXX +.......X...X....... +......XXX.XXX...... +.....X.......X..... +....XXX.....XXX.... +...X...X...X...X... +..XXX.XXX.XXX.XXX.. +.X...............X. diff --git a/tests/codegen/complex.mips b/tests/codegen/complex.mips new file mode 100644 index 00000000..9dea8b85 --- /dev/null +++ b/tests/codegen/complex.mips @@ -0,0 +1,2715 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "=(\n" + data_2: .align 2 + .asciiz "=)\n" + data_3: .align 2 + .asciiz "+" + data_4: .align 2 + .asciiz "I" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Complex: .align 2 + .asciiz "Complex" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Complex + sw $t1 16($s1) + la $t1 classname_Int + sw $t1 20($s1) + la $t1 classname_Bool + sw $t1 24($s1) + la $t1 classname_String + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Complex + li $a0 20 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Complex + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Complex_init + sw $t1 28($v0) + la $t1 function_Complex_print + sw $t1 32($v0) + la $t1 function_Complex_reflect_0 + sw $t1 36($v0) + la $t1 function_Complex_reflect_X + sw $t1 40($v0) + la $t1 function_Complex_reflect_Y + sw $t1 44($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 96 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Complex__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -52($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + beq $a0 $a2 _eq_int_bool_1 + li $a2 7 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -32($fp) +end_equal_1_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -84($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, -24($fp) + addiu $sp, $sp, 96 + jr $ra + +function_Complex__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Complex_init: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + lw $t0 -8($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + beq $a0 $a2 _eq_int_bool_2 + li $a2 7 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 0($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 0($fp) +end_equal_2_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -20($fp) + + lw $t0 -20($fp) + lw $t1 20($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + beq $a0 $a2 _eq_int_bool_3 + li $a2 7 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -12($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -12($fp) +end_equal_3_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Complex_print: + move $fp, $sp + subu $sp, $sp, 92 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -16($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + beq $a0 $a2 _eq_int_bool_4 + li $a2 7 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -8($fp) +end_equal_4_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_2 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -44($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -60($fp) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -40($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -84($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_3: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Complex_reflect_0: + move $fp, $sp + subu $sp, $sp, 56 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + beq $a0 $a2 _eq_int_bool_5 + li $a2 7 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 0($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 0($fp) +end_equal_5_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # - + li $a0 0 + lw $a1, -40($fp) + sub $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + lw $t0 -36($fp) + lw $t1 -48($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + beq $a0 $a2 _eq_int_bool_6 + li $a2 7 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -28($fp) +end_equal_6_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Complex_reflect_X: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + beq $a0 $a2 _eq_int_bool_7 + li $a2 7 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 0($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 0($fp) +end_equal_7_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Complex_reflect_Y: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + beq $a0 $a2 _eq_int_bool_8 + li $a2 7 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 0($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 0($fp) +end_equal_8_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/complex.s b/tests/codegen/complex.s new file mode 100644 index 00000000..9820cd11 --- /dev/null +++ b/tests/codegen/complex.s @@ -0,0 +1,2728 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "=(\n" + data_2: .align 2 + .asciiz "=)\n" + data_3: .align 2 + .asciiz "+" + data_4: .align 2 + .asciiz "I" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Complex: .align 2 + .asciiz "Complex" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Complex + sw $t1 16($s1) + la $t1 classname_Int + sw $t1 20($s1) + la $t1 classname_Bool + sw $t1 24($s1) + la $t1 classname_String + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Complex + li $a0 20 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Complex + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Complex_init + sw $t1 28($v0) + la $t1 function_Complex_print + sw $t1 32($v0) + la $t1 function_Complex_reflect_0 + sw $t1 36($v0) + la $t1 function_Complex_reflect_X + sw $t1 40($v0) + la $t1 function_Complex_reflect_Y + sw $t1 44($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 96 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Complex__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -52($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + beq $a0 $a2 _eq_int_bool_1 + li $a2 7 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -32($fp) +end_equal_1_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -84($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, -24($fp) + addiu $sp, $sp, 96 + jr $ra + +function_Complex__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Complex_init: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + lw $t0 -8($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + beq $a0 $a2 _eq_int_bool_2 + li $a2 7 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 0($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 0($fp) +end_equal_2_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -20($fp) + + lw $t0 -20($fp) + lw $t1 20($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + beq $a0 $a2 _eq_int_bool_3 + li $a2 7 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -12($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -12($fp) +end_equal_3_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Complex_print: + move $fp, $sp + subu $sp, $sp, 92 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -16($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + beq $a0 $a2 _eq_int_bool_4 + li $a2 7 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -8($fp) +end_equal_4_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_2 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -44($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -60($fp) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -40($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -84($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_3: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Complex_reflect_0: + move $fp, $sp + subu $sp, $sp, 56 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + beq $a0 $a2 _eq_int_bool_5 + li $a2 7 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 0($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 0($fp) +end_equal_5_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # - + li $a0 0 + lw $a1, -40($fp) + sub $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + lw $t0 -36($fp) + lw $t1 -48($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + beq $a0 $a2 _eq_int_bool_6 + li $a2 7 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -28($fp) +end_equal_6_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Complex_reflect_X: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + beq $a0 $a2 _eq_int_bool_7 + li $a2 7 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 0($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 0($fp) +end_equal_7_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Complex_reflect_Y: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + beq $a0 $a2 _eq_int_bool_8 + li $a2 7 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 0($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 0($fp) +end_equal_8_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/complex_input.txt b/tests/codegen/complex_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/complex_output.txt b/tests/codegen/complex_output.txt new file mode 100644 index 00000000..18b77c1f --- /dev/null +++ b/tests/codegen/complex_output.txt @@ -0,0 +1 @@ +=) diff --git a/tests/codegen/fib.mips b/tests/codegen/fib.mips new file mode 100644 index 00000000..3b52019d --- /dev/null +++ b/tests/codegen/fib.mips @@ -0,0 +1,1620 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "Enter n to find nth fibonacci number!\n" + data_2: .align 2 + .asciiz "\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + la $t1 function_Main_fib + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 56 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 38 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -44($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Main_fib: + move $fp, $sp + subu $sp, $sp, 80 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -32($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # - + li $a0 1 + lw $a1, -20($fp) + sub $a0, $a0, $a1 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -28($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # IF GOTO + lw $a0, -16($fp) + bnez $a0, _cil_label_LABEL_1 + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_1: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # + + lw $a0, -48($fp) + lw $a1, -52($fp) + add $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -56($fp) + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # GETATTR + lw $a1 -76($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # - + lw $a0, -64($fp) + lw $a1, -68($fp) + sub $a0, $a0, $a1 + sw $a0, -60($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -72($fp) + sw $a0, 16($fp) + + # ASSIGN + lw $a0, 0($fp) + sw $a0, -4($fp) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_0 + +_cil_label_LABEL_2: + # ALLOCATE + la $v0 type_void + sw $v0 -12($fp) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/fib.s b/tests/codegen/fib.s new file mode 100644 index 00000000..9517eeee --- /dev/null +++ b/tests/codegen/fib.s @@ -0,0 +1,1616 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "Enter n to find nth fibonacci number!\n" + data_2: .align 2 + .asciiz "\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + la $t1 function_Main_fib + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 56 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 38 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -48($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -44($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Main_fib: + move $fp, $sp + subu $sp, $sp, 80 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -32($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # - + li $a0 1 + lw $a1, -20($fp) + sub $a0, $a0, $a1 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -28($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # IF GOTO + lw $a0, -16($fp) + bnez $a0, _cil_label_LABEL_1 + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_1: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # + + lw $a0, -48($fp) + lw $a1, -52($fp) + add $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -56($fp) + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # GETATTR + lw $a1 -76($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # - + lw $a0, -64($fp) + lw $a1, -68($fp) + sub $a0, $a0, $a1 + sw $a0, -60($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -72($fp) + sw $a0, 16($fp) + + # ASSIGN + lw $a0, 0($fp) + sw $a0, -4($fp) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_0 + +_cil_label_LABEL_2: + # ALLOCATE + la $v0 type_void + sw $v0 -12($fp) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/fib_input.txt b/tests/codegen/fib_input.txt new file mode 100644 index 00000000..f599e28b --- /dev/null +++ b/tests/codegen/fib_input.txt @@ -0,0 +1 @@ +10 diff --git a/tests/codegen/fib_output.txt b/tests/codegen/fib_output.txt new file mode 100644 index 00000000..d402da6a --- /dev/null +++ b/tests/codegen/fib_output.txt @@ -0,0 +1,2 @@ +Enter n to find nth fibonacci number! +89 diff --git a/tests/codegen/graph.mips b/tests/codegen/graph.mips new file mode 100644 index 00000000..1287847d --- /dev/null +++ b/tests/codegen/graph.mips @@ -0,0 +1,10190 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz " (" + data_2: .align 2 + .asciiz "," + data_3: .align 2 + .asciiz ")" + data_4: .align 2 + .asciiz "Abort called from class EList\n" + data_5: .align 2 + .asciiz "\n" + data_6: .align 2 + .asciiz "Abort called from class VList\n" + data_7: .align 2 + .asciiz "0" + data_8: .align 2 + .asciiz "1" + data_9: .align 2 + .asciiz "2" + data_10: .align 2 + .asciiz "3" + data_11: .align 2 + .asciiz "4" + data_12: .align 2 + .asciiz "5" + data_13: .align 2 + .asciiz "6" + data_14: .align 2 + .asciiz "7" + data_15: .align 2 + .asciiz "8" + data_16: .align 2 + .asciiz "9" + data_17: .align 2 + .asciiz "Abort called from class Parse\n" + data_18: .align 2 + .asciiz "-" + data_19: .align 2 + .asciiz " " + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Vertice: .align 2 + .asciiz "Vertice" + classname_Edge: .align 2 + .asciiz "Edge" + classname_EList: .align 2 + .asciiz "EList" + classname_ECons: .align 2 + .asciiz "ECons" + classname_VList: .align 2 + .asciiz "VList" + classname_VCons: .align 2 + .asciiz "VCons" + classname_Parse: .align 2 + .asciiz "Parse" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Graph: .align 2 + .asciiz "Graph" + classname_BoolOp: .align 2 + .asciiz "BoolOp" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 64 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Vertice + sw $t1 12($s1) + la $t1 classname_Edge + sw $t1 16($s1) + la $t1 classname_EList + sw $t1 20($s1) + la $t1 classname_ECons + sw $t1 24($s1) + la $t1 classname_VList + sw $t1 28($s1) + la $t1 classname_VCons + sw $t1 32($s1) + la $t1 classname_Parse + sw $t1 36($s1) + la $t1 classname_Main + sw $t1 40($s1) + la $t1 classname_Int + sw $t1 44($s1) + la $t1 classname_Bool + sw $t1 48($s1) + la $t1 classname_String + sw $t1 52($s1) + la $t1 classname_Graph + sw $t1 56($s1) + la $t1 classname_BoolOp + sw $t1 60($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 128 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Vertice + li $a0 20 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Edge + li $a0 24 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 24 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type EList + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type ECons + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type VList + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type VCons + li $a0 20 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type Parse + li $a0 20 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type Main + li $a0 24 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 24 + sw $a0 4($v0) + sw $v0 80($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 11 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 88($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 12 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 96($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 13 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 104($s0) + + # Type Graph + li $a0 20 + li $v0 9 + syscall + li $a0 14 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 112($s0) + + # Type BoolOp + li $a0 12 + li $v0 9 + syscall + li $a0 15 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 120($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Vertice + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Vertice_outgoing + sw $t1 28($v0) + la $t1 function_Vertice_number + sw $t1 32($v0) + la $t1 function_Vertice_init + sw $t1 36($v0) + la $t1 function_Vertice_add_out + sw $t1 40($v0) + la $t1 function_Vertice_print + sw $t1 44($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Edge + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Edge_init + sw $t1 28($v0) + la $t1 function_Edge_print + sw $t1 32($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type EList + li $a0 52 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_EList_isNil + sw $t1 28($v0) + la $t1 function_EList_head + sw $t1 32($v0) + la $t1 function_EList_tail + sw $t1 36($v0) + la $t1 function_EList_cons + sw $t1 40($v0) + la $t1 function_EList_append + sw $t1 44($v0) + la $t1 function_EList_print + sw $t1 48($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type ECons + li $a0 56 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_ECons_isNil + sw $t1 28($v0) + la $t1 function_ECons_head + sw $t1 32($v0) + la $t1 function_ECons_tail + sw $t1 36($v0) + la $t1 function_EList_cons + sw $t1 40($v0) + la $t1 function_EList_append + sw $t1 44($v0) + la $t1 function_ECons_print + sw $t1 48($v0) + la $t1 function_ECons_init + sw $t1 52($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type VList + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_VList_isNil + sw $t1 28($v0) + la $t1 function_VList_head + sw $t1 32($v0) + la $t1 function_VList_tail + sw $t1 36($v0) + la $t1 function_VList_cons + sw $t1 40($v0) + la $t1 function_VList_print + sw $t1 44($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type VCons + li $a0 52 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_VCons_isNil + sw $t1 28($v0) + la $t1 function_VCons_head + sw $t1 32($v0) + la $t1 function_VCons_tail + sw $t1 36($v0) + la $t1 function_VList_cons + sw $t1 40($v0) + la $t1 function_VCons_print + sw $t1 44($v0) + la $t1 function_VCons_init + sw $t1 48($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type Parse + li $a0 48 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Parse_read_input + sw $t1 28($v0) + la $t1 function_Parse_parse_line + sw $t1 32($v0) + la $t1 function_Parse_c2i + sw $t1 36($v0) + la $t1 function_Parse_a2i + sw $t1 40($v0) + la $t1 function_Parse_a2i_aux + sw $t1 44($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type Main + li $a0 52 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Parse_read_input + sw $t1 28($v0) + la $t1 function_Parse_parse_line + sw $t1 32($v0) + la $t1 function_Parse_c2i + sw $t1 36($v0) + la $t1 function_Parse_a2i + sw $t1 40($v0) + la $t1 function_Parse_a2i_aux + sw $t1 44($v0) + la $t1 function_Main_main + sw $t1 48($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 88($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 96($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 104($s0) + sw $v0 8($t0) + + # Type Graph + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Graph_add_vertice + sw $t1 12($v0) + la $t1 function_Graph_print_E + sw $t1 16($v0) + la $t1 function_Graph_print_V + sw $t1 20($v0) + lw $t0 112($s0) + sw $v0 8($t0) + + # Type BoolOp + li $a0 20 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_BoolOp_and + sw $t1 12($v0) + la $t1 function_BoolOp_or + sw $t1 16($v0) + lw $t0 120($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 64 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 11 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 12 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 13 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 14 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 15 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 5 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 7 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 9 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Vertice__init: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_EList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 12 + jr $ra + +function_Vertice_outgoing: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Vertice_number: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Vertice_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Vertice_add_out: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 12 + jr $ra + +function_Vertice_print: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -12($fp) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -20($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Edge__init: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 12 + jr $ra + +function_Edge_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 24($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Edge_print: + move $fp, $sp + subu $sp, $sp, 84 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 2 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -36($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -52($fp) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -80($fp) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -76($fp) + addiu $sp, $sp, 84 + jr $ra + +function_EList__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_EList_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_EList_head: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_EList_tail: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 32 + jr $ra + +function_EList_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_ECons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_EList_append: + move $fp, $sp + subu $sp, $sp, 48 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -36($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ASSIGN + lw $a0, 16($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 48 + jr $ra + +function_EList_print: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_ECons__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_EList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_ECons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_ECons_head: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_ECons_tail: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_ECons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_ECons_print: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -12($fp) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -20($fp) + addiu $sp, $sp, 24 + jr $ra + +function_VList__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_VList_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_VList_head: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_VList_tail: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 32 + jr $ra + +function_VList_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_VCons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_VList_print: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_VCons__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_VList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_VCons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_VCons_head: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_VCons_tail: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_VCons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_VCons_print: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -12($fp) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -20($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Parse__init: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 120($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_BoolOp__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 12 + jr $ra + +function_Parse_read_input: + move $fp, $sp + subu $sp, $sp, 116 + # ALLOCATE + lw $t0 112($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Graph__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -56($fp) + la $a0, data_0 + sw $a0 16($a1) + + lw $t0 -12($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_1 + li $a2 12 + beq $a0 $a2 _eq_int_bool_1 + li $a2 13 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -48($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -48($fp) +end_equal_1_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # - + li $a0 1 + lw $a1, -36($fp) + sub $a0, $a0, $a1 + sw $a0, -40($fp) + + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_5 + sw $a0 16($a1) + + lw $t0 -12($fp) + lw $t1 -84($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_2 + li $a2 12 + beq $a0 $a2 _eq_int_bool_2 + li $a2 13 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -76($fp) +end_equal_2_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # - + li $a0 1 + lw $a1, -64($fp) + sub $a0, $a0, $a1 + sw $a0, -68($fp) + + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -28($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -28($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + lw $a2, -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_3 + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_3: + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -104($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -112($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_4: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 116 + jr $ra + +function_Parse_parse_line: + move $fp, $sp + subu $sp, $sp, 124 + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Vertice__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_5: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -52($fp) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -52($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -60($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_3 + li $a2 12 + beq $a0 $a2 _eq_int_bool_3 + li $a2 13 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -44($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -44($fp) +end_equal_3_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -48($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # - + li $a0 1 + lw $a1, -32($fp) + sub $a0, $a0, $a1 + sw $a0, -36($fp) + + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_6 + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -76($fp) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Edge__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -120($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -100($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_7: + # ALLOCATE + la $v0 type_void + sw $v0 -24($fp) + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 124 + jr $ra + +function_Parse_c2i: + move $fp, $sp + subu $sp, $sp, 316 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_7 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_4 + li $a2 12 + beq $a0 $a2 _eq_int_bool_4 + li $a2 13 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -8($fp) +end_equal_4_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_8 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -40($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_5 + li $a2 12 + beq $a0 $a2 _eq_int_bool_5 + li $a2 13 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -32($fp) +end_equal_5_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_9 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_6 + li $a2 12 + beq $a0 $a2 _eq_int_bool_6 + li $a2 13 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -56($fp) +end_equal_6_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_12 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_10 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_7 + li $a2 12 + beq $a0 $a2 _eq_int_bool_7 + li $a2 13 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 -80($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 -80($fp) +end_equal_7_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_14 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_11 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -112($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_8 + li $a2 12 + beq $a0 $a2 _eq_int_bool_8 + li $a2 13 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 -104($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 -104($fp) +end_equal_8_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # IF GOTO + lw $a0, -100($fp) + bnez $a0, _cil_label_LABEL_16 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_12 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_9 + li $a2 12 + beq $a0 $a2 _eq_int_bool_9 + li $a2 13 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -128($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -128($fp) +end_equal_9_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # IF GOTO + lw $a0, -124($fp) + bnez $a0, _cil_label_LABEL_18 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -164($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -160($fp) + la $a0, data_13 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -160($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_10 + li $a2 12 + beq $a0 $a2 _eq_int_bool_10 + li $a2 13 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -152($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -152($fp) +end_equal_10_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -148($fp) + + # IF GOTO + lw $a0, -148($fp) + bnez $a0, _cil_label_LABEL_20 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -184($fp) + la $a0, data_14 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -184($fp) + beq $t0 $zero _eq_false_11_ + beq $t1 $zero _eq_false_11_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_11 + li $a2 12 + beq $a0 $a2 _eq_int_bool_11 + li $a2 13 + bne $a0 $a2 _not_basic_type_11_ +_eq_str_11_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_11_ + beq $t3 $0 _eq_true_11_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_11_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_11_ + b _eq_true_11_ +_not_basic_type_11_: + bne $t0 $t1 _eq_false_11_ + b _eq_true_11_ +_eq_int_bool_11: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_11_ +_eq_true_11_: + li $a0 1 + sw $a0 -176($fp) + b end_equal_11_ +_eq_false_11_: + li $a0 0 + sw $a0 -176($fp) +end_equal_11_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # IF GOTO + lw $a0, -172($fp) + bnez $a0, _cil_label_LABEL_22 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + lw $a0 -212($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -208($fp) + la $a0, data_15 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -208($fp) + beq $t0 $zero _eq_false_12_ + beq $t1 $zero _eq_false_12_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_12 + li $a2 12 + beq $a0 $a2 _eq_int_bool_12 + li $a2 13 + bne $a0 $a2 _not_basic_type_12_ +_eq_str_12_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_12_ + beq $t3 $0 _eq_true_12_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_12_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_12_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_12_ + b _eq_true_12_ +_not_basic_type_12_: + bne $t0 $t1 _eq_false_12_ + b _eq_true_12_ +_eq_int_bool_12: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_12_ +_eq_true_12_: + li $a0 1 + sw $a0 -200($fp) + b end_equal_12_ +_eq_false_12_: + li $a0 0 + sw $a0 -200($fp) +end_equal_12_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -200($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # IF GOTO + lw $a0, -196($fp) + bnez $a0, _cil_label_LABEL_24 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -232($fp) + lw $a0 -236($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -232($fp) + la $a0, data_16 + sw $a0 16($a1) + + lw $t0 16($fp) + lw $t1 -232($fp) + beq $t0 $zero _eq_false_13_ + beq $t1 $zero _eq_false_13_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_13 + li $a2 12 + beq $a0 $a2 _eq_int_bool_13 + li $a2 13 + bne $a0 $a2 _not_basic_type_13_ +_eq_str_13_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_13_ + beq $t3 $0 _eq_true_13_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_13_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_13_ + b _eq_true_13_ +_not_basic_type_13_: + bne $t0 $t1 _eq_false_13_ + b _eq_true_13_ +_eq_int_bool_13: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_13_ +_eq_true_13_: + li $a0 1 + sw $a0 -224($fp) + b end_equal_13_ +_eq_false_13_: + li $a0 0 + sw $a0 -224($fp) +end_equal_13_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -224($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -228($fp) + lw $a0 12($a1) + sw $a0 -220($fp) + + # IF GOTO + lw $a0, -220($fp) + bnez $a0, _cil_label_LABEL_26 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -240($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 30 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_17 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -256($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -240($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -240($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -264($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -264($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + lw $a2, -264($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -272($fp) + sw $a0, -216($fp) + + # GOTO + j _cil_label_LABEL_27 + +_cil_label_LABEL_26: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 9 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -276($fp) + sw $a0, -216($fp) + +_cil_label_LABEL_27: + # ASSIGN + lw $a0, -216($fp) + sw $a0, -192($fp) + + # GOTO + j _cil_label_LABEL_25 + +_cil_label_LABEL_24: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -280($fp) + li $a0, 8 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -280($fp) + sw $a0, -192($fp) + +_cil_label_LABEL_25: + # ASSIGN + lw $a0, -192($fp) + sw $a0, -168($fp) + + # GOTO + j _cil_label_LABEL_23 + +_cil_label_LABEL_22: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + li $a0, 7 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -284($fp) + sw $a0, -168($fp) + +_cil_label_LABEL_23: + # ASSIGN + lw $a0, -168($fp) + sw $a0, -144($fp) + + # GOTO + j _cil_label_LABEL_21 + +_cil_label_LABEL_20: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + li $a0, 6 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -288($fp) + sw $a0, -144($fp) + +_cil_label_LABEL_21: + # ASSIGN + lw $a0, -144($fp) + sw $a0, -120($fp) + + # GOTO + j _cil_label_LABEL_19 + +_cil_label_LABEL_18: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + li $a0, 5 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -292($fp) + sw $a0, -120($fp) + +_cil_label_LABEL_19: + # ASSIGN + lw $a0, -120($fp) + sw $a0, -96($fp) + + # GOTO + j _cil_label_LABEL_17 + +_cil_label_LABEL_16: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -296($fp) + li $a0, 4 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -296($fp) + sw $a0, -96($fp) + +_cil_label_LABEL_17: + # ASSIGN + lw $a0, -96($fp) + sw $a0, -72($fp) + + # GOTO + j _cil_label_LABEL_15 + +_cil_label_LABEL_14: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + li $a0, 3 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -300($fp) + sw $a0, -72($fp) + +_cil_label_LABEL_15: + # ASSIGN + lw $a0, -72($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_12: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 2 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_13: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -308($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_11: + # ASSIGN + lw $a0, -24($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -312($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -312($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_9: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 316 + jr $ra + +function_Parse_a2i: + move $fp, $sp + subu $sp, $sp, 228 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_14_ + beq $t1 $zero _eq_false_14_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_14 + li $a2 12 + beq $a0 $a2 _eq_int_bool_14 + li $a2 13 + bne $a0 $a2 _not_basic_type_14_ +_eq_str_14_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_14_ + beq $t3 $0 _eq_true_14_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_14_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_14_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_14_ + b _eq_true_14_ +_not_basic_type_14_: + bne $t0 $t1 _eq_false_14_ + b _eq_true_14_ +_eq_int_bool_14: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_14_ +_eq_true_14_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_14_ +_eq_false_14_: + li $a0 0 + sw $a0 -8($fp) +end_equal_14_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_28 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_18 + sw $a0 16($a1) + + lw $t0 -48($fp) + lw $t1 -60($fp) + beq $t0 $zero _eq_false_15_ + beq $t1 $zero _eq_false_15_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_15 + li $a2 12 + beq $a0 $a2 _eq_int_bool_15 + li $a2 13 + bne $a0 $a2 _not_basic_type_15_ +_eq_str_15_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_15_ + beq $t3 $0 _eq_true_15_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_15_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_15_ + b _eq_true_15_ +_not_basic_type_15_: + bne $t0 $t1 _eq_false_15_ + b _eq_true_15_ +_eq_int_bool_15: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_15_ +_eq_true_15_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_15_ +_eq_false_15_: + li $a0 0 + sw $a0 -36($fp) +end_equal_15_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_30 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -100($fp) + la $a0, data_19 + sw $a0 16($a1) + + lw $t0 -88($fp) + lw $t1 -100($fp) + beq $t0 $zero _eq_false_16_ + beq $t1 $zero _eq_false_16_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_16_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_16 + li $a2 12 + beq $a0 $a2 _eq_int_bool_16 + li $a2 13 + bne $a0 $a2 _not_basic_type_16_ +_eq_str_16_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_16_ + beq $t3 $0 _eq_true_16_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_16_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_16_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_16_ + b _eq_true_16_ +_not_basic_type_16_: + bne $t0 $t1 _eq_false_16_ + b _eq_true_16_ +_eq_int_bool_16: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_16_ +_eq_true_16_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_16_ +_eq_false_16_: + li $a0 0 + sw $a0 -76($fp) +end_equal_16_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_32 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -112($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_33 + +_cil_label_LABEL_32: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # GETATTR + lw $a1 -156($fp) + lw $a0 12($a1) + sw $a0 -140($fp) + + # - + lw $a0, -136($fp) + lw $a1, -140($fp) + sub $a0, $a0, $a1 + sw $a0, -132($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -132($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -124($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -124($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + lw $a2, -124($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -128($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_33: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_31 + +_cil_label_LABEL_30: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -212($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # GETATTR + lw $a1 -216($fp) + lw $a0 12($a1) + sw $a0 -200($fp) + + # - + lw $a0, -196($fp) + lw $a1, -200($fp) + sub $a0, $a0, $a1 + sw $a0, -192($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -204($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -220($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -184($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -184($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + lw $a2, -184($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -188($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -176($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -176($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + lw $a2, -176($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # - + li $a0 0 + lw $a1, -164($fp) + sub $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_31: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_29 + +_cil_label_LABEL_28: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_29: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 228 + jr $ra + +function_Parse_a2i_aux: + move $fp, $sp + subu $sp, $sp, 352 + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_34: + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_35 + + # GOTO + j _cil_label_LABEL_36 + +_cil_label_LABEL_35: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -68($fp) + la $a0, data_19 + sw $a0 16($a1) + + lw $t0 -44($fp) + lw $t1 -68($fp) + beq $t0 $zero _eq_false_17_ + beq $t1 $zero _eq_false_17_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_17 + li $a2 12 + beq $a0 $a2 _eq_int_bool_17 + li $a2 13 + bne $a0 $a2 _not_basic_type_17_ +_eq_str_17_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_17_ + beq $t3 $0 _eq_true_17_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_17_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_17_ + b _eq_true_17_ +_not_basic_type_17_: + bne $t0 $t1 _eq_false_17_ + b _eq_true_17_ +_eq_int_bool_17: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_17_ +_eq_true_17_: + li $a0 1 + sw $a0 -60($fp) + b end_equal_17_ +_eq_false_17_: + li $a0 0 + sw $a0 -60($fp) +end_equal_17_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # IF GOTO + lw $a0, -56($fp) + bnez $a0, _cil_label_LABEL_37 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -92($fp) + la $a0, data_2 + sw $a0 16($a1) + + lw $t0 -44($fp) + lw $t1 -92($fp) + beq $t0 $zero _eq_false_18_ + beq $t1 $zero _eq_false_18_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_18 + li $a2 12 + beq $a0 $a2 _eq_int_bool_18 + li $a2 13 + bne $a0 $a2 _not_basic_type_18_ +_eq_str_18_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_18_ + beq $t3 $0 _eq_true_18_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_18_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_18_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_18_ + b _eq_true_18_ +_not_basic_type_18_: + bne $t0 $t1 _eq_false_18_ + b _eq_true_18_ +_eq_int_bool_18: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_18_ +_eq_true_18_: + li $a0 1 + sw $a0 -84($fp) + b end_equal_18_ +_eq_false_18_: + li $a0 0 + sw $a0 -84($fp) +end_equal_18_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -88($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # IF GOTO + lw $a0, -80($fp) + bnez $a0, _cil_label_LABEL_39 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + li $a0, 10 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -120($fp) + + # GETATTR + lw $a1 -132($fp) + lw $a0 12($a1) + sw $a0 -124($fp) + + # * + lw $a0, -120($fp) + lw $a1, -124($fp) + mul $a0, $a0, $a1 + sw $a0, -116($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -152($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -148($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -136($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -136($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + lw $a2, -136($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # + + lw $a0, -104($fp) + lw $a1, -108($fp) + add $a0, $a0, $a1 + sw $a0, -100($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -100($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -160($fp) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -164($fp) + + # + + lw $a0, -160($fp) + lw $a1, -164($fp) + add $a0, $a0, $a1 + sw $a0, -156($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + lw $a0 -156($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -168($fp) + sw $a0, -12($fp) + + lw $t0 -12($fp) + lw $t1 -8($fp) + beq $t0 $zero _eq_false_19_ + beq $t1 $zero _eq_false_19_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + li $a2 11 + beq $a0 $a2 _eq_int_bool_19 + li $a2 12 + beq $a0 $a2 _eq_int_bool_19 + li $a2 13 + bne $a0 $a2 _not_basic_type_19_ +_eq_str_19_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_19_ + beq $t3 $0 _eq_true_19_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_19_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_19_ + b _eq_true_19_ +_not_basic_type_19_: + bne $t0 $t1 _eq_false_19_ + b _eq_true_19_ +_eq_int_bool_19: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_19_ +_eq_true_19_: + li $a0 1 + sw $a0 -184($fp) + b end_equal_19_ +_eq_false_19_: + li $a0 0 + sw $a0 -184($fp) +end_equal_19_: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + lw $a0 -184($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -188($fp) + lw $a0 12($a1) + sw $a0 -180($fp) + + # IF GOTO + lw $a0, -180($fp) + bnez $a0, _cil_label_LABEL_41 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -196($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -196($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -192($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -192($fp) + lw $a0 -196($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -192($fp) + la $a0, data_0 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -192($fp) + sw $a0, -176($fp) + + # GOTO + j _cil_label_LABEL_42 + +_cil_label_LABEL_41: + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + li $a0, 0 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 104($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -200($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -200($fp) + lw $a0 -204($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -200($fp) + la $a0, data_0 + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -200($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -200($fp) + sw $a0, -176($fp) + +_cil_label_LABEL_42: + # ASSIGN + lw $a0, -176($fp) + sw $a0, -76($fp) + + # GOTO + j _cil_label_LABEL_40 + +_cil_label_LABEL_39: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -252($fp) + lw $a0 12($a1) + sw $a0 -236($fp) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -240($fp) + + # - + lw $a0, -236($fp) + lw $a1, -240($fp) + sub $a0, $a0, $a1 + sw $a0, -232($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -244($fp) + lw $a0 -232($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -244($fp) + lw $a0 12($a1) + sw $a0 -220($fp) + + # GETATTR + lw $a1 -256($fp) + lw $a0 12($a1) + sw $a0 -224($fp) + + # - + lw $a0, -220($fp) + lw $a1, -224($fp) + sub $a0, $a0, $a1 + sw $a0, -216($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + lw $a0 -216($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -228($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -276($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -276($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -264($fp) + + # GETATTR + lw $a1 -276($fp) + lw $a0 12($a1) + sw $a0 -268($fp) + + # + + lw $a0, -264($fp) + lw $a1, -268($fp) + add $a0, $a0, $a1 + sw $a0, -260($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -272($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -212($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, -12($fp) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, -76($fp) + +_cil_label_LABEL_40: + # ASSIGN + lw $a0, -76($fp) + sw $a0, -52($fp) + + # GOTO + j _cil_label_LABEL_38 + +_cil_label_LABEL_37: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -320($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -320($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -324($fp) + lw $a2, -320($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -324($fp) + lw $a0 12($a1) + sw $a0 -308($fp) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -312($fp) + + # - + lw $a0, -308($fp) + lw $a1, -312($fp) + sub $a0, $a0, $a1 + sw $a0, -304($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + lw $a0 -304($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -328($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -328($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -316($fp) + lw $a0 12($a1) + sw $a0 -292($fp) + + # GETATTR + lw $a1 -328($fp) + lw $a0 12($a1) + sw $a0 -296($fp) + + # - + lw $a0, -292($fp) + lw $a1, -296($fp) + sub $a0, $a0, $a1 + sw $a0, -288($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + lw $a0 -288($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -300($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -336($fp) + + # GETATTR + lw $a1 -348($fp) + lw $a0 12($a1) + sw $a0 -340($fp) + + # + + lw $a0, -336($fp) + lw $a1, -340($fp) + add $a0, $a0, $a1 + sw $a0, -332($fp) + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -344($fp) + lw $a0 -332($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -344($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -280($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -280($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + lw $a2, -280($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -284($fp) + sw $a0 16($a1) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, -12($fp) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, -52($fp) + +_cil_label_LABEL_38: + # GOTO + j _cil_label_LABEL_34 + +_cil_label_LABEL_36: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 352 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Parse__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -12($fp) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -20($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 88($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Graph__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_VList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_EList__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Graph_add_vertice: + move $fp, $sp + subu $sp, $sp, 32 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -4($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 16($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_Graph_print_E: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_Graph_print_V: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_BoolOp__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_BoolOp_and: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_43 + + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_44 + +_cil_label_LABEL_43: + # ASSIGN + lw $a0, 20($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_44: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 12 + jr $ra + +function_BoolOp_or: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_45 + + # ASSIGN + lw $a0, 20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_46 + +_cil_label_LABEL_45: + # ALLOCATE + lw $t0 96($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -8($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_46: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 12 + jr $ra + + +##################################### + diff --git a/tests/codegen/graph_input.txt b/tests/codegen/graph_input.txt new file mode 100644 index 00000000..b67d9021 --- /dev/null +++ b/tests/codegen/graph_input.txt @@ -0,0 +1,5 @@ +1 2,100 +2 3,200 1,150 +3 2,10 +4 3,55 5,100 +5 1,1 2,2 3,3 4,4 5,5 diff --git a/tests/codegen/graph_output.txt b/tests/codegen/graph_output.txt new file mode 100644 index 00000000..ef446522 --- /dev/null +++ b/tests/codegen/graph_output.txt @@ -0,0 +1,7 @@ +5 (5,5)5 (5,4)4 (5,3)3 (5,2)2 (5,1)1 +4 (4,5)100 (4,3)55 +3 (3,2)10 +2 (2,1)150 (2,3)200 +1 (1,2)100 + + (5,5)5 (5,4)4 (5,3)3 (5,2)2 (5,1)1 (4,5)100 (4,3)55 (3,2)10 (2,1)150 (2,3)200 (1,2)100 diff --git a/tests/codegen/hairyscary.mips b/tests/codegen/hairyscary.mips new file mode 100644 index 00000000..7a2f22e6 --- /dev/null +++ b/tests/codegen/hairyscary.mips @@ -0,0 +1,3003 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "do nothing" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Bazz: .align 2 + .asciiz "Bazz" + classname_Foo: .align 2 + .asciiz "Foo" + classname_Razz: .align 2 + .asciiz "Razz" + classname_Bar: .align 2 + .asciiz "Bar" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Main: .align 2 + .asciiz "Main" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 44 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Bazz + sw $t1 12($s1) + la $t1 classname_Foo + sw $t1 16($s1) + la $t1 classname_Razz + sw $t1 20($s1) + la $t1 classname_Bar + sw $t1 24($s1) + la $t1 classname_Int + sw $t1 28($s1) + la $t1 classname_Bool + sw $t1 32($s1) + la $t1 classname_String + sw $t1 36($s1) + la $t1 classname_Main + sw $t1 40($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 88 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Bazz + li $a0 24 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 24 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Foo + li $a0 32 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 32 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Razz + li $a0 40 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 40 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Bar + li $a0 48 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 48 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type Main + li $a0 28 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 28 + sw $a0 4($v0) + sw $v0 80($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Bazz + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Bazz_printh + sw $t1 28($v0) + la $t1 function_Bazz_doh + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Foo + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Bazz_printh + sw $t1 28($v0) + la $t1 function_Foo_doh + sw $t1 32($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Razz + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Bazz_printh + sw $t1 28($v0) + la $t1 function_Foo_doh + sw $t1 32($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Bar + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Bazz_printh + sw $t1 28($v0) + la $t1 function_Foo_doh + sw $t1 32($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Main_main + sw $t1 12($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 44 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 4 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 5 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bazz__init: + move $fp, $sp + subu $sp, $sp, 48 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # PUSHPARAM + li $a0, 6 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + li $a0, 5 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_1 + + # PUSHPARAM + li $a0, 4 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_2 + + # PUSHPARAM + li $a0, 3 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_3 + +_cil_label_LABEL_0: + # ASSIGN + lw $a0, 12($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_1: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bar__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -16($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Razz__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -24($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_3: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Foo__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -32($fp) + sw $a0, -12($fp) + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_4: + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -44($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 48 + jr $ra + +function_Bazz_printh: + move $fp, $sp + subu $sp, $sp, 16 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Bazz_doh: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # + + lw $a0, -8($fp) + lw $a1, -12($fp) + add $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Foo__init: + move $fp, $sp + subu $sp, $sp, 116 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bazz__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # PUSHPARAM + li $a0, 6 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_5 + + # PUSHPARAM + li $a0, 5 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_6 + + # PUSHPARAM + li $a0, 4 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_7 + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, 12($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_8 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bar__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -12($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_8 + +_cil_label_LABEL_7: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Razz__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -20($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_8 + +_cil_label_LABEL_8: + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 24($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -76($fp) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -76($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -88($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # + + lw $a0, -64($fp) + lw $a1, -68($fp) + add $a0, $a0, $a1 + sw $a0, -60($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # GETATTR + lw $a1 -104($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # + + lw $a0, -48($fp) + lw $a1, -52($fp) + add $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -56($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # + + lw $a0, -32($fp) + lw $a1, -36($fp) + add $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -40($fp) + sw $a0 28($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 116 + jr $ra + +function_Foo_doh: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 2 + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # + + lw $a0, -8($fp) + lw $a1, -12($fp) + add $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Razz__init: + move $fp, $sp + subu $sp, $sp, 132 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Foo__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # PUSHPARAM + li $a0, 6 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_9 + + # PUSHPARAM + li $a0, 5 + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function___conforms + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # IF GOTO + lw $a0, 0($fp) + bnez $a0, _cil_label_LABEL_10 + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, 12($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bar__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -12($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_11: + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 32($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -84($fp) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + li $a2, 3 + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + li $a2, 3 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -92($fp) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -92($fp) + lw $a0 0($a1) + sw $a0 -96($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -96($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + lw $a2, -96($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -88($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # + + lw $a0, -72($fp) + lw $a1, -76($fp) + add $a0, $a0, $a1 + sw $a0, -68($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 32($a1) + sw $a0 -104($fp) + + # PUSHPARAM + lw $a0, -104($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -104($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # + + lw $a0, -56($fp) + lw $a1, -60($fp) + add $a0, $a0, $a1 + sw $a0, -52($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # + + lw $a0, -40($fp) + lw $a1, -44($fp) + add $a0, $a0, $a1 + sw $a0, -36($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -124($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -124($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + lw $a2, -124($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -48($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # + + lw $a0, -24($fp) + lw $a1, -28($fp) + add $a0, $a0, $a1 + sw $a0, -20($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -32($fp) + sw $a0 36($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 132 + jr $ra + +function_Bar__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Razz__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 40($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 44($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 32 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bazz__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Foo__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Razz__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -16($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bar__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -24($fp) + sw $a0 24($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 32 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 8 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + li $a0, 10 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 0($fp) + la $a0, data_1 + sw $a0 16($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 8 + jr $ra + + +##################################### + diff --git a/tests/codegen/hairyscary_input.txt b/tests/codegen/hairyscary_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/hairyscary_output.txt b/tests/codegen/hairyscary_output.txt new file mode 100644 index 00000000..8985c22f --- /dev/null +++ b/tests/codegen/hairyscary_output.txt @@ -0,0 +1 @@ +17141611714163171416511714161171416317141653117141611714163171416511714161171416317141653171416117141631714165171416 \ No newline at end of file diff --git a/tests/codegen/hello_world.mips b/tests/codegen/hello_world.mips new file mode 100644 index 00000000..7ea75834 --- /dev/null +++ b/tests/codegen/hello_world.mips @@ -0,0 +1,1087 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "Hello, World.\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 14 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/hello_world.s b/tests/codegen/hello_world.s new file mode 100644 index 00000000..93c053f0 --- /dev/null +++ b/tests/codegen/hello_world.s @@ -0,0 +1,1083 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "Hello, World.\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 14 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/hello_world_input.txt b/tests/codegen/hello_world_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/hello_world_output.txt b/tests/codegen/hello_world_output.txt new file mode 100644 index 00000000..349db2bf --- /dev/null +++ b/tests/codegen/hello_world_output.txt @@ -0,0 +1 @@ +Hello, World. diff --git a/tests/codegen/helloworld.cl b/tests/codegen/helloworld.cl deleted file mode 100644 index 61d42108..00000000 --- a/tests/codegen/helloworld.cl +++ /dev/null @@ -1,6 +0,0 @@ -class Main { - main():IO { - new IO.out_string("Hello world!\n") - }; -}; - diff --git a/tests/codegen/io.mips b/tests/codegen/io.mips new file mode 100644 index 00000000..72d4ac71 --- /dev/null +++ b/tests/codegen/io.mips @@ -0,0 +1,2045 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "C: Hello world\n" + data_2: .align 2 + .asciiz "D: Hello world\n" + data_3: .align 2 + .asciiz "Done.\n" + data_4: .align 2 + .asciiz "A: Hello world\n" + data_5: .align 2 + .asciiz "B: Hello world\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_C: .align 2 + .asciiz "C" + classname_D: .align 2 + .asciiz "D" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_A: .align 2 + .asciiz "A" + classname_B: .align 2 + .asciiz "B" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 44 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_C + sw $t1 12($s1) + la $t1 classname_D + sw $t1 16($s1) + la $t1 classname_Main + sw $t1 20($s1) + la $t1 classname_Int + sw $t1 24($s1) + la $t1 classname_Bool + sw $t1 28($s1) + la $t1 classname_String + sw $t1 32($s1) + la $t1 classname_A + sw $t1 36($s1) + la $t1 classname_B + sw $t1 40($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 88 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type C + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type D + li $a0 12 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type A + li $a0 16 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 72($s0) + + # Type B + li $a0 16 + li $v0 9 + syscall + li $a0 10 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 80($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type C + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_C_out_c + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type D + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_C_out_c + sw $t1 28($v0) + la $t1 function_D_out_d + sw $t1 32($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type A + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_out_a + sw $t1 12($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + # Type B + li $a0 20 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_A_out_a + sw $t1 12($v0) + la $t1 function_B_out_b + sw $t1 16($v0) + lw $t0 80($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 44 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 10 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 9 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_C__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_C_out_c: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_D__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_D_out_d: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 80 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 80($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_B__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_C__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -32($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_D__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 6 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -68($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_A__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_A_out_a: + move $fp, $sp + subu $sp, $sp, 20 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 20 + jr $ra + +function_B__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_A__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_B_out_b: + move $fp, $sp + subu $sp, $sp, 20 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 20 + jr $ra + + +##################################### + diff --git a/tests/codegen/io_input.txt b/tests/codegen/io_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/io_output.txt b/tests/codegen/io_output.txt new file mode 100644 index 00000000..f846f596 --- /dev/null +++ b/tests/codegen/io_output.txt @@ -0,0 +1,5 @@ +A: Hello world +B: Hello world +C: Hello world +D: Hello world +Done. diff --git a/tests/codegen/life.mips b/tests/codegen/life.mips new file mode 100644 index 00000000..b5f7671a --- /dev/null +++ b/tests/codegen/life.mips @@ -0,0 +1,17702 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n" + data_2: .align 2 + .asciiz " " + data_3: .align 2 + .asciiz "X" + data_4: .align 2 + .asciiz "-" + data_5: .align 2 + .asciiz "\nPlease chose a number:\n" + data_6: .align 2 + .asciiz "\t1: A cross\n" + data_7: .align 2 + .asciiz "\t2: A slash from the upper left to lower right\n" + data_8: .align 2 + .asciiz "\t3: A slash from the upper right to lower left\n" + data_9: .align 2 + .asciiz "\t4: An X\n" + data_10: .align 2 + .asciiz "\t5: A greater than sign \n" + data_11: .align 2 + .asciiz "\t6: A less than sign\n" + data_12: .align 2 + .asciiz "\t7: Two greater than signs\n" + data_13: .align 2 + .asciiz "\t8: Two less than signs\n" + data_14: .align 2 + .asciiz "\t9: A 'V'\n" + data_15: .align 2 + .asciiz "\t10: An inverse 'V'\n" + data_16: .align 2 + .asciiz "\t11: Numbers 9 and 10 combined\n" + data_17: .align 2 + .asciiz "\t12: A full grid\n" + data_18: .align 2 + .asciiz "\t13: A 'T'\n" + data_19: .align 2 + .asciiz "\t14: A plus '+'\n" + data_20: .align 2 + .asciiz "\t15: A 'W'\n" + data_21: .align 2 + .asciiz "\t16: An 'M'\n" + data_22: .align 2 + .asciiz "\t17: An 'E'\n" + data_23: .align 2 + .asciiz "\t18: A '3'\n" + data_24: .align 2 + .asciiz "\t19: An 'O'\n" + data_25: .align 2 + .asciiz "\t20: An '8'\n" + data_26: .align 2 + .asciiz "\t21: An 'S'\n" + data_27: .align 2 + .asciiz "Your choice => " + data_28: .align 2 + .asciiz " " + data_29: .align 2 + .asciiz " XXXX X XX X XXXX " + data_30: .align 2 + .asciiz " XX X XX X XX X XX X XX " + data_31: .align 2 + .asciiz " XX X XX X XX " + data_32: .align 2 + .asciiz "XXX X X X X XXXX " + data_33: .align 2 + .asciiz "XXXXX X XXXXX X XXXX" + data_34: .align 2 + .asciiz " X X X X X X X" + data_35: .align 2 + .asciiz "X X X X X X X " + data_36: .align 2 + .asciiz " X X XXXXX X X " + data_37: .align 2 + .asciiz "XXXXX X X X X " + data_38: .align 2 + .asciiz "XXXXXXXXXXXXXXXXXXXXXXXXX" + data_39: .align 2 + .asciiz "X X X X X X X X" + data_40: .align 2 + .asciiz " X X X X X" + data_41: .align 2 + .asciiz "X X X X X " + data_42: .align 2 + .asciiz " X XX X X X " + data_43: .align 2 + .asciiz "X X X XX X " + data_44: .align 2 + .asciiz " X X X X X" + data_45: .align 2 + .asciiz "X X X X X " + data_46: .align 2 + .asciiz "X X X X X X X X X" + data_47: .align 2 + .asciiz "X X X X X" + data_48: .align 2 + .asciiz " X X X X X " + data_49: .align 2 + .asciiz " XX XXXX XXXX XX " + data_50: .align 2 + .asciiz "Would you like to continue with the next generation? \n" + data_51: .align 2 + .asciiz "Please use lowercase y or n for your answer [y]: " + data_52: .align 2 + .asciiz "n" + data_53: .align 2 + .asciiz "\n\n" + data_54: .align 2 + .asciiz "Would you like to choose a background pattern? \n" + data_55: .align 2 + .asciiz "Please use lowercase y or n for your answer [n]: " + data_56: .align 2 + .asciiz "y" + data_57: .align 2 + .asciiz "Welcome to the Game of Life.\n" + data_58: .align 2 + .asciiz "There are many initial states to choose from. \n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Board: .align 2 + .asciiz "Board" + classname_CellularAutomaton: .align 2 + .asciiz "CellularAutomaton" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 36 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Board + sw $t1 12($s1) + la $t1 classname_CellularAutomaton + sw $t1 16($s1) + la $t1 classname_Main + sw $t1 20($s1) + la $t1 classname_Int + sw $t1 24($s1) + la $t1 classname_Bool + sw $t1 28($s1) + la $t1 classname_String + sw $t1 32($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 72 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Board + li $a0 24 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 24 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type CellularAutomaton + li $a0 28 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 28 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 32 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 64($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Board + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Board_size_of_board + sw $t1 28($v0) + la $t1 function_Board_board_init + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type CellularAutomaton + li $a0 108 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Board_size_of_board + sw $t1 28($v0) + la $t1 function_Board_board_init + sw $t1 32($v0) + la $t1 function_CellularAutomaton_init + sw $t1 36($v0) + la $t1 function_CellularAutomaton_print + sw $t1 40($v0) + la $t1 function_CellularAutomaton_num_cells + sw $t1 44($v0) + la $t1 function_CellularAutomaton_cell + sw $t1 48($v0) + la $t1 function_CellularAutomaton_north + sw $t1 52($v0) + la $t1 function_CellularAutomaton_south + sw $t1 56($v0) + la $t1 function_CellularAutomaton_east + sw $t1 60($v0) + la $t1 function_CellularAutomaton_west + sw $t1 64($v0) + la $t1 function_CellularAutomaton_northwest + sw $t1 68($v0) + la $t1 function_CellularAutomaton_northeast + sw $t1 72($v0) + la $t1 function_CellularAutomaton_southeast + sw $t1 76($v0) + la $t1 function_CellularAutomaton_southwest + sw $t1 80($v0) + la $t1 function_CellularAutomaton_neighbors + sw $t1 84($v0) + la $t1 function_CellularAutomaton_cell_at_next_evolution + sw $t1 88($v0) + la $t1 function_CellularAutomaton_evolve + sw $t1 92($v0) + la $t1 function_CellularAutomaton_option + sw $t1 96($v0) + la $t1 function_CellularAutomaton_prompt + sw $t1 100($v0) + la $t1 function_CellularAutomaton_prompt2 + sw $t1 104($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Main + li $a0 112 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Board_size_of_board + sw $t1 28($v0) + la $t1 function_Board_board_init + sw $t1 32($v0) + la $t1 function_CellularAutomaton_init + sw $t1 36($v0) + la $t1 function_CellularAutomaton_print + sw $t1 40($v0) + la $t1 function_CellularAutomaton_num_cells + sw $t1 44($v0) + la $t1 function_CellularAutomaton_cell + sw $t1 48($v0) + la $t1 function_CellularAutomaton_north + sw $t1 52($v0) + la $t1 function_CellularAutomaton_south + sw $t1 56($v0) + la $t1 function_CellularAutomaton_east + sw $t1 60($v0) + la $t1 function_CellularAutomaton_west + sw $t1 64($v0) + la $t1 function_CellularAutomaton_northwest + sw $t1 68($v0) + la $t1 function_CellularAutomaton_northeast + sw $t1 72($v0) + la $t1 function_CellularAutomaton_southeast + sw $t1 76($v0) + la $t1 function_CellularAutomaton_southwest + sw $t1 80($v0) + la $t1 function_CellularAutomaton_neighbors + sw $t1 84($v0) + la $t1 function_CellularAutomaton_cell_at_next_evolution + sw $t1 88($v0) + la $t1 function_CellularAutomaton_evolve + sw $t1 92($v0) + la $t1 function_CellularAutomaton_option + sw $t1 96($v0) + la $t1 function_CellularAutomaton_prompt + sw $t1 100($v0) + la $t1 function_CellularAutomaton_prompt2 + sw $t1 104($v0) + la $t1 function_Main_main + sw $t1 108($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 36 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 4 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Board__init: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 20($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 12 + jr $ra + +function_Board_size_of_board: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Board_board_init: + move $fp, $sp + subu $sp, $sp, 184 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 15 + sw $a0 12($a1) + + lw $t0 -4($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_1 + li $a2 7 + beq $a0 $a2 _eq_int_bool_1 + li $a2 8 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -16($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -16($fp) +end_equal_1_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # IF GOTO + lw $a0, -12($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 16 + sw $a0 12($a1) + + lw $t0 -4($fp) + lw $t1 -44($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_2 + li $a2 7 + beq $a0 $a2 _eq_int_bool_2 + li $a2 8 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -36($fp) +end_equal_2_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 20 + sw $a0 12($a1) + + lw $t0 -4($fp) + lw $t1 -64($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_3 + li $a2 7 + beq $a0 $a2 _eq_int_bool_3 + li $a2 8 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -56($fp) +end_equal_3_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 21 + sw $a0 12($a1) + + lw $t0 -4($fp) + lw $t1 -84($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_4 + li $a2 7 + beq $a0 $a2 _eq_int_bool_4 + li $a2 8 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -76($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -76($fp) +end_equal_4_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + li $a0, 25 + sw $a0 12($a1) + + lw $t0 -4($fp) + lw $t1 -104($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_5 + li $a2 7 + beq $a0 $a2 _eq_int_bool_5 + li $a2 8 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 -96($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 -96($fp) +end_equal_5_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # IF GOTO + lw $a0, -92($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 28 + sw $a0 12($a1) + + lw $t0 -4($fp) + lw $t1 -124($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_6 + li $a2 7 + beq $a0 $a2 _eq_int_bool_6 + li $a2 8 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -116($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -116($fp) +end_equal_6_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # IF GOTO + lw $a0, -112($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 5 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + li $a0, 5 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -132($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -108($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 7 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 4 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -140($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -108($fp) + +_cil_label_LABEL_11: + # ASSIGN + lw $a0, -108($fp) + sw $a0, -88($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 5 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -144($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -148($fp) + li $a0, 5 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -148($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -88($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -88($fp) + sw $a0, -68($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + li $a0, 3 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 7 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -156($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -68($fp) + +_cil_label_LABEL_7: + # ASSIGN + lw $a0, -68($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 4 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -160($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + li $a0, 5 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -164($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -48($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + li $a0, 4 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + li $a0, 4 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -172($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -28($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 3 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + li $a0, 5 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -180($fp) + sw $a0 16($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 20($a1) + + # ASSIGN + lw $a0, -4($fp) + sw $a0, -8($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 184 + jr $ra + +function_CellularAutomaton__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Board__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 24($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_CellularAutomaton_init: + move $fp, $sp + subu $sp, $sp, 8 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 24($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 32($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_CellularAutomaton_print: + move $fp, $sp + subu $sp, $sp, 124 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -4($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_12: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -4($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # < + lw $a1, -36($fp) + lw $a2, -40($fp) + slt $a0, $a1, $a2 + sw $a0, -32($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_13 + + # GOTO + j _cil_label_LABEL_14 + +_cil_label_LABEL_13: + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -56($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -104($fp) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # GETATTR + lw $a1 -104($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # + + lw $a0, -92($fp) + lw $a1, -96($fp) + add $a0, $a0, $a1 + sw $a0, -88($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -100($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_12 + +_cil_label_LABEL_14: + # ALLOCATE + la $v0 type_void + sw $v0 -24($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + lw $a0 -120($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -116($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -116($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -108($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -108($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + lw $a2, -108($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 124 + jr $ra + +function_CellularAutomaton_num_cells: + move $fp, $sp + subu $sp, $sp, 12 + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_CellularAutomaton_cell: + move $fp, $sp + subu $sp, $sp, 72 + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -40($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # - + lw $a0, -28($fp) + lw $a1, -32($fp) + sub $a0, $a0, $a1 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_15 + + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -48($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -56($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_16 + +_cil_label_LABEL_15: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -64($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_16: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 72 + jr $ra + +function_CellularAutomaton_north: + move $fp, $sp + subu $sp, $sp, 84 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -40($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # - + lw $a0, -28($fp) + lw $a1, -32($fp) + sub $a0, $a0, $a1 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_17 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -72($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # - + lw $a0, -60($fp) + lw $a1, -64($fp) + sub $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_18 + +_cil_label_LABEL_17: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -76($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -76($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_18: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 84 + jr $ra + +function_CellularAutomaton_south: + move $fp, $sp + subu $sp, $sp, 84 + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # + + lw $a0, -32($fp) + lw $a1, -36($fp) + add $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_19 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -72($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # + + lw $a0, -60($fp) + lw $a1, -64($fp) + add $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_20 + +_cil_label_LABEL_19: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -76($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -76($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_20: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 84 + jr $ra + +function_CellularAutomaton_east: + move $fp, $sp + subu $sp, $sp, 132 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # + + lw $a0, -52($fp) + lw $a1, -56($fp) + add $a0, $a0, $a1 + sw $a0, -48($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # / + lw $a0, -36($fp) + lw $a1, -40($fp) + beqz $a1 _div_error_7_ + div $a0, $a0, $a1 + sw $a0, -32($fp) + b _div_end_7_ +_div_error_7_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_7_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -72($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # * + lw $a0, -20($fp) + lw $a1, -24($fp) + mul $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -80($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # + + lw $a0, -80($fp) + lw $a1, -84($fp) + add $a0, $a0, $a1 + sw $a0, -76($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + lw $t0 -28($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_8 + li $a2 7 + beq $a0 $a2 _eq_int_bool_8 + li $a2 8 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 -8($fp) +end_equal_8_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_21 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # + + lw $a0, -108($fp) + lw $a1, -112($fp) + add $a0, $a0, $a1 + sw $a0, -104($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + lw $a0 -104($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -116($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -96($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -96($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + lw $a2, -96($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -100($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_22 + +_cil_label_LABEL_21: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -124($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -124($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_22: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 132 + jr $ra + +function_CellularAutomaton_west: + move $fp, $sp + subu $sp, $sp, 120 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 16($fp) + lw $t1 -16($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_9 + li $a2 7 + beq $a0 $a2 _eq_int_bool_9 + li $a2 8 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -8($fp) +end_equal_9_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_23 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # / + lw $a0, -56($fp) + lw $a1, -60($fp) + beqz $a1 _div_error_10_ + div $a0, $a0, $a1 + sw $a0, -52($fp) + b _div_end_10_ +_div_error_10_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_10_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -52($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -72($fp) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # * + lw $a0, -40($fp) + lw $a1, -44($fp) + mul $a0, $a0, $a1 + sw $a0, -36($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + lw $t0 -48($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_11_ + beq $t1 $zero _eq_false_11_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_11 + li $a2 7 + beq $a0 $a2 _eq_int_bool_11 + li $a2 8 + bne $a0 $a2 _not_basic_type_11_ +_eq_str_11_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_11_ + beq $t3 $0 _eq_true_11_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_11_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_11_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_11_ + b _eq_true_11_ +_not_basic_type_11_: + bne $t0 $t1 _eq_false_11_ + b _eq_true_11_ +_eq_int_bool_11: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_11_ +_eq_true_11_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_11_ +_eq_false_11_: + li $a0 0 + sw $a0 -28($fp) +end_equal_11_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # IF GOTO + lw $a0, -24($fp) + bnez $a0, _cil_label_LABEL_25 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # - + lw $a0, -88($fp) + lw $a1, -92($fp) + sub $a0, $a0, $a1 + sw $a0, -84($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -80($fp) + sw $a0, -20($fp) + + # GOTO + j _cil_label_LABEL_26 + +_cil_label_LABEL_25: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -104($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -104($fp) + sw $a0, -20($fp) + +_cil_label_LABEL_26: + # ASSIGN + lw $a0, -20($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_24 + +_cil_label_LABEL_23: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_24: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 120 + jr $ra + +function_CellularAutomaton_northwest: + move $fp, $sp + subu $sp, $sp, 148 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -40($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # - + lw $a0, -28($fp) + lw $a1, -32($fp) + sub $a0, $a0, $a1 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_27 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -96($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # / + lw $a0, -84($fp) + lw $a1, -88($fp) + beqz $a1 _div_error_12_ + div $a0, $a0, $a1 + sw $a0, -80($fp) + b _div_end_12_ +_div_error_12_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_12_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # * + lw $a0, -68($fp) + lw $a1, -72($fp) + mul $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + lw $t0 -76($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_13_ + beq $t1 $zero _eq_false_13_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_13 + li $a2 7 + beq $a0 $a2 _eq_int_bool_13 + li $a2 8 + bne $a0 $a2 _not_basic_type_13_ +_eq_str_13_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_13_ + beq $t3 $0 _eq_true_13_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_13_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_13_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_13_ + b _eq_true_13_ +_not_basic_type_13_: + bne $t0 $t1 _eq_false_13_ + b _eq_true_13_ +_eq_int_bool_13: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_13_ +_eq_true_13_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_13_ +_eq_false_13_: + li $a0 0 + sw $a0 -56($fp) +end_equal_13_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_29 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -116($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -120($fp) + + # - + lw $a0, -116($fp) + lw $a1, -120($fp) + sub $a0, $a0, $a1 + sw $a0, -112($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -112($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_30 + +_cil_label_LABEL_29: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -132($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -132($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_30: + # ASSIGN + lw $a0, -48($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_28 + +_cil_label_LABEL_27: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -144($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -140($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -140($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_28: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 148 + jr $ra + +function_CellularAutomaton_northeast: + move $fp, $sp + subu $sp, $sp, 188 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -40($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # - + lw $a0, -28($fp) + lw $a1, -32($fp) + sub $a0, $a0, $a1 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 0 + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_31 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -116($fp) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -116($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # / + lw $a0, -84($fp) + lw $a1, -88($fp) + beqz $a1 _div_error_14_ + div $a0, $a0, $a1 + sw $a0, -80($fp) + b _div_end_14_ +_div_error_14_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_14_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -120($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # * + lw $a0, -68($fp) + lw $a1, -72($fp) + mul $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -128($fp) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -132($fp) + + # + + lw $a0, -128($fp) + lw $a1, -132($fp) + add $a0, $a0, $a1 + sw $a0, -124($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -124($fp) + sw $a0 12($a1) + + lw $t0 -76($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_15_ + beq $t1 $zero _eq_false_15_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_15 + li $a2 7 + beq $a0 $a2 _eq_int_bool_15 + li $a2 8 + bne $a0 $a2 _not_basic_type_15_ +_eq_str_15_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_15_ + beq $t3 $0 _eq_true_15_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_15_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_15_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_15_ + b _eq_true_15_ +_not_basic_type_15_: + bne $t0 $t1 _eq_false_15_ + b _eq_true_15_ +_eq_int_bool_15: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_15_ +_eq_true_15_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_15_ +_eq_false_15_: + li $a0 0 + sw $a0 -56($fp) +end_equal_15_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_33 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # GETATTR + lw $a1 -168($fp) + lw $a0 12($a1) + sw $a0 -160($fp) + + # + + lw $a0, -156($fp) + lw $a1, -160($fp) + add $a0, $a0, $a1 + sw $a0, -152($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -164($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -148($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_34 + +_cil_label_LABEL_33: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -172($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_34: + # ASSIGN + lw $a0, -48($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_32 + +_cil_label_LABEL_31: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -184($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -180($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -180($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_32: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 188 + jr $ra + +function_CellularAutomaton_southeast: + move $fp, $sp + subu $sp, $sp, 188 + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # + + lw $a0, -32($fp) + lw $a1, -36($fp) + add $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_35 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -116($fp) + + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -116($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # / + lw $a0, -84($fp) + lw $a1, -88($fp) + beqz $a1 _div_error_16_ + div $a0, $a0, $a1 + sw $a0, -80($fp) + b _div_end_16_ +_div_error_16_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_16_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -120($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # * + lw $a0, -68($fp) + lw $a1, -72($fp) + mul $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -128($fp) + + # GETATTR + lw $a1 -140($fp) + lw $a0 12($a1) + sw $a0 -132($fp) + + # + + lw $a0, -128($fp) + lw $a1, -132($fp) + add $a0, $a0, $a1 + sw $a0, -124($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -124($fp) + sw $a0 12($a1) + + lw $t0 -76($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_17_ + beq $t1 $zero _eq_false_17_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_17 + li $a2 7 + beq $a0 $a2 _eq_int_bool_17 + li $a2 8 + bne $a0 $a2 _not_basic_type_17_ +_eq_str_17_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_17_ + beq $t3 $0 _eq_true_17_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_17_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_17_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_17_ + b _eq_true_17_ +_not_basic_type_17_: + bne $t0 $t1 _eq_false_17_ + b _eq_true_17_ +_eq_int_bool_17: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_17_ +_eq_true_17_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_17_ +_eq_false_17_: + li $a0 0 + sw $a0 -56($fp) +end_equal_17_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_37 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -168($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # GETATTR + lw $a1 -168($fp) + lw $a0 12($a1) + sw $a0 -160($fp) + + # + + lw $a0, -156($fp) + lw $a1, -160($fp) + add $a0, $a0, $a1 + sw $a0, -152($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + lw $a0 -152($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -164($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -148($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_38 + +_cil_label_LABEL_37: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -172($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -172($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_38: + # ASSIGN + lw $a0, -48($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_36 + +_cil_label_LABEL_35: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -184($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -180($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -180($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_36: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 188 + jr $ra + +function_CellularAutomaton_southwest: + move $fp, $sp + subu $sp, $sp, 148 + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # + + lw $a0, -32($fp) + lw $a1, -36($fp) + add $a0, $a0, $a1 + sw $a0, -28($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_39 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -96($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # / + lw $a0, -84($fp) + lw $a1, -88($fp) + beqz $a1 _div_error_18_ + div $a0, $a0, $a1 + sw $a0, -80($fp) + b _div_end_18_ +_div_error_18_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_18_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # * + lw $a0, -68($fp) + lw $a1, -72($fp) + mul $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + lw $t0 -76($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_19_ + beq $t1 $zero _eq_false_19_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_19 + li $a2 7 + beq $a0 $a2 _eq_int_bool_19 + li $a2 8 + bne $a0 $a2 _not_basic_type_19_ +_eq_str_19_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_19_ + beq $t3 $0 _eq_true_19_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_19_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_19_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_19_ + b _eq_true_19_ +_not_basic_type_19_: + bne $t0 $t1 _eq_false_19_ + b _eq_true_19_ +_eq_int_bool_19: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_19_ +_eq_true_19_: + li $a0 1 + sw $a0 -56($fp) + b end_equal_19_ +_eq_false_19_: + li $a0 0 + sw $a0 -56($fp) +end_equal_19_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # IF GOTO + lw $a0, -52($fp) + bnez $a0, _cil_label_LABEL_41 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -116($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -120($fp) + + # - + lw $a0, -116($fp) + lw $a1, -120($fp) + sub $a0, $a0, $a1 + sw $a0, -112($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -112($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -108($fp) + sw $a0, -48($fp) + + # GOTO + j _cil_label_LABEL_42 + +_cil_label_LABEL_41: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -132($fp) + lw $a0 -136($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -132($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -132($fp) + sw $a0, -48($fp) + +_cil_label_LABEL_42: + # ASSIGN + lw $a0, -48($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_40 + +_cil_label_LABEL_39: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -144($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -140($fp) + la $a0, data_2 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -140($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_40: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 148 + jr $ra + +function_CellularAutomaton_neighbors: + move $fp, $sp + subu $sp, $sp, 432 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -128($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -128($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + lw $a2, -128($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -132($fp) + lw $t1 -136($fp) + beq $t0 $zero _eq_false_20_ + beq $t1 $zero _eq_false_20_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_20 + li $a2 7 + beq $a0 $a2 _eq_int_bool_20 + li $a2 8 + bne $a0 $a2 _not_basic_type_20_ +_eq_str_20_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_20_ + beq $t3 $0 _eq_true_20_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_20_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_20_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_20_ + b _eq_true_20_ +_not_basic_type_20_: + bne $t0 $t1 _eq_false_20_ + b _eq_true_20_ +_eq_int_bool_20: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_20_ +_eq_true_20_: + li $a0 1 + sw $a0 -120($fp) + b end_equal_20_ +_eq_false_20_: + li $a0 0 + sw $a0 -120($fp) +end_equal_20_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -120($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -124($fp) + lw $a0 12($a1) + sw $a0 -116($fp) + + # IF GOTO + lw $a0, -116($fp) + bnez $a0, _cil_label_LABEL_43 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -144($fp) + sw $a0, -112($fp) + + # GOTO + j _cil_label_LABEL_44 + +_cil_label_LABEL_43: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -148($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -148($fp) + sw $a0, -112($fp) + +_cil_label_LABEL_44: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -168($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -168($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + lw $a2, -168($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + lw $a0 -180($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -176($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -172($fp) + lw $t1 -176($fp) + beq $t0 $zero _eq_false_21_ + beq $t1 $zero _eq_false_21_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_21 + li $a2 7 + beq $a0 $a2 _eq_int_bool_21 + li $a2 8 + bne $a0 $a2 _not_basic_type_21_ +_eq_str_21_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_21_ + beq $t3 $0 _eq_true_21_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_21_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_21_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_21_ + b _eq_true_21_ +_not_basic_type_21_: + bne $t0 $t1 _eq_false_21_ + b _eq_true_21_ +_eq_int_bool_21: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_21_ +_eq_true_21_: + li $a0 1 + sw $a0 -160($fp) + b end_equal_21_ +_eq_false_21_: + li $a0 0 + sw $a0 -160($fp) +end_equal_21_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -164($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -164($fp) + lw $a0 -160($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -164($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # IF GOTO + lw $a0, -156($fp) + bnez $a0, _cil_label_LABEL_45 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -184($fp) + sw $a0, -152($fp) + + # GOTO + j _cil_label_LABEL_46 + +_cil_label_LABEL_45: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -188($fp) + sw $a0, -152($fp) + +_cil_label_LABEL_46: + # GETATTR + lw $a1 -112($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # GETATTR + lw $a1 -152($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # + + lw $a0, -100($fp) + lw $a1, -104($fp) + add $a0, $a0, $a1 + sw $a0, -96($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -208($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -208($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 60($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + lw $a2, -208($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + lw $a0 -220($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -216($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -212($fp) + lw $t1 -216($fp) + beq $t0 $zero _eq_false_22_ + beq $t1 $zero _eq_false_22_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_22 + li $a2 7 + beq $a0 $a2 _eq_int_bool_22 + li $a2 8 + bne $a0 $a2 _not_basic_type_22_ +_eq_str_22_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_22_ + beq $t3 $0 _eq_true_22_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_22_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_22_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_22_ + b _eq_true_22_ +_not_basic_type_22_: + bne $t0 $t1 _eq_false_22_ + b _eq_true_22_ +_eq_int_bool_22: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_22_ +_eq_true_22_: + li $a0 1 + sw $a0 -200($fp) + b end_equal_22_ +_eq_false_22_: + li $a0 0 + sw $a0 -200($fp) +end_equal_22_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -200($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # IF GOTO + lw $a0, -196($fp) + bnez $a0, _cil_label_LABEL_47 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, -192($fp) + + # GOTO + j _cil_label_LABEL_48 + +_cil_label_LABEL_47: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -228($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -228($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -228($fp) + sw $a0, -192($fp) + +_cil_label_LABEL_48: + # GETATTR + lw $a1 -108($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # GETATTR + lw $a1 -192($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # + + lw $a0, -84($fp) + lw $a1, -88($fp) + add $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -248($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -248($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + lw $a2, -248($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -260($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -260($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -256($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -252($fp) + lw $t1 -256($fp) + beq $t0 $zero _eq_false_23_ + beq $t1 $zero _eq_false_23_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_23 + li $a2 7 + beq $a0 $a2 _eq_int_bool_23 + li $a2 8 + bne $a0 $a2 _not_basic_type_23_ +_eq_str_23_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_23_ + beq $t3 $0 _eq_true_23_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_23_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_23_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_23_ + b _eq_true_23_ +_not_basic_type_23_: + bne $t0 $t1 _eq_false_23_ + b _eq_true_23_ +_eq_int_bool_23: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_23_ +_eq_true_23_: + li $a0 1 + sw $a0 -240($fp) + b end_equal_23_ +_eq_false_23_: + li $a0 0 + sw $a0 -240($fp) +end_equal_23_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -244($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -244($fp) + lw $a0 -240($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -244($fp) + lw $a0 12($a1) + sw $a0 -236($fp) + + # IF GOTO + lw $a0, -236($fp) + bnez $a0, _cil_label_LABEL_49 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -264($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -264($fp) + sw $a0, -232($fp) + + # GOTO + j _cil_label_LABEL_50 + +_cil_label_LABEL_49: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -268($fp) + sw $a0, -232($fp) + +_cil_label_LABEL_50: + # GETATTR + lw $a1 -92($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # GETATTR + lw $a1 -232($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # + + lw $a0, -68($fp) + lw $a1, -72($fp) + add $a0, $a0, $a1 + sw $a0, -64($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -288($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -288($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 72($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + lw $a2, -288($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -296($fp) + lw $a0 -300($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -296($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -292($fp) + lw $t1 -296($fp) + beq $t0 $zero _eq_false_24_ + beq $t1 $zero _eq_false_24_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_24 + li $a2 7 + beq $a0 $a2 _eq_int_bool_24 + li $a2 8 + bne $a0 $a2 _not_basic_type_24_ +_eq_str_24_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_24_ + beq $t3 $0 _eq_true_24_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_24_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_24_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_24_ + b _eq_true_24_ +_not_basic_type_24_: + bne $t0 $t1 _eq_false_24_ + b _eq_true_24_ +_eq_int_bool_24: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_24_ +_eq_true_24_: + li $a0 1 + sw $a0 -280($fp) + b end_equal_24_ +_eq_false_24_: + li $a0 0 + sw $a0 -280($fp) +end_equal_24_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + lw $a0 -280($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -284($fp) + lw $a0 12($a1) + sw $a0 -276($fp) + + # IF GOTO + lw $a0, -276($fp) + bnez $a0, _cil_label_LABEL_51 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -272($fp) + + # GOTO + j _cil_label_LABEL_52 + +_cil_label_LABEL_51: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -308($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -308($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -308($fp) + sw $a0, -272($fp) + +_cil_label_LABEL_52: + # GETATTR + lw $a1 -76($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -272($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # + + lw $a0, -52($fp) + lw $a1, -56($fp) + add $a0, $a0, $a1 + sw $a0, -48($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -328($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -328($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -332($fp) + lw $a2, -328($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -340($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -340($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -336($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -336($fp) + lw $a0 -340($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -336($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -332($fp) + lw $t1 -336($fp) + beq $t0 $zero _eq_false_25_ + beq $t1 $zero _eq_false_25_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_25 + li $a2 7 + beq $a0 $a2 _eq_int_bool_25 + li $a2 8 + bne $a0 $a2 _not_basic_type_25_ +_eq_str_25_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_25_ + beq $t3 $0 _eq_true_25_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_25_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_25_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_25_ + b _eq_true_25_ +_not_basic_type_25_: + bne $t0 $t1 _eq_false_25_ + b _eq_true_25_ +_eq_int_bool_25: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_25_ +_eq_true_25_: + li $a0 1 + sw $a0 -320($fp) + b end_equal_25_ +_eq_false_25_: + li $a0 0 + sw $a0 -320($fp) +end_equal_25_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -324($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -324($fp) + lw $a0 -320($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -324($fp) + lw $a0 12($a1) + sw $a0 -316($fp) + + # IF GOTO + lw $a0, -316($fp) + bnez $a0, _cil_label_LABEL_53 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -344($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -344($fp) + sw $a0, -312($fp) + + # GOTO + j _cil_label_LABEL_54 + +_cil_label_LABEL_53: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -348($fp) + sw $a0, -312($fp) + +_cil_label_LABEL_54: + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 -312($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # + + lw $a0, -36($fp) + lw $a1, -40($fp) + add $a0, $a0, $a1 + sw $a0, -32($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -368($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -368($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 76($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + lw $a2, -368($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -380($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -380($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + lw $a0 -380($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -376($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -372($fp) + lw $t1 -376($fp) + beq $t0 $zero _eq_false_26_ + beq $t1 $zero _eq_false_26_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_26_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_26 + li $a2 7 + beq $a0 $a2 _eq_int_bool_26 + li $a2 8 + bne $a0 $a2 _not_basic_type_26_ +_eq_str_26_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_26_ + beq $t3 $0 _eq_true_26_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_26_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_26_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_26_ + b _eq_true_26_ +_not_basic_type_26_: + bne $t0 $t1 _eq_false_26_ + b _eq_true_26_ +_eq_int_bool_26: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_26_ +_eq_true_26_: + li $a0 1 + sw $a0 -360($fp) + b end_equal_26_ +_eq_false_26_: + li $a0 0 + sw $a0 -360($fp) +end_equal_26_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -364($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -364($fp) + lw $a0 -360($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -364($fp) + lw $a0 12($a1) + sw $a0 -356($fp) + + # IF GOTO + lw $a0, -356($fp) + bnez $a0, _cil_label_LABEL_55 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -384($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -384($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -384($fp) + sw $a0, -352($fp) + + # GOTO + j _cil_label_LABEL_56 + +_cil_label_LABEL_55: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -388($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -388($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -388($fp) + sw $a0, -352($fp) + +_cil_label_LABEL_56: + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # GETATTR + lw $a1 -352($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # + + lw $a0, -20($fp) + lw $a1, -24($fp) + add $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -408($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -408($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 80($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -412($fp) + lw $a2, -408($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -420($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -420($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -416($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -416($fp) + lw $a0 -420($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -416($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -412($fp) + lw $t1 -416($fp) + beq $t0 $zero _eq_false_27_ + beq $t1 $zero _eq_false_27_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_27_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_27 + li $a2 7 + beq $a0 $a2 _eq_int_bool_27 + li $a2 8 + bne $a0 $a2 _not_basic_type_27_ +_eq_str_27_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_27_ + beq $t3 $0 _eq_true_27_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_27_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_27_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_27_ + b _eq_true_27_ +_not_basic_type_27_: + bne $t0 $t1 _eq_false_27_ + b _eq_true_27_ +_eq_int_bool_27: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_27_ +_eq_true_27_: + li $a0 1 + sw $a0 -400($fp) + b end_equal_27_ +_eq_false_27_: + li $a0 0 + sw $a0 -400($fp) +end_equal_27_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -404($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -404($fp) + lw $a0 -400($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -404($fp) + lw $a0 12($a1) + sw $a0 -396($fp) + + # IF GOTO + lw $a0, -396($fp) + bnez $a0, _cil_label_LABEL_57 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -424($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -424($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -424($fp) + sw $a0, -392($fp) + + # GOTO + j _cil_label_LABEL_58 + +_cil_label_LABEL_57: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -428($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -428($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -428($fp) + sw $a0, -392($fp) + +_cil_label_LABEL_58: + # GETATTR + lw $a1 -28($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # GETATTR + lw $a1 -392($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # + + lw $a0, -4($fp) + lw $a1, -8($fp) + add $a0, $a0, $a1 + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 432 + jr $ra + +function_CellularAutomaton_cell_at_next_evolution: + move $fp, $sp + subu $sp, $sp, 120 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 84($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 3 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_28_ + beq $t1 $zero _eq_false_28_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_28_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_28 + li $a2 7 + beq $a0 $a2 _eq_int_bool_28 + li $a2 8 + bne $a0 $a2 _not_basic_type_28_ +_eq_str_28_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_28_ + beq $t3 $0 _eq_true_28_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_28_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_28_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_28_ + b _eq_true_28_ +_not_basic_type_28_: + bne $t0 $t1 _eq_false_28_ + b _eq_true_28_ +_eq_int_bool_28: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_28_ +_eq_true_28_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_28_ +_eq_false_28_: + li $a0 0 + sw $a0 -8($fp) +end_equal_28_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_59 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 84($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 -48($fp) + lw $t1 -52($fp) + beq $t0 $zero _eq_false_29_ + beq $t1 $zero _eq_false_29_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_29_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_29 + li $a2 7 + beq $a0 $a2 _eq_int_bool_29 + li $a2 8 + bne $a0 $a2 _not_basic_type_29_ +_eq_str_29_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_29_ + beq $t3 $0 _eq_true_29_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_29_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_29_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_29_ + b _eq_true_29_ +_not_basic_type_29_: + bne $t0 $t1 _eq_false_29_ + b _eq_true_29_ +_eq_int_bool_29: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_29_ +_eq_true_29_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_29_ +_eq_false_29_: + li $a0 0 + sw $a0 -36($fp) +end_equal_29_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_61 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -56($fp) + la $a0, data_4 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -56($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_62 + +_cil_label_LABEL_61: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + lw $a0 -92($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -88($fp) + la $a0, data_3 + sw $a0 16($a1) + + lw $t0 -84($fp) + lw $t1 -88($fp) + beq $t0 $zero _eq_false_30_ + beq $t1 $zero _eq_false_30_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_30_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_30 + li $a2 7 + beq $a0 $a2 _eq_int_bool_30 + li $a2 8 + bne $a0 $a2 _not_basic_type_30_ +_eq_str_30_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_30_ + beq $t3 $0 _eq_true_30_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_30_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_30_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_30_ + b _eq_true_30_ +_not_basic_type_30_: + bne $t0 $t1 _eq_false_30_ + b _eq_true_30_ +_eq_int_bool_30: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_30_ +_eq_true_30_: + li $a0 1 + sw $a0 -72($fp) + b end_equal_30_ +_eq_false_30_: + li $a0 0 + sw $a0 -72($fp) +end_equal_30_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -72($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -76($fp) + lw $a0 12($a1) + sw $a0 -68($fp) + + # IF GOTO + lw $a0, -68($fp) + bnez $a0, _cil_label_LABEL_63 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + lw $a0 -100($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -96($fp) + la $a0, data_4 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -96($fp) + sw $a0, -64($fp) + + # GOTO + j _cil_label_LABEL_64 + +_cil_label_LABEL_63: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -104($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -104($fp) + la $a0, data_3 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -104($fp) + sw $a0, -64($fp) + +_cil_label_LABEL_64: + # ASSIGN + lw $a0, -64($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_62: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_60 + +_cil_label_LABEL_59: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -116($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -116($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -112($fp) + la $a0, data_3 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -112($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_60: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 120 + jr $ra + +function_CellularAutomaton_evolve: + move $fp, $sp + subu $sp, $sp, 76 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_65: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # < + lw $a1, -28($fp) + lw $a2, -32($fp) + slt $a0, $a1, $a2 + sw $a0, -24($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # IF GOTO + lw $a0, -20($fp) + bnez $a0, _cil_label_LABEL_66 + + # GOTO + j _cil_label_LABEL_67 + +_cil_label_LABEL_66: + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 88($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -44($fp) + sw $a0, -12($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # + + lw $a0, -60($fp) + lw $a1, -64($fp) + add $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_65 + +_cil_label_LABEL_67: + # ALLOCATE + la $v0 type_void + sw $v0 -16($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -12($fp) + sw $a0 24($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 76 + jr $ra + +function_CellularAutomaton_option: + move $fp, $sp + subu $sp, $sp, 992 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 24 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -28($fp) + la $a0, data_6 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 47 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -44($fp) + la $a0, data_7 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 47 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -60($fp) + la $a0, data_8 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 9 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -76($fp) + la $a0, data_9 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -76($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -92($fp) + lw $a0 -96($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -92($fp) + la $a0, data_10 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -92($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -84($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -84($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + lw $a2, -84($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -108($fp) + lw $a0 -112($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -108($fp) + la $a0, data_11 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 27 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + lw $a0 -128($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -124($fp) + la $a0, data_12 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + li $a0, 24 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + lw $a0 -144($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -140($fp) + la $a0, data_13 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -140($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -132($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -132($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + lw $a2, -132($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + li $a0, 10 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + lw $a0 -160($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -156($fp) + la $a0, data_14 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -156($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -148($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -148($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + lw $a2, -148($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + lw $a0 -176($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -172($fp) + la $a0, data_15 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -172($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -164($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -164($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + lw $a2, -164($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -192($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -192($fp) + li $a0, 31 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -188($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -188($fp) + lw $a0 -192($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -188($fp) + la $a0, data_16 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -188($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -180($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -180($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + lw $a2, -180($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -208($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -208($fp) + li $a0, 17 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -204($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -204($fp) + lw $a0 -208($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -204($fp) + la $a0, data_17 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -204($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -196($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -196($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -200($fp) + lw $a2, -196($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + lw $a0 -224($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -220($fp) + la $a0, data_18 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -220($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -212($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -212($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + lw $a2, -212($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + li $a0, 16 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -236($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -236($fp) + lw $a0 -240($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -236($fp) + la $a0, data_19 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -236($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -228($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -228($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -232($fp) + lw $a2, -228($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -256($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -256($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -252($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -252($fp) + lw $a0 -256($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -252($fp) + la $a0, data_20 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -252($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -244($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -244($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + lw $a2, -244($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -268($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -268($fp) + lw $a0 -272($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -268($fp) + la $a0, data_21 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -268($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -260($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -260($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -264($fp) + lw $a2, -260($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -288($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -288($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -284($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -284($fp) + lw $a0 -288($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -284($fp) + la $a0, data_22 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -284($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -276($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -276($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -280($fp) + lw $a2, -276($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -300($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -300($fp) + lw $a0 -304($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -300($fp) + la $a0, data_23 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -300($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -292($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -292($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -296($fp) + lw $a2, -292($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -320($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -320($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -316($fp) + lw $a0 -320($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -316($fp) + la $a0, data_24 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -316($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -308($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -308($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -312($fp) + lw $a2, -308($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -336($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -336($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -332($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -332($fp) + lw $a0 -336($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -332($fp) + la $a0, data_25 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -332($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -324($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -324($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -328($fp) + lw $a2, -324($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -352($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -352($fp) + li $a0, 12 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -348($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -348($fp) + lw $a0 -352($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -348($fp) + la $a0, data_26 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -348($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -340($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -340($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -344($fp) + lw $a2, -340($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -368($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -368($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -364($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -364($fp) + lw $a0 -368($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -364($fp) + la $a0, data_27 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -364($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -356($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -356($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -360($fp) + lw $a2, -356($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -372($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -372($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + lw $a2, -372($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -376($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -392($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -392($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -388($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -388($fp) + lw $a0 -392($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -388($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -388($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -380($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -380($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -384($fp) + lw $a2, -380($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -412($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -412($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -412($fp) + beq $t0 $zero _eq_false_31_ + beq $t1 $zero _eq_false_31_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_31_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_31 + li $a2 7 + beq $a0 $a2 _eq_int_bool_31 + li $a2 8 + bne $a0 $a2 _not_basic_type_31_ +_eq_str_31_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_31_ + beq $t3 $0 _eq_true_31_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_31_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_31_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_31_ + b _eq_true_31_ +_not_basic_type_31_: + bne $t0 $t1 _eq_false_31_ + b _eq_true_31_ +_eq_int_bool_31: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_31_ +_eq_true_31_: + li $a0 1 + sw $a0 -404($fp) + b end_equal_31_ +_eq_false_31_: + li $a0 0 + sw $a0 -404($fp) +end_equal_31_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -408($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -408($fp) + lw $a0 -404($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -408($fp) + lw $a0 12($a1) + sw $a0 -400($fp) + + # IF GOTO + lw $a0, -400($fp) + bnez $a0, _cil_label_LABEL_68 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -432($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -432($fp) + li $a0, 2 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -432($fp) + beq $t0 $zero _eq_false_32_ + beq $t1 $zero _eq_false_32_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_32_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_32 + li $a2 7 + beq $a0 $a2 _eq_int_bool_32 + li $a2 8 + bne $a0 $a2 _not_basic_type_32_ +_eq_str_32_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_32_ + beq $t3 $0 _eq_true_32_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_32_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_32_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_32_ + b _eq_true_32_ +_not_basic_type_32_: + bne $t0 $t1 _eq_false_32_ + b _eq_true_32_ +_eq_int_bool_32: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_32_ +_eq_true_32_: + li $a0 1 + sw $a0 -424($fp) + b end_equal_32_ +_eq_false_32_: + li $a0 0 + sw $a0 -424($fp) +end_equal_32_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -428($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -428($fp) + lw $a0 -424($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -428($fp) + lw $a0 12($a1) + sw $a0 -420($fp) + + # IF GOTO + lw $a0, -420($fp) + bnez $a0, _cil_label_LABEL_70 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -452($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -452($fp) + li $a0, 3 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -452($fp) + beq $t0 $zero _eq_false_33_ + beq $t1 $zero _eq_false_33_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_33_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_33 + li $a2 7 + beq $a0 $a2 _eq_int_bool_33 + li $a2 8 + bne $a0 $a2 _not_basic_type_33_ +_eq_str_33_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_33_ + beq $t3 $0 _eq_true_33_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_33_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_33_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_33_ + b _eq_true_33_ +_not_basic_type_33_: + bne $t0 $t1 _eq_false_33_ + b _eq_true_33_ +_eq_int_bool_33: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_33_ +_eq_true_33_: + li $a0 1 + sw $a0 -444($fp) + b end_equal_33_ +_eq_false_33_: + li $a0 0 + sw $a0 -444($fp) +end_equal_33_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -448($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -448($fp) + lw $a0 -444($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -448($fp) + lw $a0 12($a1) + sw $a0 -440($fp) + + # IF GOTO + lw $a0, -440($fp) + bnez $a0, _cil_label_LABEL_72 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -472($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -472($fp) + li $a0, 4 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -472($fp) + beq $t0 $zero _eq_false_34_ + beq $t1 $zero _eq_false_34_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_34_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_34 + li $a2 7 + beq $a0 $a2 _eq_int_bool_34 + li $a2 8 + bne $a0 $a2 _not_basic_type_34_ +_eq_str_34_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_34_ + beq $t3 $0 _eq_true_34_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_34_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_34_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_34_ + b _eq_true_34_ +_not_basic_type_34_: + bne $t0 $t1 _eq_false_34_ + b _eq_true_34_ +_eq_int_bool_34: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_34_ +_eq_true_34_: + li $a0 1 + sw $a0 -464($fp) + b end_equal_34_ +_eq_false_34_: + li $a0 0 + sw $a0 -464($fp) +end_equal_34_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -468($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -468($fp) + lw $a0 -464($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -468($fp) + lw $a0 12($a1) + sw $a0 -460($fp) + + # IF GOTO + lw $a0, -460($fp) + bnez $a0, _cil_label_LABEL_74 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -492($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -492($fp) + li $a0, 5 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -492($fp) + beq $t0 $zero _eq_false_35_ + beq $t1 $zero _eq_false_35_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_35_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_35 + li $a2 7 + beq $a0 $a2 _eq_int_bool_35 + li $a2 8 + bne $a0 $a2 _not_basic_type_35_ +_eq_str_35_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_35_ + beq $t3 $0 _eq_true_35_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_35_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_35_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_35_ + b _eq_true_35_ +_not_basic_type_35_: + bne $t0 $t1 _eq_false_35_ + b _eq_true_35_ +_eq_int_bool_35: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_35_ +_eq_true_35_: + li $a0 1 + sw $a0 -484($fp) + b end_equal_35_ +_eq_false_35_: + li $a0 0 + sw $a0 -484($fp) +end_equal_35_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -488($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -488($fp) + lw $a0 -484($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -488($fp) + lw $a0 12($a1) + sw $a0 -480($fp) + + # IF GOTO + lw $a0, -480($fp) + bnez $a0, _cil_label_LABEL_76 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -512($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -512($fp) + li $a0, 6 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -512($fp) + beq $t0 $zero _eq_false_36_ + beq $t1 $zero _eq_false_36_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_36_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_36 + li $a2 7 + beq $a0 $a2 _eq_int_bool_36 + li $a2 8 + bne $a0 $a2 _not_basic_type_36_ +_eq_str_36_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_36_ + beq $t3 $0 _eq_true_36_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_36_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_36_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_36_ + b _eq_true_36_ +_not_basic_type_36_: + bne $t0 $t1 _eq_false_36_ + b _eq_true_36_ +_eq_int_bool_36: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_36_ +_eq_true_36_: + li $a0 1 + sw $a0 -504($fp) + b end_equal_36_ +_eq_false_36_: + li $a0 0 + sw $a0 -504($fp) +end_equal_36_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -508($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -508($fp) + lw $a0 -504($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -508($fp) + lw $a0 12($a1) + sw $a0 -500($fp) + + # IF GOTO + lw $a0, -500($fp) + bnez $a0, _cil_label_LABEL_78 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -532($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -532($fp) + li $a0, 7 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -532($fp) + beq $t0 $zero _eq_false_37_ + beq $t1 $zero _eq_false_37_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_37_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_37 + li $a2 7 + beq $a0 $a2 _eq_int_bool_37 + li $a2 8 + bne $a0 $a2 _not_basic_type_37_ +_eq_str_37_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_37_ + beq $t3 $0 _eq_true_37_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_37_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_37_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_37_ + b _eq_true_37_ +_not_basic_type_37_: + bne $t0 $t1 _eq_false_37_ + b _eq_true_37_ +_eq_int_bool_37: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_37_ +_eq_true_37_: + li $a0 1 + sw $a0 -524($fp) + b end_equal_37_ +_eq_false_37_: + li $a0 0 + sw $a0 -524($fp) +end_equal_37_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -528($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -528($fp) + lw $a0 -524($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -528($fp) + lw $a0 12($a1) + sw $a0 -520($fp) + + # IF GOTO + lw $a0, -520($fp) + bnez $a0, _cil_label_LABEL_80 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -552($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -552($fp) + li $a0, 8 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -552($fp) + beq $t0 $zero _eq_false_38_ + beq $t1 $zero _eq_false_38_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_38_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_38 + li $a2 7 + beq $a0 $a2 _eq_int_bool_38 + li $a2 8 + bne $a0 $a2 _not_basic_type_38_ +_eq_str_38_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_38_ + beq $t3 $0 _eq_true_38_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_38_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_38_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_38_ + b _eq_true_38_ +_not_basic_type_38_: + bne $t0 $t1 _eq_false_38_ + b _eq_true_38_ +_eq_int_bool_38: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_38_ +_eq_true_38_: + li $a0 1 + sw $a0 -544($fp) + b end_equal_38_ +_eq_false_38_: + li $a0 0 + sw $a0 -544($fp) +end_equal_38_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -548($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -548($fp) + lw $a0 -544($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -548($fp) + lw $a0 12($a1) + sw $a0 -540($fp) + + # IF GOTO + lw $a0, -540($fp) + bnez $a0, _cil_label_LABEL_82 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -572($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -572($fp) + li $a0, 9 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -572($fp) + beq $t0 $zero _eq_false_39_ + beq $t1 $zero _eq_false_39_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_39_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_39 + li $a2 7 + beq $a0 $a2 _eq_int_bool_39 + li $a2 8 + bne $a0 $a2 _not_basic_type_39_ +_eq_str_39_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_39_ + beq $t3 $0 _eq_true_39_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_39_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_39_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_39_ + b _eq_true_39_ +_not_basic_type_39_: + bne $t0 $t1 _eq_false_39_ + b _eq_true_39_ +_eq_int_bool_39: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_39_ +_eq_true_39_: + li $a0 1 + sw $a0 -564($fp) + b end_equal_39_ +_eq_false_39_: + li $a0 0 + sw $a0 -564($fp) +end_equal_39_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -568($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -568($fp) + lw $a0 -564($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -568($fp) + lw $a0 12($a1) + sw $a0 -560($fp) + + # IF GOTO + lw $a0, -560($fp) + bnez $a0, _cil_label_LABEL_84 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -592($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -592($fp) + li $a0, 10 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -592($fp) + beq $t0 $zero _eq_false_40_ + beq $t1 $zero _eq_false_40_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_40_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_40 + li $a2 7 + beq $a0 $a2 _eq_int_bool_40 + li $a2 8 + bne $a0 $a2 _not_basic_type_40_ +_eq_str_40_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_40_ + beq $t3 $0 _eq_true_40_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_40_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_40_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_40_ + b _eq_true_40_ +_not_basic_type_40_: + bne $t0 $t1 _eq_false_40_ + b _eq_true_40_ +_eq_int_bool_40: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_40_ +_eq_true_40_: + li $a0 1 + sw $a0 -584($fp) + b end_equal_40_ +_eq_false_40_: + li $a0 0 + sw $a0 -584($fp) +end_equal_40_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -588($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -588($fp) + lw $a0 -584($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -588($fp) + lw $a0 12($a1) + sw $a0 -580($fp) + + # IF GOTO + lw $a0, -580($fp) + bnez $a0, _cil_label_LABEL_86 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -612($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -612($fp) + li $a0, 11 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -612($fp) + beq $t0 $zero _eq_false_41_ + beq $t1 $zero _eq_false_41_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_41_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_41 + li $a2 7 + beq $a0 $a2 _eq_int_bool_41 + li $a2 8 + bne $a0 $a2 _not_basic_type_41_ +_eq_str_41_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_41_ + beq $t3 $0 _eq_true_41_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_41_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_41_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_41_ + b _eq_true_41_ +_not_basic_type_41_: + bne $t0 $t1 _eq_false_41_ + b _eq_true_41_ +_eq_int_bool_41: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_41_ +_eq_true_41_: + li $a0 1 + sw $a0 -604($fp) + b end_equal_41_ +_eq_false_41_: + li $a0 0 + sw $a0 -604($fp) +end_equal_41_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -608($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -608($fp) + lw $a0 -604($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -608($fp) + lw $a0 12($a1) + sw $a0 -600($fp) + + # IF GOTO + lw $a0, -600($fp) + bnez $a0, _cil_label_LABEL_88 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -632($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -632($fp) + li $a0, 12 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -632($fp) + beq $t0 $zero _eq_false_42_ + beq $t1 $zero _eq_false_42_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_42_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_42 + li $a2 7 + beq $a0 $a2 _eq_int_bool_42 + li $a2 8 + bne $a0 $a2 _not_basic_type_42_ +_eq_str_42_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_42_ + beq $t3 $0 _eq_true_42_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_42_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_42_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_42_ + b _eq_true_42_ +_not_basic_type_42_: + bne $t0 $t1 _eq_false_42_ + b _eq_true_42_ +_eq_int_bool_42: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_42_ +_eq_true_42_: + li $a0 1 + sw $a0 -624($fp) + b end_equal_42_ +_eq_false_42_: + li $a0 0 + sw $a0 -624($fp) +end_equal_42_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -628($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -628($fp) + lw $a0 -624($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -628($fp) + lw $a0 12($a1) + sw $a0 -620($fp) + + # IF GOTO + lw $a0, -620($fp) + bnez $a0, _cil_label_LABEL_90 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -652($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -652($fp) + li $a0, 13 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -652($fp) + beq $t0 $zero _eq_false_43_ + beq $t1 $zero _eq_false_43_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_43_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_43 + li $a2 7 + beq $a0 $a2 _eq_int_bool_43 + li $a2 8 + bne $a0 $a2 _not_basic_type_43_ +_eq_str_43_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_43_ + beq $t3 $0 _eq_true_43_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_43_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_43_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_43_ + b _eq_true_43_ +_not_basic_type_43_: + bne $t0 $t1 _eq_false_43_ + b _eq_true_43_ +_eq_int_bool_43: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_43_ +_eq_true_43_: + li $a0 1 + sw $a0 -644($fp) + b end_equal_43_ +_eq_false_43_: + li $a0 0 + sw $a0 -644($fp) +end_equal_43_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -648($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -648($fp) + lw $a0 -644($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -648($fp) + lw $a0 12($a1) + sw $a0 -640($fp) + + # IF GOTO + lw $a0, -640($fp) + bnez $a0, _cil_label_LABEL_92 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -672($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -672($fp) + li $a0, 14 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -672($fp) + beq $t0 $zero _eq_false_44_ + beq $t1 $zero _eq_false_44_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_44_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_44 + li $a2 7 + beq $a0 $a2 _eq_int_bool_44 + li $a2 8 + bne $a0 $a2 _not_basic_type_44_ +_eq_str_44_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_44_ + beq $t3 $0 _eq_true_44_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_44_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_44_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_44_ + b _eq_true_44_ +_not_basic_type_44_: + bne $t0 $t1 _eq_false_44_ + b _eq_true_44_ +_eq_int_bool_44: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_44_ +_eq_true_44_: + li $a0 1 + sw $a0 -664($fp) + b end_equal_44_ +_eq_false_44_: + li $a0 0 + sw $a0 -664($fp) +end_equal_44_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -668($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -668($fp) + lw $a0 -664($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -668($fp) + lw $a0 12($a1) + sw $a0 -660($fp) + + # IF GOTO + lw $a0, -660($fp) + bnez $a0, _cil_label_LABEL_94 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -692($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -692($fp) + li $a0, 15 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -692($fp) + beq $t0 $zero _eq_false_45_ + beq $t1 $zero _eq_false_45_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_45_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_45 + li $a2 7 + beq $a0 $a2 _eq_int_bool_45 + li $a2 8 + bne $a0 $a2 _not_basic_type_45_ +_eq_str_45_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_45_ + beq $t3 $0 _eq_true_45_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_45_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_45_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_45_ + b _eq_true_45_ +_not_basic_type_45_: + bne $t0 $t1 _eq_false_45_ + b _eq_true_45_ +_eq_int_bool_45: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_45_ +_eq_true_45_: + li $a0 1 + sw $a0 -684($fp) + b end_equal_45_ +_eq_false_45_: + li $a0 0 + sw $a0 -684($fp) +end_equal_45_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -688($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -688($fp) + lw $a0 -684($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -688($fp) + lw $a0 12($a1) + sw $a0 -680($fp) + + # IF GOTO + lw $a0, -680($fp) + bnez $a0, _cil_label_LABEL_96 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -712($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -712($fp) + li $a0, 16 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -712($fp) + beq $t0 $zero _eq_false_46_ + beq $t1 $zero _eq_false_46_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_46_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_46 + li $a2 7 + beq $a0 $a2 _eq_int_bool_46 + li $a2 8 + bne $a0 $a2 _not_basic_type_46_ +_eq_str_46_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_46_ + beq $t3 $0 _eq_true_46_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_46_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_46_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_46_ + b _eq_true_46_ +_not_basic_type_46_: + bne $t0 $t1 _eq_false_46_ + b _eq_true_46_ +_eq_int_bool_46: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_46_ +_eq_true_46_: + li $a0 1 + sw $a0 -704($fp) + b end_equal_46_ +_eq_false_46_: + li $a0 0 + sw $a0 -704($fp) +end_equal_46_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -708($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -708($fp) + lw $a0 -704($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -708($fp) + lw $a0 12($a1) + sw $a0 -700($fp) + + # IF GOTO + lw $a0, -700($fp) + bnez $a0, _cil_label_LABEL_98 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -732($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -732($fp) + li $a0, 17 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -732($fp) + beq $t0 $zero _eq_false_47_ + beq $t1 $zero _eq_false_47_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_47_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_47 + li $a2 7 + beq $a0 $a2 _eq_int_bool_47 + li $a2 8 + bne $a0 $a2 _not_basic_type_47_ +_eq_str_47_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_47_ + beq $t3 $0 _eq_true_47_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_47_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_47_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_47_ + b _eq_true_47_ +_not_basic_type_47_: + bne $t0 $t1 _eq_false_47_ + b _eq_true_47_ +_eq_int_bool_47: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_47_ +_eq_true_47_: + li $a0 1 + sw $a0 -724($fp) + b end_equal_47_ +_eq_false_47_: + li $a0 0 + sw $a0 -724($fp) +end_equal_47_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -728($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -728($fp) + lw $a0 -724($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -728($fp) + lw $a0 12($a1) + sw $a0 -720($fp) + + # IF GOTO + lw $a0, -720($fp) + bnez $a0, _cil_label_LABEL_100 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -752($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -752($fp) + li $a0, 18 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -752($fp) + beq $t0 $zero _eq_false_48_ + beq $t1 $zero _eq_false_48_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_48_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_48 + li $a2 7 + beq $a0 $a2 _eq_int_bool_48 + li $a2 8 + bne $a0 $a2 _not_basic_type_48_ +_eq_str_48_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_48_ + beq $t3 $0 _eq_true_48_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_48_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_48_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_48_ + b _eq_true_48_ +_not_basic_type_48_: + bne $t0 $t1 _eq_false_48_ + b _eq_true_48_ +_eq_int_bool_48: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_48_ +_eq_true_48_: + li $a0 1 + sw $a0 -744($fp) + b end_equal_48_ +_eq_false_48_: + li $a0 0 + sw $a0 -744($fp) +end_equal_48_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -748($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -748($fp) + lw $a0 -744($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -748($fp) + lw $a0 12($a1) + sw $a0 -740($fp) + + # IF GOTO + lw $a0, -740($fp) + bnez $a0, _cil_label_LABEL_102 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -772($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -772($fp) + li $a0, 19 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -772($fp) + beq $t0 $zero _eq_false_49_ + beq $t1 $zero _eq_false_49_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_49_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_49 + li $a2 7 + beq $a0 $a2 _eq_int_bool_49 + li $a2 8 + bne $a0 $a2 _not_basic_type_49_ +_eq_str_49_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_49_ + beq $t3 $0 _eq_true_49_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_49_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_49_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_49_ + b _eq_true_49_ +_not_basic_type_49_: + bne $t0 $t1 _eq_false_49_ + b _eq_true_49_ +_eq_int_bool_49: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_49_ +_eq_true_49_: + li $a0 1 + sw $a0 -764($fp) + b end_equal_49_ +_eq_false_49_: + li $a0 0 + sw $a0 -764($fp) +end_equal_49_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -768($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -768($fp) + lw $a0 -764($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -768($fp) + lw $a0 12($a1) + sw $a0 -760($fp) + + # IF GOTO + lw $a0, -760($fp) + bnez $a0, _cil_label_LABEL_104 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -792($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -792($fp) + li $a0, 20 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -792($fp) + beq $t0 $zero _eq_false_50_ + beq $t1 $zero _eq_false_50_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_50_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_50 + li $a2 7 + beq $a0 $a2 _eq_int_bool_50 + li $a2 8 + bne $a0 $a2 _not_basic_type_50_ +_eq_str_50_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_50_ + beq $t3 $0 _eq_true_50_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_50_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_50_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_50_ + b _eq_true_50_ +_not_basic_type_50_: + bne $t0 $t1 _eq_false_50_ + b _eq_true_50_ +_eq_int_bool_50: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_50_ +_eq_true_50_: + li $a0 1 + sw $a0 -784($fp) + b end_equal_50_ +_eq_false_50_: + li $a0 0 + sw $a0 -784($fp) +end_equal_50_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -788($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -788($fp) + lw $a0 -784($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -788($fp) + lw $a0 12($a1) + sw $a0 -780($fp) + + # IF GOTO + lw $a0, -780($fp) + bnez $a0, _cil_label_LABEL_106 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -812($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -812($fp) + li $a0, 21 + sw $a0 12($a1) + + lw $t0 0($fp) + lw $t1 -812($fp) + beq $t0 $zero _eq_false_51_ + beq $t1 $zero _eq_false_51_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_51_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_51 + li $a2 7 + beq $a0 $a2 _eq_int_bool_51 + li $a2 8 + bne $a0 $a2 _not_basic_type_51_ +_eq_str_51_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_51_ + beq $t3 $0 _eq_true_51_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_51_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_51_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_51_ + b _eq_true_51_ +_not_basic_type_51_: + bne $t0 $t1 _eq_false_51_ + b _eq_true_51_ +_eq_int_bool_51: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_51_ +_eq_true_51_: + li $a0 1 + sw $a0 -804($fp) + b end_equal_51_ +_eq_false_51_: + li $a0 0 + sw $a0 -804($fp) +end_equal_51_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -808($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -808($fp) + lw $a0 -804($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -808($fp) + lw $a0 12($a1) + sw $a0 -800($fp) + + # IF GOTO + lw $a0, -800($fp) + bnez $a0, _cil_label_LABEL_108 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -820($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -820($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -816($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -816($fp) + lw $a0 -820($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -816($fp) + la $a0, data_28 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -816($fp) + sw $a0, -796($fp) + + # GOTO + j _cil_label_LABEL_109 + +_cil_label_LABEL_108: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -828($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -828($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -824($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -824($fp) + lw $a0 -828($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -824($fp) + la $a0, data_29 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -824($fp) + sw $a0, -796($fp) + +_cil_label_LABEL_109: + # ASSIGN + lw $a0, -796($fp) + sw $a0, -776($fp) + + # GOTO + j _cil_label_LABEL_107 + +_cil_label_LABEL_106: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -836($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -836($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -832($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -832($fp) + lw $a0 -836($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -832($fp) + la $a0, data_30 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -832($fp) + sw $a0, -776($fp) + +_cil_label_LABEL_107: + # ASSIGN + lw $a0, -776($fp) + sw $a0, -756($fp) + + # GOTO + j _cil_label_LABEL_105 + +_cil_label_LABEL_104: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -844($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -844($fp) + li $a0, 16 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -840($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -840($fp) + lw $a0 -844($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -840($fp) + la $a0, data_31 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -840($fp) + sw $a0, -756($fp) + +_cil_label_LABEL_105: + # ASSIGN + lw $a0, -756($fp) + sw $a0, -736($fp) + + # GOTO + j _cil_label_LABEL_103 + +_cil_label_LABEL_102: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -852($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -852($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -848($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -848($fp) + lw $a0 -852($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -848($fp) + la $a0, data_32 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -848($fp) + sw $a0, -736($fp) + +_cil_label_LABEL_103: + # ASSIGN + lw $a0, -736($fp) + sw $a0, -716($fp) + + # GOTO + j _cil_label_LABEL_101 + +_cil_label_LABEL_100: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -860($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -860($fp) + li $a0, 28 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -856($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -856($fp) + lw $a0 -860($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -856($fp) + la $a0, data_33 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -856($fp) + sw $a0, -716($fp) + +_cil_label_LABEL_101: + # ASSIGN + lw $a0, -716($fp) + sw $a0, -696($fp) + + # GOTO + j _cil_label_LABEL_99 + +_cil_label_LABEL_98: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -868($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -868($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -864($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -864($fp) + lw $a0 -868($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -864($fp) + la $a0, data_34 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -864($fp) + sw $a0, -696($fp) + +_cil_label_LABEL_99: + # ASSIGN + lw $a0, -696($fp) + sw $a0, -676($fp) + + # GOTO + j _cil_label_LABEL_97 + +_cil_label_LABEL_96: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -876($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -876($fp) + li $a0, 21 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -872($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -872($fp) + lw $a0 -876($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -872($fp) + la $a0, data_35 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -872($fp) + sw $a0, -676($fp) + +_cil_label_LABEL_97: + # ASSIGN + lw $a0, -676($fp) + sw $a0, -656($fp) + + # GOTO + j _cil_label_LABEL_95 + +_cil_label_LABEL_94: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -884($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -884($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -880($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -880($fp) + lw $a0 -884($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -880($fp) + la $a0, data_36 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -880($fp) + sw $a0, -656($fp) + +_cil_label_LABEL_95: + # ASSIGN + lw $a0, -656($fp) + sw $a0, -636($fp) + + # GOTO + j _cil_label_LABEL_93 + +_cil_label_LABEL_92: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -892($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -892($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -888($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -888($fp) + lw $a0 -892($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -888($fp) + la $a0, data_37 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -888($fp) + sw $a0, -636($fp) + +_cil_label_LABEL_93: + # ASSIGN + lw $a0, -636($fp) + sw $a0, -616($fp) + + # GOTO + j _cil_label_LABEL_91 + +_cil_label_LABEL_90: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -900($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -900($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -896($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -896($fp) + lw $a0 -900($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -896($fp) + la $a0, data_38 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -896($fp) + sw $a0, -616($fp) + +_cil_label_LABEL_91: + # ASSIGN + lw $a0, -616($fp) + sw $a0, -596($fp) + + # GOTO + j _cil_label_LABEL_89 + +_cil_label_LABEL_88: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -908($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -908($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -904($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -904($fp) + lw $a0 -908($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -904($fp) + la $a0, data_39 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -904($fp) + sw $a0, -596($fp) + +_cil_label_LABEL_89: + # ASSIGN + lw $a0, -596($fp) + sw $a0, -576($fp) + + # GOTO + j _cil_label_LABEL_87 + +_cil_label_LABEL_86: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -916($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -916($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -912($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -912($fp) + lw $a0 -916($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -912($fp) + la $a0, data_40 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -912($fp) + sw $a0, -576($fp) + +_cil_label_LABEL_87: + # ASSIGN + lw $a0, -576($fp) + sw $a0, -556($fp) + + # GOTO + j _cil_label_LABEL_85 + +_cil_label_LABEL_84: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -924($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -924($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -920($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -920($fp) + lw $a0 -924($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -920($fp) + la $a0, data_41 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -920($fp) + sw $a0, -556($fp) + +_cil_label_LABEL_85: + # ASSIGN + lw $a0, -556($fp) + sw $a0, -536($fp) + + # GOTO + j _cil_label_LABEL_83 + +_cil_label_LABEL_82: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -932($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -932($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -928($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -928($fp) + lw $a0 -932($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -928($fp) + la $a0, data_42 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -928($fp) + sw $a0, -536($fp) + +_cil_label_LABEL_83: + # ASSIGN + lw $a0, -536($fp) + sw $a0, -516($fp) + + # GOTO + j _cil_label_LABEL_81 + +_cil_label_LABEL_80: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -940($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -940($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -936($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -936($fp) + lw $a0 -940($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -936($fp) + la $a0, data_43 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -936($fp) + sw $a0, -516($fp) + +_cil_label_LABEL_81: + # ASSIGN + lw $a0, -516($fp) + sw $a0, -496($fp) + + # GOTO + j _cil_label_LABEL_79 + +_cil_label_LABEL_78: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -948($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -948($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -944($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -944($fp) + lw $a0 -948($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -944($fp) + la $a0, data_44 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -944($fp) + sw $a0, -496($fp) + +_cil_label_LABEL_79: + # ASSIGN + lw $a0, -496($fp) + sw $a0, -476($fp) + + # GOTO + j _cil_label_LABEL_77 + +_cil_label_LABEL_76: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -956($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -956($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -952($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -952($fp) + lw $a0 -956($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -952($fp) + la $a0, data_45 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -952($fp) + sw $a0, -476($fp) + +_cil_label_LABEL_77: + # ASSIGN + lw $a0, -476($fp) + sw $a0, -456($fp) + + # GOTO + j _cil_label_LABEL_75 + +_cil_label_LABEL_74: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -964($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -964($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -960($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -960($fp) + lw $a0 -964($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -960($fp) + la $a0, data_46 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -960($fp) + sw $a0, -456($fp) + +_cil_label_LABEL_75: + # ASSIGN + lw $a0, -456($fp) + sw $a0, -436($fp) + + # GOTO + j _cil_label_LABEL_73 + +_cil_label_LABEL_72: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -972($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -972($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -968($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -968($fp) + lw $a0 -972($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -968($fp) + la $a0, data_47 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -968($fp) + sw $a0, -436($fp) + +_cil_label_LABEL_73: + # ASSIGN + lw $a0, -436($fp) + sw $a0, -416($fp) + + # GOTO + j _cil_label_LABEL_71 + +_cil_label_LABEL_70: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -980($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -980($fp) + li $a0, 25 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -976($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -976($fp) + lw $a0 -980($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -976($fp) + la $a0, data_48 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -976($fp) + sw $a0, -416($fp) + +_cil_label_LABEL_71: + # ASSIGN + lw $a0, -416($fp) + sw $a0, -396($fp) + + # GOTO + j _cil_label_LABEL_69 + +_cil_label_LABEL_68: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -988($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -988($fp) + li $a0, 20 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -984($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -984($fp) + lw $a0 -988($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -984($fp) + la $a0, data_49 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -984($fp) + sw $a0, -396($fp) + +_cil_label_LABEL_69: + # RETURN + lw $v0, -396($fp) + addiu $sp, $sp, 992 + jr $ra + +function_CellularAutomaton_prompt: + move $fp, $sp + subu $sp, $sp, 92 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 54 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_50 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 49 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -28($fp) + la $a0, data_51 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -40($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -52($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -76($fp) + la $a0, data_52 + sw $a0 16($a1) + + lw $t0 0($fp) + lw $t1 -76($fp) + beq $t0 $zero _eq_false_52_ + beq $t1 $zero _eq_false_52_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_52_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_52 + li $a2 7 + beq $a0 $a2 _eq_int_bool_52 + li $a2 8 + bne $a0 $a2 _not_basic_type_52_ +_eq_str_52_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_52_ + beq $t3 $0 _eq_true_52_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_52_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_52_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_52_ + b _eq_true_52_ +_not_basic_type_52_: + bne $t0 $t1 _eq_false_52_ + b _eq_true_52_ +_eq_int_bool_52: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_52_ +_eq_true_52_: + li $a0 1 + sw $a0 -68($fp) + b end_equal_52_ +_eq_false_52_: + li $a0 0 + sw $a0 -68($fp) +end_equal_52_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # IF GOTO + lw $a0, -64($fp) + bnez $a0, _cil_label_LABEL_110 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -84($fp) + sw $a0, -60($fp) + + # GOTO + j _cil_label_LABEL_111 + +_cil_label_LABEL_110: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -88($fp) + sw $a0, -60($fp) + +_cil_label_LABEL_111: + # RETURN + lw $v0, -60($fp) + addiu $sp, $sp, 92 + jr $ra + +function_CellularAutomaton_prompt2: + move $fp, $sp + subu $sp, $sp, 92 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 2 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -12($fp) + la $a0, data_53 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 48 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -28($fp) + la $a0, data_54 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 49 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -44($fp) + la $a0, data_55 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -56($fp) + sw $a0, 0($fp) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -76($fp) + la $a0, data_56 + sw $a0 16($a1) + + lw $t0 0($fp) + lw $t1 -76($fp) + beq $t0 $zero _eq_false_53_ + beq $t1 $zero _eq_false_53_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_53_ + li $a2 6 + beq $a0 $a2 _eq_int_bool_53 + li $a2 7 + beq $a0 $a2 _eq_int_bool_53 + li $a2 8 + bne $a0 $a2 _not_basic_type_53_ +_eq_str_53_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_53_ + beq $t3 $0 _eq_true_53_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_53_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_53_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_53_ + b _eq_true_53_ +_not_basic_type_53_: + bne $t0 $t1 _eq_false_53_ + b _eq_true_53_ +_eq_int_bool_53: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_53_ +_eq_true_53_: + li $a0 1 + sw $a0 -68($fp) + b end_equal_53_ +_eq_false_53_: + li $a0 0 + sw $a0 -68($fp) +end_equal_53_: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # IF GOTO + lw $a0, -64($fp) + bnez $a0, _cil_label_LABEL_112 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -84($fp) + sw $a0, -60($fp) + + # GOTO + j _cil_label_LABEL_113 + +_cil_label_LABEL_112: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -88($fp) + sw $a0, -60($fp) + +_cil_label_LABEL_113: + # RETURN + lw $v0, -60($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_CellularAutomaton__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 28($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 148 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Bool__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_String__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_57 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 47 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -32($fp) + la $a0, data_58 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_114: + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 104($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -44($fp) + + # IF GOTO + lw $a0, -44($fp) + bnez $a0, _cil_label_LABEL_115 + + # GOTO + j _cil_label_LABEL_116 + +_cil_label_LABEL_115: + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -56($fp) + sw $a0, 0($fp) + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 96($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -64($fp) + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_CellularAutomaton__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -68($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -80($fp) + sw $a0 28($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 28($a1) + sw $a0 -84($fp) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -84($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + +_cil_label_LABEL_117: + # GETATTR + lw $a1 0($fp) + lw $a0 12($a1) + sw $a0 -100($fp) + + # IF GOTO + lw $a0, -100($fp) + bnez $a0, _cil_label_LABEL_118 + + # GOTO + j _cil_label_LABEL_119 + +_cil_label_LABEL_118: + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -112($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -112($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 100($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + lw $a2, -112($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -116($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # IF GOTO + lw $a0, -108($fp) + bnez $a0, _cil_label_LABEL_120 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -120($fp) + sw $a0, 0($fp) + + # ASSIGN + lw $a0, -120($fp) + sw $a0, -104($fp) + + # GOTO + j _cil_label_LABEL_121 + +_cil_label_LABEL_120: + # GETATTR + lw $a1 12($fp) + lw $a0 28($a1) + sw $a0 -124($fp) + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -124($fp) + lw $a0 0($a1) + sw $a0 -128($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -128($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 92($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + lw $a2, -128($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 28($a1) + sw $a0 -136($fp) + + # PUSHPARAM + lw $a0, -136($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -136($fp) + lw $a0 0($a1) + sw $a0 -140($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -140($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + lw $a2, -140($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -144($fp) + sw $a0, -104($fp) + +_cil_label_LABEL_121: + # GOTO + j _cil_label_LABEL_117 + +_cil_label_LABEL_119: + # ALLOCATE + la $v0 type_void + sw $v0 -96($fp) + + # GOTO + j _cil_label_LABEL_114 + +_cil_label_LABEL_116: + # ALLOCATE + la $v0 type_void + sw $v0 -40($fp) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 148 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/life_input.txt b/tests/codegen/life_input.txt new file mode 100644 index 00000000..07e01672 --- /dev/null +++ b/tests/codegen/life_input.txt @@ -0,0 +1,66 @@ +y +1 +n +y +2 +n +y +3 +n +y +4 +n +y +5 +n +y +6 +n +y +7 +n +y +8 +n +y +9 +n +y +10 +n +y +11 +n +y +12 +n +y +13 +n +y +14 +n +y +15 +n +y +16 +n +y +17 +n +y +18 +n +y +19 +n +y +20 +n +y +21 +y +y +n +n \ No newline at end of file diff --git a/tests/codegen/life_output.txt b/tests/codegen/life_output.txt new file mode 100644 index 00000000..5a9b9f73 --- /dev/null +++ b/tests/codegen/life_output.txt @@ -0,0 +1,778 @@ +Welcome to the Game of Life. +There are many initial states to choose from. + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + XX +XXXX +XXXX + XX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + X + X + X + X +X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X + X + X + X + X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X X + X X + X + X X +X X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X + X + X + X +X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + X + X + X + X + X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X X + X X +X X + + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + X X +X X + X X + + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X X + X X + X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + X + X X +X X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X X X + X X +X X X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +XXXXX +XXXXX +XXXXX +XXXXX +XXXXX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +XXXXX + X + X + X + X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + X + X +XXXXX + X + X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +X X + X X X + X X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + X X + X X X +X X + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +XXXX +X +X +XXXX +X +X +XXXX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + +XXX + X + X + X + X + X +XXX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + XX +X X +X X + XX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + XX +X X +X X + XX +X X +X X + XX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: +Please chose a number: + 1: A cross + 2: A slash from the upper left to lower right + 3: A slash from the upper right to lower left + 4: An X + 5: A greater than sign + 6: A less than sign + 7: Two greater than signs + 8: Two less than signs + 9: A 'V' + 10: An inverse 'V' + 11: Numbers 9 and 10 combined + 12: A full grid + 13: A 'T' + 14: A plus '+' + 15: A 'W' + 16: An 'M' + 17: An 'E' + 18: A '3' + 19: An 'O' + 20: An '8' + 21: An 'S' +Your choice => + + XXX +X +X + XX + X + X +XXX + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + +-XX- +X-X- +X--- +-XX- +---X +-X-X +-XX- + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + +-XX- +X-X- +X-X- +-XX- +-X-X +-X-X +-XX- + +Would you like to continue with the next generation? +Please use lowercase y or n for your answer [y]: + + +Would you like to choose a background pattern? +Please use lowercase y or n for your answer [n]: \ No newline at end of file diff --git a/tests/codegen/list.mips b/tests/codegen/list.mips new file mode 100644 index 00000000..f76ec38a --- /dev/null +++ b/tests/codegen/list.mips @@ -0,0 +1,2616 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz " " + data_2: .align 2 + .asciiz "\n" + data_3: .align 2 + .asciiz "Abort called from class List\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_List: .align 2 + .asciiz "List" + classname_Cons: .align 2 + .asciiz "Cons" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 36 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_List + sw $t1 28($s1) + la $t1 classname_Cons + sw $t1 32($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 72 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type List + li $a0 12 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Cons + li $a0 20 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 64($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_print_list + sw $t1 28($v0) + la $t1 function_Main_main + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type List + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_List_isNil + sw $t1 12($v0) + la $t1 function_List_head + sw $t1 16($v0) + la $t1 function_List_tail + sw $t1 20($v0) + la $t1 function_List_cons + sw $t1 24($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Cons + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Cons_isNil + sw $t1 12($v0) + la $t1 function_Cons_head + sw $t1 16($v0) + la $t1 function_Cons_tail + sw $t1 20($v0) + la $t1 function_List_cons + sw $t1 24($v0) + la $t1 function_Cons_init + sw $t1 28($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 36 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 7 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_print_list: + move $fp, $sp + subu $sp, $sp, 80 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 124 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 2 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 3 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 4 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 5 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -88($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # - + li $a0 1 + lw $a1, -76($fp) + sub $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_3 + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_3: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -112($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -120($fp) + sw $a0 12($a1) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_4: + # ALLOCATE + la $v0 type_void + sw $v0 -68($fp) + + # RETURN + lw $v0, -68($fp) + addiu $sp, $sp, 124 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_List__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_List_head: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_List_tail: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 32 + jr $ra + +function_List_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Cons__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_head: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_tail: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/list.s b/tests/codegen/list.s new file mode 100644 index 00000000..7f6f3824 --- /dev/null +++ b/tests/codegen/list.s @@ -0,0 +1,2389 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz " " + data_2: .align 2 + .asciiz "\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_List: .align 2 + .asciiz "List" + classname_Cons: .align 2 + .asciiz "Cons" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 36 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_List + sw $t1 28($s1) + la $t1 classname_Cons + sw $t1 32($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 72 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type List + li $a0 12 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Cons + li $a0 20 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 64($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_print_list + sw $t1 28($v0) + la $t1 function_Main_main + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type List + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_List_isNil + sw $t1 12($v0) + la $t1 function_List_head + sw $t1 16($v0) + la $t1 function_List_tail + sw $t1 20($v0) + la $t1 function_List_cons + sw $t1 24($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Cons + li $a0 44 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_List_isNil + sw $t1 12($v0) + la $t1 function_List_head + sw $t1 16($v0) + la $t1 function_List_tail + sw $t1 20($v0) + la $t1 function_List_cons + sw $t1 24($v0) + la $t1 function_Cons_isNil + sw $t1 28($v0) + la $t1 function_Cons_head + sw $t1 32($v0) + la $t1 function_Cons_tail + sw $t1 36($v0) + la $t1 function_Cons_init + sw $t1 40($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 36 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 7 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_print_list: + move $fp, $sp + subu $sp, $sp, 80 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -40($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -52($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 124 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 2 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 3 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -24($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 4 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 5 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -60($fp) + sw $a0 12($a1) + +_cil_label_LABEL_2: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -88($fp) + lw $a0 0($a1) + sw $a0 -92($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -92($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + lw $a2, -92($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -96($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # - + li $a0 1 + lw $a1, -76($fp) + sub $a0, $a0, $a1 + sw $a0, -80($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -80($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -84($fp) + lw $a0 12($a1) + sw $a0 -72($fp) + + # IF GOTO + lw $a0, -72($fp) + bnez $a0, _cil_label_LABEL_3 + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_3: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -100($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -100($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -104($fp) + lw $a2, -100($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -112($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -120($fp) + sw $a0 12($a1) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_4: + # ALLOCATE + la $v0 type_void + sw $v0 -68($fp) + + # RETURN + lw $v0, -68($fp) + addiu $sp, $sp, 124 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_List_head: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_List_tail: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Cons__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_head: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_tail: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/list_input.txt b/tests/codegen/list_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/list_output.txt b/tests/codegen/list_output.txt new file mode 100644 index 00000000..fca72490 --- /dev/null +++ b/tests/codegen/list_output.txt @@ -0,0 +1,5 @@ +5 4 3 2 1 +4 3 2 1 +3 2 1 +2 1 +1 diff --git a/tests/codegen/new_complex.mips b/tests/codegen/new_complex.mips new file mode 100644 index 00000000..c21e4517 --- /dev/null +++ b/tests/codegen/new_complex.mips @@ -0,0 +1,3371 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "=(\n" + data_2: .align 2 + .asciiz "=)\n" + data_3: .align 2 + .asciiz "+" + data_4: .align 2 + .asciiz "I" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Complex: .align 2 + .asciiz "Complex" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Complex + sw $t1 16($s1) + la $t1 classname_Int + sw $t1 20($s1) + la $t1 classname_Bool + sw $t1 24($s1) + la $t1 classname_String + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Complex + li $a0 20 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Complex + li $a0 60 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Complex_init + sw $t1 28($v0) + la $t1 function_Complex_print + sw $t1 32($v0) + la $t1 function_Complex_reflect_0 + sw $t1 36($v0) + la $t1 function_Complex_reflect_X + sw $t1 40($v0) + la $t1 function_Complex_reflect_Y + sw $t1 44($v0) + la $t1 function_Complex_equal + sw $t1 48($v0) + la $t1 function_Complex_x_value + sw $t1 52($v0) + la $t1 function_Complex_y_value + sw $t1 56($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 160 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Complex__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -44($fp) + lw $t1 -52($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + beq $a0 $a2 _eq_int_bool_1 + li $a2 7 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -32($fp) +end_equal_1_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -76($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_1: + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -96($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -96($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + lw $a2, -96($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -100($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -120($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -120($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + lw $a2, -120($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -108($fp) + lw $a0 0($a1) + sw $a0 -112($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -112($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + lw $a2, -112($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -116($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # IF GOTO + lw $a0, -92($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -136($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -128($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -128($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + lw $a2, -128($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -132($fp) + sw $a0, -88($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -156($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -152($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -152($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -148($fp) + sw $a0, -88($fp) + +_cil_label_LABEL_3: + # RETURN + lw $v0, -88($fp) + addiu $sp, $sp, 160 + jr $ra + +function_Complex__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Complex_init: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + lw $t0 -8($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + beq $a0 $a2 _eq_int_bool_2 + li $a2 7 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 0($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 0($fp) +end_equal_2_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -20($fp) + + lw $t0 -20($fp) + lw $t1 20($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + beq $a0 $a2 _eq_int_bool_3 + li $a2 7 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -12($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -12($fp) +end_equal_3_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Complex_print: + move $fp, $sp + subu $sp, $sp, 92 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -16($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + beq $a0 $a2 _eq_int_bool_4 + li $a2 7 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -8($fp) +end_equal_4_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -44($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -60($fp) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -40($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -84($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_5: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Complex_reflect_0: + move $fp, $sp + subu $sp, $sp, 56 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + beq $a0 $a2 _eq_int_bool_5 + li $a2 7 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 0($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 0($fp) +end_equal_5_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # - + li $a0 0 + lw $a1, -40($fp) + sub $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + lw $t0 -36($fp) + lw $t1 -48($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + beq $a0 $a2 _eq_int_bool_6 + li $a2 7 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -28($fp) +end_equal_6_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Complex_reflect_X: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + beq $a0 $a2 _eq_int_bool_7 + li $a2 7 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 0($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 0($fp) +end_equal_7_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Complex_reflect_Y: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + beq $a0 $a2 _eq_int_bool_8 + li $a2 7 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 0($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 0($fp) +end_equal_8_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Complex_equal: + move $fp, $sp + subu $sp, $sp, 68 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -16($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_9 + li $a2 6 + beq $a0 $a2 _eq_int_bool_9 + li $a2 7 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -8($fp) +end_equal_9_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -48($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -48($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_10 + li $a2 6 + beq $a0 $a2 _eq_int_bool_10 + li $a2 7 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -40($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -40($fp) +end_equal_10_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # IF GOTO + lw $a0, -36($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -32($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -64($fp) + sw $a0, -32($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -32($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_7: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 68 + jr $ra + +function_Complex_x_value: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Complex_y_value: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/new_complex.s b/tests/codegen/new_complex.s new file mode 100644 index 00000000..78dca231 --- /dev/null +++ b/tests/codegen/new_complex.s @@ -0,0 +1,3384 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "=(\n" + data_2: .align 2 + .asciiz "=)\n" + data_3: .align 2 + .asciiz "+" + data_4: .align 2 + .asciiz "I" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Complex: .align 2 + .asciiz "Complex" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Complex + sw $t1 16($s1) + la $t1 classname_Int + sw $t1 20($s1) + la $t1 classname_Bool + sw $t1 24($s1) + la $t1 classname_String + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Complex + li $a0 20 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Complex + li $a0 60 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Complex_init + sw $t1 28($v0) + la $t1 function_Complex_print + sw $t1 32($v0) + la $t1 function_Complex_reflect_0 + sw $t1 36($v0) + la $t1 function_Complex_reflect_X + sw $t1 40($v0) + la $t1 function_Complex_reflect_Y + sw $t1 44($v0) + la $t1 function_Complex_equal + sw $t1 48($v0) + la $t1 function_Complex_x_value + sw $t1 52($v0) + la $t1 function_Complex_y_value + sw $t1 56($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 160 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Complex__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -44($fp) + lw $t1 -52($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + beq $a0 $a2 _eq_int_bool_1 + li $a2 7 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -32($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -32($fp) +end_equal_1_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + lw $a0 -32($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -36($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # IF GOTO + lw $a0, -28($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -24($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -76($fp) + sw $a0, -24($fp) + +_cil_label_LABEL_1: + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -96($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -96($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + lw $a2, -96($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -100($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -100($fp) + lw $a0 0($a1) + sw $a0 -104($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -104($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -108($fp) + lw $a2, -104($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -12($fp) + lw $a0 0($a1) + sw $a0 -120($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -120($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 36($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + lw $a2, -120($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -124($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -108($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -108($fp) + lw $a0 0($a1) + sw $a0 -112($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -112($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -116($fp) + lw $a2, -112($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -116($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # IF GOTO + lw $a0, -92($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -140($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -140($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -136($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -136($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -136($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -128($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -128($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -132($fp) + lw $a2, -128($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -132($fp) + sw $a0, -88($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -156($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -156($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -152($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -152($fp) + lw $a0 -156($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -152($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -152($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -144($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -144($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -148($fp) + lw $a2, -144($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -148($fp) + sw $a0, -88($fp) + +_cil_label_LABEL_3: + # RETURN + lw $v0, -88($fp) + addiu $sp, $sp, 160 + jr $ra + +function_Complex__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Complex_init: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + lw $t0 -8($fp) + lw $t1 16($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + beq $a0 $a2 _eq_int_bool_2 + li $a2 7 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 0($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 0($fp) +end_equal_2_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -20($fp) + + lw $t0 -20($fp) + lw $t1 20($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + beq $a0 $a2 _eq_int_bool_3 + li $a2 7 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -12($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -12($fp) +end_equal_3_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Complex_print: + move $fp, $sp + subu $sp, $sp, 92 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -16($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_4_ + beq $t1 $zero _eq_false_4_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_4 + li $a2 6 + beq $a0 $a2 _eq_int_bool_4 + li $a2 7 + bne $a0 $a2 _not_basic_type_4_ +_eq_str_4_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_4_ + beq $t3 $0 _eq_true_4_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_4_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_4_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_4_ + b _eq_true_4_ +_not_basic_type_4_: + bne $t0 $t1 _eq_false_4_ + b _eq_true_4_ +_eq_int_bool_4: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_4_ +_eq_true_4_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_4_ +_eq_false_4_: + li $a0 0 + sw $a0 -8($fp) +end_equal_4_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -44($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -60($fp) + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -40($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -40($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -76($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + lw $a0 -76($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -72($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -64($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -64($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + lw $a2, -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -68($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -88($fp) + + # PUSHPARAM + lw $a0, -88($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -80($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -80($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + lw $a2, -80($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -84($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_5: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Complex_reflect_0: + move $fp, $sp + subu $sp, $sp, 56 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_5_ + beq $t1 $zero _eq_false_5_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_5 + li $a2 6 + beq $a0 $a2 _eq_int_bool_5 + li $a2 7 + bne $a0 $a2 _not_basic_type_5_ +_eq_str_5_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_5_ + beq $t3 $0 _eq_true_5_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_5_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_5_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_5_ + b _eq_true_5_ +_not_basic_type_5_: + bne $t0 $t1 _eq_false_5_ + b _eq_true_5_ +_eq_int_bool_5: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_5_ +_eq_true_5_: + li $a0 1 + sw $a0 0($fp) + b end_equal_5_ +_eq_false_5_: + li $a0 0 + sw $a0 0($fp) +end_equal_5_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -36($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -52($fp) + + # GETATTR + lw $a1 -52($fp) + lw $a0 12($a1) + sw $a0 -40($fp) + + # - + li $a0 0 + lw $a1, -40($fp) + sub $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -48($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + lw $t0 -36($fp) + lw $t1 -48($fp) + beq $t0 $zero _eq_false_6_ + beq $t1 $zero _eq_false_6_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_6 + li $a2 6 + beq $a0 $a2 _eq_int_bool_6 + li $a2 7 + bne $a0 $a2 _not_basic_type_6_ +_eq_str_6_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_6_ + beq $t3 $0 _eq_true_6_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_6_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_6_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_6_ + b _eq_true_6_ +_not_basic_type_6_: + bne $t0 $t1 _eq_false_6_ + b _eq_true_6_ +_eq_int_bool_6: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_6_ +_eq_true_6_: + li $a0 1 + sw $a0 -28($fp) + b end_equal_6_ +_eq_false_6_: + li $a0 0 + sw $a0 -28($fp) +end_equal_6_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Complex_reflect_X: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_7_ + beq $t1 $zero _eq_false_7_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_7 + li $a2 6 + beq $a0 $a2 _eq_int_bool_7 + li $a2 7 + bne $a0 $a2 _not_basic_type_7_ +_eq_str_7_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_7_ + beq $t3 $0 _eq_true_7_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_7_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_7_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_7_ + b _eq_true_7_ +_not_basic_type_7_: + bne $t0 $t1 _eq_false_7_ + b _eq_true_7_ +_eq_int_bool_7: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_7_ +_eq_true_7_: + li $a0 1 + sw $a0 0($fp) + b end_equal_7_ +_eq_false_7_: + li $a0 0 + sw $a0 0($fp) +end_equal_7_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Complex_reflect_Y: + move $fp, $sp + subu $sp, $sp, 28 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # - + li $a0 0 + lw $a1, -12($fp) + sub $a0, $a0, $a1 + sw $a0, -16($fp) + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + lw $t0 -8($fp) + lw $t1 -20($fp) + beq $t0 $zero _eq_false_8_ + beq $t1 $zero _eq_false_8_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_8 + li $a2 6 + beq $a0 $a2 _eq_int_bool_8 + li $a2 7 + bne $a0 $a2 _not_basic_type_8_ +_eq_str_8_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_8_ + beq $t3 $0 _eq_true_8_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_8_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_8_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_8_ + b _eq_true_8_ +_not_basic_type_8_: + bne $t0 $t1 _eq_false_8_ + b _eq_true_8_ +_eq_int_bool_8: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_8_ +_eq_true_8_: + li $a0 1 + sw $a0 0($fp) + b end_equal_8_ +_eq_false_8_: + li $a0 0 + sw $a0 0($fp) +end_equal_8_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 28 + jr $ra + +function_Complex_equal: + move $fp, $sp + subu $sp, $sp, 68 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -16($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_9_ + beq $t1 $zero _eq_false_9_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_9 + li $a2 6 + beq $a0 $a2 _eq_int_bool_9 + li $a2 7 + bne $a0 $a2 _not_basic_type_9_ +_eq_str_9_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_9_ + beq $t3 $0 _eq_true_9_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_9_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_9_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_9_ + b _eq_true_9_ +_not_basic_type_9_: + bne $t0 $t1 _eq_false_9_ + b _eq_true_9_ +_eq_int_bool_9: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_9_ +_eq_true_9_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_9_ +_eq_false_9_: + li $a0 0 + sw $a0 -8($fp) +end_equal_9_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -48($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -48($fp) + lw $t1 -56($fp) + beq $t0 $zero _eq_false_10_ + beq $t1 $zero _eq_false_10_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + li $a2 5 + beq $a0 $a2 _eq_int_bool_10 + li $a2 6 + beq $a0 $a2 _eq_int_bool_10 + li $a2 7 + bne $a0 $a2 _not_basic_type_10_ +_eq_str_10_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_10_ + beq $t3 $0 _eq_true_10_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_10_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_10_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_10_ + b _eq_true_10_ +_not_basic_type_10_: + bne $t0 $t1 _eq_false_10_ + b _eq_true_10_ +_eq_int_bool_10: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_10_ +_eq_true_10_: + li $a0 1 + sw $a0 -40($fp) + b end_equal_10_ +_eq_false_10_: + li $a0 0 + sw $a0 -40($fp) +end_equal_10_: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -44($fp) + lw $a0 -40($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # IF GOTO + lw $a0, -36($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -60($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -32($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -64($fp) + sw $a0, -32($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -32($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_7: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 68 + jr $ra + +function_Complex_x_value: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Complex_y_value: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/new_complex_input.txt b/tests/codegen/new_complex_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/new_complex_output.txt b/tests/codegen/new_complex_output.txt new file mode 100644 index 00000000..0e8da112 --- /dev/null +++ b/tests/codegen/new_complex_output.txt @@ -0,0 +1,2 @@ +=) +=) diff --git a/tests/codegen/palindrome.mips b/tests/codegen/palindrome.mips new file mode 100644 index 00000000..70a24479 --- /dev/null +++ b/tests/codegen/palindrome.mips @@ -0,0 +1,2358 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "enter a string\n" + data_2: .align 2 + .asciiz "that was not a palindrome\n" + data_3: .align 2 + .asciiz "that was a palindrome\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_pal + sw $t1 28($v0) + la $t1 function_Main_main + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_pal: + move $fp, $sp + subu $sp, $sp, 188 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -8($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -48($fp) + lw $t1 -52($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -36($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # GETATTR + lw $a1 -124($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # - + lw $a0, -104($fp) + lw $a1, -108($fp) + sub $a0, $a0, $a1 + sw $a0, -100($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -100($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -76($fp) + lw $t1 -92($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -64($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -64($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # IF GOTO + lw $a0, -60($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -128($fp) + sw $a0, -56($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -164($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -164($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + lw $a2, -164($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + li $a0, 2 + sw $a0 12($a1) + + # GETATTR + lw $a1 -168($fp) + lw $a0 12($a1) + sw $a0 -152($fp) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # - + lw $a0, -152($fp) + lw $a1, -156($fp) + sub $a0, $a0, $a1 + sw $a0, -148($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -176($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -140($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -140($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + lw $a2, -140($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -132($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -132($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + lw $a2, -132($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -136($fp) + sw $a0, -56($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -56($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -180($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -184($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 188 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 88 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # - + li $a0 0 + lw $a1, 0($fp) + sub $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -24($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # IF GOTO + lw $a0, -36($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -32($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 22 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -76($fp) + sw $a0, -32($fp) + +_cil_label_LABEL_7: + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 88 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/palindrome.s b/tests/codegen/palindrome.s new file mode 100644 index 00000000..195901ab --- /dev/null +++ b/tests/codegen/palindrome.s @@ -0,0 +1,2354 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "enter a string\n" + data_2: .align 2 + .asciiz "that was not a palindrome\n" + data_3: .align 2 + .asciiz "that was a palindrome\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_pal + sw $t1 28($v0) + la $t1 function_Main_main + sw $t1 32($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_pal: + move $fp, $sp + subu $sp, $sp, 188 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -20($fp) + lw $t1 -24($fp) + beq $t0 $zero _eq_false_1_ + beq $t1 $zero _eq_false_1_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_1 + li $a2 5 + beq $a0 $a2 _eq_int_bool_1 + li $a2 6 + bne $a0 $a2 _not_basic_type_1_ +_eq_str_1_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_1_ + beq $t3 $0 _eq_true_1_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_1_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_1_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_1_ + b _eq_true_1_ +_not_basic_type_1_: + bne $t0 $t1 _eq_false_1_ + b _eq_true_1_ +_eq_int_bool_1: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_1_ +_eq_true_1_: + li $a0 1 + sw $a0 -8($fp) + b end_equal_1_ +_eq_false_1_: + li $a0 0 + sw $a0 -8($fp) +end_equal_1_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -52($fp) + li $a0, 1 + sw $a0 12($a1) + + lw $t0 -48($fp) + lw $t1 -52($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -36($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -36($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + lw $a0 -36($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -32($fp) + + # IF GOTO + lw $a0, -32($fp) + bnez $a0, _cil_label_LABEL_2 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 0 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -96($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -96($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -96($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -116($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -116($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + lw $a2, -116($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -124($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -124($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -104($fp) + + # GETATTR + lw $a1 -124($fp) + lw $a0 12($a1) + sw $a0 -108($fp) + + # - + lw $a0, -104($fp) + lw $a1, -108($fp) + sub $a0, $a0, $a1 + sw $a0, -100($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -112($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -112($fp) + lw $a0 -100($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -112($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -88($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -88($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -92($fp) + lw $a2, -88($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + lw $t0 -76($fp) + lw $t1 -92($fp) + beq $t0 $zero _eq_false_3_ + beq $t1 $zero _eq_false_3_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_3 + li $a2 5 + beq $a0 $a2 _eq_int_bool_3 + li $a2 6 + bne $a0 $a2 _not_basic_type_3_ +_eq_str_3_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_3_ + beq $t3 $0 _eq_true_3_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_3_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_3_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_3_ + b _eq_true_3_ +_not_basic_type_3_: + bne $t0 $t1 _eq_false_3_ + b _eq_true_3_ +_eq_int_bool_3: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_3_ +_eq_true_3_: + li $a0 1 + sw $a0 -64($fp) + b end_equal_3_ +_eq_false_3_: + li $a0 0 + sw $a0 -64($fp) +end_equal_3_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -64($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -68($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # IF GOTO + lw $a0, -60($fp) + bnez $a0, _cil_label_LABEL_4 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -128($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -128($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -128($fp) + sw $a0, -56($fp) + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -164($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -164($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -168($fp) + lw $a2, -164($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -172($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -172($fp) + li $a0, 2 + sw $a0 12($a1) + + # GETATTR + lw $a1 -168($fp) + lw $a0 12($a1) + sw $a0 -152($fp) + + # GETATTR + lw $a1 -172($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # - + lw $a0, -152($fp) + lw $a1, -156($fp) + sub $a0, $a0, $a1 + sw $a0, -148($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -160($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -176($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -176($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -176($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 16($fp) + lw $a0 0($a1) + sw $a0 -140($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -140($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + lw $a2, -140($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -144($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -132($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -132($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -136($fp) + lw $a2, -132($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -136($fp) + sw $a0, -56($fp) + +_cil_label_LABEL_5: + # ASSIGN + lw $a0, -56($fp) + sw $a0, -28($fp) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_2: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -180($fp) + sw $a0, -28($fp) + +_cil_label_LABEL_3: + # ASSIGN + lw $a0, -28($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -184($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -184($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -184($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 188 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 88 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # - + li $a0 0 + lw $a1, 0($fp) + sub $a0, $a0, $a1 + sw $a0, -4($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 15 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + lw $a0 -28($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -24($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 16($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 -44($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # IF GOTO + lw $a0, -36($fp) + bnez $a0, _cil_label_LABEL_6 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + lw $a0 -68($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -64($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -56($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -56($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + lw $a2, -56($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -60($fp) + sw $a0, -32($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + li $a0, 22 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -80($fp) + lw $a0 -84($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -80($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -80($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -72($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -72($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -76($fp) + lw $a2, -72($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -76($fp) + sw $a0, -32($fp) + +_cil_label_LABEL_7: + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 88 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/palindrome_input.txt b/tests/codegen/palindrome_input.txt new file mode 100644 index 00000000..8e1b6414 --- /dev/null +++ b/tests/codegen/palindrome_input.txt @@ -0,0 +1 @@ +anitalabalatina diff --git a/tests/codegen/palindrome_output.txt b/tests/codegen/palindrome_output.txt new file mode 100644 index 00000000..7a009595 --- /dev/null +++ b/tests/codegen/palindrome_output.txt @@ -0,0 +1,2 @@ +enter a string +that was a palindrome diff --git a/tests/codegen/primes.mips b/tests/codegen/primes.mips new file mode 100644 index 00000000..f0843852 --- /dev/null +++ b/tests/codegen/primes.mips @@ -0,0 +1,2493 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "2 is trivially prime.\n" + data_2: .align 2 + .asciiz " is prime.\n" + data_3: .align 2 + .asciiz "continue" + data_4: .align 2 + .asciiz "Abort called from class String\n" + data_5: .align 2 + .asciiz "halt" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 32 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 420 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 22 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 2 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -20($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -24($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 500 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -28($fp) + sw $a0 24($a1) + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # IF GOTO + lw $a0, -36($fp) + bnez $a0, _cil_label_LABEL_1 + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_1: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -60($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # + + lw $a0, -48($fp) + lw $a1, -52($fp) + add $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -56($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 2 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -68($fp) + sw $a0 20($a1) + +_cil_label_LABEL_3: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -104($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -124($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -128($fp) + + # GETATTR + lw $a1 -124($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -116($fp) + + # * + lw $a0, -112($fp) + lw $a1, -116($fp) + mul $a0, $a0, $a1 + sw $a0, -108($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -104($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # < + lw $a1, -92($fp) + lw $a2, -96($fp) + slt $a0, $a1, $a2 + sw $a0, -88($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # IF GOTO + lw $a0, -84($fp) + bnez $a0, _cil_label_LABEL_6 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -164($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -184($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -204($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -208($fp) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -192($fp) + + # GETATTR + lw $a1 -208($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # / + lw $a0, -192($fp) + lw $a1, -196($fp) + beqz $a1 _div_error_1_ + div $a0, $a0, $a1 + sw $a0, -188($fp) + b _div_end_1_ +_div_error_1_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_1_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -200($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -200($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -184($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # GETATTR + lw $a1 -200($fp) + lw $a0 12($a1) + sw $a0 -176($fp) + + # * + lw $a0, -172($fp) + lw $a1, -176($fp) + mul $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -164($fp) + lw $a0 12($a1) + sw $a0 -152($fp) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # - + lw $a0, -152($fp) + lw $a1, -156($fp) + sub $a0, $a0, $a1 + sw $a0, -148($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -160($fp) + lw $t1 -212($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -140($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -140($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -144($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # IF GOTO + lw $a0, -136($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -216($fp) + sw $a0, -132($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -220($fp) + sw $a0, -132($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -132($fp) + sw $a0, -80($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, -80($fp) + +_cil_label_LABEL_7: + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_4 + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -244($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -244($fp) + lw $a0 12($a1) + sw $a0 -232($fp) + + # GETATTR + lw $a1 -248($fp) + lw $a0 12($a1) + sw $a0 -236($fp) + + # + + lw $a0, -232($fp) + lw $a1, -236($fp) + add $a0, $a0, $a1 + sw $a0, -228($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + lw $a0 -228($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -240($fp) + sw $a0 20($a1) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_5: + # ALLOCATE + la $v0 type_void + sw $v0 -72($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -276($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -296($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -300($fp) + + # GETATTR + lw $a1 -296($fp) + lw $a0 12($a1) + sw $a0 -284($fp) + + # GETATTR + lw $a1 -300($fp) + lw $a0 12($a1) + sw $a0 -288($fp) + + # * + lw $a0, -284($fp) + lw $a1, -288($fp) + mul $a0, $a0, $a1 + sw $a0, -280($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + lw $a0 -280($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -276($fp) + lw $a0 12($a1) + sw $a0 -264($fp) + + # GETATTR + lw $a1 -292($fp) + lw $a0 12($a1) + sw $a0 -268($fp) + + # < + lw $a1, -264($fp) + lw $a2, -268($fp) + slt $a0, $a1, $a2 + sw $a0, -260($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -272($fp) + lw $a0 12($a1) + sw $a0 -256($fp) + + # IF GOTO + lw $a0, -256($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -252($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -308($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -308($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -320($fp) + + # PUSHPARAM + lw $a0, -320($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -312($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -312($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + lw $a2, -312($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -336($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -336($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -332($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -332($fp) + lw $a0 -336($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -332($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -332($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -324($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -324($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -328($fp) + lw $a2, -324($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -328($fp) + sw $a0, -252($fp) + +_cil_label_LABEL_11: + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -364($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -368($fp) + + # GETATTR + lw $a1 -364($fp) + lw $a0 12($a1) + sw $a0 -352($fp) + + # GETATTR + lw $a1 -368($fp) + lw $a0 12($a1) + sw $a0 -356($fp) + + # <= + lw $a1, -352($fp) + lw $a2, -356($fp) + sle $a0, $a1, $a2 + sw $a0, -348($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -360($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -360($fp) + lw $a0 -348($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -360($fp) + lw $a0 12($a1) + sw $a0 -344($fp) + + # IF GOTO + lw $a0, -344($fp) + bnez $a0, _cil_label_LABEL_12 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + li $a0, 8 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -372($fp) + lw $a0 -376($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -372($fp) + la $a0, data_3 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -372($fp) + sw $a0, -340($fp) + + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_12: + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -380($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -380($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -384($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -400($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -400($fp) + li $a0, 31 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -396($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -396($fp) + lw $a0 -400($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -396($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -396($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -380($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -380($fp) + lw $a0 0($a1) + sw $a0 -388($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -388($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -392($fp) + lw $a2, -388($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -408($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -408($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -404($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -404($fp) + lw $a0 -408($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -404($fp) + la $a0, data_5 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -404($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -404($fp) + lw $a0 0($a1) + sw $a0 -412($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -412($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -416($fp) + lw $a2, -412($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -416($fp) + sw $a0, -340($fp) + +_cil_label_LABEL_13: + # GOTO + j _cil_label_LABEL_0 + +_cil_label_LABEL_2: + # ALLOCATE + la $v0 type_void + sw $v0 -32($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -32($fp) + sw $a0 28($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 420 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/primes.s b/tests/codegen/primes.s new file mode 100644 index 00000000..5621ec0b --- /dev/null +++ b/tests/codegen/primes.s @@ -0,0 +1,2365 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "2 is trivially prime.\n" + data_2: .align 2 + .asciiz " is prime.\n" + data_3: .align 2 + .asciiz "continue" + data_4: .align 2 + .asciiz "halt" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 32 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 396 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 22 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + li $a0, 2 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -16($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -20($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -24($fp) + sw $a0 20($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -28($fp) + li $a0, 500 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -28($fp) + sw $a0 24($a1) + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -40($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -40($fp) + lw $a0 12($a1) + sw $a0 -36($fp) + + # IF GOTO + lw $a0, -36($fp) + bnez $a0, _cil_label_LABEL_1 + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_1: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -60($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -64($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -60($fp) + lw $a0 12($a1) + sw $a0 -48($fp) + + # GETATTR + lw $a1 -64($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # + + lw $a0, -48($fp) + lw $a1, -52($fp) + add $a0, $a0, $a1 + sw $a0, -44($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -56($fp) + lw $a0 -44($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -56($fp) + sw $a0 16($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 2 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -68($fp) + sw $a0 20($a1) + +_cil_label_LABEL_3: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -104($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -124($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -128($fp) + + # GETATTR + lw $a1 -124($fp) + lw $a0 12($a1) + sw $a0 -112($fp) + + # GETATTR + lw $a1 -128($fp) + lw $a0 12($a1) + sw $a0 -116($fp) + + # * + lw $a0, -112($fp) + lw $a1, -116($fp) + mul $a0, $a0, $a1 + sw $a0, -108($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -120($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -120($fp) + lw $a0 -108($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -104($fp) + lw $a0 12($a1) + sw $a0 -92($fp) + + # GETATTR + lw $a1 -120($fp) + lw $a0 12($a1) + sw $a0 -96($fp) + + # < + lw $a1, -92($fp) + lw $a2, -96($fp) + slt $a0, $a1, $a2 + sw $a0, -88($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -100($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -100($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -100($fp) + lw $a0 12($a1) + sw $a0 -84($fp) + + # IF GOTO + lw $a0, -84($fp) + bnez $a0, _cil_label_LABEL_6 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -164($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -184($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -204($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -208($fp) + + # GETATTR + lw $a1 -204($fp) + lw $a0 12($a1) + sw $a0 -192($fp) + + # GETATTR + lw $a1 -208($fp) + lw $a0 12($a1) + sw $a0 -196($fp) + + # / + lw $a0, -192($fp) + lw $a1, -196($fp) + beqz $a1 _div_error_1_ + div $a0, $a0, $a1 + sw $a0, -188($fp) + b _div_end_1_ +_div_error_1_: + la $a0 _div_zero_msg + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_div_end_1_: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -200($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -200($fp) + lw $a0 -188($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -184($fp) + lw $a0 12($a1) + sw $a0 -172($fp) + + # GETATTR + lw $a1 -200($fp) + lw $a0 12($a1) + sw $a0 -176($fp) + + # * + lw $a0, -172($fp) + lw $a1, -176($fp) + mul $a0, $a0, $a1 + sw $a0, -168($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -180($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -180($fp) + lw $a0 -168($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -164($fp) + lw $a0 12($a1) + sw $a0 -152($fp) + + # GETATTR + lw $a1 -180($fp) + lw $a0 12($a1) + sw $a0 -156($fp) + + # - + lw $a0, -152($fp) + lw $a1, -156($fp) + sub $a0, $a0, $a1 + sw $a0, -148($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -160($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -160($fp) + lw $a0 -148($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -212($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -212($fp) + li $a0, 0 + sw $a0 12($a1) + + lw $t0 -160($fp) + lw $t1 -212($fp) + beq $t0 $zero _eq_false_2_ + beq $t1 $zero _eq_false_2_ + lw $a0 0($t0) + lw $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + li $a2 4 + beq $a0 $a2 _eq_int_bool_2 + li $a2 5 + beq $a0 $a2 _eq_int_bool_2 + li $a2 6 + bne $a0 $a2 _not_basic_type_2_ +_eq_str_2_: + lw $t3 12($t0) + lw $t3 12($t3) + lw $t4, 12($t1) + lw $t4, 12($t4) + bne $t3 $t4 _eq_false_2_ + beq $t3 $0 _eq_true_2_ + addu $t0 $t0 16 + lw $t0 0($t0) + addu $t1 $t1 16 + lw $t1 0($t1) + move $t2 $t3 +_verify_ascii_sequences_2_: + lb $a0 0($t0) + lb $a1 0($t1) + bne $a0 $a1 _eq_false_2_ + addu $t0 $t0 1 + addu $t1 $t1 1 + addiu $t2 $t2 -1 + bnez $t2 _verify_ascii_sequences_2_ + b _eq_true_2_ +_not_basic_type_2_: + bne $t0 $t1 _eq_false_2_ + b _eq_true_2_ +_eq_int_bool_2: + lw $a3 12($t0) + lw $t4 12($t1) + bne $a3 $t4 _eq_false_2_ +_eq_true_2_: + li $a0 1 + sw $a0 -140($fp) + b end_equal_2_ +_eq_false_2_: + li $a0 0 + sw $a0 -140($fp) +end_equal_2_: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -144($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -144($fp) + lw $a0 -140($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -144($fp) + lw $a0 12($a1) + sw $a0 -136($fp) + + # IF GOTO + lw $a0, -136($fp) + bnez $a0, _cil_label_LABEL_8 + + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -216($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -216($fp) + li $a0, 1 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -216($fp) + sw $a0, -132($fp) + + # GOTO + j _cil_label_LABEL_9 + +_cil_label_LABEL_8: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -220($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -220($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -220($fp) + sw $a0, -132($fp) + +_cil_label_LABEL_9: + # ASSIGN + lw $a0, -132($fp) + sw $a0, -80($fp) + + # GOTO + j _cil_label_LABEL_7 + +_cil_label_LABEL_6: + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -224($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -224($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -224($fp) + sw $a0, -80($fp) + +_cil_label_LABEL_7: + # GETATTR + lw $a1 -80($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # IF GOTO + lw $a0, -76($fp) + bnez $a0, _cil_label_LABEL_4 + + # GOTO + j _cil_label_LABEL_5 + +_cil_label_LABEL_4: + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -244($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -248($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -248($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -244($fp) + lw $a0 12($a1) + sw $a0 -232($fp) + + # GETATTR + lw $a1 -248($fp) + lw $a0 12($a1) + sw $a0 -236($fp) + + # + + lw $a0, -232($fp) + lw $a1, -236($fp) + add $a0, $a0, $a1 + sw $a0, -228($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -240($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -240($fp) + lw $a0 -228($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 -240($fp) + sw $a0 20($a1) + + # GOTO + j _cil_label_LABEL_3 + +_cil_label_LABEL_5: + # ALLOCATE + la $v0 type_void + sw $v0 -72($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -276($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -296($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 20($a1) + sw $a0 -300($fp) + + # GETATTR + lw $a1 -296($fp) + lw $a0 12($a1) + sw $a0 -284($fp) + + # GETATTR + lw $a1 -300($fp) + lw $a0 12($a1) + sw $a0 -288($fp) + + # * + lw $a0, -284($fp) + lw $a1, -288($fp) + mul $a0, $a0, $a1 + sw $a0, -280($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -292($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -292($fp) + lw $a0 -280($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -276($fp) + lw $a0 12($a1) + sw $a0 -264($fp) + + # GETATTR + lw $a1 -292($fp) + lw $a0 12($a1) + sw $a0 -268($fp) + + # < + lw $a1, -264($fp) + lw $a2, -268($fp) + slt $a0, $a1, $a2 + sw $a0, -260($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -272($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -272($fp) + lw $a0 -260($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -272($fp) + lw $a0 12($a1) + sw $a0 -256($fp) + + # IF GOTO + lw $a0, -256($fp) + bnez $a0, _cil_label_LABEL_10 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -304($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -304($fp) + li $a0, 0 + sw $a0 12($a1) + + # ASSIGN + lw $a0, -304($fp) + sw $a0, -252($fp) + + # GOTO + j _cil_label_LABEL_11 + +_cil_label_LABEL_10: + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -308($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -308($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -320($fp) + + # PUSHPARAM + lw $a0, -320($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -312($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -312($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -316($fp) + lw $a2, -312($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -336($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -336($fp) + li $a0, 11 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -332($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -332($fp) + lw $a0 -336($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -332($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -332($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -324($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -324($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -328($fp) + lw $a2, -324($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -328($fp) + sw $a0, -252($fp) + +_cil_label_LABEL_11: + # GETATTR + lw $a1 12($fp) + lw $a0 24($a1) + sw $a0 -364($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -368($fp) + + # GETATTR + lw $a1 -364($fp) + lw $a0 12($a1) + sw $a0 -352($fp) + + # GETATTR + lw $a1 -368($fp) + lw $a0 12($a1) + sw $a0 -356($fp) + + # <= + lw $a1, -352($fp) + lw $a2, -356($fp) + sle $a0, $a1, $a2 + sw $a0, -348($fp) + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -360($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -360($fp) + lw $a0 -348($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -360($fp) + lw $a0 12($a1) + sw $a0 -344($fp) + + # IF GOTO + lw $a0, -344($fp) + bnez $a0, _cil_label_LABEL_12 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -376($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -376($fp) + li $a0, 8 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -372($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -372($fp) + lw $a0 -376($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -372($fp) + la $a0, data_3 + sw $a0 16($a1) + + # ASSIGN + lw $a0, -372($fp) + sw $a0, -340($fp) + + # GOTO + j _cil_label_LABEL_13 + +_cil_label_LABEL_12: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -384($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -384($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -380($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -380($fp) + lw $a0 -384($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -380($fp) + la $a0, data_4 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -380($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -380($fp) + lw $a0 0($a1) + sw $a0 -388($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -388($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -392($fp) + lw $a2, -388($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -392($fp) + sw $a0, -340($fp) + +_cil_label_LABEL_13: + # GOTO + j _cil_label_LABEL_0 + +_cil_label_LABEL_2: + # ALLOCATE + la $v0 type_void + sw $v0 -32($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -32($fp) + sw $a0 28($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 396 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/primes_input.txt b/tests/codegen/primes_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/primes_output.txt b/tests/codegen/primes_output.txt new file mode 100644 index 00000000..a4d0fcb3 --- /dev/null +++ b/tests/codegen/primes_output.txt @@ -0,0 +1,96 @@ +2 is trivially prime. +3 is prime. +5 is prime. +7 is prime. +11 is prime. +13 is prime. +17 is prime. +19 is prime. +23 is prime. +29 is prime. +31 is prime. +37 is prime. +41 is prime. +43 is prime. +47 is prime. +53 is prime. +59 is prime. +61 is prime. +67 is prime. +71 is prime. +73 is prime. +79 is prime. +83 is prime. +89 is prime. +97 is prime. +101 is prime. +103 is prime. +107 is prime. +109 is prime. +113 is prime. +127 is prime. +131 is prime. +137 is prime. +139 is prime. +149 is prime. +151 is prime. +157 is prime. +163 is prime. +167 is prime. +173 is prime. +179 is prime. +181 is prime. +191 is prime. +193 is prime. +197 is prime. +199 is prime. +211 is prime. +223 is prime. +227 is prime. +229 is prime. +233 is prime. +239 is prime. +241 is prime. +251 is prime. +257 is prime. +263 is prime. +269 is prime. +271 is prime. +277 is prime. +281 is prime. +283 is prime. +293 is prime. +307 is prime. +311 is prime. +313 is prime. +317 is prime. +331 is prime. +337 is prime. +347 is prime. +349 is prime. +353 is prime. +359 is prime. +367 is prime. +373 is prime. +379 is prime. +383 is prime. +389 is prime. +397 is prime. +401 is prime. +409 is prime. +419 is prime. +421 is prime. +431 is prime. +433 is prime. +439 is prime. +443 is prime. +449 is prime. +457 is prime. +461 is prime. +463 is prime. +467 is prime. +479 is prime. +487 is prime. +491 is prime. +499 is prime. +Abort called from class String diff --git a/tests/codegen/print-cool.mips b/tests/codegen/print-cool.mips new file mode 100644 index 00000000..c35dd01e --- /dev/null +++ b/tests/codegen/print-cool.mips @@ -0,0 +1,1456 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 92 + # ALLOCATE + lw $t0 8($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 8($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 4 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function__isvoid + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 8($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 3 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -4($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -80($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/print-cool.s b/tests/codegen/print-cool.s new file mode 100644 index 00000000..c9a12cb9 --- /dev/null +++ b/tests/codegen/print-cool.s @@ -0,0 +1,1452 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 92 + # ALLOCATE + lw $t0 8($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 8($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -36($fp) + li $a0, 4 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function__isvoid + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -48($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -48($fp) + lw $a0 0($a1) + sw $a0 -52($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -52($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 8($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -56($fp) + lw $a2, -52($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + li $a0, 3 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -68($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # PUSHPARAM + lw $a0, -72($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -56($fp) + lw $a0 0($a1) + sw $a0 -60($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -60($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + lw $a2, -60($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -64($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -4($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -4($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -88($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -88($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -84($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -84($fp) + lw $a0 -88($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -84($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -84($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -76($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -76($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -80($fp) + lw $a2, -76($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -80($fp) + addiu $sp, $sp, 92 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/print-cool_input.txt b/tests/codegen/print-cool_input.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/codegen/print-cool_output.txt b/tests/codegen/print-cool_output.txt new file mode 100644 index 00000000..2b58f898 --- /dev/null +++ b/tests/codegen/print-cool_output.txt @@ -0,0 +1 @@ +cool diff --git a/tests/codegen/sort-list.mips b/tests/codegen/sort-list.mips new file mode 100644 index 00000000..4a7f0f23 --- /dev/null +++ b/tests/codegen/sort-list.mips @@ -0,0 +1,3876 @@ +#Compiled by DiazRock COOL compiler +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "Abort called from class List\n" + data_2: .align 2 + .asciiz "\n" + data_3: .align 2 + .asciiz "How many numbers to sort? " + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_List: .align 2 + .asciiz "List" + classname_Cons: .align 2 + .asciiz "Cons" + classname_Nil: .align 2 + .asciiz "Nil" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + li $v0 10 + syscall + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 40 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_List + sw $t1 12($s1) + la $t1 classname_Cons + sw $t1 16($s1) + la $t1 classname_Nil + sw $t1 20($s1) + la $t1 classname_Main + sw $t1 24($s1) + la $t1 classname_Int + sw $t1 28($s1) + la $t1 classname_Bool + sw $t1 32($s1) + la $t1 classname_String + sw $t1 36($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 80 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type List + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Cons + li $a0 20 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Nil + li $a0 12 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 72($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type List + li $a0 64 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_List_isNil + sw $t1 28($v0) + la $t1 function_List_cons + sw $t1 32($v0) + la $t1 function_List_car + sw $t1 36($v0) + la $t1 function_List_cdr + sw $t1 40($v0) + la $t1 function_List_rev + sw $t1 44($v0) + la $t1 function_List_sort + sw $t1 48($v0) + la $t1 function_List_insert + sw $t1 52($v0) + la $t1 function_List_rcons + sw $t1 56($v0) + la $t1 function_List_print_list + sw $t1 60($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Cons + li $a0 68 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Cons_isNil + sw $t1 28($v0) + la $t1 function_List_cons + sw $t1 32($v0) + la $t1 function_Cons_car + sw $t1 36($v0) + la $t1 function_Cons_cdr + sw $t1 40($v0) + la $t1 function_Cons_rev + sw $t1 44($v0) + la $t1 function_Cons_sort + sw $t1 48($v0) + la $t1 function_Cons_insert + sw $t1 52($v0) + la $t1 function_Cons_rcons + sw $t1 56($v0) + la $t1 function_Cons_print_list + sw $t1 60($v0) + la $t1 function_Cons_init + sw $t1 64($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Nil + li $a0 64 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Nil_isNil + sw $t1 28($v0) + la $t1 function_List_cons + sw $t1 32($v0) + la $t1 function_List_car + sw $t1 36($v0) + la $t1 function_List_cdr + sw $t1 40($v0) + la $t1 function_Nil_rev + sw $t1 44($v0) + la $t1 function_Nil_sort + sw $t1 48($v0) + la $t1 function_Nil_insert + sw $t1 52($v0) + la $t1 function_Nil_rcons + sw $t1 56($v0) + la $t1 function_Nil_print_list + sw $t1 60($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_iota + sw $t1 28($v0) + la $t1 function_Main_main + sw $t1 32($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 40 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List_isNil: + move $fp, $sp + subu $sp, $sp, 36 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 36 + jr $ra + +function_List_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_List_car: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 40 + jr $ra + +function_List_cdr: + move $fp, $sp + subu $sp, $sp, 40 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -32($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -32($fp) + addiu $sp, $sp, 40 + jr $ra + +function_List_rev: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_sort: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_insert: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_rcons: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_print_list: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 16($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + li $a0, 29 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -16($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -16($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -28($fp) + addiu $sp, $sp, 32 + jr $ra + +function_Cons__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Cons_car: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_cdr: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_rev: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -16($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Cons_sort: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -16($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Cons_insert: + move $fp, $sp + subu $sp, $sp, 76 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -40($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -60($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -72($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 76 + jr $ra + +function_Cons_rcons: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 32 + jr $ra + +function_Cons_print_list: + move $fp, $sp + subu $sp, $sp, 40 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -20($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -28($fp) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 60($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 40 + jr $ra + +function_Nil__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Nil_rev: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_sort: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_insert: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Nil_rcons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Nil_print_list: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_iota: + move $fp, $sp + subu $sp, $sp, 80 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Nil__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_2: + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # < + lw $a1, -24($fp) + lw $a2, -28($fp) + slt $a0, $a1, $a2 + sw $a0, -20($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # IF GOTO + lw $a0, -16($fp) + bnez $a0, _cil_label_LABEL_3 + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_3: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 64($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # + + lw $a0, -60($fp) + lw $a1, -64($fp) + add $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -68($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_4: + # ALLOCATE + la $v0 type_void + sw $v0 -12($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # RETURN + lw $v0, -76($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 56 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_3 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 60($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -52($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + + +##################################### + diff --git a/tests/codegen/sort-list.s b/tests/codegen/sort-list.s new file mode 100644 index 00000000..c532030a --- /dev/null +++ b/tests/codegen/sort-list.s @@ -0,0 +1,3495 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "\n" + data_2: .align 2 + .asciiz "How many numbers to sort? " + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_List: .align 2 + .asciiz "List" + classname_Cons: .align 2 + .asciiz "Cons" + classname_Nil: .align 2 + .asciiz "Nil" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 40 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_List + sw $t1 12($s1) + la $t1 classname_Cons + sw $t1 16($s1) + la $t1 classname_Nil + sw $t1 20($s1) + la $t1 classname_Main + sw $t1 24($s1) + la $t1 classname_Int + sw $t1 28($s1) + la $t1 classname_Bool + sw $t1 32($s1) + la $t1 classname_String + sw $t1 36($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 80 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type List + li $a0 12 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Cons + li $a0 20 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Nil + li $a0 12 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 8 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 64($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 9 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 72($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type List + li $a0 64 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_List_isNil + sw $t1 28($v0) + la $t1 function_List_cons + sw $t1 32($v0) + la $t1 function_List_car + sw $t1 36($v0) + la $t1 function_List_cdr + sw $t1 40($v0) + la $t1 function_List_rev + sw $t1 44($v0) + la $t1 function_List_sort + sw $t1 48($v0) + la $t1 function_List_insert + sw $t1 52($v0) + la $t1 function_List_rcons + sw $t1 56($v0) + la $t1 function_List_print_list + sw $t1 60($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Cons + li $a0 100 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_List_isNil + sw $t1 28($v0) + la $t1 function_List_cons + sw $t1 32($v0) + la $t1 function_List_car + sw $t1 36($v0) + la $t1 function_List_cdr + sw $t1 40($v0) + la $t1 function_List_rev + sw $t1 44($v0) + la $t1 function_List_sort + sw $t1 48($v0) + la $t1 function_List_insert + sw $t1 52($v0) + la $t1 function_List_rcons + sw $t1 56($v0) + la $t1 function_List_print_list + sw $t1 60($v0) + la $t1 function_Cons_isNil + sw $t1 64($v0) + la $t1 function_Cons_init + sw $t1 68($v0) + la $t1 function_Cons_car + sw $t1 72($v0) + la $t1 function_Cons_cdr + sw $t1 76($v0) + la $t1 function_Cons_rev + sw $t1 80($v0) + la $t1 function_Cons_sort + sw $t1 84($v0) + la $t1 function_Cons_insert + sw $t1 88($v0) + la $t1 function_Cons_rcons + sw $t1 92($v0) + la $t1 function_Cons_print_list + sw $t1 96($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Nil + li $a0 88 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_List_isNil + sw $t1 28($v0) + la $t1 function_List_cons + sw $t1 32($v0) + la $t1 function_List_car + sw $t1 36($v0) + la $t1 function_List_cdr + sw $t1 40($v0) + la $t1 function_List_rev + sw $t1 44($v0) + la $t1 function_List_sort + sw $t1 48($v0) + la $t1 function_List_insert + sw $t1 52($v0) + la $t1 function_List_rcons + sw $t1 56($v0) + la $t1 function_List_print_list + sw $t1 60($v0) + la $t1 function_Nil_isNil + sw $t1 64($v0) + la $t1 function_Nil_rev + sw $t1 68($v0) + la $t1 function_Nil_sort + sw $t1 72($v0) + la $t1 function_Nil_insert + sw $t1 76($v0) + la $t1 function_Nil_rcons + sw $t1 80($v0) + la $t1 function_Nil_print_list + sw $t1 84($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type Main + li $a0 36 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_iota + sw $t1 28($v0) + la $t1 function_Main_main + sw $t1 32($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 64($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 72($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 40 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 8 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 9 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 3 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_List_isNil: + move $fp, $sp + subu $sp, $sp, 12 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 12 + jr $ra + +function_List_cons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_List_car: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 16 + jr $ra + +function_List_cdr: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -8($fp) + addiu $sp, $sp, 16 + jr $ra + +function_List_rev: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_sort: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_insert: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_rcons: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 40($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_List_print_list: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 0($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons__init: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Int__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + la $v0 type_void + sw $v0 -4($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Cons_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_init: + move $fp, $sp + subu $sp, $sp, 0 + # SETATTR + lw $a1 12($fp) + lw $a0 16($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 20($fp) + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Cons_car: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_cdr: + move $fp, $sp + subu $sp, $sp, 4 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Cons_rev: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -16($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Cons_sort: + move $fp, $sp + subu $sp, $sp, 24 + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 0($fp) + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -4($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -4($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + lw $a2, -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -20($fp) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -8($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -16($fp) + addiu $sp, $sp, 24 + jr $ra + +function_Cons_insert: + move $fp, $sp + subu $sp, $sp, 76 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -12($fp) + + # GETATTR + lw $a1 -24($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # < + lw $a1, -12($fp) + lw $a2, -16($fp) + slt $a0, $a1, $a2 + sw $a0, -8($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -8($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -20($fp) + lw $a0 12($a1) + sw $a0 -4($fp) + + # IF GOTO + lw $a0, -4($fp) + bnez $a0, _cil_label_LABEL_0 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -44($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 52($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -56($fp) + + # PUSHPARAM + lw $a0, -56($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -36($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -36($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + lw $a2, -36($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -40($fp) + sw $a0, 0($fp) + + # GOTO + j _cil_label_LABEL_1 + +_cil_label_LABEL_0: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -60($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -64($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -60($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -60($fp) + lw $a0 0($a1) + sw $a0 -68($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -68($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + lw $a2, -68($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ASSIGN + lw $a0, -72($fp) + sw $a0, 0($fp) + +_cil_label_LABEL_1: + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 76 + jr $ra + +function_Cons_rcons: + move $fp, $sp + subu $sp, $sp, 32 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -16($fp) + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -16($fp) + lw $a0 0($a1) + sw $a0 -20($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -20($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 56($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + lw $a2, -20($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -24($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 32 + jr $ra + +function_Cons_print_list: + move $fp, $sp + subu $sp, $sp, 40 + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -8($fp) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 20($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -24($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -24($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -20($fp) + lw $a0 -24($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -20($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -12($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -12($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -16($fp) + lw $a2, -12($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 16($a1) + sw $a0 -28($fp) + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -28($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 60($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -36($fp) + addiu $sp, $sp, 40 + jr $ra + +function_Nil__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_List__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_isNil: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Nil_rev: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_sort: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Nil_insert: + move $fp, $sp + subu $sp, $sp, 8 + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 80($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 8 + jr $ra + +function_Nil_rcons: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 16($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 0($fp) + lw $a0 0($a1) + sw $a0 -8($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -8($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + lw $a2, -8($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Nil_print_list: + move $fp, $sp + subu $sp, $sp, 4 + # ALLOCATE + lw $t0 64($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 1 + sw $a0 12($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + la $v0 type_void + sw $v0 0($fp) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Main_iota: + move $fp, $sp + subu $sp, $sp, 80 + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, 0($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Nil__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + li $a0, 0 + sw $a0 12($a1) + +_cil_label_LABEL_2: + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -24($fp) + + # GETATTR + lw $a1 16($fp) + lw $a0 12($a1) + sw $a0 -28($fp) + + # < + lw $a1, -24($fp) + lw $a2, -28($fp) + slt $a0, $a1, $a2 + sw $a0, -20($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -32($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -32($fp) + lw $a0 -20($fp) + sw $a0 12($a1) + + # GETATTR + lw $a1 -32($fp) + lw $a0 12($a1) + sw $a0 -16($fp) + + # IF GOTO + lw $a0, -16($fp) + bnez $a0, _cil_label_LABEL_3 + + # GOTO + j _cil_label_LABEL_4 + +_cil_label_LABEL_3: + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + + addiu $sp, $sp, 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Cons__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -52($fp) + + # PUSHPARAM + lw $a0, -52($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -44($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -44($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 68($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -48($fp) + lw $a2, -44($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -48($fp) + sw $a0 12($a1) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -72($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -72($fp) + li $a0, 1 + sw $a0 12($a1) + + # GETATTR + lw $a1 -8($fp) + lw $a0 12($a1) + sw $a0 -60($fp) + + # GETATTR + lw $a1 -72($fp) + lw $a0 12($a1) + sw $a0 -64($fp) + + # + + lw $a0, -60($fp) + lw $a1, -64($fp) + add $a0, $a0, $a1 + sw $a0, -56($fp) + + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -68($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -68($fp) + lw $a0 -56($fp) + sw $a0 12($a1) + + # ASSIGN + lw $a0, -68($fp) + sw $a0, -8($fp) + + # GOTO + j _cil_label_LABEL_2 + +_cil_label_LABEL_4: + # ALLOCATE + la $v0 type_void + sw $v0 -12($fp) + + # GETATTR + lw $a1 12($fp) + lw $a0 12($a1) + sw $a0 -76($fp) + + # RETURN + lw $v0, -76($fp) + addiu $sp, $sp, 80 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 56 + # ALLOCATE + lw $t0 56($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 26 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 72($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -24($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -24($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 12($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -28($fp) + lw $a2, -24($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -28($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 -16($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -16($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 28($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -20($fp) + lw $a2, -16($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -20($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -20($fp) + lw $a0 0($a1) + sw $a0 -32($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -32($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 44($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -36($fp) + lw $a2, -32($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -36($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -36($fp) + lw $a0 0($a1) + sw $a0 -40($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -40($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 48($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -44($fp) + lw $a2, -40($fp) + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, -44($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 -44($fp) + lw $a0 0($a1) + sw $a0 -48($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, -48($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 60($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -52($fp) + lw $a2, -48($fp) + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -52($fp) + addiu $sp, $sp, 56 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/codegen/sort-list_input.txt b/tests/codegen/sort-list_input.txt new file mode 100644 index 00000000..f599e28b --- /dev/null +++ b/tests/codegen/sort-list_input.txt @@ -0,0 +1 @@ +10 diff --git a/tests/codegen/sort-list_output.txt b/tests/codegen/sort-list_output.txt new file mode 100644 index 00000000..9878d57e --- /dev/null +++ b/tests/codegen/sort-list_output.txt @@ -0,0 +1,10 @@ +How many numbers to sort? 0 +1 +2 +3 +4 +5 +6 +7 +8 +9 diff --git a/tests/codegen/test.cl b/tests/codegen/test.cl deleted file mode 100755 index 9c2e0fd8..00000000 --- a/tests/codegen/test.cl +++ /dev/null @@ -1,19 +0,0 @@ -class Main inherits IO { - - main () : Object { - { - let x:A <- new B in out_string( x.f().m() ); - let x:A <- new A in out_string( x.f().m() ); - } - - }; -}; - -class A { - m () : String { "A" }; - f () : A { new A }; -}; - -class B inherits A { - m () : String { "B" }; -}; diff --git a/tests/semantic/arithmetic1.cl b/tests/semantic/arithmetic1.cl new file mode 100644 index 00000000..bf94eb19 --- /dev/null +++ b/tests/semantic/arithmetic1.cl @@ -0,0 +1,11 @@ +--The static types of the two sub-expressions must be Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Int <- 1 * 2 / 3 - 4 + new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in x <- x + new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic10.cl b/tests/semantic/arithmetic10.cl new file mode 100644 index 00000000..bbfe6cdb --- /dev/null +++ b/tests/semantic/arithmetic10.cl @@ -0,0 +1,15 @@ +(* +The expression ~ is the integer +complement of . The expression must have static type Int and the entire expression +has static type Int. +*) + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Bool <- let x: Bool <- 1 / 2 - 3 + 4 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in ~new A.type_name().concat(new B.type_name().concat(new C.type_name())).length(); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic10_error.txt b/tests/semantic/arithmetic10_error.txt new file mode 100644 index 00000000..b2be0476 --- /dev/null +++ b/tests/semantic/arithmetic10_error.txt @@ -0,0 +1 @@ +(13, 19) - TypeError: Inferred type Int of initialization of attribute test does not conform to declared type Bool. \ No newline at end of file diff --git a/tests/semantic/arithmetic11.cl b/tests/semantic/arithmetic11.cl new file mode 100644 index 00000000..fc067dc1 --- /dev/null +++ b/tests/semantic/arithmetic11.cl @@ -0,0 +1,14 @@ +(* +The expression not is the boolean complement of . The expression + must have static type Bool and the entire expression has static type Bool. +*) + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Bool <- let x: Bool <- 1 / 2 - 3 + 4 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in not 1 + new A.type_name().concat(new B.type_name().concat(new C.type_name())).length(); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic11_error.txt b/tests/semantic/arithmetic11_error.txt new file mode 100644 index 00000000..bb4b8e1c --- /dev/null +++ b/tests/semantic/arithmetic11_error.txt @@ -0,0 +1 @@ +(13, 24) - TypeError: Argument of 'not' has type Int instead of Bool. \ No newline at end of file diff --git a/tests/semantic/arithmetic12.cl b/tests/semantic/arithmetic12.cl new file mode 100644 index 00000000..2e012fc4 --- /dev/null +++ b/tests/semantic/arithmetic12.cl @@ -0,0 +1,14 @@ +(* +The expression not is the boolean complement of . The expression + must have static type Bool and the entire expression has static type Bool. +*) + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Bool <- 1 / 2 - 3 + 4 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in not 1 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length(); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic12_error.txt b/tests/semantic/arithmetic12_error.txt new file mode 100644 index 00000000..d25eab65 --- /dev/null +++ b/tests/semantic/arithmetic12_error.txt @@ -0,0 +1 @@ +(12, 18) - TypeError: Inferred type Bool of initialization of attribute test does not conform to declared type Int. \ No newline at end of file diff --git a/tests/semantic/arithmetic1_error.txt b/tests/semantic/arithmetic1_error.txt new file mode 100644 index 00000000..a74ebf3d --- /dev/null +++ b/tests/semantic/arithmetic1_error.txt @@ -0,0 +1 @@ +(10, 27) - TypeError: non-Int arguments: Int + String diff --git a/tests/semantic/arithmetic2.cl b/tests/semantic/arithmetic2.cl new file mode 100644 index 00000000..59532573 --- /dev/null +++ b/tests/semantic/arithmetic2.cl @@ -0,0 +1,11 @@ +--The static types of the two sub-expressions must be Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Int <- 1 + 2 * 3 / 4 - new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in x <- x - new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic2_error.txt b/tests/semantic/arithmetic2_error.txt new file mode 100644 index 00000000..2c7952af --- /dev/null +++ b/tests/semantic/arithmetic2_error.txt @@ -0,0 +1 @@ +(10, 27) - TypeError: non-Int arguments: Int - String diff --git a/tests/semantic/arithmetic3.cl b/tests/semantic/arithmetic3.cl new file mode 100644 index 00000000..b208957f --- /dev/null +++ b/tests/semantic/arithmetic3.cl @@ -0,0 +1,11 @@ +--The static types of the two sub-expressions must be Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Int <- 1 - 2 + 3 * 4 / new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in x <- x / new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic3_error.txt b/tests/semantic/arithmetic3_error.txt new file mode 100644 index 00000000..81d88331 --- /dev/null +++ b/tests/semantic/arithmetic3_error.txt @@ -0,0 +1 @@ +(10, 27) - TypeError: non-Int arguments: Int / String diff --git a/tests/semantic/arithmetic4.cl b/tests/semantic/arithmetic4.cl new file mode 100644 index 00000000..2c7dd4fc --- /dev/null +++ b/tests/semantic/arithmetic4.cl @@ -0,0 +1,11 @@ +--The static types of the two sub-expressions must be Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Int <- 1 / 2 - 3 + 4 * new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in x <- x * new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic4_error.txt b/tests/semantic/arithmetic4_error.txt new file mode 100644 index 00000000..1ca6df02 --- /dev/null +++ b/tests/semantic/arithmetic4_error.txt @@ -0,0 +1 @@ +(10, 27) - TypeError: non-Int arguments: Int * String \ No newline at end of file diff --git a/tests/semantic/arithmetic5.cl b/tests/semantic/arithmetic5.cl new file mode 100644 index 00000000..bc08c6e8 --- /dev/null +++ b/tests/semantic/arithmetic5.cl @@ -0,0 +1,11 @@ +--The static type of the expression is Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Bool <- let x: Int <- 1 / 2 - 3 + 4 * new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in x <- x * new A.type_name().concat(new B.type_name().concat(new C.type_name())).length(); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic5_error.txt b/tests/semantic/arithmetic5_error.txt new file mode 100644 index 00000000..dd534684 --- /dev/null +++ b/tests/semantic/arithmetic5_error.txt @@ -0,0 +1 @@ +(9, 19) - TypeError: Inferred type Int of initialization of attribute test does not conform to declared type Bool. diff --git a/tests/semantic/arithmetic6.cl b/tests/semantic/arithmetic6.cl new file mode 100644 index 00000000..a0c3d03f --- /dev/null +++ b/tests/semantic/arithmetic6.cl @@ -0,0 +1,11 @@ + --The static types of the two sub-expressions must be Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Bool <- let x: Bool <- 1 / 2 - 3 + 4 <= new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in 1 <= new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; diff --git a/tests/semantic/arithmetic6_error.txt b/tests/semantic/arithmetic6_error.txt new file mode 100644 index 00000000..2e43dfc1 --- /dev/null +++ b/tests/semantic/arithmetic6_error.txt @@ -0,0 +1 @@ +(10, 22) - TypeError: non-Int arguments: Int <= String diff --git a/tests/semantic/arithmetic7.cl b/tests/semantic/arithmetic7.cl new file mode 100644 index 00000000..c00c75cd --- /dev/null +++ b/tests/semantic/arithmetic7.cl @@ -0,0 +1,12 @@ + --The static types of the two sub-expressions must be Int. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Bool <- let x: Bool <- 1 / 2 - 3 + 4 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in 1 < new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; + diff --git a/tests/semantic/arithmetic7_error.txt b/tests/semantic/arithmetic7_error.txt new file mode 100644 index 00000000..6f353711 --- /dev/null +++ b/tests/semantic/arithmetic7_error.txt @@ -0,0 +1 @@ +(10, 22) - TypeError: non-Int arguments: Int < String diff --git a/tests/semantic/arithmetic8.cl b/tests/semantic/arithmetic8.cl new file mode 100644 index 00000000..3210bdb8 --- /dev/null +++ b/tests/semantic/arithmetic8.cl @@ -0,0 +1,13 @@ + --The rules are exactly the same as for the binary arithmetic operations, except that the result is a Bool. + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Bool <- 1 / 2 - 3 + 4 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in 1 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length(); +}; + + diff --git a/tests/semantic/arithmetic8_error.txt b/tests/semantic/arithmetic8_error.txt new file mode 100644 index 00000000..ebcaa379 --- /dev/null +++ b/tests/semantic/arithmetic8_error.txt @@ -0,0 +1 @@ +(9, 18) - TypeError: Inferred type Bool of initialization of attribute test does not conform to declared type Int. diff --git a/tests/semantic/arithmetic9.cl b/tests/semantic/arithmetic9.cl new file mode 100644 index 00000000..95579e13 --- /dev/null +++ b/tests/semantic/arithmetic9.cl @@ -0,0 +1,15 @@ +(* +The expression ~ is the integer +complement of . The expression must have static type Int and the entire expression +has static type Int. +*) + +class A { }; +class B inherits A { }; +class C inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + test: Int <- let x: Bool <- 1 / 2 - 3 + 4 < new A.type_name().concat(new B.type_name().concat(new C.type_name())).length() + in 1 + ~new A.type_name().concat(new B.type_name().concat(new C.type_name())); +}; \ No newline at end of file diff --git a/tests/semantic/arithmetic9_error.txt b/tests/semantic/arithmetic9_error.txt new file mode 100644 index 00000000..99fafbbf --- /dev/null +++ b/tests/semantic/arithmetic9_error.txt @@ -0,0 +1 @@ +(14, 25) - TypeError: Argument of '~' has type String instead of Int. \ No newline at end of file diff --git a/tests/semantic/assignment1.cl b/tests/semantic/assignment1.cl new file mode 100644 index 00000000..19ab7021 --- /dev/null +++ b/tests/semantic/assignment1.cl @@ -0,0 +1,7 @@ +--The static type of the expression must conform to the declared type of the identifier + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: Int <- "String"; +}; diff --git a/tests/semantic/assignment1_error.txt b/tests/semantic/assignment1_error.txt new file mode 100644 index 00000000..6eb88301 --- /dev/null +++ b/tests/semantic/assignment1_error.txt @@ -0,0 +1 @@ +(6, 18) - TypeError: Inferred type String of initialization of attribute test does not conform to declared type Int. diff --git a/tests/semantic/assignment2.cl b/tests/semantic/assignment2.cl new file mode 100644 index 00000000..cace221a --- /dev/null +++ b/tests/semantic/assignment2.cl @@ -0,0 +1,13 @@ +--The static type of an assignment is the static type of . + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(a: A): B { a <- new C }; + test2(a: A): D { a <- new C }; +}; diff --git a/tests/semantic/assignment2_error.txt b/tests/semantic/assignment2_error.txt new file mode 100644 index 00000000..ed10b7f3 --- /dev/null +++ b/tests/semantic/assignment2_error.txt @@ -0,0 +1 @@ +(12, 22) - TypeError: Inferred return type C of method test2 does not conform to declared return type D. diff --git a/tests/semantic/assignment3.cl b/tests/semantic/assignment3.cl new file mode 100644 index 00000000..eba0d69e --- /dev/null +++ b/tests/semantic/assignment3.cl @@ -0,0 +1,14 @@ +--The static type of an assignment is the static type of . + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + a: A; + b: B <- a <- new C; + d: D <- a <- new C; +}; diff --git a/tests/semantic/assignment3_error.txt b/tests/semantic/assignment3_error.txt new file mode 100644 index 00000000..bc9a718c --- /dev/null +++ b/tests/semantic/assignment3_error.txt @@ -0,0 +1 @@ +(13, 13) - TypeError: Inferred type C of initialization of attribute d does not conform to declared type D. \ No newline at end of file diff --git a/tests/semantic/attributes1.cl b/tests/semantic/attributes1.cl new file mode 100644 index 00000000..3fa0440e --- /dev/null +++ b/tests/semantic/attributes1.cl @@ -0,0 +1,13 @@ +--The static type of the expression must conform to the declared type of the attribute. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + test1: IO <- new Main; + test2: B <- new A; + + main(): IO { out_string("Hello World!")}; +}; \ No newline at end of file diff --git a/tests/semantic/attributes1_error.txt b/tests/semantic/attributes1_error.txt new file mode 100644 index 00000000..9cb8460c --- /dev/null +++ b/tests/semantic/attributes1_error.txt @@ -0,0 +1 @@ +(10, 17) - TypeError: Inferred type A of initialization of attribute test2 does not conform to declared type B. diff --git a/tests/semantic/attributes2.cl b/tests/semantic/attributes2.cl new file mode 100644 index 00000000..7937c2cc --- /dev/null +++ b/tests/semantic/attributes2.cl @@ -0,0 +1,13 @@ +--The static type of the expression must conform to the declared type of the attribute. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + test1: IO <- new Main; + test2: C <- new D; + + main(): IO { out_string("Hello World!")}; +}; \ No newline at end of file diff --git a/tests/semantic/attributes2_error.txt b/tests/semantic/attributes2_error.txt new file mode 100644 index 00000000..6d601b7c --- /dev/null +++ b/tests/semantic/attributes2_error.txt @@ -0,0 +1 @@ +(10, 17) - TypeError: Inferred type D of initialization of attribute test2 does not conform to declared type C. diff --git a/tests/semantic/attributes3.cl b/tests/semantic/attributes3.cl new file mode 100644 index 00000000..8a67decd --- /dev/null +++ b/tests/semantic/attributes3.cl @@ -0,0 +1,25 @@ +--Attributes are local to the class in which they are defined or inherited. + +class A { + a: Int <- 5; + test(x1: Int, y1: Int): Int { + let x: Int <- x1, y: Int <-y1 in { + x <- x + a; + y <- y + a; + if b then x + y else x - y fi; + } + }; +}; +class B inherits A { + b: Bool <- true; +}; +class C inherits B { + c: String <- "C"; +}; +class D inherits B { + d: IO <- new Main.main(); +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!") }; +}; \ No newline at end of file diff --git a/tests/semantic/attributes3_error.txt b/tests/semantic/attributes3_error.txt new file mode 100644 index 00000000..6195c816 --- /dev/null +++ b/tests/semantic/attributes3_error.txt @@ -0,0 +1 @@ +(9, 16) - NameError: Undeclared identifier b. diff --git a/tests/semantic/attributes4.cl b/tests/semantic/attributes4.cl new file mode 100644 index 00000000..a7f63adb --- /dev/null +++ b/tests/semantic/attributes4.cl @@ -0,0 +1,39 @@ +--Attributes are local to the class in which they are defined or inherited. + +class A { + a: Int <- 5; +}; +class B inherits A { + b: Bool <- true; + test(x1: Int, y1: Int): Int { + let x: Int <- x1, y: Int <-y1 in { + x <- x + a; + y <- y + a; + if b then x + y else x - y fi; + } + }; +}; +class D inherits B { + d: IO <- new Main.main(); + test3(x1: Int, y1: Int): IO { + let x: Int <- x1, y: Int <-y1, c: String <- "C" in { + x <- x + a; + y <- y + a; + if b then new IO.out_string(c) else d fi; + } + }; +}; +class C inherits B { + c: String <- "C"; + test2(x1: Int, y1: Int): IO { + let x: Int <- x1, y: Int <-y1 in { + x <- x + a; + y <- y + a; + if b then new IO.out_string(c) else d fi; + } + }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!") }; +}; \ No newline at end of file diff --git a/tests/semantic/attributes4_error.txt b/tests/semantic/attributes4_error.txt new file mode 100644 index 00000000..fa5fcfa8 --- /dev/null +++ b/tests/semantic/attributes4_error.txt @@ -0,0 +1 @@ +(32, 49) - NameError: Undeclared identifier d. \ No newline at end of file diff --git a/tests/semantic/basics1.cl b/tests/semantic/basics1.cl new file mode 100644 index 00000000..32ae1656 --- /dev/null +++ b/tests/semantic/basics1.cl @@ -0,0 +1,10 @@ +-- It is an error to redefine the IO class. + +class IO { + scan(): String { ":)" }; + print(s: String): IO { new IO }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; \ No newline at end of file diff --git a/tests/semantic/basics1_error.txt b/tests/semantic/basics1_error.txt new file mode 100644 index 00000000..676f5049 --- /dev/null +++ b/tests/semantic/basics1_error.txt @@ -0,0 +1 @@ +(3, 7) - SemanticError: Redefinition of basic class IO. diff --git a/tests/semantic/basics2.cl b/tests/semantic/basics2.cl new file mode 100644 index 00000000..cf2b1cd2 --- /dev/null +++ b/tests/semantic/basics2.cl @@ -0,0 +1,9 @@ +-- It is an error to inherit from or redefine Int. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class A inherits Int { + is_prime(): Bool { false }; +}; diff --git a/tests/semantic/basics2_error.txt b/tests/semantic/basics2_error.txt new file mode 100644 index 00000000..69a3b681 --- /dev/null +++ b/tests/semantic/basics2_error.txt @@ -0,0 +1 @@ +(7, 18) - SemanticError: Class A cannot inherit class Int. diff --git a/tests/semantic/basics3.cl b/tests/semantic/basics3.cl new file mode 100644 index 00000000..fef017a8 --- /dev/null +++ b/tests/semantic/basics3.cl @@ -0,0 +1,9 @@ +-- It is an error to inherit from or redefine Int. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class Int { + is_prime(): Bool { false }; +}; \ No newline at end of file diff --git a/tests/semantic/basics3_error.txt b/tests/semantic/basics3_error.txt new file mode 100644 index 00000000..d8f80cb1 --- /dev/null +++ b/tests/semantic/basics3_error.txt @@ -0,0 +1 @@ +(7, 7) - SemanticError: Redefinition of basic class Int. diff --git a/tests/semantic/basics4.cl b/tests/semantic/basics4.cl new file mode 100644 index 00000000..9266ec79 --- /dev/null +++ b/tests/semantic/basics4.cl @@ -0,0 +1,9 @@ +-- It is an error to inherit from or redefine String. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class A inherits String { + is_palindrome(): Bool { false }; +}; \ No newline at end of file diff --git a/tests/semantic/basics4_error.txt b/tests/semantic/basics4_error.txt new file mode 100644 index 00000000..d5cd4c3d --- /dev/null +++ b/tests/semantic/basics4_error.txt @@ -0,0 +1 @@ +(7, 18) - SemanticError: Class A cannot inherit class String. diff --git a/tests/semantic/basics5.cl b/tests/semantic/basics5.cl new file mode 100644 index 00000000..bad5eff1 --- /dev/null +++ b/tests/semantic/basics5.cl @@ -0,0 +1,9 @@ +-- It is an error to inherit from or redefine String. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class String { + is_palindrome(): Bool { false }; +}; \ No newline at end of file diff --git a/tests/semantic/basics5_error.txt b/tests/semantic/basics5_error.txt new file mode 100644 index 00000000..8437accf --- /dev/null +++ b/tests/semantic/basics5_error.txt @@ -0,0 +1 @@ +(7, 7) - SemanticError: Redefinition of basic class String. diff --git a/tests/semantic/basics6.cl b/tests/semantic/basics6.cl new file mode 100644 index 00000000..47266ebe --- /dev/null +++ b/tests/semantic/basics6.cl @@ -0,0 +1,9 @@ +-- It is an error to inherit from or redefine Bool. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class A inherits Bool { + xor(b: Bool): Bool { false }; +}; \ No newline at end of file diff --git a/tests/semantic/basics6_error.txt b/tests/semantic/basics6_error.txt new file mode 100644 index 00000000..b4d22da1 --- /dev/null +++ b/tests/semantic/basics6_error.txt @@ -0,0 +1 @@ +(7, 18) - SemanticError: Class A cannot inherit class Bool. diff --git a/tests/semantic/basics7.cl b/tests/semantic/basics7.cl new file mode 100644 index 00000000..0f30aaec --- /dev/null +++ b/tests/semantic/basics7.cl @@ -0,0 +1,9 @@ +-- It is an error to inherit from or redefine Bool. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class Bool { + xor(b: Bool): Bool { false }; +}; \ No newline at end of file diff --git a/tests/semantic/basics7_error.txt b/tests/semantic/basics7_error.txt new file mode 100644 index 00000000..92660ab9 --- /dev/null +++ b/tests/semantic/basics7_error.txt @@ -0,0 +1 @@ +(7, 7) - SemanticError: Redefinition of basic class Bool. diff --git a/tests/semantic/basics8.cl b/tests/semantic/basics8.cl new file mode 100644 index 00000000..3b9697d4 --- /dev/null +++ b/tests/semantic/basics8.cl @@ -0,0 +1,9 @@ +-- It is an error redefine Object. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + +class Object { + xor(b: Bool): Bool { false }; +}; \ No newline at end of file diff --git a/tests/semantic/basics8_error.txt b/tests/semantic/basics8_error.txt new file mode 100644 index 00000000..652f47b3 --- /dev/null +++ b/tests/semantic/basics8_error.txt @@ -0,0 +1 @@ +(7, 7) - SemanticError: Redefinition of basic class Object. diff --git a/tests/semantic/blocks1.cl b/tests/semantic/blocks1.cl new file mode 100644 index 00000000..1e928908 --- /dev/null +++ b/tests/semantic/blocks1.cl @@ -0,0 +1,31 @@ +--The static type of a block is the static type of the last expression. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: B <- { + new A; + { + new B; + { + new C; + { + new D; + { + new E; + { + new F; + }; + }; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/tests/semantic/blocks1_error.txt b/tests/semantic/blocks1_error.txt new file mode 100644 index 00000000..2f0e2caf --- /dev/null +++ b/tests/semantic/blocks1_error.txt @@ -0,0 +1 @@ +(13, 16) - TypeError: Inferred type F of initialization of attribute test does not conform to declared type B. diff --git a/tests/semantic/case1.cl b/tests/semantic/case1.cl new file mode 100644 index 00000000..82c6a4d6 --- /dev/null +++ b/tests/semantic/case1.cl @@ -0,0 +1,23 @@ +--For each branch, let Ti be the static type of . The static type of a case expression is Join 1≤i≤n Ti. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- case "true" of + i: Int => New C; + b: Bool => New D; + s: String => New E; + esac; + + test: B <- case 0 of + b: Bool => new F; + i: Int => new E; + esac; +}; diff --git a/tests/semantic/case1_error.txt b/tests/semantic/case1_error.txt new file mode 100644 index 00000000..f05ce31b --- /dev/null +++ b/tests/semantic/case1_error.txt @@ -0,0 +1 @@ +(19, 16) - TypeError: Inferred type A of initialization of attribute test does not conform to declared type B. diff --git a/tests/semantic/case2.cl b/tests/semantic/case2.cl new file mode 100644 index 00000000..ae97b41d --- /dev/null +++ b/tests/semantic/case2.cl @@ -0,0 +1,23 @@ +-- The variables declared on each branch of a case must all have distinct types. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- case "true" of + i: Int => New C; + b: Bool => New D; + s: String => New E; + esac; + + test: A <- case 0 of + b: Bool => new F; + i: Bool => new E; + esac; +}; \ No newline at end of file diff --git a/tests/semantic/case2_error.txt b/tests/semantic/case2_error.txt new file mode 100644 index 00000000..302fec38 --- /dev/null +++ b/tests/semantic/case2_error.txt @@ -0,0 +1 @@ +(21, 20) - SemanticError: Duplicate branch Bool in case statement. \ No newline at end of file diff --git a/tests/semantic/case3.cl b/tests/semantic/case3.cl new file mode 100644 index 00000000..da79bbfe --- /dev/null +++ b/tests/semantic/case3.cl @@ -0,0 +1,23 @@ +-- Missing type + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- case "true" of + i: Int => New C; + b: Bool => New D; + s: String => New E; + esac; + + test: A <- case 0 of + b: Bool => new F; + i: Ball => new E; + esac; +}; \ No newline at end of file diff --git a/tests/semantic/case3_error.txt b/tests/semantic/case3_error.txt new file mode 100644 index 00000000..fea261e5 --- /dev/null +++ b/tests/semantic/case3_error.txt @@ -0,0 +1 @@ +(21, 20) - TypeError: Class Ball of case branch is undefined. \ No newline at end of file diff --git a/tests/semantic/class1.cl b/tests/semantic/class1.cl new file mode 100644 index 00000000..ed83da9d --- /dev/null +++ b/tests/semantic/class1.cl @@ -0,0 +1,9 @@ +-- Classes may not be redefined. + +class Repeat { + sum(a: Int, b: Int): Int { a + b }; +}; + +class Repeat { + mult(a: Int, b: Int): Int { a * b }; +}; \ No newline at end of file diff --git a/tests/semantic/class1_error.txt b/tests/semantic/class1_error.txt new file mode 100644 index 00000000..19c50767 --- /dev/null +++ b/tests/semantic/class1_error.txt @@ -0,0 +1,2 @@ +(7, 5) - SemanticError: Classes may not be redefined + diff --git a/tests/semantic/conditionals1.cl b/tests/semantic/conditionals1.cl new file mode 100644 index 00000000..3446a8b0 --- /dev/null +++ b/tests/semantic/conditionals1.cl @@ -0,0 +1,14 @@ +--The predicate must have static type Bool. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + a: A <- if new F then new D else new C fi; +}; \ No newline at end of file diff --git a/tests/semantic/conditionals1_error.txt b/tests/semantic/conditionals1_error.txt new file mode 100644 index 00000000..b8634535 --- /dev/null +++ b/tests/semantic/conditionals1_error.txt @@ -0,0 +1 @@ +(13, 16) - TypeError: Predicate of 'if' does not have type Bool. diff --git a/tests/semantic/conditionals2.cl b/tests/semantic/conditionals2.cl new file mode 100644 index 00000000..9d6313d7 --- /dev/null +++ b/tests/semantic/conditionals2.cl @@ -0,0 +1,24 @@ +(* +Let T and F be the static types of the branches of the conditional. Then the static type of the +conditional is T t F. (think: Walk towards Object from each of T and F until the paths meet.) +*) + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- if true then + new C + else + if false then new D + else new E fi + fi; + + test: B <- if not true then new F else new E fi; +}; diff --git a/tests/semantic/conditionals2_error.txt b/tests/semantic/conditionals2_error.txt new file mode 100644 index 00000000..d6f5fc30 --- /dev/null +++ b/tests/semantic/conditionals2_error.txt @@ -0,0 +1,2 @@ +(23, 16) - TypeError: Inferred type A of initialization of attribute test does not conform to declared type B. + diff --git a/tests/semantic/dispatch1.cl b/tests/semantic/dispatch1.cl new file mode 100644 index 00000000..1c0457fa --- /dev/null +++ b/tests/semantic/dispatch1.cl @@ -0,0 +1,33 @@ +(* +e0 .f(e1, . . . , en ) +Assume e0 has static type A. +Class A must have a method f +*) + +class A inherits IO { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + g(v: Int): Int { v + v + v }; + + back(s: String): B { { + out_string(s); + self; + } }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: B <- new D.back("Hello ").back("World!"); +}; \ No newline at end of file diff --git a/tests/semantic/dispatch1_error.txt b/tests/semantic/dispatch1_error.txt new file mode 100644 index 00000000..7fb22edc --- /dev/null +++ b/tests/semantic/dispatch1_error.txt @@ -0,0 +1 @@ +(32, 37) - AttributeError: Dispatch to undefined method back. diff --git a/tests/semantic/dispatch2.cl b/tests/semantic/dispatch2.cl new file mode 100644 index 00000000..5182912b --- /dev/null +++ b/tests/semantic/dispatch2.cl @@ -0,0 +1,34 @@ +(* +e0 .f(e1, . . . , en ) +Assume e0 has static type A. +Class A must have a method f +the dispatch and the definition of f must have the same number of arguments +*) + +class A inherits IO { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + g(v: Int): Int { v + v + v }; + + back(s: String): B { { + out_string(s); + self; + } }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: Int <- new D.back("Hello ").g(2, 2); +}; \ No newline at end of file diff --git a/tests/semantic/dispatch2_error.txt b/tests/semantic/dispatch2_error.txt new file mode 100644 index 00000000..a86c3534 --- /dev/null +++ b/tests/semantic/dispatch2_error.txt @@ -0,0 +1 @@ +(33, 39) - SemanticError: Method g called with wrong number of arguments. diff --git a/tests/semantic/dispatch3.cl b/tests/semantic/dispatch3.cl new file mode 100644 index 00000000..ecb1535d --- /dev/null +++ b/tests/semantic/dispatch3.cl @@ -0,0 +1,36 @@ +(* +e0 .f(e1, . . . , en ) +Assume e0 has static type A. +Class A must have a method f +the static type of the ith actual parameter must conform to the declared type of the ith formal parameter. +*) + +class A inherits IO { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + g(v: Int): Int { v + v + v }; + + back(s: String): B { { + out_string(s); + self; + } }; + + alphabet(a: A, b: B, c: C): D { self }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: B <- new D.alphabet(new D, new D, new D.back("Hello ")).back("World!"); +}; \ No newline at end of file diff --git a/tests/semantic/dispatch3_error.txt b/tests/semantic/dispatch3_error.txt new file mode 100644 index 00000000..0def5cf0 --- /dev/null +++ b/tests/semantic/dispatch3_error.txt @@ -0,0 +1 @@ +(35, 45) - TypeError: In call of method alphabet, type B of parameter c does not conform to declared type C. diff --git a/tests/semantic/dispatch4.cl b/tests/semantic/dispatch4.cl new file mode 100644 index 00000000..9cadd833 --- /dev/null +++ b/tests/semantic/dispatch4.cl @@ -0,0 +1,36 @@ +(* +e0 .f(e1, . . . , en ) +Assume e0 has static type A. +Class A must have a method f +If f has return type B and B is a class name, then the static type of the dispatch is B. +*) + +class A inherits IO { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + g(v: Int): Int { v + v + v }; + + back(s: String): B { { + out_string(s); + self; + } }; + + alphabet(a: A, b: B, c: C): D { self }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: D <- new D.alphabet(new D, new D.back("Hello "), new C).back("World!"); +}; \ No newline at end of file diff --git a/tests/semantic/dispatch4_error.txt b/tests/semantic/dispatch4_error.txt new file mode 100644 index 00000000..9699f166 --- /dev/null +++ b/tests/semantic/dispatch4_error.txt @@ -0,0 +1 @@ +(35, 16) - TypeError: Inferred type B of initialization of attribute test does not conform to declared type D. \ No newline at end of file diff --git a/tests/semantic/dispatch5.cl b/tests/semantic/dispatch5.cl new file mode 100644 index 00000000..b4437b1b --- /dev/null +++ b/tests/semantic/dispatch5.cl @@ -0,0 +1,31 @@ +(* +(,...,) is shorthand for self.(,...,). +*) + +class A inherits IO { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; + sum(m: Int, n: Int, p: Int): Int { m + n + p }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + + back(s: String): B { { + out_string(s); + g(2); + sum(1, 2, 3); + self; + } }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; \ No newline at end of file diff --git a/tests/semantic/dispatch5_error.txt b/tests/semantic/dispatch5_error.txt new file mode 100644 index 00000000..d26bf34a --- /dev/null +++ b/tests/semantic/dispatch5_error.txt @@ -0,0 +1 @@ +(24, 9) - AttributeError: Dispatch to undefined method sum. diff --git a/tests/semantic/dispatch6.cl b/tests/semantic/dispatch6.cl new file mode 100644 index 00000000..fcc033f2 --- /dev/null +++ b/tests/semantic/dispatch6.cl @@ -0,0 +1,32 @@ +(* +e@B.f() invokes the method +f in class B on the object that is the value of e. For this form of dispatch, the static type to the left of +“@”must conform to the type specified to the right of “@”. +*) + +class A { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; + sum(m: Int, n: Int, p: Int): Int { m + n + p }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + g(v: Int): Int { v + v + v }; + sum(v: Int, w: Int, z: Int): Int { v - w - z }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + a: A <- new D; + b: Int <- new D@B.sum(1, 2, 3); + test: Int <- a@B.sum(1, 2, 3); +}; diff --git a/tests/semantic/dispatch6_error.txt b/tests/semantic/dispatch6_error.txt new file mode 100644 index 00000000..ae9184b2 --- /dev/null +++ b/tests/semantic/dispatch6_error.txt @@ -0,0 +1 @@ +(31, 18) - TypeError: Expression type A does not conform to declared static dispatch type B. diff --git a/tests/semantic/eq1.cl b/tests/semantic/eq1.cl new file mode 100644 index 00000000..88f2a7ff --- /dev/null +++ b/tests/semantic/eq1.cl @@ -0,0 +1,17 @@ +(* +The comparison = is a special +case. If either or has static type Int, Bool, or String, then the other must have the +same static type. Any other types, including SELF TYPE, may be freely compared. +*) + +class A { }; +class B inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + x: Bool <- 1 = 2; + test: Bool <- 1 = new A; + y: Bool <- "1" = "2"; + z: Bool <- true = not false; +}; \ No newline at end of file diff --git a/tests/semantic/eq1_error.txt b/tests/semantic/eq1_error.txt new file mode 100644 index 00000000..f8142568 --- /dev/null +++ b/tests/semantic/eq1_error.txt @@ -0,0 +1 @@ +(14, 21) - TypeError: Illegal comparison with a basic type. diff --git a/tests/semantic/eq2.cl b/tests/semantic/eq2.cl new file mode 100644 index 00000000..d7685278 --- /dev/null +++ b/tests/semantic/eq2.cl @@ -0,0 +1,17 @@ +(* +The comparison = is a special +case. If either or has static type Int, Bool, or String, then the other must have the +same static type. Any other types, including SELF TYPE, may be freely compared. +*) + +class A { }; +class B inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + x: Bool <- 1 = 2; + y: Bool <- "1" = "2"; + test: Bool <- "1" = new B; + z: Bool <- true = not false; +}; diff --git a/tests/semantic/eq2_error.txt b/tests/semantic/eq2_error.txt new file mode 100644 index 00000000..a44ab0d5 --- /dev/null +++ b/tests/semantic/eq2_error.txt @@ -0,0 +1 @@ +(15, 23) - TypeError: Illegal comparison with a basic type. diff --git a/tests/semantic/eq3.cl b/tests/semantic/eq3.cl new file mode 100644 index 00000000..4dad693e --- /dev/null +++ b/tests/semantic/eq3.cl @@ -0,0 +1,17 @@ +(* +The comparison = is a special +case. If either or has static type Int, Bool, or String, then the other must have the +same static type. Any other types, including SELF TYPE, may be freely compared. +*) + +class A { }; +class B inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + x: Bool <- 1 = 2; + y: Bool <- "1" = "2"; + z: Bool <- true = not false; + test: Bool <- "true" = not false; +}; diff --git a/tests/semantic/eq3_error.txt b/tests/semantic/eq3_error.txt new file mode 100644 index 00000000..c4e27eb8 --- /dev/null +++ b/tests/semantic/eq3_error.txt @@ -0,0 +1 @@ +(16, 26) - TypeError: Illegal comparison with a basic type. diff --git a/tests/semantic/eq4.cl b/tests/semantic/eq4.cl new file mode 100644 index 00000000..11afc119 --- /dev/null +++ b/tests/semantic/eq4.cl @@ -0,0 +1,17 @@ +(* +The comparison = is a special +case. If either or has static type Int, Bool, or String, then the other must have the +same static type. Any other types, including SELF TYPE, may be freely compared. The result is a Bool. +*) + +class A { }; +class B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + x: Bool <- 1 = 2; + y: Bool <- "1" = "2"; + z: Bool <- new A = new B; + test: Int <- new A = new B; +}; diff --git a/tests/semantic/eq4_error.txt b/tests/semantic/eq4_error.txt new file mode 100644 index 00000000..3ead21d0 --- /dev/null +++ b/tests/semantic/eq4_error.txt @@ -0,0 +1 @@ +(16, 18) - TypeError: Inferred type Bool of initialization of attribute test does not conform to declared type Int. diff --git a/tests/semantic/features1.cl b/tests/semantic/features1.cl new file mode 100644 index 00000000..96dd8ebc --- /dev/null +++ b/tests/semantic/features1.cl @@ -0,0 +1,19 @@ +(* +No method name may be defined multiple times in +a class, and no attribute name may be defined multiple times in a class, but a method and an attribute +may have the same name. +*) + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A { + x: Int <- 3; + + x(): Int { 3 }; + + x: String <- ":)"; +}; \ No newline at end of file diff --git a/tests/semantic/features1_error.txt b/tests/semantic/features1_error.txt new file mode 100644 index 00000000..40033e9b --- /dev/null +++ b/tests/semantic/features1_error.txt @@ -0,0 +1 @@ +(18, 5) - SemanticError: Attribute x is multiply defined in class. \ No newline at end of file diff --git a/tests/semantic/features2.cl b/tests/semantic/features2.cl new file mode 100644 index 00000000..2db177f7 --- /dev/null +++ b/tests/semantic/features2.cl @@ -0,0 +1,19 @@ +(* +No method name may be defined multiple times in +a class, and no attribute name may be defined multiple times in a class, but a method and an attribute +may have the same name. +*) + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A { + x: Int <- 3; + + x(): String { "3" }; + + x(): String { ":)" }; +}; \ No newline at end of file diff --git a/tests/semantic/features2_error.txt b/tests/semantic/features2_error.txt new file mode 100644 index 00000000..117e0604 --- /dev/null +++ b/tests/semantic/features2_error.txt @@ -0,0 +1 @@ +(18, 5) - SemanticError: Method x is multiply defined. \ No newline at end of file diff --git a/tests/semantic/features3.cl b/tests/semantic/features3.cl new file mode 100644 index 00000000..a3b59259 --- /dev/null +++ b/tests/semantic/features3.cl @@ -0,0 +1,15 @@ +-- Missing type + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A { + x: Int <- 3; + + x(): Int { 3 }; + + c: Cadena; +}; \ No newline at end of file diff --git a/tests/semantic/features3_error.txt b/tests/semantic/features3_error.txt new file mode 100644 index 00000000..53f1abe2 --- /dev/null +++ b/tests/semantic/features3_error.txt @@ -0,0 +1 @@ +(14, 8) - TypeError: Class Cadena of attribute c is undefined. \ No newline at end of file diff --git a/tests/semantic/hello_world.cl b/tests/semantic/hello_world.cl deleted file mode 100755 index 0c818f90..00000000 --- a/tests/semantic/hello_world.cl +++ /dev/null @@ -1,5 +0,0 @@ -class Main inherits IO { - main(): IO { - out_string("Hello, World.\n") - }; -}; diff --git a/tests/semantic/inheritance1.cl b/tests/semantic/inheritance1.cl new file mode 100644 index 00000000..5adb59d9 --- /dev/null +++ b/tests/semantic/inheritance1.cl @@ -0,0 +1,19 @@ +--It is illegal to redefine attribute names. + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A { + x: Int <- 3; + + x(): String { ":)" }; +}; + +class B inherits A { + x: Int; + + div(a: Int, b: Int): Int { a / b}; +}; \ No newline at end of file diff --git a/tests/semantic/inheritance1_error.txt b/tests/semantic/inheritance1_error.txt new file mode 100644 index 00000000..ec5b504e --- /dev/null +++ b/tests/semantic/inheritance1_error.txt @@ -0,0 +1 @@ +(16, 5) - SemanticError: Attribute x is an attribute of an inherited class. \ No newline at end of file diff --git a/tests/semantic/inheritance2.cl b/tests/semantic/inheritance2.cl new file mode 100644 index 00000000..2ed46f37 --- /dev/null +++ b/tests/semantic/inheritance2.cl @@ -0,0 +1,19 @@ +--If C inherits from P, then P must have a class definition somewhere in the program. + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class Alo { + x: Int <- 3; + + x(): String { "3" }; +}; + +class B inherits A { + div(a: Int, b: Int): Int { a / b}; + + x: String <- "2"; +}; \ No newline at end of file diff --git a/tests/semantic/inheritance2.mips b/tests/semantic/inheritance2.mips new file mode 100644 index 00000000..95ec1e08 --- /dev/null +++ b/tests/semantic/inheritance2.mips @@ -0,0 +1,1323 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "bye!" + data_2: .align 2 + .asciiz "hi!" + data_3: .align 2 + .asciiz "3" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + classname_Alo: .align 2 + .asciiz "Alo" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 32 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + la $t1 classname_Alo + sw $t1 28($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 64 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + # Type Alo + li $a0 16 + li $v0 9 + syscall + li $a0 7 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 56($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + # Type Alo + li $a0 16 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_Alo_x + sw $t1 12($v0) + lw $t0 56($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 32 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 7 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Alo__init: + move $fp, $sp + subu $sp, $sp, 4 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + li $a0, 3 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + lw $a0 0($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 4 + jr $ra + +function_Alo_x: + move $fp, $sp + subu $sp, $sp, 8 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -4($fp) + li $a0, 1 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 0($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 0($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 0($fp) + la $a0, data_3 + sw $a0 16($a1) + + # RETURN + lw $v0, 0($fp) + addiu $sp, $sp, 8 + jr $ra + + +##################################### + diff --git a/tests/semantic/inheritance2_error.txt b/tests/semantic/inheritance2_error.txt new file mode 100644 index 00000000..1ec7669b --- /dev/null +++ b/tests/semantic/inheritance2_error.txt @@ -0,0 +1 @@ +(15, 18) - TypeError: Class B inherits from an undefined class A. \ No newline at end of file diff --git a/tests/semantic/inheritance3.cl b/tests/semantic/inheritance3.cl new file mode 100644 index 00000000..83a4e132 --- /dev/null +++ b/tests/semantic/inheritance3.cl @@ -0,0 +1,13 @@ +--The parent-child relation on classes defines a graph. This graph may not contain cycles. + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A inherits A { + x: Int <- 3; + + x(): String { ":)" }; +}; \ No newline at end of file diff --git a/tests/semantic/inheritance3.mips b/tests/semantic/inheritance3.mips new file mode 100644 index 00000000..0342250c --- /dev/null +++ b/tests/semantic/inheritance3.mips @@ -0,0 +1,1177 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "bye!" + data_2: .align 2 + .asciiz "hi!" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/semantic/inheritance3_error.txt b/tests/semantic/inheritance3_error.txt new file mode 100644 index 00000000..d17ca7f4 --- /dev/null +++ b/tests/semantic/inheritance3_error.txt @@ -0,0 +1 @@ +(9, 18) - SemanticError: Class A, or an ancestor of A, is involved in an inheritance cycle. \ No newline at end of file diff --git a/tests/semantic/inheritance4.cl b/tests/semantic/inheritance4.cl new file mode 100644 index 00000000..efe6e9a6 --- /dev/null +++ b/tests/semantic/inheritance4.cl @@ -0,0 +1,19 @@ +--The parent-child relation on classes defines a graph. This graph may not contain cycles. + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A inherits B { + x: Int <- 3; + + x(): String { ":)" }; +}; + +class B inherits A { + y: Int <- 2; + + div(a: Int, b: Int): Int { a / b}; +}; \ No newline at end of file diff --git a/tests/semantic/inheritance4.mips b/tests/semantic/inheritance4.mips new file mode 100644 index 00000000..0342250c --- /dev/null +++ b/tests/semantic/inheritance4.mips @@ -0,0 +1,1177 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "bye!" + data_2: .align 2 + .asciiz "hi!" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/semantic/inheritance4_error.txt b/tests/semantic/inheritance4_error.txt new file mode 100644 index 00000000..b437ec66 --- /dev/null +++ b/tests/semantic/inheritance4_error.txt @@ -0,0 +1 @@ +(15, 18) - SemanticError: Class B, or an ancestor of B, is involved in an inheritance cycle. \ No newline at end of file diff --git a/tests/semantic/inheritance5.cl b/tests/semantic/inheritance5.cl new file mode 100644 index 00000000..6650368c --- /dev/null +++ b/tests/semantic/inheritance5.cl @@ -0,0 +1,21 @@ +--The parent-child relation on classes defines a graph. This graph may not contain cycles. + +class Main inherits IO { + main(): IO { out_string("hi!") }; + + main: IO <- out_string("bye!"); +}; + +class A inherits B { + x: Int <- 3; + + x(): String { ":)" }; +}; + +class B inherits C { + y: Int <- 2; + + div(a: Int, b: Int): Int { a / b}; +}; + +class C inherits A { }; \ No newline at end of file diff --git a/tests/semantic/inheritance5.mips b/tests/semantic/inheritance5.mips new file mode 100644 index 00000000..0342250c --- /dev/null +++ b/tests/semantic/inheritance5.mips @@ -0,0 +1,1177 @@ +.data + str_buffer: .space 1024 + + _index_negative_msg: .align 2 + .asciiz "Index to substr is negative\n" + _index_out_msg: .align 2 + .asciiz "Index out range exception\n" + _abort_msg: .align 2 + .asciiz "Execution aborted\n" + _div_zero_msg: .align 2 + .asciiz "Division by zero exception\n" + + data_0: .align 2 + .asciiz "" + data_1: .align 2 + .asciiz "bye!" + data_2: .align 2 + .asciiz "hi!" + + classname_void: .align 2 + .asciiz "void" + classname_Object: .align 2 + .asciiz "Object" + classname_IO: .align 2 + .asciiz "IO" + classname_Main: .align 2 + .asciiz "Main" + classname_Int: .align 2 + .asciiz "Int" + classname_Bool: .align 2 + .asciiz "Bool" + classname_String: .align 2 + .asciiz "String" + type_void: .align 2 + .asciiz "" + +.text +main: + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_name_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_allocate_prototypes_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_prototypes + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_dispatch_tables + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_build_class_parents_table + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + # ALLOCATE + lw $t0 24($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + sw $v0 0($sp) + addiu $sp $sp -4 + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Main_main + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp $sp 4 + li $v0 10 + syscall + +########## STATIC FUNCTIONS ########## + +function___conforms: + move $fp, $sp + lw $t0 12($fp) + lw $t1 16($fp) + beq $t1 1 _conforms_ret_true_ +_conforms_loop_: + beq $t0 $t1 _conforms_ret_true_ + beq $t0 1 _conforms_ret_false_ + mul $t0 $t0 4 + addu $t0 $t0 $s2 + lw $t0 0($t0) + j _conforms_loop_ +_conforms_ret_true_: + li $v0 1 + j _conforms_ret_ +_conforms_ret_false_: + li $v0 0 + _conforms_ret_: + jr $ra + +function__isvoid: + move $fp, $sp + # ALLOCATE + lw $t0 40($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $t0 12($fp) + la $t1 type_void + beq $t0 $t1 _is_void_true_ + sw $0 12($v0) + j _is_void_end_ +_is_void_true_: + li $t0 1 + sw $t0 12($v0) +_is_void_end_: + jr $ra + +function_Object_abort: + move $fp, $sp + jr $ra + +function_Object_copy: + move $fp, $sp + lw $t0 12($fp) + lw $a0 4($t0) + move $t4 $a0 + li $v0 9 + syscall + move $t2 $v0 + li $t3 0 +_objcopy_loop: + lw $t1 0($t0) + sw $t1 0($v0) + addiu $t0 $t0 4 + addiu $v0 $v0 4 + addiu $t3 $t3 4 + ble $t4 $t3 _objcopy_loop +_objcopy_div_end_: + move $v0 $t2 + jr $ra + +function_Object_type_name: + move $fp, $sp + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + lw $a1 12($fp) + lw $a1 0($a1) + mul $a1 $a1 4 + addu $a1 $a1 $s1 + lw $a1 0($a1) + move $a2 $0 + move $t2 $a1 +_str_len_clsname_: + lb $a0 0($t2) + beq $a0 $0 _end_clsname_len_ + addiu $a2 $a2 1 + addiu $t2 $t2 1 + j _str_len_clsname_ +_end_clsname_len_: + sw $a2, 12($v0) + sw $v0, 12($v1) + sw $a1, 16($v1) + move $v0 $v1 + jr $ra + +function_String_length: + move $fp, $sp + lw $a0 12($fp) + lw $v0 12($a0) + jr $ra + +function_String_concat: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t3 $v0 + lw $a1 12($fp) + lw $a2 16($fp) + lw $t1 12($a1) + lw $t1 12($t1) + lw $t2 12($a2) + lw $t2 12($t2) + addu $t0 $t2 $t1 + sw $t0 12($v1) + lw $a1 16($a1) + lw $a2 16($a2) + addiu $t0 $t0 1 + move $a0 $t0 + li $v0 9 + syscall + move $t5 $v0 + move $t4 $a1 + addu $a1 $a1 $t1 +_strcat_copy_: + beq $t4 $a1 _end_strcat_copy_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_ +_end_strcat_copy_: + move $t4 $a2 + addu $a2 $a2 $t2 +_strcat_copy_snd_: + beq $t4 $a2 _end_strcat_copy_snd_ + lb $a0 0($t4) + sb $a0 0($t5) + addiu $t5 $t5 1 + addiu $t4 $t4 1 + j _strcat_copy_snd_ +_end_strcat_copy_snd_: + sb $0 0($t5) + sw $v1 12($t3) + sw $v0 16($t3) + move $v0 $t3 + jr $ra + +function_String_substr: + move $fp, $sp + lw $t5 12($fp) + lw $a1 16($fp) + lw $a1 12($a1) + lw $a2 20($fp) + lw $a2 12($a2) + blt $a1 $0 _index_negative + blt $a2 $0 _index_negative + add $a2 $a1 $a2 + lw $a3 12($t5) + lw $a3 12($a3) + bgt $a2 $a3 _index_out + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + move $t7 $a2 + subu $t7 $t7 $a1 + sw $t7 12($t0) + move $a0 $a2 + li $v0 9 + syscall + sw $t0 12($v1) + sw $v0 16($v1) + move $t1 $v0 + lw $t5 16($t5) + move $t4 $t5 + addu $t4 $t4 $a1 + addu $t5 $t5 $a2 +_substr_copy_: + bge $t4 $t5 _end_substr_copy_ + lb $a0 0($t4) + sb $a0 0($t1) + addiu $t1 $t1 1 + addiu $t4 $t4 1 + j _substr_copy_ +_index_negative: + la $a0 _index_negative_msg + b _subst_abort +_index_out: + la $a0 _index_out_msg + b _subst_abort +_subst_abort: + li $v0 4 + syscall + la $a0 _abort_msg + li $v0 4 + syscall + li $v0 10 + syscall +_end_substr_copy_: + move $v0 $v1 + jr $ra + +function_IO_in_int: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $t0 $v0 + li $v0 5 + syscall + sw $v0 12($t0) + move $v0 $t0 + jr $ra + +function_IO_in_string: + move $fp, $sp + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + move $v1 $v0 + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + addiu $sp, $sp, 4 + + sw $v1 12($v0) + move $t5 $v0 + la $a0 str_buffer + li $a1 1025 + li $v0 8 + syscall + move $a0 $0 + la $t2 str_buffer +_in_string_str_len_: + lb $t0 0($t2) + beq $t0 $0 _end_in_string_str_len_ + beq $t0 10 _end_in_string_str_len_ + addiu $a0 $a0 1 + addiu $t2 $t2 1 + j _in_string_str_len_ +_end_in_string_str_len_: + sw $a0 12($v1) + li $v0 9 + syscall + la $t4 str_buffer + move $t1 $v0 +_in_str_copy_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_copy_ + beq $t0 10 _end_in_str_copy_ + sb $t0 0($t1) + addiu $t4 $t4 1 + addiu $t1 $t1 1 + j _in_str_copy_ +_end_in_str_copy_: + sw $v0 16($t5) + la $t4 str_buffer +_in_str_clean_: + lb $t0 0($t4) + beq $t0 $0 _end_in_str_clean_ + sb $0 0($t4) + addiu $t4 $t4 1 + j _in_str_clean_ +_end_in_str_clean_: + move $v0 $t5 + jr $ra + +function_IO_out_int: + move $fp, $sp + lw $a0 16($fp) + lw $a0 12($a0) + li $v0 1 + syscall + lw $v0 12($fp) + jr $ra + +function_IO_out_string: + move $fp, $sp + lw $a0 16($fp) + lw $a0 16($a0) + li $v0 4 + syscall + lw $v0 12($fp) + jr $ra + + +############## TABLES ################ + +function_build_class_name_table: + li $a0 28 + li $v0 9 + syscall + move $s1 $v0 + la $t1 classname_void + sw $t1 0($s1) + la $t1 classname_Object + sw $t1 4($s1) + la $t1 classname_IO + sw $t1 8($s1) + la $t1 classname_Main + sw $t1 12($s1) + la $t1 classname_Int + sw $t1 16($s1) + la $t1 classname_Bool + sw $t1 20($s1) + la $t1 classname_String + sw $t1 24($s1) + jr $ra + +function_allocate_prototypes_table: + li $a0 56 + li $v0 9 + syscall + move $s0 $v0 + jr $ra + +function_build_prototypes: + # Type void + li $a0 12 + li $v0 9 + syscall + li $a0 0 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 0($s0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + li $a0 1 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 8($s0) + + # Type IO + li $a0 12 + li $v0 9 + syscall + li $a0 2 + sw $a0 0($v0) + li $a0 12 + sw $a0 4($v0) + sw $v0 16($s0) + + # Type Main + li $a0 16 + li $v0 9 + syscall + li $a0 3 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 24($s0) + + # Type Int + li $a0 16 + li $v0 9 + syscall + li $a0 4 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 32($s0) + + # Type Bool + li $a0 16 + li $v0 9 + syscall + li $a0 5 + sw $a0 0($v0) + li $a0 16 + sw $a0 4($v0) + sw $v0 40($s0) + + # Type String + li $a0 20 + li $v0 9 + syscall + li $a0 6 + sw $a0 0($v0) + li $a0 20 + sw $a0 4($v0) + sw $v0 48($s0) + + jr $ra + +function_build_dispatch_tables: + # Type void + li $a0 0 + li $v0 9 + syscall + lw $t0 0($s0) + sw $v0 8($t0) + + # Type Object + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 8($s0) + sw $v0 8($t0) + + # Type IO + li $a0 28 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + lw $t0 16($s0) + sw $v0 8($t0) + + # Type Main + li $a0 32 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_IO_in_int + sw $t1 12($v0) + la $t1 function_IO_in_string + sw $t1 16($v0) + la $t1 function_IO_out_int + sw $t1 20($v0) + la $t1 function_IO_out_string + sw $t1 24($v0) + la $t1 function_Main_main + sw $t1 28($v0) + lw $t0 24($s0) + sw $v0 8($t0) + + # Type Int + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 32($s0) + sw $v0 8($t0) + + # Type Bool + li $a0 12 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + lw $t0 40($s0) + sw $v0 8($t0) + + # Type String + li $a0 24 + li $v0 9 + syscall + la $t1 function_Object_abort + sw $t1 0($v0) + la $t1 function_Object_copy + sw $t1 4($v0) + la $t1 function_Object_type_name + sw $t1 8($v0) + la $t1 function_String_length + sw $t1 12($v0) + la $t1 function_String_concat + sw $t1 16($v0) + la $t1 function_String_substr + sw $t1 20($v0) + lw $t0 48($s0) + sw $v0 8($t0) + + jr $ra + +function_build_class_parents_table: + li $a0 28 + li $v0 9 + syscall + move $s2 $v0 + + li $t0 2 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 4 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 5 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 6 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 1 + sw $t1 0($t0) + + li $t0 3 + mul $t0 $t0 4 + add $t0 $t0 $s2 + li $t1 2 + sw $t1 0($t0) + + jr $ra + + +########### COOL FUNCTIONS ########## + +function_Object__init: + move $fp, $sp + subu $sp, $sp, 0 + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_IO__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Main__init: + move $fp, $sp + subu $sp, $sp, 16 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_IO__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 4 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_1 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + lw $a0 -4($fp) + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Main_main: + move $fp, $sp + subu $sp, $sp, 16 + # ALLOCATE + lw $t0 32($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -12($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -12($fp) + li $a0, 3 + sw $a0 12($a1) + + # ALLOCATE + lw $t0 48($s0) + sw $t0, 0($sp) + addiu $sp, $sp, -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object_copy + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -8($fp) + + addiu $sp, $sp, 4 + + # SETATTR + lw $a1 -8($fp) + lw $a0 -12($fp) + sw $a0 12($a1) + + # SETATTR + lw $a1 -8($fp) + la $a0, data_2 + sw $a0 16($a1) + + # PUSHPARAM + lw $a0, -8($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # TYPEOF + lw $a1 12($fp) + lw $a0 0($a1) + sw $a0 0($fp) + + # VCALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + lw $a2, 0($fp) + mul $a2, $a2, 8 + addu $a2, $a2, $s0 + lw $a1, 0($a2) + lw $a2, 8($a1) + lw $a0 24($a2) + jalr $a0 + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + sw $v0 -4($fp) + lw $a2, 0($fp) + + # POPPARAM + addiu $sp $sp 4 + + # POPPARAM + addiu $sp $sp 4 + + # RETURN + lw $v0, -4($fp) + addiu $sp, $sp, 16 + jr $ra + +function_Int__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_Bool__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + +function_String__init: + move $fp, $sp + subu $sp, $sp, 0 + # PUSHPARAM + lw $a0, 12($fp) + sw $a0 0($sp) + addiu $sp $sp -4 + + # CALL + addiu $sp, $sp, -8 + sw $ra, 4($sp) + sw $fp, 8($sp) + jal function_Object__init + lw $fp, 8($sp) + lw $ra, 4($sp) + addiu $sp, $sp, 8 + + # POPPARAM + addiu $sp $sp 4 + + # SETATTR + lw $a1 12($fp) + li $a0, 0 + sw $a0 12($a1) + + # SETATTR + lw $a1 12($fp) + la $a0, data_0 + sw $a0 16($a1) + + # RETURN + lw $v0, 12($fp) + addiu $sp, $sp, 0 + jr $ra + + +##################################### + diff --git a/tests/semantic/inheritance5_error.txt b/tests/semantic/inheritance5_error.txt new file mode 100644 index 00000000..da72ba54 --- /dev/null +++ b/tests/semantic/inheritance5_error.txt @@ -0,0 +1 @@ +(21, 18) - SemanticError: Class C, or an ancestor of C, is involved in an inheritance cycle. \ No newline at end of file diff --git a/tests/semantic/isvoid1.cl b/tests/semantic/isvoid1.cl new file mode 100644 index 00000000..072720d8 --- /dev/null +++ b/tests/semantic/isvoid1.cl @@ -0,0 +1,26 @@ +--evaluates to true if expr is void and evaluates to false if expr is not void. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- if isvoid new F then + new C + else + if false then new D + else new E fi + fi; + + test: B <- isvoid if isvoid new F then + new C + else + if false then new D + else new E fi + fi; +}; \ No newline at end of file diff --git a/tests/semantic/isvoid1_error.txt b/tests/semantic/isvoid1_error.txt new file mode 100644 index 00000000..0922de90 --- /dev/null +++ b/tests/semantic/isvoid1_error.txt @@ -0,0 +1 @@ +(20, 16) - TypeError: Inferred type Bool of initialization of attribute test does not conform to declared type B. diff --git a/tests/semantic/let1.cl b/tests/semantic/let1.cl new file mode 100644 index 00000000..26ef6302 --- /dev/null +++ b/tests/semantic/let1.cl @@ -0,0 +1,15 @@ +--The type of an initialization expression must conform to the declared type of the identifier. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- let a: Bool, a: Int <- 5, a: String, a: A <- new F, b: B <- new E in b; + test: B <- let a: Bool, a: Int <- 5, a: String, a: A <- new F, b: C <- new E in b; +}; \ No newline at end of file diff --git a/tests/semantic/let1_error.txt b/tests/semantic/let1_error.txt new file mode 100644 index 00000000..16ecf780 --- /dev/null +++ b/tests/semantic/let1_error.txt @@ -0,0 +1 @@ +(14, 76) - TypeError: Inferred type E of initialization of b does not conform to identifier's declared type C. diff --git a/tests/semantic/let2.cl b/tests/semantic/let2.cl new file mode 100644 index 00000000..c5956ead --- /dev/null +++ b/tests/semantic/let2.cl @@ -0,0 +1,15 @@ +--The type of let is the type of the body. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- let a: Bool, a: Int <- 5, a: String, a: A <- new F, b: B <- new E in b; + test: B <- let a: Bool, a: Int <- 5, a: String, a: A <- new F, b: A <- new E in b; +}; \ No newline at end of file diff --git a/tests/semantic/let2_error.txt b/tests/semantic/let2_error.txt new file mode 100644 index 00000000..b1e8a365 --- /dev/null +++ b/tests/semantic/let2_error.txt @@ -0,0 +1 @@ +(14, 16) - TypeError: Inferred type A of initialization of attribute test does not conform to declared type B. diff --git a/tests/semantic/let3.cl b/tests/semantic/let3.cl new file mode 100644 index 00000000..8c0670ab --- /dev/null +++ b/tests/semantic/let3.cl @@ -0,0 +1,15 @@ +-- Missing type + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + b: B <- let a: Bool, a: Int <- 5, a: String, a: A <- new F, b: B <- new E in b; + test: B <- let a: Bool, a: Int <- 5, a: String, a: A <- new F, b: Cadena in new B; +}; \ No newline at end of file diff --git a/tests/semantic/let3_error.txt b/tests/semantic/let3_error.txt new file mode 100644 index 00000000..39c5315d --- /dev/null +++ b/tests/semantic/let3_error.txt @@ -0,0 +1 @@ +(14, 71) - TypeError: Class Cadena of let-bound identifier b is undefined. \ No newline at end of file diff --git a/tests/semantic/loops1.cl b/tests/semantic/loops1.cl new file mode 100644 index 00000000..de3a624d --- /dev/null +++ b/tests/semantic/loops1.cl @@ -0,0 +1,8 @@ +--The predicate must have static type Bool. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + i: Int <- 1; + test: Object <- while "true" loop i <- i + 1 pool; +}; \ No newline at end of file diff --git a/tests/semantic/loops1_error.txt b/tests/semantic/loops1_error.txt new file mode 100644 index 00000000..b160214b --- /dev/null +++ b/tests/semantic/loops1_error.txt @@ -0,0 +1 @@ +(7, 27) - TypeError: Loop condition does not have type Bool. \ No newline at end of file diff --git a/tests/semantic/loops2.cl b/tests/semantic/loops2.cl new file mode 100644 index 00000000..dea69fa1 --- /dev/null +++ b/tests/semantic/loops2.cl @@ -0,0 +1,9 @@ +--The static type of a loop expression is Object. + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + i: Int <- 1; + test: Object <- while not false loop i <- i + 1 pool; + test2: Int <- while not false loop i <- i + 1 pool; +}; diff --git a/tests/semantic/loops2_error.txt b/tests/semantic/loops2_error.txt new file mode 100644 index 00000000..9711cdf6 --- /dev/null +++ b/tests/semantic/loops2_error.txt @@ -0,0 +1 @@ +(8, 19) - TypeError: Inferred type Object of initialization of attribute test2 does not conform to declared type Int. diff --git a/tests/semantic/methods1.cl b/tests/semantic/methods1.cl new file mode 100644 index 00000000..d1203197 --- /dev/null +++ b/tests/semantic/methods1.cl @@ -0,0 +1,12 @@ +--The identifiers used in the formal parameter list must be distinct + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(a: A, a: B): Int { 4 }; +}; \ No newline at end of file diff --git a/tests/semantic/methods1_error.txt b/tests/semantic/methods1_error.txt new file mode 100644 index 00000000..06ab88a9 --- /dev/null +++ b/tests/semantic/methods1_error.txt @@ -0,0 +1 @@ +(11, 16) - SemanticError: Formal parameter a is multiply defined. diff --git a/tests/semantic/methods2.cl b/tests/semantic/methods2.cl new file mode 100644 index 00000000..3865f0e1 --- /dev/null +++ b/tests/semantic/methods2.cl @@ -0,0 +1,12 @@ +--The type of the method body must conform to the declared return type. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(a: A, b: B): C { new D }; +}; \ No newline at end of file diff --git a/tests/semantic/methods2_error.txt b/tests/semantic/methods2_error.txt new file mode 100644 index 00000000..f7e4a330 --- /dev/null +++ b/tests/semantic/methods2_error.txt @@ -0,0 +1 @@ +(11, 27) - TypeError: Inferred return type D of method test does not conform to declared return type C. diff --git a/tests/semantic/methods3.cl b/tests/semantic/methods3.cl new file mode 100644 index 00000000..b92faeb9 --- /dev/null +++ b/tests/semantic/methods3.cl @@ -0,0 +1,14 @@ +--A formal parameter hides any definition of an attribute of the same name. + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + a: C <- new C; + test(a: D): D { a }; + test2(a: B): C { a }; +}; \ No newline at end of file diff --git a/tests/semantic/methods3_error.txt b/tests/semantic/methods3_error.txt new file mode 100644 index 00000000..1165b759 --- /dev/null +++ b/tests/semantic/methods3_error.txt @@ -0,0 +1 @@ +(13, 22) - TypeError: Inferred return type B of method test2 does not conform to declared return type C. diff --git a/tests/semantic/methods4.cl b/tests/semantic/methods4.cl new file mode 100644 index 00000000..be8fa36e --- /dev/null +++ b/tests/semantic/methods4.cl @@ -0,0 +1,19 @@ +(* +The rule is +simple: If a class C inherits a method f from an ancestor class P, then C may override the inherited +definition of f provided the number of arguments, the types of the formal parameters, and the return +type are exactly the same in both definitions. +*) + +class A { + f(x: Int, y: Int): Int { x + y }; +}; +class B inherits A { + f(x: Int, y: Object): Int { x }; +}; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; \ No newline at end of file diff --git a/tests/semantic/methods4_error.txt b/tests/semantic/methods4_error.txt new file mode 100644 index 00000000..9f1486de --- /dev/null +++ b/tests/semantic/methods4_error.txt @@ -0,0 +1 @@ +(12, 15) - SemanticError: In redefined method f, parameter type Object is different from original type Int. diff --git a/tests/semantic/methods5.cl b/tests/semantic/methods5.cl new file mode 100644 index 00000000..3905dfdd --- /dev/null +++ b/tests/semantic/methods5.cl @@ -0,0 +1,20 @@ +(* +The rule is +simple: If a class C inherits a method f from an ancestor class P, then C may override the inherited +definition of f provided the number of arguments, the types of the formal parameters, and the return +type are exactly the same in both definitions. +*) + +class A { + f(x: Int, y: Int): Int { x + y }; +}; +class B inherits A { + f(a: Int, b: Int): Object { a - b }; +}; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; + diff --git a/tests/semantic/methods5_error.txt b/tests/semantic/methods5_error.txt new file mode 100644 index 00000000..8b6bdf36 --- /dev/null +++ b/tests/semantic/methods5_error.txt @@ -0,0 +1 @@ +(12, 24) - SemanticError: In redefined method f, return type Object is different from original return type Int. diff --git a/tests/semantic/methods6.cl b/tests/semantic/methods6.cl new file mode 100644 index 00000000..dd2b73da --- /dev/null +++ b/tests/semantic/methods6.cl @@ -0,0 +1,27 @@ +(* +The rule is +simple: If a class C inherits a method f from an ancestor class P, then C may override the inherited +definition of f provided the number of arguments, the types of the formal parameters, and the return +type are exactly the same in both definitions. +*) + +class A { + f(x: Int, y: Int): Int { x + y }; + g(x: Int): Int { x + x }; +}; +class B inherits A { + f(a: Int, b: Int): Int { a - b }; +}; +class C inherits B { + ident(m: Int): Int { m }; + f(m: Int, n: Int): Int { m * n }; +}; +class D inherits B { + ident(v: String): IO { new IO.out_string(v) }; + f(v: Int, w: Int): Int { v / w }; + g(v: Int, w: Int, z: Int): Int { v + w + z }; +}; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; +}; \ No newline at end of file diff --git a/tests/semantic/methods6_error.txt b/tests/semantic/methods6_error.txt new file mode 100644 index 00000000..8e32663b --- /dev/null +++ b/tests/semantic/methods6_error.txt @@ -0,0 +1 @@ +(22, 5) - SemanticError: Incompatible number of formal parameters in redefined method g. diff --git a/tests/semantic/methods7.cl b/tests/semantic/methods7.cl new file mode 100644 index 00000000..e5a01f68 --- /dev/null +++ b/tests/semantic/methods7.cl @@ -0,0 +1,12 @@ +-- Missing type + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(a: A, b: Ball): Int { 4 }; +}; \ No newline at end of file diff --git a/tests/semantic/methods7_error.txt b/tests/semantic/methods7_error.txt new file mode 100644 index 00000000..472cbd9d --- /dev/null +++ b/tests/semantic/methods7_error.txt @@ -0,0 +1 @@ +(11, 19) - TypeError: Class Ball of formal parameter b is undefined. \ No newline at end of file diff --git a/tests/semantic/methods8.cl b/tests/semantic/methods8.cl new file mode 100644 index 00000000..3fccab54 --- /dev/null +++ b/tests/semantic/methods8.cl @@ -0,0 +1,12 @@ +-- Missing type + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(a: A, b: B): Integrer { 4 }; +}; \ No newline at end of file diff --git a/tests/semantic/methods8_error.txt b/tests/semantic/methods8_error.txt new file mode 100644 index 00000000..dc9302ec --- /dev/null +++ b/tests/semantic/methods8_error.txt @@ -0,0 +1 @@ +(11, 23) - TypeError: Undefined return type Integrer in method test. \ No newline at end of file diff --git a/tests/semantic/new1.cl b/tests/semantic/new1.cl new file mode 100644 index 00000000..d007fc03 --- /dev/null +++ b/tests/semantic/new1.cl @@ -0,0 +1,31 @@ +-- Missing type + +class A { }; +class B inherits A { }; +class C inherits B { }; +class D inherits B { }; +class E inherits B { }; +class F inherits A { }; + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test: F <- { + new A; + { + new Ball; + { + new C; + { + new D; + { + new E; + { + new F; + }; + }; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/tests/semantic/new1_error.txt b/tests/semantic/new1_error.txt new file mode 100644 index 00000000..612a3d42 --- /dev/null +++ b/tests/semantic/new1_error.txt @@ -0,0 +1 @@ +(16, 17) - TypeError: 'new' used with undefined class Ball. \ No newline at end of file diff --git a/tests/semantic/self1.cl b/tests/semantic/self1.cl new file mode 100644 index 00000000..3387fd26 --- /dev/null +++ b/tests/semantic/self1.cl @@ -0,0 +1,11 @@ +(* +But it is an error to assign to self or to bind self in a let, a +case, or as a formal parameter. It is also illegal to have attributes named self. +*) + + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(a: Main): IO { self <- a }; +}; diff --git a/tests/semantic/self1_error.txt b/tests/semantic/self1_error.txt new file mode 100644 index 00000000..6beb3cda --- /dev/null +++ b/tests/semantic/self1_error.txt @@ -0,0 +1 @@ +(10, 30) - SemanticError: Cannot assign to 'self'. diff --git a/tests/semantic/self2.cl b/tests/semantic/self2.cl new file mode 100644 index 00000000..2e6921a9 --- /dev/null +++ b/tests/semantic/self2.cl @@ -0,0 +1,10 @@ +(* +But it is an error to assign to self or to bind self in a let, a +case, or as a formal parameter. It is also illegal to have attributes named self. +*) + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(): IO { let self: Main <- new Main in self }; +}; diff --git a/tests/semantic/self2_error.txt b/tests/semantic/self2_error.txt new file mode 100644 index 00000000..20c883c9 --- /dev/null +++ b/tests/semantic/self2_error.txt @@ -0,0 +1 @@ +(9, 22) - SemanticError: 'self' cannot be bound in a 'let' expression. diff --git a/tests/semantic/self3.cl b/tests/semantic/self3.cl new file mode 100644 index 00000000..81709b4b --- /dev/null +++ b/tests/semantic/self3.cl @@ -0,0 +1,10 @@ +(* +But it is an error to assign to self or to bind self in a let, a +case, or as a formal parameter. It is also illegal to have attributes named self. +*) + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + test(self: IO): IO { self }; +}; diff --git a/tests/semantic/self3_error.txt b/tests/semantic/self3_error.txt new file mode 100644 index 00000000..0ae38200 --- /dev/null +++ b/tests/semantic/self3_error.txt @@ -0,0 +1 @@ +(9, 10) - SemanticError: 'self' cannot be the name of a formal parameter. diff --git a/tests/semantic/self4.cl b/tests/semantic/self4.cl new file mode 100644 index 00000000..7c2b960c --- /dev/null +++ b/tests/semantic/self4.cl @@ -0,0 +1,10 @@ +(* +But it is an error to assign to self or to bind self in a let, a +case, or as a formal parameter. It is also illegal to have attributes named self. +*) + +class Main inherits IO { + main(): IO { out_string("Hello World!")}; + + self: IO <- self; +}; \ No newline at end of file diff --git a/tests/semantic/self4_error.txt b/tests/semantic/self4_error.txt new file mode 100644 index 00000000..c19ca400 --- /dev/null +++ b/tests/semantic/self4_error.txt @@ -0,0 +1 @@ +(9, 5) - SemanticError: 'self' cannot be the name of an attribute. From 8bc2896f4dda785648d877097f314d403ec40de1 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Sun, 24 Jan 2021 23:15:16 -0500 Subject: [PATCH 92/96] Added ply requirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 9eb0cad1..8cf0ffb8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ +ply pytest pytest-ordering From 89a08d4583c5d9da878573b9b12f63ff6d786e9b Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 25 Jan 2021 09:07:42 -0500 Subject: [PATCH 93/96] Changes in test code --- tests/codegen_test.py | 6 +++-- tests/semantic_test.py | 7 ++--- tests/utils/utils.py | 59 +++++++++++++++++++++++++++++++++--------- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/tests/codegen_test.py b/tests/codegen_test.py index 6d864cb0..48df768f 100644 --- a/tests/codegen_test.py +++ b/tests/codegen_test.py @@ -1,6 +1,6 @@ import pytest import os -from utils import compare_errors +from utils import compare_outputs tests_dir = __file__.rpartition('/')[0] + '/codegen/' tests = [(file) for file in os.listdir(tests_dir) if file.endswith('.cl')] @@ -8,8 +8,10 @@ # @pytest.mark.lexer # @pytest.mark.parser # @pytest.mark.semantic +@pytest.mark.codegen @pytest.mark.ok @pytest.mark.run(order=4) @pytest.mark.parametrize("cool_file", tests) def test_codegen(compiler_path, cool_file): - compare_errors(compiler_path, tests_dir + cool_file, None) \ No newline at end of file + compare_outputs(compiler_path, tests_dir + cool_file, tests_dir + cool_file[:-3] + '_input.txt',\ + tests_dir + cool_file[:-3] + '_output.txt') \ No newline at end of file diff --git a/tests/semantic_test.py b/tests/semantic_test.py index 6c71f896..cac9cd78 100644 --- a/tests/semantic_test.py +++ b/tests/semantic_test.py @@ -1,6 +1,6 @@ import pytest import os -from utils import compare_errors +from utils import compare_errors, first_error_only_line tests_dir = __file__.rpartition('/')[0] + '/semantic/' tests = [(file) for file in os.listdir(tests_dir) if file.endswith('.cl')] @@ -8,6 +8,7 @@ @pytest.mark.semantic @pytest.mark.error @pytest.mark.run(order=3) -@pytest.mark.parametrize("cool_file", []) +@pytest.mark.parametrize("cool_file", tests) def test_semantic_errors(compiler_path, cool_file): - compare_errors(compiler_path, tests_dir + cool_file, tests_dir + cool_file[:-3] + '_error.txt') \ No newline at end of file + compare_errors(compiler_path, tests_dir + cool_file, tests_dir + cool_file[:-3] + '_error.txt', \ + cmp=first_error_only_line) \ No newline at end of file diff --git a/tests/utils/utils.py b/tests/utils/utils.py index 9d58ac3f..961cf7cb 100644 --- a/tests/utils/utils.py +++ b/tests/utils/utils.py @@ -3,17 +3,19 @@ COMPILER_TIMEOUT = 'El compilador tarda mucho en responder.' +SPIM_TIMEOUT = 'El spim tarda mucho en responder.' TEST_MUST_FAIL = 'El test %s debe fallar al compilar' TEST_MUST_COMPILE = 'El test %s debe compilar' BAD_ERROR_FORMAT = '''El error no esta en formato: (,) - : - o no se encuentra en la 3ra linea''' + o no se encuentra en la 3ra linea\n\n%s''' UNEXPECTED_ERROR = 'Se esperaba un %s en (%d, %d). Su error fue un %s en (%d, %d)' +UNEXPECTED_OUTPUT = 'La salida de %s no es la esperada:\n%s\nEsperada:\n%s' ERROR_FORMAT = r'^\s*\(\s*(\d+)\s*,\s*(\d+)\s*\)\s*-\s*(\w+)\s*:(.*)$' def parse_error(error: str): merror = re.fullmatch(ERROR_FORMAT, error) - assert merror, BAD_ERROR_FORMAT + assert merror, BAD_ERROR_FORMAT % error return (t(x) for t, x in zip([int, int, str, str], merror.groups())) @@ -26,6 +28,14 @@ def first_error(compiler_output: list, errors: list): assert line == oline and column == ocolumn and error_type == oerror_type,\ UNEXPECTED_ERROR % (error_type, line, column, oerror_type, oline, ocolumn) +def first_error_only_line(compiler_output: list, errors: list): + line, column, error_type, _ = parse_error(errors[0]) + + oline, ocolumn, oerror_type, _ = parse_error(compiler_output[0]) + + assert line == oline and error_type == oerror_type,\ + UNEXPECTED_ERROR % (error_type, line, column, oerror_type, oline, ocolumn) + def get_file_name(path: str): try: @@ -37,20 +47,45 @@ def compare_errors(compiler_path: str, cool_file_path: str, error_file_path: str try: sp = subprocess.run(['bash', compiler_path, cool_file_path], capture_output=True, timeout=timeout) return_code, output = sp.returncode, sp.stdout.decode() - except TimeoutError: + except subprocess.TimeoutExpired: assert False, COMPILER_TIMEOUT + assert return_code == 1, TEST_MUST_FAIL % get_file_name(cool_file_path) + + fd = open(error_file_path, 'r') + errors = fd.read().split('\n') + fd.close() + + # checking the errors of compiler compiler_output = output.split('\n') + cmp(compiler_output[2:], errors) + +SPIM_HEADER = r'''^SPIM Version .+ of .+ +Copyright .+\, James R\. Larus\. +All Rights Reserved\. +See the file README for a full copyright notice\. +(?:Loaded: .+\n)*''' +def compare_outputs(compiler_path: str, cool_file_path: str, input_file_path: str, output_file_path: str, timeout=100): + try: + sp = subprocess.run(['bash', compiler_path, cool_file_path], capture_output=True, timeout=timeout) + assert sp.returncode == 0, TEST_MUST_COMPILE % get_file_name(cool_file_path) + except subprocess.TimeoutExpired: + assert False, COMPILER_TIMEOUT - if error_file_path: - assert return_code == 1, TEST_MUST_FAIL % get_file_name(cool_file_path) + spim_file = cool_file_path[:-2] + 'mips' - fd = open(error_file_path, 'r') - errors = fd.read().split('\n') + try: + fd = open(input_file_path, 'rb') + sp = subprocess.run(['spim', '-file', spim_file], input=fd.read(), capture_output=True, timeout=timeout) fd.close() + mo = re.match(SPIM_HEADER, sp.stdout.decode()) + if mo: + output = mo.string[mo.end():] + except subprocess.TimeoutExpired: + assert False, SPIM_TIMEOUT + + fd = open(output_file_path, 'r') + eoutput = fd.read() + fd.close() - # checking the errors of compiler - cmp(compiler_output[2:], errors) - else: - print(return_code, output) - assert return_code == 0, TEST_MUST_COMPILE % get_file_name(cool_file_path) \ No newline at end of file + assert output == eoutput, UNEXPECTED_OUTPUT % (spim_file, repr(output), repr(eoutput)) From ee695e4bd561fd44ea198a441176a97df3923311 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 25 Jan 2021 09:14:03 -0500 Subject: [PATCH 94/96] Added basic classes in .py --- src/compiler/utils/basics_AST.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/compiler/utils/basics_AST.py diff --git a/src/compiler/utils/basics_AST.py b/src/compiler/utils/basics_AST.py new file mode 100644 index 00000000..621b6a2a --- /dev/null +++ b/src/compiler/utils/basics_AST.py @@ -0,0 +1,13 @@ +from compiler.components.lexer.lexer_analyzer import tokenizer, tokens +from compiler.components.parser.syntax_analyzer import run_parser + +def build_basic_ast(): + fpath = "./basics_classes.cl" + with open(fpath, encoding="utf-8") as file: + code = file.read() + _, _, real_col= tokenizer(code) + ast_basic= run_parser(tokens= tokens, + source_program= code, + real_col= real_col) + return ast_basic + From 9fb7bac34fca1bde37dede0a35d49795bdb155b9 Mon Sep 17 00:00:00 2001 From: DiazRock Date: Mon, 25 Jan 2021 23:38:53 -0500 Subject: [PATCH 95/96] First version of the report --- doc/paper.md | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++ doc/paper.pdf | Bin 0 -> 209097 bytes 2 files changed, 123 insertions(+) create mode 100644 doc/paper.md create mode 100644 doc/paper.pdf diff --git a/doc/paper.md b/doc/paper.md new file mode 100644 index 00000000..77f33a7d --- /dev/null +++ b/doc/paper.md @@ -0,0 +1,123 @@ +--- +title: "Informe sobre el trabajo de Compilación de cuarto año de Ciencias de la Computación" +author: [Alejandro Díaz Roque] +date: "2021-01-25" +subject: "Compilación" +keywords: [análisis sintáctico, análisis semántico, generación de código] +subtitle: "Implementación en python3 de un compilador del lenguaje de programación COOL" +lang: "es-419" + +toc: yes +numbersections: yes +titlepage: true +--- + +# Introducción + +El presente informe trata sobre la implementación en `python` de un compilador +del lenguaje `COOL` (Class Room Object Oriented Language), un software que se encarga de tomar ficheros escritos en `COOL`, y trasladarlos a código máquina ejecutable por un sistema operativo. El código máquina en este caso es `MIPS32`. +Se especificarán las componentes en que se encuentra dividido dicho software, los detalles relevantes en la implementación de cada una, y además se dará una breve explicación de cómo instalar y ejecutar el programa. + +# División en Componentes + +El compilador se encuentra dividido en 4 componentes principales: + +- **Lexer**: Que se encarga del análisis lexicográfico. Aquí se definen los tokens del lenguaje COOL. +- **Parser**: Donde se define la gramática especificada en el estándar de COOL, y donde además se construye el árbol de derivación correspondiente a la cadena asociada a un fichero para dicha gramática. +- **Semantic**: Donde se definen las clases que están dentro del fichero `.cl`, se crea la jerarquía entre ellas, y además se hace chequeo de tipos para las operaciones que se ejecuten dentro del `.cl`. +- **Generation**: Donde se traslada un `.cl` a un fichero `.mips` equivalente. Para ello, se define una representación intermedia, denominada `CIL` (Class Intermediate Language), se traduce el contenido del archivo `.cl` a esa representación, y lo resultante se traslada a un archivo `.mips`, ejecutable por una arquitectura `MIPS32`. + +## Análisis lexicográfico + +Dentro de la carpeta `/src/compiler/components/lexer`, se encuentra el fichero `lexer_analyzer.py`. En este se define todo lo necesario para construir la lista de tokens de `COOL`. Se usa el módulo `ply.lex` de `python` como framework, para hacer esta tarea de modo ágil. + +Luego de ser construidp el lexer, al archivo de entrada se le aplica la operación de *tokenización*, que consiste en dividir el texto escrito en `COOL` en diferentes tokens, según la definición del lexer. + +```python + # Este es el código para tokenizar un .cl + def tokenizer(stream_input): + global readjust_col + readjust_col = 0 + lexer.input(stream_input) + token_list = [] + lexer.lineno= 1 + #lexer.lexpos= 1 + real_col = {} + for tok in lexer: + real_col.update({ str(tok): find_column(stream_input, tok) }) + token_list.append(tok) + + + return errors, token_list, real_col + +``` + +Un detalle a resaltar es cómo se guarda la columna real de cada token. Por un lado se usa el diccionario `real_col`, que tiene como llave la representación en `string` de cada token y como valor el método `find_column`, que retorna la posición del token en la entrada. Y por el otro, se usa el sistema de seguimiento `ply.lex`, que pone en el atributo `lexpos` de cada token su número de ocurrencia, y la variable global `readjust_col`, para reajustar el valor de `lexpos` cuando hay un salto de línea. Esto es para reportar un error con la posición conveniente. + +## Análisis sintáctico + +Tomando como punto de partida lo hecho previamente en el análisis lexicográfico, usando el módulo `ply.yacc`, se define la gramática de `COOL` y generar, y a partir de ella el árbol de derivación correspondiente para el archivo `.cl` de entrada. +De igual manera, en este paso se obtiene el *Abstract Syntax Tree* o `AST`, que es el que sirve de entrada a las componentes **Semantic** y **Generation**. +Para la definición del `AST`, usamos las clases que están definidas en el módulo `/src/components/semantic/AST_definitions.py`. + +## Análisis semántico + +En esta fase, nos encargamos de tres aspectos esenciales, dado un `AST` de `COOL`: + +- Chequear que todos los tipos que se usan en el `AST` existen. +- Chequear que las definiciones de dichos tipos, y de sus *features* tienen sentido bajo los estándares de `COOL`. +- Chequear que la relación de jerarquía es correcta. +- Chequear que las operaciones definidas correctamente, tengan un uso consistente. + +Para ello, se recorre el `AST` usando el patrón *visitor*, que consiste en realizar sucesivas visitas al `AST` recopilando información en cada una que se usa en la próxima. + +```python + class NodeVisitor: + def __init__(self, programContext): + self.programContext= programContext + + def visit(self, node: Node, **args): + if isinstance(self, TypeCheckerVisitor): + if issubclass(type(node), NodeBinaryOperation): + return self.visit_NodeBinaryOperation(node, **args) + + visitor_method_name = 'visit_' + node.clsname + visitor = getattr(self, visitor_method_name, self.not_implemented) + return visitor(node, **args) # Return the new context result from the visit + + def not_implemented(self, node: Node, **args): + raise Exception('Not implemented visit_{} method'.format(node.clsname)) +``` + +Cada recorrido del `AST`, es una clase que hereda de `NodeVisitor`. +Para esta componente, se usan 4 clases, o sea, 4 recorridos, en el siguiente orden: + +1. **TypeCollectorVisitor** +2. **TypeBuilderVisitor** +3. **TypeInheritanceVisitor** +4. **TypeCheckerVisitor** + +### Estructuras adicionales para los recorridos + +#### ProgramContext + +En cada recorrido, se va actualizando un objeto de tipo `globalContext` y de nombre `programContext`, que se encarga de ir actualizando toda la información necesaria para que el contexto del `AST`, tenga sentido. De esta forma, cada vez que `programContext` cambia, lo hace a través de alguno de los métodos definido en su clase asociada, y en cada método chequea, antes de la actualización, si la operación es válida. O sea, que no haya tipos redefinidos, que una operación aritmética tenga sentido, etc. + +#### Clase error + +La clase `error` se usa para definir los errores que se pueden cometer en el proceso de compilación de una entrada en `COOL`, debido a errores de escritura. Se encuentra en el archivo `/src/compiler/utils/errors.py`. Para el caso del `programContext` antes mencionado, se usa un diccionario con los posibles errores en el análisis semántico, llamado `error_selector`. + +#### Environment + +La variable `environment` es un diccionario que sirve para guardar cada nombre de objeto en el `AST` con su tipo correspondiente, para el scope de una expresión. + +## Generation Code + +Luego de que se chequea que el `AST` es consistente, se vuelve a recorrer el mismo para obtener la representación equivalente en `MIPS32`. Para esto se crean dos clases, usando la misma lógica que en la componente **Semantic**: + +1. **CILVisitor**: Para crear la representación en `CIL` del `AST`. Esta representación es un árbol. Los nodos del árbol están definidos en el archivo `/src/compiler/components/generation/CIL_definitions.py` +2. **MipsVisitor**: Para a partir del árbol `CIL`, obtener el archivo `.mips` correspondiente. Para traducir de uno a otro, se usan convenciones, teniendo en cuenta la función de cada registro y cómo se comportan las llamadas al sistema que hace `MIPS32`. + +# Conclusión + +La implementación posee detalles corregibles. No obstante, su correctitud y robustez se corresponden con lo exigido en los test de prueba que se evalúan en el *pull request*. diff --git a/doc/paper.pdf b/doc/paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe2fa9ef248670713c7c928ae385177bc2930895 GIT binary patch literal 209097 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

yQ+Yd?>hMo(JSU}2S(sn&(C05|0hhYKp2j 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�PiXp+pZ-_uL^@1&!JC)^5p7!Zpu$@{RytgF8 z-948jgGRlc50whJ*Rt+{->iD2$7@S=q!3q0G2)A&LfN5~7y|oE{6;$f8d2SdkR*aO$+H5#7glOPSg-2QOTHoJr zM)eK2#_pdLlP+n%p$n$bFCgOtLUE;t(~K& zL%*&LsZOkjYD4^96m*1WL5c?REFk#|`ZKN}@mog3Fhc!Ag)7f|aZKlEVb-K8qis!p6x9$SgJ(Lpfv}9?# zQ)z#Tvau+Z2de-K;hZ>)u3~H3S_&>-BBX&xSacv01-{DxMFh%RUD*UQL|)n+T5=Y0lT*whU8os66|!^Cw+v2T4( zg`qpxT2hfpO-w>MN60Hu$NvE=ZnIJI2(J=pKz$TX8g3vv3hMHv=A8qv3Pl_ zXC2%KltM=h@TYSaBONB_#IH8sQ2$;xgnK+d`rc))ltTNxwuT#7>Ejj)KyH^tzgUIW zKqyaYmK?}*?UQwMLB1k#G__EL^MV7bdEceN3*MG@a~GpW2lBf%QzqLZoHcma`*z~R z%WO66p7kIy-uNIIsq?E)`d&LEK6GPhtuGQ&dW7H>5+z}stqSm@sWkmf0Nj$ipai1w zCd8>df54!mLtlJD7Q*5ZNc;g$G(nD=Z#^QwYs=Sc0*x{#4*{)E=-Z%buQW*Zt|>SI z?FC#7q&zwnXN<;e+1>@1kW@Y@9-wE`^sMnnMcFBpR)sh&g+C5Ri{Cg?*O%FY(zKgT zpNGb)C-fXpc|`9C?f0EDhMb_ph&|BoKbSUAWCjTvL?^H=CZ@=}hs}dHFIVM%JlrxC zilH)?L3jHmj$?5_a}G>3jf&`Iw;Nt7u!~<@dCkau+gAA6sPYz1iZFf#mUnBc;rUUxnBB*u)YE4zj*Q@s)U zT#Ko4irS%?lv9RzjKY2T!cL7`6)A#w%VuswKu)XDK4K;Cnu&?M>HISXrjHCTLrQ2f z-43ZY2eqTih7TB}DnwPJm*E8a$J|o!b)syRQ4#X4VCnl4yo3LAO6zSMzGuZ|4Fg9= zz5&(fLyMBLp?3keR2-xPSS!SQGH~(yvyfPbo*lQBQ)S+y-RrLZPok2MZh`vX@T8D# zpO?@6tw66%!#EqI4P*oSbdL;usBe|dOLTnOoDcAC*it+wIaP_EWvib($0#dnCwOuD z#^||m=Nqth8_;Ttf1evsS#0*+tVN^z@<%yFDsWXCU3NadeC4o<2N(|HZTDX@t-h`A zkPoh1+0T7AKKIH5d+y_Vt2vbRaMfp*h%;9zblCi#Jc?a?#E6Ntv>?^l0PUvqTeC7l z8(`kj%{<~v9!>aiYGN6k`mQ31;#{y%-5do|Z$^^l9wn=Zhi!bJg7II@@`f)ej{$A9!ToGK|A1q*}`3S)-rq+w5Y3OdkIJaoVKmvoPh0y&_6mO_PgSk0fP zVAh-Po=Ufmq=u3G$VsV+pmoD>2mB(Aa>-s6Ns;H)++3w3PA;*FgBn*SM8EpPOM%^= zECL*kOd z!qP(E(eRANwytB%rB|G>`xd^onPX98SSAWpiG`r~`z1?_*pWpLX!@cVp3n7_guZ+1 z&AENvE}-EbC3a;fc?fWlG9r8*g6J!;W=7y%SlF}qfVS^~$R#?4wI5+K3c`)$M!l3G zQY~`hUsMtyYBJc$ni=kV$=ZXVA69UBt!*dGtQ$9YS}S$Vv8aY>nD%`BDV^}{_p=uT zU%~K8!*O+2Rn);vZ5yp(yD6^&l)}0Mc!}RyXO3-QwP(jC5H#R&DAG7)N#-Dk4=*Mb z-et-B55-&5=gt7_u6nkysx;ws+{ zIQwg4{=>FlX{zF~x!SI`ZOUK^=a8EqBYt|lp5(VT6SQDItqC`RDG5JQn)%>Ra+n@# z1mF*5mHcV2uiw|4X+GI6eDekZMt_WnoCx9FJa!~>qm4B9rL_2xw-eK#>Z_s5EC0o- zK(@|WeU6helW3ll^zHYi$ov66-#XXYG=t&mO%0Ns+5RN#a7I7Do4jPaIo%dVp-VSj zzJ%vd6IA{=G#PE4zt;PsBY8rLGh_~Q7VrJ-z!vlienfG_SJQtSICmu3HdgbbfhMM^ z3X+v@IP30QR0`(#)*4Xc%2RV6mHDaY=#Kf--cO3F;R^XJSX##vBdpwPX%1FMg2BKP+@QdY1K4c9`*r{s+SeL;^5&nk%ql9Awe#92r50HUl3{w{9_h2JKghDc&??z2ho=V>=Zre z6(i^2JR2akSTf$nEibNYaW>p!agG-M@GasR#@nse!MB_U9z{M_ax^E*QV(idgH$H& zg+HT%SZWoV$4{Oy3t0R{=;qzgN(VYahQ3X%@K1~-071M@YTN`Hs)RKr;t<6s3?vWI z|M~zgH{c&ibfZg91A1V8)%G5o^U6KY=DrUk%-2;pR0E&cq?u8MR_PN`4g z=-gBg#D68iNuSd!k~vJB-{sR)foy}29Ro<4sw|4MYc60y zB;@Qp#>J6u+56d*t-#B7C>#TUXDJ6b(Sz1uEHSbx7PN5zTHku*P}AOBo6X}Z9vEfB z3u|jW{k0;Q5NPz9a|3FBO|+#mpJP8W+^RcUL`K;2me{K-zbAzG_uX?ylE4}5*N!CE zf!FQ7L~@|_Q1F+2*YFG)=snMf#ut#!)Lm|I6KOo{KHk(pJ!cC@n2f^teqcqo;epNv zW)05*r=)l%g53`-w($m=U+kL-n|z+M0!Ah}Bb*sBzp4Cs6@C1YBaK;iYI=Cs7IkL@ z02{2UONLV`fUKPKD_r~o(yX|LFE^dLRq9^-qI4?UTE?D}WiX}pX%-u`AqPEz7YJ-+ zovS3ybq%o=9n77|n>#$awi?(zjCrpvr#Y+=U~qo$XC<6nlz$-@QcT`;_=0nH&}Ib? zLUNdU{6QsBu;*VOwXnji0ECM#k0+Qt1wxs{GhGy&D2`8*=caV@10-!a;l&296KUe*Rq?b;vaw`5_1VJ1ECApv0aX5W0)9a-K~d>+gSG_PrWtnwgmR$}=Nf{t;*nytm~J zF92bdDopAFAwOR{#&L8gM-~aLtogDbXi=HKZzAjTk?m*i)QS%U)jH`)-)r#%AUowi zW^YU6HzyLTLFOa^4fP5BAZs zGe>R~^lsL!A445F|1xsAR0^taRhX0R9}2&T_6Pj(Hk$V$4v&UTW(!*&ApxQ~fx5pq zNJa*?SXIS)$)Dy{LSW!33W%R{@`qIbQ5e5!A~!T<_*yvy=Q+>kDka9#lzic|#eEno zV5uDT{o>6%Y7Lo&x`I!ljt6B9p4VIq+S+Tie(j^JXlxD6MRuZ`v^%d;3_`Q;Wp)%? zKeiaGTeZO|aClFhhh~ScA8hN!Aq(au$BrRP3N4yJhKiQ2r^8{jYqeOOG+f$D4fH zJM~#s1p=T1!ZNM7mxX#k&}Fpj^;djdPiin9RlGtq3mBim{L-bX^l< z2_k8ywKXFnA&zSL8c#`>t9kp_ZU1H!20EQV;IEBjL(^{!a4Rs|s1?$sMI~v~KJnAI z@icR`s(3Gcne_ajJ?HWHQ7RjWLQV!~w8e0w1g_?87MlySMiU`tIgv9uu$q{Cj}&$Z7!85-~U9ugqhavb+dJZnJ4@_`|3qJ4amt z)q(xuGQqqJ7}E$qkY-6a`+ijyYU$DSSV2Nr^p?F4@d!$@yBgd@K6+)#D3vAk<%sOa zy{bjh5o_@S8dtMv4_a&|J`l=_W;xNGk4mBU_|bE0@ZL^UR+iJMTn8Yfl1W+VbF>E> zK*u%{i$^3?r{KpO@gD6`aXSi`N!<*FTsW|rdxjC34%A~3f<4*Z*aX4ZwNbYO)LY~K zMgh>`@Gl`)6mBMITxr<-oIrDiuN!KrDX;JG<^9N;3(nfnfj1tU` zHyuS_#pco0rI&5F{yE5zwM>;ikYDPoBc0OJ5Q*E+=lIMKnsbBC;1 zCFpD!@dF6#4K3$}Imhbvjy{6m*!lX|4dsE;`P+0nnM4u=;hw(0wv$e5SR_;5Cfs)B zOV01Ue{ecomqP`Qh2|piYz&j0Xn`7c(+sgU`g3UT#_&tu>OA#-g35iOsRSI}IJ=Ge zvGp=NA|a=TROFvWk1$s@X_irQhI|2V0mdg5vzxkA!X)qhlB;D)V|$&~sgvo|V%78j zP&o@f6VdL3-j>)36v>(SBlqtbcA8&JPFL^xGlE7mI@x0?*GH%kw5cp<%>S&-jGTVD zbeS7}`p)B0u2o;7!I}}wn#JoBJDtjLHv5o2{?lKaGh%+SM8g{Gj45=nRSP-!?ErTX z#88MvX&r%n^eQQY1?x^um0r`o0>FI>3zu+jIJ6ZAW2dz(`ETsp98f^*}ZD2p&h3isF>N@^XJ7f5^sP+CtqTjZ{`9r9U{BX zmG*AIKKnZYoAWB(_|mGtI$qr#!@`)V2kGwWEZxA5EdtoAwunqm zKDhB?*e^O^xl1&)B|Vc=s1^D9M^up2%Dkk_HVwW#&nHBM*!XLj`gf z)&8x{&W@i)Lkho8ghL>Iso&y0_Lk#8zm*-^(=9T8A)ME=_={t;Veif!kC=Kgu~7H3 z(Gc4(6cTJ`Ah`jVC0${2K*{XKRJjbtt2?q4@K5tvuO_i|#qeN@A`d-)UK zHIND~1z?mU8=0r)=DVsaJXr8OXW864n4~{+^6eWslX#Z=aHi2GbWA*eBX=6QcTU@V z%GmrBthV_YPhO4q&@8X%1tNI4*H%u_RUCTTflo)tof-HPszAUve^34|IiL3x0kyW` z(>sBn6i<|4tW6gUi@tzc&8@*X9K>+kT-bdfvnd5BgS4}$u(kAj8v^V6UQi!FB7R#B zU4Yx=*llL@V2mQZSEAl~#bSfLR6*5F_(_Vx@W`y9lp?B87m$?|F^H0|WqEEipaVN2 zS3-X|nYa=xRZIZD8+?4@VvcE!*1`NOe% zyHP{;psk;S(Y{XVia|K>dvMl3HtB?!L@jOlgIDuo{u;g1!+_AP=De^2`(!38iByNPm3`bEbYG`BYZ$~ z=*7<>{r?Fmry?2b+{vAw=h4iwx5Vr1cvkkjPcO~lZ_#w;wTI}B%mbHc72I{OC3ocJ zK*V;H*_yn4noTe$EVtbCU<-o>NTC)*+=8*B^7$4 zxY~oeOIEzYL+{pbiF@2M-0p?$O2!-e&TRt6+%MU&C*4*U=UR9hdFOQT*RNocu-dUA z_7bpLCovXw(B`cHh5R&F7@WN-J$`dK@irfDQFy>Io;Kmvcjyb3pobaVms^}}90mnw zGVO8BW8d4;Ws_r{IY<;rQ1PT?`lD#2;jB`({QV-}ZFl(hN2bE%NvkFYL=s~}u1jMw z;bE=;rb~N!E#0qt% zjOZ~oEfcyh_fUAl8B+Abks2Mp8M=_W><60F{fRHrYd6Xt7L}J0l zVo+nE92!;4qpVLy!oz@`hVpO6BTxB*4OkdWu#L~DEPm*Xk4RxV)nOuvrn;q z1su87HE&mis*?wt_im19XsL6_2tugZhcE|}lq{kQfLJz}(SOB>qAm>iJky`}+9qks zPY(NBMeqnTL0xv;b~R)7(+M}<)HU%#euN^K%h(=oNYn*}Re0y^gqWcVS^RI$=;Q|s z4Fh&&*^sfSc&?Mh2}LQ$CxeOg3@V+eK`>tRK7P(iZ-4*vZt)!jq%L4Iay)ON&MAs6 z4_vz$ZDXoRPmDB;ds<0ZCD>c1 zQ&%8B+od1MQE|vvJA$^S?NYktroppL$hPztqHj zFPNMclVnPPR|87mqoMPx&Mn$aHVE7%wO=h0xrC9K8W8c1Q08U85R>Wqs#$yv(D9!m zuNj7?XYI;TB8)#fjjiKk1~u_EaL_6)T9AWHzWZ*_fE>-g?g2e$7grYVFv&}?epZr! zxQczkA)!oFn2{Lw<-_lMV;QVJ(-gRKAn0#@9OLW49nU-SAFRHKn4SI6UssuL5y)LV ze*yMNA%9WGsL@uhCq?jiS=pl%!t}z(jUTZ81qNAoPg+dq{kfbFBGO|h4D#*&o;7(Y z2u=(ExaNKgAG)P-C=VTFb& ziWULWgmGBjI4`B&hB62;4XRO^H?1oJ12v3fWyP&;jX+xgz zs+sfKIOW^SHarfyuJE=>`Q?_Y5`}XKh*jERtCJLHvNMGTdmiu1O^2b+t{yR(VNBa| zXiiaqf?S+Dv-iTOtc!H(VQ&Gr$GOW0?4g2p_Dn8#YMo1T%@9!LkJP}KoaxpNR}yU6kgj7=&+p%OJrz97lGgo5oZNyl>nXuO zqnzSz;<5Cs21Z8%5gJ~CX{m+i>C8GKFL%`0Em6UVaGl;&+M1`GY<-8L))#8eeCyCU zYbq}W&y#VETKI$1g6r9In3rX&WlU{NeAwhgxmt+CA>5``E4|e*mh+LFF3AfH@GmWZyR`m7}7suU%f% zv0RU#+=vx4sSZEG-lcU5Kq!y=tFPL5Ki$-9auJVCe=jvY)+P!jtfx}|(!!pPHIJ6+ zyCu`0<&>pEg&{qhc9cU1@vc9fK~j;|`U?fLQ! z@yrz?`nILH+&t+ZoQAY$Jh4O=Jri-gialgcRs6zuTUAFp2yv;JK8liWdquFAx&o?$bA<8vgsU^pw%R z9v-MEK%-EPRZbP_5s(??|K;LHp46io=c1V7`}(bY!PM?84*+%(@kSbwmMr94N0Ped zMt1_l1W<>A*Rj5qqCqYA-%q3kRVTf$8{YbDJKX^z2~pdg^Bo1%{?yF*7CB`;^ndXq zib2`${}3BE1!LV|6m!Mf9v#)vDOxXecqWhtI3ARO5upa&*x1UFjBY@7hiad)FMLaMN9HbI~uSZG>4rfi?4)iK0n0K0wPe%oY# z`)0X7`OA4|?|f4F)$&SQ$SH*9Cj2P>YQERoi`aEb6**)l63lN1CKpsklIi-iKS)Dk z<90`MsEy1L&1RwGQx$lZ^J>r)uZfnT6u+?FG6s6Z91I)~<{$%wAM1Hm0D0hWu0`yc zCq~s_b+Svf%U79_GLD4|`30%LZe%Rt(#{!^KQ+e$7Y~Rs11FdXh|n!TuucPtRp(i( z$jEVbvwA52;P#JrF(6gQ?{^ZN1F_4!S^C?t#+f+RG${{HFuE|bjb)nTfLrcyN2*rr z6MBF6l$F-1pjQ75H3Dz8P&lVqWaxSQ$6n*QNtM;wOH&G>Vd0wuSc7OT$+soY?O5KM zO1p!4k%AB=jubT=UCg|U|n**L;=la47ZOlo8* zclQ}Ry%fLSPAfDCZPwQ{RvM#%$ka?*qVQWWaUH&)B;|4>rwX2RC+ZO>5m{Oi1tImA z$y>e%VjT5wDvpeRmZdQ>-gjeJ{f~JsNdr3jok)!chAxI`f1qM+t%+E?=(Fv0ZD`M4 zMolqK654SQyXvXThzQKtT;*b-NVkf;XaJF4yHq3J^REIA2WA7*AI?7nK(c(qzS2pN zJ*!KF{gjD6L!wiQwf3626n9LClL$T~c0~{Dr?0~5N9^+W5NzWFj>t8D8bkg*o0nE6 zsj?e@aUrcXSOiEby}~2x5|*T`$Y%_%CMunow+|6q5)}q`+9oqlS8@UlE|&O=hUhEW zXZ1(0ccY%;Rs>>D*G7SMBzR07;Uua%O_LA9W3sq>G8I{i-=_pJrDB)`x#6K5sSWZb zQvyvywi&d9*B*(^Yp-dWO|Qzb^#^XtK;j|ir!!;&lpYK&FmLr;< zkTe`oW=;F?J`s%#)wB*unZeb8T}mYh)&^9|?Ckpp@Qv1!VSBe40TD3F`X92AmJHZN zuI=|V)b(W*;8-pZs=F#a%;G6Dw@nQnj5VgawTF9hu(P^#*m!DA-|a^(jYt-mOHmsP zy=Qg4NX-9V00j#A^}rYm;PL2KNk@0Bcbd;`(3PU%hm8wn}?Ooi{Yvi8yfE1Zhh7ukw~ z31cE+f00PY3+F*sL5Qk7Zy))Y`m;jaaRdeiNvo3qf-SJqg{V?w;F`RA&k*Rbgc&h% z50?`xd0V!iLbprdm7=uf(vk4&jSb%E%W>)nShDXI9a${6jS2Agt#$^$4QW%wnKq63 za5Z_jlwyIoWqEEJ)DqKesFq_D!_=ZmDf%R+^>2o7_W|GhSiMxojLF#=(M~V z^=&XC|DW~&)RliOfUdNgw%)45VoLHU=r)>4I|uoF_MNB>hFCKS>S{_C=AB0cvRZWl z%;v&aa@o7aP!;W~^7V4SpU5=;Tis>#&Xm7Y*ZWgkqP!CazWEhT-7U zpW&ZaZy_)P_A)j_{dDK$;#Td)-|-L2ql2C4n+VtmHHSoxaSD&$FE7i#(w#l>RAUCZ zV3;kq(UT)xzsX@ioJMHQ|7Ee2qvF3LH{=fbnoTV0N4Q3u1axGJv* zVE*zgkF|WVq|LwH1bu{V1(JQI*^A5>;`@fK4u6gtv*T;XPwlBXsYA3|@_10PQ0KuQ zb;eWDyei~KCbK2_tVGV&@8MNpQh4$t-tAOxK7K?Xp@VP`W%1tXA<|W|MpLi zc@U9|_HK>YJ@TcB#^~J>d0TQN_`=_-me6D2gt5=>mN~j%e@eO%k6g8vOsLabuK4LM z^kHHTlCbZ$Q)E+mQf$imK%273j9~Ywup)`s4dAKoWYR6qOhgvy9T;c`(nm(@Z;(T!sz_$>Rg?MfDL)Vd3dTmBX$-ba@ZQ0T?5i6Oz5yiqjdHWGY@6gS2iFPSXtlqb>F+UkxV(}TjU`jLf90L*8O`q~>fq524 z9N7G6n?CVZ(LB89!{QuUVzD_fam(xxt?Sp4t8ooG+J*V7UHuee(&@<%;CqUW<2RTg z18ba^ypcvqp4|=zJmWc+s`|q{P7ZQ^JU|qx%>@CPVaGu|yyrov!P$v~8l;;^W;guJ zJG|PK9tmC~1IhYqum@n{gDF851`3Yb3y)OFbF|c}cv5;+RkkE1O!zZscv_|Y>TIu5 z%{&se5`YUrP3Koqyp|K-DrtPchz<@xuovum#mQS;lfn4nxyM*uE^oGEyQw|~AxbfM zt>n@<{5P=X@Htx5nE5JGFKF=F;!mcCL zin?1P%#C_D91Nx*XS>^%!%MSD9L>rDTcp|~6D=^rUw%s>CdZphRZSq(1lQJ5;)#@R zpVz;}1XaTtLC>LOGi_tZo|czs&)|QlF>JS=KT2)b$m5*7EAZIa!9R>4!^qEQ#_jpE z5==2AE^M4Wlu}@jazFEvCigWU2*R_K#I}otsX8D0i$umAND47x?oJpVVq$ z!nyCSU^G#wc$6c;Y(AIiHw40B@_B}Kem!?uPCM=9R# zAmtSLh6yLZ*(q6=rbPLP?%-^t;g~l=8~q1xH`#bHEKUhaGn9WFhfV)Y1SbE7_q37Z zIW)3R^Gv#_O~g4~KPu%g32vz!rr928q24p3>csgt$umRdL(KP@VxJUB;4_=8EU|Wz zE6W5a&ttnf1fPYElPYQLp=xjo7hW3$5Xuf=A-ONYxse|xSUdlef}B?E4|l=H&TB9r zB>vbUB?|J&z6psS^4K6nh#@5XeK!uxc>rKQpTCsKW-Tsr^B`T?M#?ckq!LZ2b2r+t ziTA6aE%~X5*6tf7tq~Fhk=td1DjAwVDHPZ`$#apG!R^|sjLi;eAc-7FXL!S0#*xJv zbv~b*5fY3&K|0vYfJ!Dj_=8rzWvQN5gMMK&%8 z_pB*a2V!J~NfJ+*WVJp06t?w-h0^6P)at!k&5_~OpNv@n5B1g&lf9{!9m13o7QG^1 zihp^@%AVm>I9(1u%b&G-Gftmw9P*|wy{US!s!I((=O-3KAxGuUfnS46lnBqqI z!Ca6Oz1T|jio*X5aPs36s7 zH4clAzzcrNA%MK5Fm--g6c;fTLe;a!#|m=WW? z2X1||eJ|xzvev=Z{Cbs~C>P+SbOO8NWJK*Nv_cB{RP3_~mzz;)9EtBgNXcIpYE*ym z5%-qW)pJ7F#hxuLW_!D6FVs-4leeTbW-$!4ryh5wx;`rSTO_P%AMUY|5q5sP==%14 zqj26M?JfBgMhD+Y7Wm+TPmi>fSaf)tKosF;`bw5plw^sPyN1sSWo~41baG{3Z3<;> zWN%_>3NbP_ATS_rVrmLJJPI#NWo~D5XfYr+I4}w?Ol59obZ9alG&wmpHVQ9HWo~D5 zXfq%%3NK7$ZfA68AT=;EI5;36ARr(LFGgu>bY*fNFGg%(bY(^%ueygjysmN5+nM5s|%q*px9Nn1Mm|6J%>Q3$;b4ztoM^_b)6O)*ey#;`s znH7N-U;#9D1DIJ_104}q{smVub+81msLCiSYw0ljzeHJBTKxwo>uBW!;Q3Fyg}d|r z^sNt*x1WTZ?TfcD=1#{3Tv z{~{Rh55xZr1-eQBy(}$MfNthC04q~_SIhs{W!+5ef##x)*7lYF*8i9^9W5+D_CQBV z6(?7q+rJioiH-HYeHu1Eb2~>%S62Yne_WQ17XMXJ@}IUXfR5JxV%X8b6lC$g4F7hk zm;xQ$G`yYvSKWU#{BND@f9r~-|15(SK%bSFm6h!u;6LC0NQVDaPTdXUWM`=jwD^a_ z|4T+OF()s8FB2yhH-L$Q?Hhod?H}o%et7-<@A2mDAdsb_+rR(8e|q^J-3s^*F_xBI zmgWd+zn#qaLu}K3Ww_Ph=8jBB=(LeROLBM)ca7PGyPN^(b%M=|e$$Z4Aw1YH#UqO4 zJmMEqd-%M`f8XrLkT@`tj}Ik7psU?CN8m2^<^oiaq2~yzbRoRjxEz%wkhXf-e2Uz{ z4*xla)nYYaYKVboV8nh_?ZTNQmhKa}A!-87=lNvi|`I&N(OzsO;fUFNZ}tg~%H8$v=#s{umoTL4Kg&PuTwq8_|%r@zEH> z8E2EJ5X5msd)1A0j)hB}=p7!ZL8#`%qT=td*|I}+jGhx^hR;0h0k<6$Q|XU^D=S~^ z%Gr3nzV@vX!pwX)Q!5F+FK@sMemKE2`3;N{=J(L2bSTgMQk98A`x($f*q8-3m;25I zP9ny8Z>2y_m~x@sc(T=olJXJ>H-2xFiD&+esBPl<|%GQJ&Jkz$7>s@LoepsXjus%KXf)vux{#B~4X zqm-+t``rC0URXZhHrd73XZcSZ%fpAjM{8Ay=Qw9FONIM}mx1X>AsEfG{vr3v?P zFfy+#P3|pw%N6|E zeAmb!KWp@JJDmgEh#+yXBP}}hZ%^ZQB{bwm=H63!k0TdnWJrr4d9Nc{ffWhQIhrb> z9E{t=1Dt5m34>^-{sF6UPcE3Yap;{7i5nbQ1)w2V9;^zu82Sy^=CeH9%9%v|E=$gL zVI0z~xZhx`Dz};v6gYhi*y1bkFQT;5>ZSEcIDaBkFQ@HZMXRPU61327{&qaIbu(}_ z-$|7^FIj#G-JX)A6Sv2G2QK!=Eg5mDzB^8E`~ZgA@wN%nycQLnT6;15Fb~m$f`u4z z2SOyyxQ8S`hMg#HMHq7)M&aD2Mhri-D1W5@n6J=2p^sG=wU?FCxbb7r5jSo0&)r#LiHQE@Owx!XLRvam z|MBh)51qz?o)Q~kD_ub7T+c+JzrrZmkvyTQ#f%!v7cWGW`K}UTF^X#0xaI(laxHOm z)vXY>NLI0!`!lIqNI^Q%Z^p^tnVUk(@8sOlNYPP`lYrdn9L(x&Har-=1+iWB+@)V^ zip3X=`Q13tiB5>*1OLg>CX8G4#?!de)!k8#3hRE6v8tWZQ3{m|p zH%DR*h2E^SbQCqMq)I#NMck_6w#n*`ad1nE9O)$DVC(kUa|iRq*>T}l#jAp0=0}CH zauW@EYHZsFIX=ed)6by3Xt+zr@c^%ctX&86->Ksz{MFJ0)M}vm0WSmnLQ!4>|pBuoglE z9v+AZzjo`8t}v0?AG+iK1sui1i|V@r+~Y(;V(B(V`4pllwUzC3N6kD5*Xj`Qg&UI1 zr*8D>5#pr1W)N-?R(>q==LP03!}M@mqvVp*PpJpuqZ-}^4%$Al9~p=QTAY%Ozb1}) zWd;Cbt1JEfo`=eUX>~$8+KnPoFo=cVtId{1-;*C82nBs#Pocq|;nT`Ex(j}YmO<)T zzt0=qB}bFDhucf_$E}Jt|B9#oOSnGVeQBY+_fBDRCJ+&9>{e^E4Ylru`wKUAvuQ}U zU_J-vDi&9Xg!92Tx=Wu)K27q<%nNAKzrhV#)Wb=+N*lmbuBjrRr4f*Qf#|%S$236x z)1g_G);-*Uio<=ncp|izP_X`rPx-iWac#EGqQ8q@Pq(132&Vt&%imu)wvHPzIRNLY zeD#-R)cHzJd5Ot_jSEO(8PvX;9-UcGae2HxuEhxxsdw#v5xJ`tnef4gYh)fS%~>gK z1HZ)aJaXNq#U!?%cJKxOzJ!W?@PnD)^hsOhzZ#dS!Un`JBeLTX)f1)i6mTw0QfF0v zney+x%8a=_m;TsU&H+z0fBkws049id$PceC;_ml%X&So#HK|LEjHhVhCgB z*M8BrKk7}s(4vrqMgT6e964p_MJeXWS*@VgmdlBBK^Ja6-5=>&)q0^>w29B6(quM_N0dj9zm+J`(4($FZSV_$8;IN8q2;2GhZ|xXYG7sJ`oROdZKC zQQn;C-OreSIOF!gx9s*cpWu;q_P)Q|qntvz|TW? zvrSLe1l}Z8idG>QTBab+_7SUawr+*)5Q}U1GDa=%s><%}nlz}PX#*b| z$n>Q@vk#LK3LwYD59N{j9yp}Yw~k@w&K>69?jk=x>l@cF6xf0^bmzdydHDeGM5JQ) zmR;)_pnVxEEF+wX*DI>w#0wAbkf%LH;bc|3!um|7(;8Us)CF zCWKfhWI|B@3{aH*iw$jmxPJd_vF@KU!6`)3j%GDoAfonj$Jae@AT*9RctW2A?ygGw z!}D*|q?6Q@_ylO?HAIm#81=MbmArPdW<@3AL_(~D-jA9+{t2SmM<ZXB{|Q5~ePv8O~+WUZl2){HRPfHffJ#MClmMGzo;-60xkAi_?$#!(bfG*5#p zIQ44cUfSS}Wh;^#`RjR@v0&GLUJn=SET<{-%M~VJRm{n(AKuV~q2y%eac`Q@e zfbMv2l`;{+n)u5ulaE<>%}|)VIX35Aa&!m1RaK3wxr$%S2`oqd+Am?9Us{g~9o149 zGl9VY9^`=DMRZb<^=3n|3U-wL{^4)3b{Sc(Qf7*Ppaz2j?!yPKlc^CTz59m=scPRN zJ~0b={GzqTJ0N(I(}=vR(d2YNu^zi#hNTtZiJTUZ>wI3;gfd-CXMNE^&2drEHiN;> z?3?(h<&Ej^cDg;5pkaDmQXfyK7#P`j9#<$RUf~lpbY9MZuGX66K7p8t4=5J;n zMH19|Yj^=w)sGb8xDXV-S`LkVgZP;z2}8=P2(3 zcP4&Nl9o_avSL17s(Nv`%4dEKYcR7E7NfvLjG_Ggwd=KQS8M#U#zPOGNR&Q!n&?{* zt%iXGn;YZu_mfR@n^3rd=wM}>;XYD@eD9N={+H7p1LH@I_xcJP^4xuUC~i}hnZiVv z!9VUCHPYVzi|$3NB&K;-)4+s=vqz4RPp;mCgQMr;>Hlm+r?@-I$O4&^PZ-nmdg^Q z^tbd)LPURt3Rjs)?)|wjbSOK+X-3U&aV1;k+htN2e^vc8Ry^kM`nX}P`6&u|CXyTRqnN|522(v=hH?)ED? z#yOxPs~29<@G{KcuAbB*eXiO3o8~!0>$RKES172<3H%}$3cjFt04`ixv+4^OaiKG& zdDo8R%BRvmZK@J$n)0pWft~zMuB~1`qQ-eS5qJ=_CQ|dwXZ)wm<0Qv*Hd{CjwrG*- zJR}!?FqnO30H0$L1*d_IzOiI_LsM<+Y1heY_vH4wa~>CB0!XE*b%XY=gD407{?3>K(-QJS!M&h9^;7(y zO@_SEJe8=)+u{e5J*wqu*KXC@cKjrDIU z9rr{_&&#e^dVuy8{rH7k@}J8=4iM30<2c&4URi(4a?7(+kTGid8p`H6?I%N{Jqk@& zcz=IW^ssc?J=hMUYuN|KrV(g>n`>p zvaXYJJBwCy6Bo_&M>ta7$P3dWx{52G3@<8JS3(plO=lz6G*+7~_0RK@EcQ6fKc-Ea z4h26PgBr_N@3ut^rQ{$Ep}VX#zw!4P)-62w|MVSTgHhkw!4mVKroQ#2w!L8(ku8u- zF*k;!^BK}fmu<&LB$GS({046icAhKBnk0&_$y!i-gClro3IQIqP&?*y{WL98?E^8! zt43b?I5XgTn5Uy4Z|*PX6;DfO)?50eXN35&J+`I%o}kKKYDO2A$xYc|os~!>>CWX~ zDXGT3R>EMBRtcV$i3^WMMxD7DzvNxzboYKql{A2JhE6Fz6H0C_naGRR#~ak}_%k-8 zA*1&8{x$t={lPc?_iWCI&>!#9=M&cC89o2UPrQ32#Ya~jVt{4KGdO#8!#tpt*204i zs2d$Js`0}67hte)IkxON)xe|yVTonVU`(h0`)d)THK6CF^=UAAda=OxaS z!>VDhZ+N19_g^{Fw+F>5HEl|*wG@BzmdM$Xse%fQx~C=$`RUM#zIMktNRTjEf5smY zrf~I3f*?qp4{X~vJbf>*G*}f&f9m7X@a4s+T3OAkjRaV#C=1P2pL_j#kXx+cN?Qog zh&ZRgzznP#qg1iY0vosXJZm`pogpsRYXSmn}dH4F~Uv^;D)8PAgva-PPN{E1Sp{WAFu z_*f!=!_JOj1^put=rOztu?dziB=~COOJg&!jYSsyDGQnh~ouFLR%hk!6fV~ePIl&9^);jGBQHfrR^AIuVuok4^t#cHp9% zQ!pF1=-G5nnmpVYaaTLlv1wJ)AvhL0oP%oR8e7+}%m!>l3_pu3Jj!cz^*ha-dth>Es86Y2Uhte7U4Bum7kmwUW^dR%3{-*M1Y=FjyPV2u&PK$kI2s& z!VD{5ome&t;arOdKF{@9C7F18K|7<$+D=b9`0`=a1>@NH`*#d!S$%km$e$r!!940- zZqh$Dpnc{T?!5v<2DrdjilLlv5Ug1y*T$jtUn`gHeYz0eaW~cWg34d7(*-b-TwgQf z7BDi>lN5xb{1_qlPEp;ZkL7|0-A+qY>M}9iwWGdi);1P)zodR{A6G$;MR?}Lbks+! z%l|)Axzv?B-Y@cD zBHCtu-kj(v)D^bz0Z_In`5!JMoJH>eXdEfvX_Qavg!`S~)|tMXAB3affG7q+M-=al zM->1H(T_xJ*!Gdky4d@nC@b89*KF4KDyTY}FJ@I8OZd8#gz8bz2BJ8GgV={vk#8e0 zZ*L`-Du1;^ox4B+(P@;6gX(^xkgd{rj7f-{k~Bm@ny4>1kv23)9|zlq{Jjs(CegPP z!C7>1SCe39OzfyLm(7ArYWn+v=i~skj#QXCe<4}6WrUF`26Goel+cpN;|HhXfbLmV zJ!vNcy$%t*%(qX#LvMA5L$0qf34+mKHT>p9B2?OK-3G3}W1HbNYMbv|qp0IPHH33wk$DMnKb;&oetd4jw zknJ8qLh?uV&py1KS(Cy2-snm3bhH+Bt*Qa6w&&?p^sz-WE@z*%>O4oS!P>x;k@l#V zG{7nQ75sj=ZRCU4l3|!SoVFdRn|VuPt|w%m@LSrsq#I;-(Nb~g+IhBd&O~mTlHN+J zL4^Gd&-~pWy%Y_MM19!9-L5vCA;ub0Sg9xy0xOJ}d{$mZWNyl#El##3I`Zsu-Z7*_ zh%8rHN{tOjBwQ*iw^QKdla%0FR|5-7#A*Gwku*oPwj;34Kh|m4qQhX9doc(fMhi5d8f(5=ztlRnj}uy=?pXb}25~bF@QASPl`;@({N|l-gj)hssGpDp&6H)$O{I!Poq2!z{->hNkC3~ z;$dF=Za69_lbI(0*sH)DeTbBaZpZ#$0 zyH;w_ku5Bga|->{^u+%Ua}vf}&cLG33nfDPDu;te35sA;w4<|XOa0p;*LAZ9FZ^m? zUp>{9K04;D%MQr~rqU5h$emY(nnqWB20EMSG*6ad`orYf`GnTV zUfr!CJ%Z9azROZa=Gk{}0VP^Xn*hSziV^P9KmCZ@&;)u%6nrzS%MMr^iSi7Tw_l_? z;N5YgKFob-kNfMZ&{3((W

5JfLVIgN4#Hkpl0uM87>8yy#rs>Pn%;-H>b)!8>P> zb3@T4J(}9p`RIYpDYh>pYYXFE3dF-3Yqxg3P*Tb=u(nM8NaDW@1z&l|QmzUaG&Ikh z8@Zv@A~5W>0c+cfi`GR8GL{b_N(EZITU=YXAiI{eW?T$zlg4BR5a+OmzIWYHvtmuY z0+iooimL$w^uu^*>EG1i(v$oQ6rVkD<}6ND74xvFl#y}G&4mq?Hb66^j2vrRQbW;D z=_Da{C5=9zt%UP|+BE0r+Bst%pr9!rfaDAPqrU=Ma`ReAo?hV~C@=c#CrLcdl$l&r zF5-J-rn6U4quO^cxI_Y;y!YsRc;SW`LGD8_92L!JLpji{LY=0WqsNzPHtk>f#r^4@ zGMX8L1pLK12>~#YMcxA`H5KadT@Bn0$)Z$#T>t@i{{dVG?LIBX!XfbC$`6KfrK{RO zHAHaRNw4qY^kAKV&Y#Fo!NKEBJ|Eg6*0;!{)%5=29rEm6HxT}Lk593{{uqnh@gqD@ zeU^1go0Hq45=%~oRETlQBzj+a)c8j-2pKB=z8~Ynl@&XzOkRv|1vlKePN}5F9D@R zMdq+zAy~dLEv>*fR+FKBTosOBd5VUwe4sl|PcJ%RqVnUjlMcF{n3q922q#Fjs;P1H z?0R!@_{*_XXvsrx~5R zo1?yH0U?0rifX4m`@Qpkd(=nc)2k2oOv{{ir$^Q1j8J(i89W_ftKd093>BV)v#xNd zMErVYhq?jd!i@gr&TkY1?ACb-13uO%X!t>a*jQPVDEIGjf*XB^^5c*<9*;XO%|QfH zr0+O~U{(YTODW22j4OY_Q^6e;7~x)Y3-^3hV&f81`xZ$xY?}A;e$4ck>Ny87UEeqA zD4D`S-VPD{nLiWj78-^s(C#^t9+kFJ+YcEc2Psrm+y*+6FsTngvu%E&5_ z@C=uCJQt;HPpYxsV)MWv&3z@sO{Uv0ah|(e{WWR!e zWY!m6#|l?ko)0dx1g)TGfF8=EOE0WA0e+RJXV~;oY4hYxwk_^X&O4yM` zqKO>(1};R<<0;Vf&2$c;5?{v%p73jBDIDs%Wy?}*Ps!6z#e9a4r4k4tIDSTVSz$NH z5jW5)o!1%SgA%^dK6gNZd9%`K8TXH?am1BkmHc@?mjo2DMn1-l@t`xo>t((+T{mKi zGzFS#D(v~%W6?zeDZ+RcW^Hev7SDO0P$laR26SFM_ z&s)(WO57%D-lv3>6Rep#E&!4gd>_LziI$CkD~+#f-49b!IV{aeJs#v$_rV8wW$f^b zNjQ7V;!)1((O)~$s8@d>^NzJs?+S-~9d#WUIK~Tutm@f?qhUg^Dd(+buAy`)_#;XB zguC=hPi==H9Hc5o^A(=ETuCyV#EIC#DL*rYpALUvbLy_4%x3qp+b3NGBkn4g>her= zUi%K5Z})8bsEAA`KI8is$FwC|08$$l!rAR9_HB=o4MhR6jTOp5!M?`nVM6%r_U5cC z%b2}*WFv^HsnuwdnU9Fxt>zgj?yww$E7 zxU{MFTL`5AmmbQ6(6e61Ts`5_9ewJ$LyX$J1pQ(}3TH4<*5 z_$YpP`s6I1Cvn3!zj$?@l$DeQ!O)b*LJ` z;NYYeSz96(*hc7F{ayDa`G7Dkl|n4sJ;a4>Epvl&-%x+hbf18jt-@V761V9sa)5AZ znB$A875_=Ah()))!K<`}$(wF7p3S-sj!dw=gU&UQ+I<>RkD>UA9rUYZEj{Kq9sRll&eAPt{|z4oTUS zx(M>;z#(hkRv!O?kb4#w#F~Eczu^Z zRQYgQ6J*0cMf_xzm?u?2Jq|y?U6uJH+h@CR{}D8Z;9Mw9vFw1M?D~~3yUV^qw%?xE zM+xU9L$dZN@+lj2yP%ImzpF(Xr-=~+$75|MT}6V?T=U+IHM1|RAv#37F|W3^}?`;Aqq=zu5=7Ee_HcSMO#Gk zu2>J?5I#QC4Q(uxth` zqi0(mDVFLt+PHA@@w=q+NCq+1c!Y*U&F4{+Pp2VLb{Kam=Iw}9+{eme98gv(ZX|dS zZlzv0&k7*h^EHX-IIv)rgl-q z28Q$mY$XFNCrJ#utRKBDff>*XFJVKE@usTbpijsP^4zcN3q^TwD0r+eh50++3sCg2 z?*Frq*Dvlax?2)w`ec^?Va&xwxte7fg^AP_nP zk=0oC8Laz0EC?xQ!J>W(nPL`h(3!iFT5c@-hJU2e1xB1SacUydeK%UK>SW4zXbh4njdkDnZ`H6^A6zI-n&X*@5z3#xKx-k= zo>|_=EtnC+8yt1V*`uQJ80B1iyq5%3}8 zV0H7p{b81-HLN(d&ifgy3d*12+1-3@FJmNuz%B1Z&dG``(8LwU5;fvvw_ZKk5XK5K zs%a6NJ1STDFWm#B?IqI7~+;+h^16s^s==Zc|=FEhPa`0x8K=m-}fzo$pDD@A!~uCkl&0BFnBy z&X&d|VNj7Yl)#~q(fyHf;XSG#UW z<7C7$3#br7ijM6_B6HrqHBKzhlheWm{;b)BAG->v3oga=^3yrQ65^mQ1{tzwk~Y1H z?2Zz<&2HtTDf-4v6nSY|x#;~GW_nS0O7)iQmi)30NKwib7#25)x#2@8#US8~*10O# zK7|pJ%f%*vpjMGK3E_Y9#9NbFcpR?xXO1S&#sZT@A0R5Ffh$SISr=iD(yDXtnerh? zabNv%iZZP!oy?$BPhc@_;RXMeeNwoirJdv&z}2Y3*eE9B>s=|zjDnax0{)vldLqD_pbno&Ft_bW^J+17Hg=F`OT%{%tp0$96c zmkYm6IGHgmA|1f4%|D9t6~3_E_N!~7h((fP58e4W!rGm$9B47pphQ#BY^(7({~@Yq zeGaCQCp7kT)FmuLlk`Mg{E5vyaAsHOGb=|A#+!^d!2ts*+V4*^VM5_y_c>B|snc@j~K8%J}Lg4>-Av^HL z+n>AyrpK`N;bV+iw1mBD@g3!-2{i?YjZDsN#EtVi5XDjvcfC{{<#6c1%wufwEoJ2bcD!kVkxJTaS zf=N#!v4`>&Q05%|Om*p7WQ5&#oGd^{s)BkkJs0`=g@FqztqJm>NN?No%`R|>o?Bcu z)Pg#YadCz9wgT&c5RtU_9nu{}uDDz*>7|a^ocaB8m1Z@~c~xHi>uO$v^CGjMMuAF$P3v4r~5c1)KhpW`f#O@3=S?W`%_Pla&Ripk5q@$B{|woixsv zJvkTeE{e){ya*}X>kuo>(LO#~pX?y#^ki|aulY?D+LW;?Y$66^8J=q)1x+tfv%UYe zEOStETBm)CsFxPV=4t%X+4z1zfWWA_N3iZ?(J~iddQK)wWp(ibx;AL!wav`cAt44ZL%yFnJI-Xl|i3Uf+qy_7CTFefn`EpUDWy@CQpxPvTa*y2$ zghzDWGE8+ZBUzy=EVqk{g$$_w){;;;%sa;REg!|ZHyFwUjXg=FJL|1u8$pi_RC>a5 z);r3BaWh2T`iTjXLWD{y4=!78Lh;p0n<|jgWinzv^kLjbt!7) zj(cCqdSk z_S;RrehvRvY}Xpn!5e39=7iuXi1ehk`3_UBoI>PS*%kRDDO#+ z`8*Ehs|U)7&?Jy82r+G3&Xgrh%a=1ub^OKp~PsKcD3Pn}!CFE3F;exz2c9>HYt*YFG7}G&(f|;La1hi{m z@;HK$-&dDn!kU$1+oIBlm7R#?^X@HbSp`N`Wf&>|u5iUo+7)--5#t3k=VA5j+||E5 zmANULRnYjxEDNTX5JVK#Uv1@wkKggp#y7;WQ+(djl`-CC$P|HknwXNxT3WA))FVn% zfGGWeOrll6-4DrB$J9`?W@0HYPnPox>h|jWdw-6(a48|2|LSXq`ZYE7P<7INZu<+K z-=*%y$OOM^LA@j>w^bW89R-1rto$I#9r7QBCNTS>rblGQ@Jb5zC5>Qq5OLe^0~&fX zR5gPwCLNofOBNmb>H-rL!`@iuLMVB!ugd!3u}s8rxZ$cZ{*FUtp8;H$y;O7KqB)mv zZWTs4EuqxU*i%D6=E)J3><8aM!Oz=dkIT(r6ky#Hh2YFU&1%S|b9l>MZc3ILg-T{H zx9U|;|B`OFL0~X5`Kr$H1VD*xcdt$Rz6f?A_WSLrXr=J;KqlDB%k^}r>UT_W?T)wx zWm&;FZ1gP^*9Ki;9`pbQYhu%}Zx1Bfr_zWnBLVAqRCJQm{7~BI`o}91JFipv0St+t zJXZr7LQ^_b${O-Jcr5XlhKTln+b}%wv00EgRVJsl$K|~pn0OmrP8d)ti==@lM>8AqZ*d#shgr6DDzoLnCZ5= zb+gCkNSAYb$kZ@>hGqnAh)BN%gXGncmJWeuMzbck#;c1~OJ5b6bYldyMux?uO{YaG zZ!}Ym>v+ce#Mz6D--s?CJ%6T%bAB^G0Wlv9#fme|YY=6Wn5mv@tHiJUk+IIGM2KcF zH5;`bzu(L+QE2hdR&k??Hm(CjTybeTLG%QW@SBW8Z#Hbl?~3vf@sikMsxg75ay|1Z zgMCZum9X{?Qa>cM(0}c859XV@_$KDg0F~veplqf zKQd~w4C_R4w;!$w--j;Dv%FP8yN}CP2ezn%{Rrja;_DLDP5Ui>coF%fR#`RCX{L=Y?+hD3OcG5fAjp<9kx zJ+&*<7-uc-3GSl&s-;hVtJUPO_4?qt)+i{#hN`T-1>O(g|zLPxEQLgUJN`5~W z7?Q1?g}|5PCwDj^Dw8>eaT}C3KTPwt(yP%yb_p-`2aaLhtFR#?_1B$q}SFcK)J+JbcJ*eWc z_b3n9n+4M9G}*zwHY=Iy$D%VNv!K6#V)>2)jc?d6c5BGLYQF7FW31}3^cpELb%EUn zNz@7T*O8VaDk(}v?FjDaM8ozy#3%1Im5fId%8w7j`&AHxL-x!Uuoej;STdM~W4Ff9 z`*0qM-p2L>28FPd2jNiGPD2SKS3EjPq@{-SGtU%?YiGJ`VEt}Bu+96Wuv@MdLR{Pn z4N?m+IO#5hxg(#(cBT1%=|=%*1zEf=@v+NY!Keq9Ro3kB?7%l|(H5DEnQd|I z*hi-OnW`!~JT%z3NGvKoi|%K6MH&21F4oC$#$@&{A5)Yp-t0bN9}o4S>JMH?=p?l; zRe^E=@+Z(GcKz^omdR*)%;zZYvm$gmF(q@mLi9bSgkh{*2B_BHq{*zH{6MGI*3j2XcCd?V-qmrB_QyN&>(n)Tm>YDD=R zpzHs5OUpZ1ogDh3%wmzRDe?|rB<8fXY+c#oNhRjGiDr6UvhE#4eH1FZ2-LVliCkS^ z$Jf|Qc)<;ZED;3!MFi-w#6MiIBwuAa5udC#hsMq++egx-)j1Sv0u|%-BUe``ln6&M z7m@iO{pv)zjy3mEH4V!}!GQ0=q^e@1lz#J!eNo~rXF4UMp!zv+>-^``X$*oDWvB(E zHzU+XYt1xgWjgApQ??MP!YG~+h0h83UAh^Ykwh{!{i}`#CWCp+36(}?`cwQ@MdpNj z0mPnIWkWjdsJJOD-_uxzQ1A(&v2`ConBrra z4;Yx7mH>k`2EN|9+}ux+N1<(c^jX}KsJpSvTUs{8x{5bvi;NqzQ@yY!WXSw?vFqy@ z%LBx*Rcz-p32wlTaE^bYt=cw^)YDg4nL;o}81bvhjFQlJN&y&uSU5Tq$lRXzd8L>hTs7>Uv4Y9AtE)1d1>&$_R04@8ll--jlFor15FOsy6xT~ z1Lu6u-G626NU14o*J#eQ2rRhuEAS6;E34>MY7 zP4wjyt>ov@NGL;Ze!p}etXBXWq8_4kTlrofFo+Sa785TOoUc@B;gKY4%v$d&AwV*< zPh#sy4f~&CMOr>Ovr1|&4$vzKJHf@EX3^PE*4m`W@X@nTP20jn3#6&YjAI^{u@!1m3O8QL zttp5lDjpI8wRU{dwaBMdKRe-x4a=wd!xX@#j76_x2|T{~XLBGY

z^1*pR*qjM-( z`RD^pRUlGG0-s!3B@rk^Akn5qhVk$ZC>jagdEg3e?V`|^l=#j{OE166CQG%rmkC3+ zuDSix;Ac-`cMwq@z3a}4RT#xWFdVkK=A=WTxu`9Ji8Mc%jT}M~MMVOk)vLfwXSNGjcK zobDqhoJdebQArpfi9O;?$G>L`KbE=aA;DpHD$g#IS=b%&3KsmNsvCev0)}{*J8#$M z;LdB0)@E{x*dGr5>MwhMor&McF#G!Cse^(YriC)E1!Hv8<_Qn-pzAM{MY}*w)N5~9 zO;FGJqHPqi)t4+ov29XxQ2~}R$9iyLFTR_=f$R@RW1$eRonMK21L^C4z| z3#`l^<1WX(KVc`QD(_mM9(=TTC)bGO7*U3ZB%K|9b(w>##)A4P>T@d58e|JPXe4$O zyOh6Va{*^ZeBXO-iDcQehRWF1f14hdjH(0Id3f|=I?$L=--yk?KRG=KA|tYctuRp^TLJ`4kzaR>x{d;AJ3N*oOn}1DoW9A&-jO3`xMy&|}!%T8kEse@FIy=RY#` zkJcg2(S(OR$it)rQi#6@;z^rmx~g0zw_#+vx-sGQJmZ0XUpN6_kdV^_*N@O51Gjwa z?QjKDhmBE%cWCaYg12}2_^F6vFgChq6%XwT<-L_#>T3JGxH!EqT=5TzF^I|6!*I31Mh zYRmyk5--tO6_wW{=~1G90No0ff(tqEhGu0Pa&)`l3yUwk(LksWS9wv*CdYyBrM)S` zr>X=+UJ<`HDbeq?){JMsVbS4Aftb7%?YbD;Aj*}1&jPz6PT);oT8sdJa2Qav7_ zRu!Tl+8^=+Cu82{O2T4iWqbJ5qJup(y-&w8szVD<5j_OJsJx0%EL~7<$Oj zulk%t+3W>GHbZhz^{@QQRH^kdT`pzRVWoj#W{1%R@y+WaquRyUvCsahGcSv+xl7y& zm4^eucX%YU!{@b^OFC_?5h;6SSC(INOODEphw}jAO^YQ#JPCB-gVc(nV(2E27OXY|_O(y?qOl!W<8VTvrV*8n8utcH3``AM$3yuAQ^Xzl|^3ljEtliaaQ0fz37z zJh_fI1{%M|aMY)RUM`lOe(GyKCG790xEH5=f&rD!@w#~&I zrXWsGFc;~>Uv}(#@k%q&zV96PyhK?LzjT(%7j;#Gu-phXOHwd!a_)?2e}M zg;1pTeOmA_X!g4i&DuoW6TX_~>l2|WSUM@L+O(I<$_>&yLSB@%Sr@!man6E(Q1oy@ zI}%OM49cDR^q%;t<5yC{HrldcjyaDPH%j13N*_3afO%n!+dm)AcdlHkoOkDx>PA;6 z1N7)ECV3fNyNK77_waWtI_YEqx-NC)JSMkEYE;H_J7*bZ2E=(t-pu9|U(22Pqg-WG z_9Nr6B_?XNCML;7ww$Z%#)AaCGm6_SoZDcEx5^3inKqkF!#CjuSBu@`e~B4)pcGc? z8q6X~8$7+T1lZe+s5w$dyO@o2$LzLJ%nT*Vr8xXCVx0&@QJV|zoooknpahOvrw`pb zO$|+O_YclpQfDXvqLY9{P|e#Pl}tDDQ= zaTXpgwR z=l+HMkhG*H`E{CY8&lSOq>ay*Ph=u3Ys*#ACWYAy%JQhN1GdiO+MFyf*KD0^0@Hpn zWkmF&GUa14d|Xv{9TPSuCG+42hY8QiCC@f$|J^0_Y((Tm5!59O_sSek00QE78P@!k zKylfaKonMd%}-UKN1}Ubv@}3#1pD!R!@?k2{fNJ0bz4Y9$6YuulYAEg(#?GZuh%lS~8jzpuYf;5JB^Pq-A7YB+5X^BDpAC0Nf?BwBw zCQ4wJZ3_1J_AYfi306&cHn0E$hsIzJ2|p{&cs%O*DAZVs82kASQQ-p`wgLL1Yvkur zlQdThtO{d=)x#IFb_A<4oz5Xy94L z-;ymW&{`1}!`ZQ=#YCk>OtXUXUR!xTh%adamk2A0xw7#RmJ*)G9O>g?Kt4_NreX)- zC$Xy$HK+OPy0=J(q-JZfKrs_<&1^w&o=jtJco~f^yP(dDCw8>E%HFtJzU&h0ziIq} z1lK2TP7{gJ0>#VEG;~wjc7Q|4^Ysy;t-`eby$+B3S9;Yc2}uIQ5r3}FiTQWA*1R+a z+x52mYZ)0Piwn%z<;)GvjDd2KHmU}?3uKvVh`UgzaQ{}MbK=3NyVt{nNjcMgHf4Em z+uABgrh;`FpUeecwBfc3lT6Qwml@bd(rKSAwZFcLWbB?tF3Cp+T#}OZfE8C_+;LQH zslx*ucmYWKVi0NAgdx}?W0Rum?K@!0k^w?L>)ax)DEIZD$t{PD6~FURMOwQ~g_(Bs ziK$PyE`xyKC+OSMuKrCI*Zh5bs-|t{qqI5Mma1P*a)NNL67_IHF`W^2D?8+{%}}c} zppG36p*RpBkmjyhOiWJkBQe>g#`t`?^65Y8TRViZ2GgRTk}7&f4+q}>2;V%Y%Tsgs z{R@?N+0AlO{@7qN$bZmH7cFg9z{PWjcdDBddGf#X@iUYujp&)wAtrzyCc==tEW^h2 zq6DD{At-$kHmp+UfM``ND|ANm0&{c->SHTSe7C5^Lr(Og{&DWVXMlkZ-J+b?YbBQy zMNCPb$?B~nu==Y>P-Joyp#>v0Te?}-sHUk9pBO*N<2-CD2B|H{sb9l5!mcbva_}2R zIfFKqm3&DdI@l~XW?FMZ<@s5Tjl!VK?9;m1HZkr<1l(1zn^$nIdP_E-l>OT(3ge8| zCNweMDn<>w^9}UdPirIOdjR;!R8o{p0DR{|E!jPfv z)chca_lP%fNj9B3_&qWuRlU(~ri;$dG>P1^0l}t)XVbz1K6tl>*M>dZcAxwC8K;^K z!^;o8pNN=s^*1bIr~h^fAl~b zbV0E=uf)`3IEo;*d}`k}wyfUmhDvKPR@_S6iaj7@OmPj6uRbmrLz!vga7dEnUKuA7 zHJQH&EOB1WrO;(|_(kB6OgWtoC104IP-_IKj;Cu_TyqJ&2jjR~XGGU8*&7D}Ow2ue?e`W;%!|(k7R{a=hYq5Aws)E6{!TP@)g#S7cM$by zbhGj?+RQ-rW0XX zUutIO4DVRW_F9$fYeqU&(gYgN6Yin1W-SfGFy;}w9#kq>mVTXBWWM*oG0=j879_8S ze&{8DI4}*QnirkW9I~!^99V@oWOT;;ULe9K1oWx}WjWo4i)HYR7rSqrdipQVYi5ktt2!aTZ z7Cy428(EA7h%hV6EqRrMdsr`#q*l&L^7RwCiTvrtgh%WGZP2#X_;wS#sB(s3uO_6% z^{Db=|3(h#IyQ2U$OUa&d{Lo;ymX;%z+!YJ%IU;>0A-_At*TMn=B=OBIDT^QzGv)q z%fG4&1&)|}2+0ORB?VmDOx4amRG7J(L$e>IAIq3f=i;I7*<1rG)ME{Yyjz;Pq>gQ7&S>ex*Y3{cCneYPT*3 zrOnNn--A-AWFp7{c-T0ZcNXhR1|8dpvej^U;UM62J6{qK`P1px+c9qs8B2I07SER} zLT>x_ET~kw$}cyW5c~_6tp4&8O_(*$vuf|-pBUbjkGgx-TzL?g$5csH>@5NdWm-0B zGrAc196{q!vj6g=9lrB;mJldSWeC;z7w@Cn1s^+GPeS ziB1O@8>8r3*rhw9#P)ZQ?hk1U_s{}CF`2kiwL7-_l*T#>H>832KSL&8b5i@{-K?hxL1D2J%d6#O(J)1hD;6y8@?orLrUtT2x-< zCBF{`NYDu*v9x}h#3T%>ae82%ttUU+%AH{|gHFsE5lDN4w;QQS&B(RjRO!s;mpE|GWe z_^t>UC{-OD_LpR0BR@)3T3TSA9$aq}Zd-6?pL3o1NV5~b3RxH)s`Am?BJ4_DtpBGL zGlBuGhQWj|SIB&>Pfi(zOb#7NtY>$qJY2f`J4ezPb7u{H_rakz02Imoq zaz(q5?!ujT4&*S8sJRNF!SqN(erQbFm;*Q@CTZ_2=-D!c@_ka<+U^+@*S1}u(i62_ zGn~8$&|^y;Sjtd8&vV@Smha%v3!$0j7+OX5zwB`fgUZp{aN#+c)PE|A2=&DjS3H_< zc5ub$U!HLtt1Nrbf(!ECRGCaUeqy)|?U0Al0C~xaznf$ST8bWiOzwTETer=ikdh}w zO^?VJ1Y}T!GqYdt&#Hz9W$A&`h>3~aMoeq+`#yVR^bhpR|1RpCtVCt-A~zJd^#WBK z!@KLjQD$TwwDjIvlLgsnqdLLo5c5@UY@8^!-g>r>qeLLbDo!TOKcSmJuPZP+`@b2(73 zWLf3}O?124$7PzQxi_;NjwL*h(3o{ZjgxD}?Kah||BF=>uHH9syFrfq)SMr}$Rxv(Gxl-~L#b}7; zhdLY57bRj_j-yzS5pnfUR)fEBj7^U$^3FJW+&YrJkEl6*Ys65eH2!@XNzg$gk0vd?_o3ewUQDOT6>! zyyp_In2i5(^=@`4#EOFy9a89*werKtd6el0M00B2(8f09q}bWgxrQU4u!0U?@Br$8 zzb30RAwmt4GonS(byvVOwD))W)l=~a*pqh5sF3Nm$U~y5U=$e@0-^eDJ*J>zt)+oV zAWHF6ugdac8uaK7=u@73O_52NgRmA4LCKdu3Y`ILiQ?%x_wjyKK{44@xK(UES+=3m z7ss5H^QS}M+0Qop=ptqU&0HQMy{!-qaW6oej{ilv0tXi^6ZEVbZDb2c!3# zpoKtYbaAZG=$=e}(VG^1c#L8veVh&36YxtFD#thC{8u9nq1Z6|BUfOaX_nNK%5BU6 z)m)Z?DFxpg_lca>D{?zBvZ;Ubw5Uhl^#?gR#_7TiNxMGX9LCd*pIja8r4)@tX(a7% z;l`8?D1+azpeC+{gRA4a-DOGOZgi%}AR>Yr*T37Icc5{l)Syd%>}$>7o+C$SssGb! zq0@J(LU9sMTVr1(&)hN6-2v!PbgF+VG~Xc{x&(Ql`#NYNg3adLWT!?T^qz%Kb#bQ!xIXWIq^ z>MKgU+p33-zNoyA1~yI2N04nuN{LnbxUqsJw`AuzPPG;Vd@i5DU}M4W+m{ljSgEds+9%1zm=%l zLXDa+5)Gw}>IFmi+?RP*9}kDt!$q)BTy@3b=o%NAC7%y8ZOW6&97bR~(0f5&tI@Kq zAwX&De7&Q1k1F{u=GYDO=8>KD$I%ZJ*n74CT1hDIlZ6kT@Z$Z5z0(TSq zn#je?*&nVV4})u)`-SPA?GNU}7j%efiljW)djcM4^!(t z#P6BZ=gb6`N3XH6LW*ltB-lIRjg`McqCG%3sqjn-F>wa16awSSfnA_)8k~ zL$XuP?jZWb{6M&$?+QNAUr6Z^8~NyY^n$7HXSs!Y`k7hjXz8_w z)RK@$pVCuZZ9Q8$$npSet0g;L_bE|A+ z58Il3Hcb}`qV5b;HZw-ft*rr{r_eWoG~()G+RfAQP*R-2mnKc`J+p7^$bxJR8v+*t z9mw|6@*M3j63(^P)9b_J&{F{;aZTi>5i^1h;)q>oGr%bzO!%i%*8)kjbdeCSh#S1# z_}TZmru#TOVn*n&7Y1lvbInnzA(O?Q&KZQOheewgZuwlj`6BiBnx$Wm`JUln{>j^e zGxO;QC;f3npN3%r%)4ZKD}A$oJryLbODiSzmLsyEcW3qKx|vi zxFgvJE7Sl}=rtV0g= zSvi^B7%SP&-ev}~EqFf32M{-^SJO2?02dJZCyKOYJ+JwvF5AfTgy?#=LX7$FTW^}+icti{QmYw1e^Pk=W!52!}6!p6GhvClCP1*dC z%a9h~X~E$FDYx8PBB02+LO*o=%DA>=hmo068_{&KQVBAF# zVxp*k^hdOlj(~FHijBJ-yAA-|7BS@{VPsl-k(>Jib6jvU&$KrOlzmPXUCL)dB#gvR zFoc!Z{wm55?%hWqj#+P3D5&y;1Vr>ZgIO-7L&kQ2?Hb-$@~_Bm>LhwkI*;E|)df(j zHh?jt3V>T>I$>O4Sq%#}q8hZ^!rU9W3Dm_^X0;)%llsq%ZD%H7&sRM!DM*8eWazNt zu7aPTHXfxOoCv)F=5xwK#WTvXuKP3)t$`hkfaKv%qXcaD?a|)bY7LO1Aft5k6voVM z#aYR;P*j}40M>z zNBi!X$%8no7F2et}|Mc?NZ5KyD#Wbrw5)O;xLG&3LZzv^?FScpL&PQ z#4dhIUg*~DgWcOgFCBOlLSx+67wX*^0nAe6fFuqQ=PtTk1@)RaBOI`Hy1F^pW_uMyAHLKz2pE2g_|WIQ6bAn>lTC;^I4x39#7Fe}7755o-mEBB;t-9OfCpJR z+QAO>ssd>g78r|*{9Rmcu6?4^QmmF3Wr2ES4UmkMC94R4CcF@0>KPa%U*f-gMf`WR zng%y485Xl$ls6l%nbR7z^)@N5RgK$GrtgKJS1gmDUWP40s)~mWg78I&CHilc-%FN<4fTAJ6K58&Wo)Z(fT8#MO6nP+D+`GWfMHhNt^JY@ybe_bj z523a$)9$kv@zL5BvFAoCQITqJY|Xg^uyD!n$t36lw$oEn73W!%>R99qFJ ze?n4(BL{HjzO#B;Jr)Ts#OLE1GG&;?rqP;q7=7x|g4v4a@!xY9AxF1$pubCax(yE` zc-wzptUv!QF5n3Hb=GO2Tggt`#9m9`VJeu<V|Txdu^Y?HNI+XFb;}(Rhg?!w#9PDWJwV?DOR^az{RjNGaVR?5kN%w{s~;F)%S!i!aw_q` zZd>p{xl=psM6xVUdbXPq=mxdc)YG=lIOv!kcQ)?Cu%_Ap@b=%T>$@SUy(U%g`MAFS>d0%rr6wq(^bNnWTO@6qR@SHm> z4RV?p-hJkq+*k;>I=*0q?~QG>FZRg2+^T^Ew>saB^o);qwzw)Wg+P+%hCx!C;i?G9 zWmohz+1iT}9kj$wttpe`#pQzOa%xW%6KhFkZ z$6n^2XnqFi)W%#LxAEqB(2sw!xYwP#A-5pF7n)=IfjA2(C+fO2)^@r-U3BV&`F^8d z=H0LM^A~Z3Bs;Imd{}|18`}yO8%owSS>8qXvW~jY9gxRgfUtVrjq*|3Lksu5oW;nq z8c%eJTnNbI-5icCnnmNu=>zpVyw;{KK;i3#1&G2Vu^`pu!dN*+9W;0Fkx9Ag*X#=I zQ-2OxE?t|=<0~A-iv@vpgiC0XB8Bz5v-7V0Jul9+W{&t?%*cMy$S9~1w=Cy@HCm;U z#g^DUMO(0uKqZWVZc9zPE-3-GQ^Hq~6-*2E<1ez7KJ&RJ?P)w?q%6SB^mEi8EdYVF z_0Z?Ha+{qJmdfMMfZU<4xce}d?aAi6r~Dv*|Jj2nZCJkzACFm!GF7qQ+z8HOCN0x6 z?|l1^?rP0~(~IDkB7XeQEadhdLv1JJfn?GhgV^wgR1IqbtpMvOvg1kO*L9t?SBxEl zYkBzngZy_;Zy6li7dj|9yrlVw-&gQj03*EjcsN`zJc*)RD|z`VXY^8`JGUKH1sZ+* ziB-P-AxB%hS0$`C?S6g92}^r0oJEh=Cdq#k2jE7jQN~=n%fWh)zreMHN|nw3%olX; zLf4^4O&F?bwhjZ?hvZ9nzwO@-g5VVny~H2dPeCT81)Ba*M&CNxvO;XK}hq~=qi=T(1J$K)!Q84K6) zyk~-yEVtv2)H(tlP<_0D&fvX4um0yAPNZ=X0`5%fHzkpobyx%GvEj%*uDnBPz55p% zDaXk>efvS26m&{vKPikXeZr~Gq&FoVU-r1KV~M18pGX08^_OdT%n1QoctLo72>uuL z11LEZ|9gqV|41^OT*RcIPd>h8uhL=!FEwV)ltbvxjmuho8##loC)=H{DJZ+#sH=(qG7%3ABaGBITR&1?a z7ZcVa!D`M7`*l!>Sxjk{6N*Ew789mZVc`OAskJi%$x!NLmx&(R?jco-Qde!_OCl^}gGr<1V9nV_CNZ zD;F~eXAs0Oxz~#Z#^y&?szo>ni|Q>av4e>j!I{`@H-`d6{hNlO(Y1JJEL=QMi}x6d zziR5E|B+F}+J>OMHalf~VI=@fCa1@+yproeL4*SW(2ML4js>kaF3kb%Tg-?xNOq@4 z%9c!5Clz!J$5UxsKE(eZXM1MBJcM+>O-+u(R&?Oq@R+iF#KUiwTSYNLCd3XTdB%%- zK0z0d6vmY(cjj(^z~{3XJtz3GUS4ob5w4$}cW;BJOl830xYbyl92(;o@C-#OEe|>P zxS@vZYQI9ymgUi|nNSn+9LJ?lpz(m8_^ejd}6E(9RpsQDXxV(|mEl3*7xU1a0_ zG5oB9sNMBh4pIQRMUk=&;bBh&nf%J<^z=+^;IYI?gqUX^t&$Za``!P_!OA;!Q9erY z9x@v^Rbz{_`OrE;Z|#5V)N!Xn@c_rxfk1_6I027ig$+oWfs)6u<(8u=xdvMvfhwOh z)dT}CZ5M4NSaP6R#q?Td9+leaQ6pN!!V+As3x^TSUw#>Vj2hLKzW_zMaRkpha9GMyH`U*IN6mACpebx7;vCiATE z=TYsvl)rjpN@V{$EV1KoA5kN6Lm?B$;XBB;_X4D?8ICXgSh-(Xml?nQM0lzAPMZJ&R`8 zfws779#8-4B3&Bbm66#uzNCfuB}Qc1g0-+AfGkrl;?t*Q3Q}708jTZg6SoA38ZOP5*c;r>urb32ajAGpBc=ceC9h%zUzUrJ4+5RCev zluqPkTttgjxYGeClpAd8cR=k$qs3N?1i@EN6!bHRQS=?K4~ePMZTqVJOEt(UqY5mn zEHwM)rZ#ShmrM(;4MJ|NB&RxA9TA`AHE-69M7W*t`B7iv>FO8X=4`X}+Sc_u6|TF& z)3c+%fAcKih5TW+d2$@X64aIaqU1uB>1%wcnUZkLZNHf{$^MmgKflaQn6pzRd0}S2G4dO_>(vd z&1#YAeID8w7iPw<@(jupjx*AC@G}s^XgRCwDpZ^SS=q8*&$%~VcJ#?{4ZEX#nmJ}n zBgVtgC{sORa(YxDK}VqCA_x%_hWTuHAV)m)7vbm3qq*XAb{fAj7nKyYq7AFNC)g4Z zFjHz=kx_kga#E7V10fE9st!{2uI0E?MfZnER2$FxKKn$>Ewliy#xieK5T-h*V~vW8 z-nxktdR|XW(<%$}QDF*qnC7mp6Zlf1DnT9T`a)*dZ3ZV}VxhA176To3>f%JTdG@=z z{ID^dIxs(qLTVv%ai=_aNE2ZyO%>ZP|CLY_pS;o9y#m(p#bgNz^5q-F(Mtc)7 zt&*cOH8jiN#u*?TVZOHs=L`<4e&feIh8Su;l>LccRn!qL2FfeLUbALL>9~M7UkNEw zp5zN7p;=C#{dDaSyzBweVF4!sik`n`1a!mYvUs?$$9_!>EQevL;G;zsGhVEG@Z7Go zwYj5+bBxwEm=8%?P9QuO^zyO3hZj0>dc)C9kY%SWxpdWzs+zMZOu2-~IFiyJxMq76C7Q(pkcl0JIBL z>1-RNAatE84-nu2z$pebky5?XW15NTF$>`rbgiV?27tr#sJt~|c4}wi`0}ZJ9ly^bG2>lUl7_?>?aM7n3WI!rxnYJu?(9{14!Dg5T5?J35toZiuaq$n1^hg zIVHyR9eS-tj{X7s(X{~p&H$VHRh2#XE2!Day#LuhO}~=6P{B&ps}d5Z0n~k&oP&^I z;{A;H0`RH5&yAk}7k$bL9R<{U^rWA7*5B4TOHlC%+#~Im<6E})il0Fzlx6-T(N$KL zw##!C4nYKLkUjLaz;qB)w3^8jC(Jey(X9}OfO!GNIm{*mwhOtjq=*&;GVL-QpEFWM z_S603VBye&dVsUjp!?%mfOi*PBal)QIe3zmK%ro^?uci7xS>XIBEh-(m%7$U4HzLb zyU37*D;N0bxmb?bw7-LK!EfZPUJM4l$X!p}8zltQ zl#XOF1lNiT_`YqaS`EzZesKFcR>Jy6-zHysqH?0ca!v?8G=^K|uhODTK?=^NKarnN z+_d1%y?LEuZ1c)#TlOZ^Vv{Km@EcF30x>5~!;s6v-cyO5Tj#h5PS@_w?|T=Nkwo^YO+wMfq9n@c7^`%`1Z=H?$#s~Ih za2kmr#{>~WVa~3O+@Lndxf*8F+u|Wke0!Z%M3nkJZUzt(h`$rA?JxXI-YH100 zcUq6+#{e!@#$LkE*MV*#VBk(&RD>&hwWdWuMD@jsEbXTh$oM^A|19tLk`o>y7TK-JU#Qd25b%OWG(SMr{_w{aQ47)5p6xs*nF+! zMq&pYvL3C|$4jZjV3(roBr4@FG2?psFY4Ww6__py6F8jdDBh2q97vEr3lAG+UKRAV zQ`Xd#gz-hn+uvU4#Me@G!qaT_5?llU#ql==V_%AAN+v2d3U(xkaQfZi`+g+A(`?_1 zjUa|cRSPgM!%GC+sGqf@0iCNkf5GC6_lTfv_!j3;$Ua@w#56=^c2RB<6~%LbL+)K3SX!~MCNKf!f8svYzp`Wq znY5w>xY|z-K|sQWt7{Dh@!C3&=mE+19fKq^>Dagn<&ODCI_^@08_P)ROLuzZQ2sP}S33T*XFHIEwOTq(8Ici$Aoi#M+wdXEmV0;Ua6C;2 zKgpSpf){7d>tx%tJ_G>cjC?b~n5_}u#rT59N#J&2Sl%{u{m)Y+=k<`4~!Izf1gNRJ#RCUw=NTa5I5iRP^2`Q{5ccO zYl@OI=B?J!8%w3GueW1l{KN|5w&uuiE!>?f7H33!mLPtm8r#S9#;2I{BT%&#U6!L< zm>>ieCcsziXyZf$25QI)v`vb@a#5bDH8i@qgwwL!TVG=Kb}=^gRqh)qMhmVC;=PbY z&afr5b#71}spNgLPoM>ub%{Jnz^n=Q^3<@acM7fIypDkGTJ_ZJ;w+4Jf(`B1KxP`l zK?XM<9Z~ssd+oUl$3kFNbOBe*Ql$P3qamr#)UqL12a3OOY9W$|F^?S9{?Y4WRf=c5 z+)?fN`@TPr@5Bij<&HorjHmA=TLC69vk4=sxZ!4ye}OI6y>O_5J0O>)r&BRu#m&_ zJk5m&wa!F4`eBCbad=G;iWReabgCd|zg4D6`1is=C#Y2=6g;^g(cJ;Zx#uHitI8Ej zrmj#hA^Ie!LE#)~a!x#=%^`ZDovHF-xk{QNPNi~ss-Yi$4M|VkzG(#qkY?{U4^X)u zc)kTjP5`(q!i#Vc2&l?nk=MHO!La%;m(hT`JUjyhN=&TzV2va|3iy;A&X%;-zhANe5&_T$P7$`QFfh z964l%Z{n4qOyxj2UkG#}_*NLNt&TLk7pt~@4{A!s`q?XAyGDRe?&+1)3~&he$a!Jy zpv9!py0eDrSvP5to3QI=5ME;io?26hg~z9r^ES(kGyVyzdkNzS4=X z(AJ9R7`nqQ9u!<7-m4@%EZ%~{R6|$ zm(L1?h!Y#P8yNF+<&9B?XBhV$&^l1?Jnw4+U#Bl<)N|Ev7eDmxuQv0H(n8%@Myba@ zdXbmsokxzq$&R;odfl2~6l2j3Ysom|RzqARey#InBiUyl`-`!eg5pG*I|7mgqfg~$ z7c(_plXQ?3>fQaEodH*@*%WoHKS$t2n9EdGd)dwb%#IbDcS`qpIjiEql;#<+JZTCB zf&?7TIsJMJ{<2^i1gOmP+=hV5w&Le&KEkjwENA0v)odyNQ~ijh7aHv#r$xjer?a1a1nNm z`l*|6iqidrSi}mUb49gyt#GM$_S(}dC5i`iOxi?0?Cw(f#H5Bwp2b4R4!z0k3HUjl zW2-#bUBHl5+^VP0eQlj3Z=_=+hx{7|5^|qCi-Z!wYJBFm)~9WUS6blv47Zt5`&4~= z(HBIhxvrrv>n4;3Q=&aj^Fn!jD(UII^~=k)(=E@%PW+xhVcc~K%7)JNB5{gM=fMVp zeg**(QlFcC~3>WiBD=Y)GH9L55SJ*?A8|!4Y57?JMEb2J73l8>j`vWl5)eMxW(oprH zhG9X7QI)7TPK$jE2kvcx&frNMejNI#lWto|2|i<0sl7BWj}LtHf$c?|ie^c;2UV~UC6@Ig%qiv8wPu$x= zM&}aCLiuvCn@&c3j+Gl-2{w5r=LonF*qY)V$*C6$)gNNh1DMlQ@7*#H^a**FdcD^V zls684Dv}9fbK@};NYx#ano4Lg)D6Glq3uf;&p(vM3RsLbW8t)&U%YJ{sc|u3W8)1+ z#s6;xtg~sTB#Tfdeo!1X$=1$S20^!7$2Sd>G*id|OeHuVl8(^LQede%Q6+c78zCFu zs)%Uwur_+Eb>jR>VOiP+LABULX{6c{@cZ^3&}Mn2wGC|RqcI`b0N@a-B%fL3xKsEc zc0kb-+wxX>zsaExYStPZTrs)NjCa)4CPMV@id-(p%o2FIp%&9FQwrCu>N^0~HShpU zYxKCk3}}O&ZMIzN9VGfbKFA-wZ^{G138!@Tucd?+3xYwrT!pb~R?y_~gV)6zqcyxJ zcash;J+{#5N`Z7{kH*|!A#2n^so&1*P<1ck z1t=rt%kCOxE*~B@Q4WFK8ZsyWI@K-A&v!r6X_a*P%nd3^Raw7sY#0!67>R+ z|0bHUrM=St93)87KWOj_Ck#K%7Y<<^;G*WNt(;40-yNg*80Nv#cgYGSKZd*i9HHdW zvT!y%{lJG<;pxDk^rAQnaE(?-Yzk1d)Y;%wvz2#KZP0nwvMl}{p}N(YOB{6q6**J) zy%nMoJA(JAU0%W*1?uBl4Xn+Q{Mc&(Kh|AA>UcSFtCb&?asKN=k+x|m3IVA3 zT@82YT}h7~DDs70>pCs;V#HwJFXW4gT57`aX-SXh`(hP0Pf=B$;Q0k?gJ|`*IC{NK z9ognp&WgIZ&M@PK#9`gx#CJwc16$+@Dol;K<%y>+;pml_jI+{L45@w@$^e5CA9!-8 zfM*c2OZRMr?10ZjbZeZmTgE8MQ6WmG^m zozJt+Fe9!~r82-OZ8i{lLNX*J0eIKZw?r2)HY32MhIpXy(wY`TEg28pirY5Kxvw`5x`;y2P zbjXOrlWR$}x1VBwf?p@{Ua5;s(H|bQ|Z0vR7iU4kGF>Zvs)h z_8uhIZ4Knf;0ZJ!<|=#b9MfmQx}uor|M$4^~lho}B!BV6B`WUo}xNrPPwpb!<{6EeFulLXz1c)+)Ea6$% z#r=Xg!RH7#I)HXIKOfE}Mw77vUmW#eFJC_Z{{EF|{ETwQ zZVj`4>$kv9b(P`+jvwxDYN|oIPJio=h^lapz#=6Dm}cNjmuasvT9zU-x2h*wTnMX z{c1}dkwIExbtn3$A!cFKFJi89ps)mSCg0WQ49zID(GRis>r=BQYC=A>`INzHDp4_i zWM@h;O<;)3d35C8n!1*~kw{9&!!`Eha>`Y@9-SmM%)dzDF-z`F705tWXL=JCFZsK1 z3E`b;qC@YUgbt>`4-FI|ODpa|6|C#dxKz%r@Vge2d<=JUk>t7PKz+KeB{+nv&pWHA zsYA{;Zu-3j6iK%dlHz5Zb%ohk%p!=$iDszI@)zjzbb%o3A!H%~s*^DaEI@FxuwZYg zRd-uP9PvM=<;c#nzeT?04-xMTeq6VYcnTHTr!SieUiv? zziwUrq~A3k3ipnGeRRnWG-)Q}*%Pk)?FF3NAIlX|QPQPCX9o8RGtUW7}7G9nXts^6 z3en1S;kvL#aBjTm3fy zgGBoG_iNk5FX0x&94m_x2*)`ad*tTH>ivv$8K2}A@Rfq2s1q?$4Ex(IFs2|_x^yf# zEo7p^RsH!T^f6Ch({I^`MUn@dgYGniI1X7txLSLzNw(iWB}LZ4A!Bp&0E(jvf> z=ruBdafQGSZVqf9EYie<8x3ouF9b>8K+W00JylDV&$9+7KDIP?$V;dH2B~8s1vq}f zVYC}z;6K(x%pVZ0F?8+%-t2+jeq|2FX@og>W*lnq2;q*{-+AXab5TdXcQMSFkQg+e zP?*|Eo%tz*1KcBo)eo`?>&o;1P}v$Ck%kb^~0Z)p#N$%~-^p zqu=LpfwVi@M;`Dbx^49~%V09{R8i!ep>3jzr~w$e`)}3x(wmzq`kqY|4koj_jZ&W9 zXKr?szbY|BV`gvII2?`M&Atvm_A*@Fv|(43uaMI=OFZ+_MmGSIfzbu`ZqI8Ddiy{P$R-Al^J@z$Pp;VQD!!J3 z=JI@`*Bnz(;E;*ARBlS_l)zTpB&RRfxREen_D*X!V0+q!+8R1eP=Jt{9tJfHmtFQq z%NuUa{XVu@^p*|~bXhRuP702s;hApFCP-{cLU+} zviJ5>$4jdS&cJ;4j%tAB4&9C6-3`Jo0=C4LPg^oawUJ?k;U4-FMX;eQW2huJj%leR zn5gl}DUn>7VgEm_&Ve}>KufltE|DPh7Xo=GSX!+wmX~aaQT}ZLnUh0Af^?XHLAw96VO*XrvPt?mm zbC611(E6j$A9xT?8W+F}ZJ}<72B~GoR7GeXgtNiuHk1y3qLX?ACf}Bd_4I5lI6d@a9GiDa0uM6O1EHb2lrS#ZnM-rQHhX zl!p}UBU00c%XB;^ruO*5qk*}ei{a5+pJOGxV#YzdUQbD0yHUehBwk9iv@56+=F{vK za(CqkoCba{A(6CMg2Cx+(RK3r4$bjK3igP&qjqEdM&8&STu=y~yo@0NpemsNAuPIN z`kWJ=uym9^2!db{m6+*gc^`M6HsJce3eIsjo;)Df25|86WTOj($ z*>=-A6e0()BNkFAg60GJ-cK9L!bbdrct$SIj0t+13k4nJb;yG$w)VRRe)VdYlBw|KlB44|FF~q`;*nHv04>J8Jo7YAE+h?A%&cVR;=!||c zYtr;hA}w;+$xF>15EuF5u_EDQDWMR)++7~_gYo_){+aaEzyY=rWu4kwid zV)ukep-Q>;l02KX5U|-aK3z5o?9Ue>v}i4}C?P>#dI#qsy6}SO-nAbW zlS^}Z#Hl{I(fY4-sK;kzo{20rkgbE@3Rmh_TkvfJjGiUa;8TI0f-2;X+p1=DGLd&{ zZaN%|HQC#x?l=O+ul<7gapr-4YY1}uEl(G0*T(&NAL{x%wOU=9vNm}xc_<7ABaT?} zLNBR?3cL?&{0+JGw)qURukgcYobciih{UN;R5^Ps1bdN!&NDSnQ^EW?2I^!a zX|mfMSb2cI^Wnuhbl&!A27;K@J|ou6Xe7dpVr}+kf1(cx8vXMpStg_iLG1wmdKilh z2JR`V2iW77h5CT{?In{JknEjy62}pEK`^+Rbrq){xrvZok-n=cjtNTVL*McM))a_l zz(wTHyO7<3*SZl|s@!j}N8q7=@9h7qtAP~DNa`k@emgnYLV@^61ez!L*)&2goeRYP z4eDLzz;}-iSwV!G0HFAC(_la8b-Ken#bsaI<&g+`o`FlN;A3sj5GU-hY1u71PIqYt z(>r>N=dr*WHbp?Vw}KtKdfZDPX5F@ldl;#9l=PBGdOtt;-t)qsCvev^$(A))I-aKX zCLjzaNN*Z=I-O!M@=HspGQyrJFMZd=Hy!(>(1D7Lzrv(PNjo+W#4+A61PgPj#62QwM5Wt&8L+f4gnf6VxmiGM@xy zf*RAjMs)+OB1n(4V#TPaSLIty1~i-lZW^{r=${ZHdhd3^?u+0$2*;A%l*ox9rwtq@ z3A&VOKYnlfy=6bvLVAu>lv~k|S`Jq5h*M;KJhX<$%SkJXM`lgD4Sx+lqryd2r#KHr0 zwr>o2`bMD0Kk?Dwh`-L>q5PgsvJCz>&My`1u!W!FMZfu zdevN=FiLec#c|?b?xE#?cQwyCHM;yX@n^AAO=l2`3ELz zBU;umK$T#4Y6L_8W&&Iwn0o_jruZuod%3F4%235K2NM!+!EF6$OdU1Tv2BUTeGg-n zjCm*WBIGo1st7oji%k*S%(Z^)8X$=dtj9yvLXaabFpRWc!%U$C8sOw0P~$9%+-O5& z@}Iogub!rRW;(S?|7N6A=4;q*B|it}7YyP?f0wIA@dQ~VyS*%(=xgiYSp{+_HglI! zX;3yIdZ*gwXOET=3A(=jVl{fA35>u&$~Aev&ZI>3@*KTLQx(Y8yl;Oap^v`g^`j&{le?X|hN@t#8S&XIbAbuP0WpT~8Ow5d?8s6qGh0Q-*@T zg4TNKpIIV*b5H*b+3U@lfk75r%zcxZbNK#S)MHT_@qZ8uyS6u3@#h5idn8rj32W*< z>UPJ|AlBpp2qWNiD1tIgou{g|rZ-5>8rL@R0x63xMMYMJJq7W+DzRq-^bk8(`7ow@ z-uJ1{K?ZsT<~#>u)v(%S%Qn;uHCBQkwhb|rqxgd{Io4}J*~=*>QXEQH|Hb37hIb%L z5qAjtUk?|bYA>Xc8^!}E2o-$%K<+^=xl-`tylPm}7yWhU8DGVc#%I7^N<;F0X&kz$ z9qn6}mso|g9GK_TJXG;yk@TZOoT{|{b{syuwwpqtU=njozW~r zxgAAHaO%8iW-qI*h#!~u6OX2L^QKAa8wvb>ydJlI3aa?!Pl_lBX)P}|IQMw7Hdw+6MLVjX_21d7c|I+rzD!?KnGol3WG32u3ai0h zx+T~gM=2;HhaHKPsnzaO*wb|XlU-x=Hm$;z<>0zJI5b`;0=Ejf*LKPN{*(@bOdM;~ zz<EEtRHefn36W%)pAd-MbWOne{{GBkFu6KW0^CW*&5l}*xjWjs7u{UWAcd) zx~*JdbO+avb)#17Uu=7j`EYb>8qZonhP6$^AZlNME}4Xj^qOYx#>@v3+uXEM#~m6ngWcAuHFEX*r4vaq`0&j+&DOm(t3$`P2#nX6 zY>q&os>tuf(zQ{ku+n?Mz5IXniKNAb)0Fz3)qU+*s)`&%E!Z;tkbZDR+**Y<8!90R zzlZDZA6=Zb7PPTcFAd6R!Lm4JJiYkRD6MtsH>N8KejJK~3bAg1FHii}dBdOV4tK(4 z84iVDH0)}d(a6py=!Cc&Bb#0;;cEbF$c`gk$T)0vIhfrSd6E-`uz4j(n0&I?#opXR z>}k4>$JOT&b*+PM4f_eiIY+xszNNu)j?~-v0Ds8?>1#3|BmUdRiJ`ER>?QAZGG^89 z4P(rky>AWga1Ddk4gR9X1VAkY8m_$Y&Apb8KE(0bSbF=@1 zVZgIx;#U7P8&+S4H;YJ>pmV|>@WE0LFT8?{{%2He4IpNm-T-4D#5$`OtUYp*pk=c1 zYqko#sHh9p6oxgUisI~2)y4f{Hwr1zZrSy77_R6xK0PB|-&?_%7p$Q1kq}B9|53{Z z74;vTshpxnpZiY=df~9h6+tG7WP7+T% zIrO0?;;~9;Tkd8V7(y9NcG~;*_IIsmMB=4!O)wFLgwg8O z??oBH#LPql8sbIYzBaDkT>Zo#X+d8?n~cjz&ZZO;&v!=JQLRG6xX~RmT~#jfrwamz z0NlP)F0rvOoN_d#y#}x}~|lz1C$mgI2Pw;c3FdUiQ#!05o4* zR_y@N?8xIzmwfW@V-gxj40x&`PU6%Fzap`k@(lE~+VQ>u0F70GT4xyQrHdV+m7oIB zxXOZ7aFC3QhK1OD&)iKp`q+`{hKx5qmGNChM#x&1hyJUM5zj?(2V}+u<0>nu^U^W5 zJCjdmtv-Q}|K2#nZ{UI@CFW*=8vGVY2XR=aV!8!Y)B|{=)A>oF9?WB(|EHa!}6g*v*|q#=8yncS$w;WKa$Qn zF>3Td&6k5!)rp9k-~nIu@XdEyNMp9F=o$r#W#p^C*Cy9hjeSqKVmY(#@M@BmGaV&* z)R4L1PQHuQgyBUX-tdoKb(^fH^|RHPQ}%$92w_6oMXnfk12!)jMYhK&jPJH9J%l;O z$wt{wb-?|N@@m2ANTbSzMoz8?PD?Rsqo#*%GKpj;d#`0sw7&GBKw*ncY-K?##h%5z zk>GrF{TR~}R{p*{)H1D}>4re8eVGh6tLP)8=Fu8DhIPbY>#udMyCA~ozC-3HbwX-s z8KAYy6NjwOJrORe9n=O14BiEs%=_PM(O^?qf5BnhvB@Y*41rGOdeg_cutSUWN3ElQ z#O2wv=tC{5LLZ*QZ0*5YFgt*mS01)4OC1hI@cS4m^afGG+cE?6ox9UZDpI>%jViay z<5Ug_BRnf%l|HRuDtBP}zWX|Bowg0@%>}l{Y`P8G2;(GOm3`BJ96>T z1Et2V-b%Z zBIsq`E=F;!w&~8GDAk^!8(4>>O)G51LOfF=RYYY6+zCb5huH+zx9!!5T8Q6olHKo>5nw;QF{ zUou$S#QyX$zYXe7le!m+xxIp2zpE85(Beu|Spnb=Xq{>do5mD3h)yko6!dt>ZO>-p zoz_5Wz?4jbLo0beE~QP4_m>m&Qz2_(Vj={!b437ra`)Pg!R5XRU)* zr2#GseLG>BEb^u%cAk%O7Uu1NtX`u-!Q}2skxjd~>a^F#WEv1a`+kG$-vnr;eJ36L z?e-|i&#du;7zWJZjM&`eyVas|v-rFX!hEInmKFMJP|Zo1dE&3^EGrH3q1v-F zi1HMRNYIL9u>!0otr^xO#)d7juk?ecJ_u}CD>o4=8dbkLJXQ;6!tl_=M+Y6q_R7`x zG}OJ`?cx#=3u3{Xb?v%uy{2Ri1}l(N-tzo4-<8K>R+*uPszvcK*kW12>(FIv@x>KF zxJuI*r?8M;JD%B9L7DSH^mc0tdEiIu9_ur$c300jck_ua*3+TPua*K9XH>o8T;fQS zF^GTfq9f|1789j|PW2~ISd~x%qUI`oMM>L9BDqcPD6>{n>)t9p=K8QtdYz9E@WJv# zUiHX8`$+}GNR=kSF~H#LRutu!>`*l{3Ju3{z;EHG71%I4&@)2|s7TyxPIZ7KH6Y=% z^@D2uUS?lxB!d#Z7D&P{X!Tg%6n}h@Zl3?WlDrfx!n@!lu}72wQCI_S8Ch&T$x_vP z0n^Q=eKa|lW+RehSWzeHOs(>Rds&t(UA9o$u6SN>!$NftNxi)(>W0$2?>Z0h3`g^o zC|+JDKi4h{RbW$Q%))uzV=WRUd7*{BG(Kt?7D?VOA#8@Jde+yGCdTJSIyo{Q%Ndrr zOk+RXXVj3g@459MilUiyERIi(

B&vAQJQ`%xnUt3E4%YM_h_3bG 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

Q6507Oq*7&0H=RJ8o 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 J;(pq zjx}-FVXi`Fk2&H@LaDa`#w`5WwYFMpHnkRbKDJfw2Oe&F`}!|yfHy(Cz?*Yvymj5ROB4Pte6}{ ztnU9n{gZA*1Bj)2PH&KyDOm`|9vdkJtLr={` zkA9L=t>CN-!Y$19_NRE37|T;!J7tW$Kkn6_`uSMgk5D}Ry1bv5>!=g_6b*66rGng6 zhm0%BUKVe!=yd(iNWjW^Iuw=6<2j$!x)Vk0m`t8>-292B+=j4Tvj&byYmdncrL-<< zB%dR_j+!Zoa1(c+Fs(t?l6tWI#s27j^@I6gu+(#8-LT)P=9`6Ju4I63U(`AY!k4oT zz-h|H4DRAOHn*&1)Ejsa z@8naIdQ})NNEIqc0OIKk+;43BXlT?uPC&{+QJmyUf=Qf$5|C~UG6@=QuC*E3E z&9?f@TWD?+_u)p@uZgzvljObPuk}0yhOfc)%onxqSJSpteR$7%C|6>ZcX5inJPgZ> zPZ$V~l8}nF-J1!c2RJWBJ(kgX=Ul-K(_10WAk0hktv6j)+>p&q`h)f$hiGEj_*mCp z3iGdp2>UfilhWAoTpjop%E<>N#0{4(p2cvtM*B32KF$&y%&{wzC_ zxT+dH&vN!P)p^8)YE6DPlWF7u)UX9hyy%5un4}xvn)~ss1%-Ljq z07XvVp@*_dNmV>5HRbC$(O5i6-7w^}(!1qmwoL#rS&;{a6R^Eqp$AgCvadM|GI zQp9RGN+BFgX3@4x#bzE`sa#;hO{%*rnV~gDqcVQPeFSSCBdS=&VF}nWPIvsG&KlK} zCu6!rkvQ(Bpwu`dv)4Cn=B)e4F22+}yx`OcQfRsCftMlPC?Y;iWx)&$z1iKXO#b+4 z@Ecs#HP8~LvwP)vlJRmN(UCyTb2rtb3#v7N3*|tosOjUQ-TZ6atY-E0u zE(Z8KlXm`9#dM)DWu2Dv&YlWN-%X;bRE9j)!RTpk(i(z5Rz`3$oCeci+Q`{Rcodfc z72!cBTo0vY8b#3e!A9zSbWez&a;XsZ@FqqxHQ3G>`p8UI8>!%kGXxXbij(8>d{R7GKy4>1f#-L_T5-hku?_fevhA`NgKVTfqg0|AhMaE0_W zGyTM4_a|CwXJW~LS~On%c>VZ?dKfdcB<4qF*0{Iu4dcVa8l|d+>cj?>X*MLjr!}ee9t zj^zNKdM-BjTRkg)&7x^;Sn_FY5Z$?35Tx$46kyRc*EpK$&@E6CJ3S*C(j?0Q z%CVWzWiWe)mpTM&^gAVg&k?D#YfvE)s>0K4ePdq-r_%g@s(4#KLUQ6HB6x0oUAs>T zy#z*wkR$*3!M__ksb^^@P%d{tx$GZ14W_=Y%qo^b3TPM=j=7unC*CWjSzA+c@E%%7 z610>)0`H={i~FVO`~b5J(3 zgbLSNYZJa`q1K^2YY<%?Wpf?}m|I%vAW^cDu_tq29-{vG(K0XJv!C&As7=F3InNi7 z)l}h}B8^xZXB9B7qBe~)s3HC3wLZZ1AijC+ydE7PtRm|aYQv^EkTXF%Qo@TANsH>+ zp>w2q5B(H--7Wi~3JT3?;LY6Qe70a=YkY_$$YV$^O&g63?sn|%MtyWQE;l%u)SIG~ z!1zVi`YR=2!%Ywuykk8~D`b3+YmoEW|Ia-4U%Os39J#*+gHOU1eJ7&m?QCMTX z>h=q}pW?$MJxWqT?TAfpqk^9H^fwf!M%&{3z=44RHIH^fW4*DW8s%b#o21SKY%@+h zWji@ErGPqUo1R?goa2Q;?stnksow5gvLOT0#%+WEoy^2D7-pv1Kqw=XFfAPWOLoMj z-V+@(_7q>p;lgrXJ>C+;A2L~HT#&#e_q$XD#`+$g=9s_tTfcai#=am#d)s&&!L0OS zIF+7F1m&Br9=$q7Qb-QmlI;Nn;Qu@*uQ^5eTrQpl@Ss~6;)db8ok#q8o>$41vOwBn z1D>r$Ers4EaqqoS)n|T2OLSU^m!-G{EcR18zQzOXZ9XriL)z=|A?KNLQ|WnH{$5~= z;(fQ}wTHf6+7NrI0ujo<-#nl)9j{uP&LAh7B)r&OWuK3rKPqKL@8A<0J^AqQ)@g)E z8ygHCOcL8ApbI(tl`ai%J!Lx9-=aVDYoX0Vj2em6PmXsNN(N)!#@B5YY4V1rKX|gE z!anSFjvPQ^1a?FoRJbn@7m-IOKIFk|Jv!@-bRMJf?r;0hv{*!RAd?R(44V-JHC33q z5J+Q&w|)Ma?t}@ntvu8W+Upb(D3jJW)TF}oJ&)Uc&dCUq+ij?y)+;3iY3*qpb!`hw z`8@%5?%5*#=@^Kq6xlCZWL0Y6Gl&=!T3fV-t&~+?O?^)Hj0>H9GUme;WE-6w3&Y!R zK^)z#NjKYA`zgFy_JelnUhM}6O@fOg^dsUT5S)T`;;A-3a+$911!GL!Qtt7fwREh+ z@g!RZa-{%my(y5W(?FiSG7JJ^xW4VB)0wZx5qQ-YgX=+|qB4yiMjoNpwcD+{6^^a4 zz7@!+9OWY9+~x&-?<<_U1Iom1#)ohSRGp}qqst{s@4LgYI0{f%L%^&|4@N%jw#Dlw zsiU8lw7dNcwcJb{OBO=y(hK3pHNTV?sP-MG4WK@w?PdGi4;OTA83clD=%JG>yc%Az zW3bG8#21^Gclj8aK*A8!NDtan&GRM{4%G?VjW~>$Z2k&r8wYH9AwLLs`$jxJ>^SDs zHW#A5{viUKnzWu_wFREuPW0p!cd54+ljv?`;|f-iDiFEwW)ALXZO^ldD{k^*-_We3{k{ zVXp%K1~rJ;SsstZxu`M1>OU$%p*;Vw+_F_ zc{;Y0RsYn~V0_QndFlclJPb$huTJYFJo8;@ugE32>TjLwhX;_s=_ypJdJdzs(`Egp zzhK@-pyX4L{R&6`4mL4}mIQ?GRKdSy^BYA*&jRBGViSa#rU+69gE;SN^`8|c@_;E@ zhA2JIL!wF9f|A>yQ7$%-W!(_3D>66^5`@IJ#K5@Yvf!S$5U~d|f4e_=-%l{s#K!QS z!fZisi*b_6!j1tT93&Xu2jbK-gS{)eaiyQ`yRrw9fhJi9y!-3UKQ@gwobQDv_$>fp z^rTIP(}IH@eRE7Gkegeg4z&Klfmg`d@qze>b8_yXn4Z~WTz4EmucL2K@Dy}zSaySI zGIudGoJdJJa+2|*A|#ETxSyD1sg&k6dh1eC?)5#U#5eZ9K??M&X6+Y6Y}#D80XXG8 zVAp7tt_)=U_sa^Iu$xlCh|sv|aM|&aU=_d+mMq_BvT=orvCkJgsqIIPW>dve_SR_; zlwWH;@GOEu9r%>UTucA#D%Hh4a0Q^&cb}76=I9x9&nPQ7T;T9FH*7wt34cI!)&iKOPCD?Ay=QSgO{ETljOPHS`aWUsI`!~>lPq@g`K=T)vksN`ISYA_6|J`V0n@_8j`k+b`d_BB+A|81u&u9q=pmFY2* z0X13IXAEj&_Gj6BO9|#5tcAdDovq2G4UZYA(~I(SKD^gF?J9CB$uc2U@K>wunjTdy zQ|us1jX)MV4;sZ^$`DS|8RCDIuS<~38dQe(`&_Zx;_Qfk>=Bb-4HuAdhAZrmMD=LD2e4xeISnwgEt5%<; zvI@JYK*n{mJ_1GWD?87v=0s6131Uye9aboe?b3ou$C6ZKUf&b(V2bOa?{Us}LtnL! zcd0iQst&p?FCe4?vvcK*U5dOvy20tB)O@>crM46+W|EKPh}Tw0hZpi!C2`+2>Nu2+rS)e_)&t?rnJ&MOt>Fci^tT!sa|{_f zBW}&)?4v^VvcRH~=fK1awt5Dw3H?e3cyrgS2?bqxJvj(=AycV^Cg{g;VM)YHgp_(Yv)dR5nt-8PRod$l1D2F?B6*xs_A3CS-&-?SECkw<2JX8dJ%PO9T z4uFh8`ZO@w2;!!oQeeuSSV;ZNOKpBa3>SATl)TLb7+c&}r#x}LcUv1vs_jEj^oBxs zmq)xG;hA?~6&$PA#U_)NGS^eA8W&sgcHl=pH|NpHYWV8aKm}$vs%WPdM&$v<60{!S zdZ}%@d@8c@rZ%XvdNvCRqtCaeCVUFdGe_pZXti*D&+gigPXv_CPdxK+x1R*`HmYLk z0YOieOsnkKvjT%Fqw*7&H+5oyt4F?^#@I`hMM-(T!!r=hZ|Rc0i3cdIVnQ^wPq|TB z8ueKhZo4|a3pEYBK}bGJ`3lERV{gacjiO`lWe+mHu*4?H5Wz?Z`k%GL`^Ba7C^Sv% znRQS~VC5*DJ2pPDNsS0psrm~bxWDM_ga{C2IHjd*Spk41ru}aROpAZ+MXCDJaGRQX zQ4bn4{QVj}#~gk12OS39FUTSkG^JQdg@AN1=VBBFU#lga``O7r zFo4eXw>P!S2f-n9dWh83myM`Ru^vDTzK#a1Is<**oteKWFA4g{3t>85mQ#v1W*{)1 zrwlDCIG;Xdujz#fldbLq&d%;|ZcJQ;Sp}GmR;sKPFM|10GhpdeO z)(%EER3n$!LsCWTWeWM@U@izF==mohSD9+`(&)sQ2MWa!;|=zyf0*>M+lRM?C)zw) z3KdIxI%&3r&82TNxob$9zozJt1cGK$?mjN2%%COMgEYRE5 zcoDRf016|Ry(8hO)CSW9P3)1Hz_o<}N9!$^U#Um1F%hr8KgI71%TT^ULZxy`imn{3 zPDlTG2%Hn%6-^&ocP6)1OEnq!`ljBTPTa69!a_^_fF+rVCvRxrS`Z!tpFjaMzy>KK z;qrzSRxIw4dHoKZ=n4pwLI%_i4wMgsHL3(@e@ z7HcI>oyp*KS^_XgIlqge@4{ejoE_23t!duy5f8V`08A1}u;y}p)BccjxB0m=R6w=d z9QFlCuzK$%gkTE6XQKTH6=WCH{j5V#tw}#&yc*>?GzzlNs5cYjXGQ|?$Vu`bvh{FO zc3rcjE|G(KnL%--S|cyEy)|2*oSJ+mplDW%#h}PMsDaZ59bHbHDQq&GerY@;ppyNl z&{nDUHA^=5crZs-fFn9{3UTd5Y~>&@jlgyEJ>}tVM9;=dZU>;uJhc|0Ol*#4zW(;NSNk5 zM5z!nJ$|cgkqst>7bHv@1sAgx898%<5n%{P-e@PXOc#I#*aJ-Twi)nU1O)K%3V_C4 zvco|x6e`sZA071b1&KJlJ;QuWgM>R|4SFi~R*&H$@RQTBwhTqjO-DV>zxD~MC90io z%69l)91IMJ%I*BeSV?2<1BpH&YRr@iLES?6ez+jVJ56&1^_4;(W4n0J%KF6i;;Z}S z*PLw6(F8py<^l(i8G`ouUyxWqF{y*Wq-Dv!jXwS*tbd6qJtqk7qrFDMgo0$aws=M( z$vy8mOp_`0q@m&pAnPs~TB!It^81P#sgLM3F}Jh=YUu)YP17^~`F>|#jsGO$1tvB~ z*}|*6w5G`hE9L#&kI&W)g`gFwCujj`&K`vEI1jFiv%jA5L7lBv=yIlPp(ur}(Q@-C zd$vSFN9F`JWxXf;;f_!5B2 zJaLV0GokP`G6d&8{Z}Xa;=B?AYoMY++OpKK$|!G3!ftTAuDV-yXh*JA0OKS_ zwO7ld^rNWc!C>&^7NBM!N^ZQ|bq;jjCd_!*NU1Y`>5}@Jhyh7?M4{ll0rQ-;gX6VuSW#H@)Yj-dU!n|;`t(jVb`{kxPc)Te&ejj zVJ#CHXOh?ctRY1=lBUSzc8OZ3N&r$MZ%C<$X>|7b57HNMlba;0)S@Hb$OBc@t%ZqdE9T;f&hF)`R6n~ zJ86i|UT+!RLh##;6_Lz+QJk7g<=W_NCO&eRXIjU4wjS>7+Wk!OMK9iGF(i+FG5_)C zoT?KumG<*xRkHG?u=+os#Rucg5Q2@tw|9HPU?&RVV%un%njbudF(8tV>5nP!=R*b) zdGZ{ij%ACaspXrQxMs4WI;E5I-NBYompRWP@vJu*J*z^rjOk7+>+lr!A+k1dMkz3k z5F7NHWpge}{DZcDxA!(ZS#4oRoMq_}|E2<_l-WzCbrXX~)|3APu9$%TpOWBzv2~y7 zbrQvMBO+$Sq@I>{&FdAr9zsxwTM(q6TYy=oBtNP}0`j%np{`(_-IG4y6hhp_S+xAA zC)<42t)(CAMBwP@olQ2q?n~T4`(o(^V>f);Yll9sR4+qg2#j~>5Kj;(EgihDlo8>@ zcU${}4A-fZM!P}vsj#*QYmkW{S@6Hb8lOHnzGo6=j&Pn^#IbB&sEo@XnE@2*-K8QP zlVIozGL-GWm}IHmh4{Mq#F0HHQlC=xWSEfuz|(gUl0tv@(EdpE^VYec2m`r>^(tq# zCX}J-I5#-h0<*U!vFYD%c#%uSZw*;n!7Uqh6@Jp&#<*{G5pZuNA&(Aj>79?HNW2U& zX%v-Vq=x3gT(Y{$_QP9A?oWN=Zy~x3NT=YwcHJ4*@@mlh!OFg7D|I`_=p8xusX{jH z?C^tAszU^j&p`AYoz>FT{)@$i> zA(vB~bv`L|)?#pGK%G6jq-I(`WQ>Mv{PJkILgiJZnxK=}b>ktlyzmH%U%kpl6(CbE z#~W*ylQ}S`+_Chrw4rr9c-5+_3bq8k-ITw>N}b?Ey_YspleE`{E3R2*$ZjV=m* z-29i^th#)L|JybpJU@-sPo#~u#fEWZR*!?wIphk$`u-Q>b?|4~$DTQ=JPQv5Fr-Vl zoro?-?pX?ID+lYn-Zqu@2{J|4jEKfMuqY&2@wns*DZ!W)=Jg4|? zf_#UXrGX)ba~Ni@J9gNCn?Gy@T8-c$)F2?z^=c7$)raur#9zQRl_Blcf)IhSEZc*H zf3bXpMBx(xRCu^}gFH{$WU2Qp^oxvkDh++7_MMi*rj88#o&8XO<-I`R zESrKAG&XL)ZoaQ((#F*bQVzhr`WiY*TPwC^x|^W7PDF5JLBa_76PFrJtw{f@xt-w| zE#kA4wj_L1n&b0XJTySTxgPkK_Od0$i0B=lamJxHt(UJvSJheSVY=Jyret_9C9}n} zcdHM>`PZU{;}<3UN%m)(&pr6Q(}c<~Le6(^6%N|j+4RW^_y&d9nqrZ;#x~$OktOk% z>-Yl;nk%%!*FOi6AyfUo2)m~qQGhKAz-_xv+c<68wr$(CZQHhO+qP}nJtvvu<~~d^ zf1y&Tq_X$=*3xim*S%u!4ovz!lz}NdhE)@+(OoRopJiFfRwR9dU39W}R5s6^`y|r+ zD@bKt42LKRQ*ZLHiX6~2&nrRip;$9F3kztms5pHO3N{o$osaHVS$Ot;AH>mJEjng| zhX9y+5bSE}al$wo56z599T4>XTEnV4EFoCkN~t;48SM`_M+VZs=+yZp5k(=It0bic z6EY+>^^DI=QOLVJMh#+ihz#nJ&VcL_sgN;$cZAp7e|510Ux2b9YL0k%2ab|1KrdQ7 zReA#sj{OaIUJ89w*HsH=i^|s$*u!Lu{a9Y=yJBsud^coemRXyOY2_OZJhnl>AamDKY)Ef6lB_mcr=nuOV@`m3$SPS_A!Ob&FnZ;Km@CyLD5 zfs>4F28{!WT%~Og{dI=A_>7b`QdX*PW8v20TZ6}?yCCkPh`LHhi)KC}l}cwaL)65# z;wT~Yt{r~l7inAY(qF{u9J(U}8o8Uv%AfH;)ve9J(L;7aiO8*OC$e~8aN@(bq2`B;D-b)O)Ru zGRZNenyofm#Lvm%SfNjkaaRT_C1~z#ESb6Dw1yY%|J+iBD5gvpgC`)i5wK|M73uN9 zgiQ+|=Z=bLSAr`W0KDnB2B7bUw+w9%)@yg>dVh!A?^P||nZi_$q8=D^CBI(97S`Hu z7Y9Pn%hE=-;eNdef+HrSdE*>h0#4V_-p~X0pQ4$No#H+8blhe#JNJRV<=G?I9CQ{-e z>$p6{dQz_9<3N3?GvBxcHC>IYKAHRy1|2IQ?RN>2lvhFsl|fW+U45q0`B)qM1Knwe z0Nnh3EXCqaA18iG?}9K>6mV=;NYT*hQk2@CK(_rH8$V(on*4%J37?n2J-Mt}A~NjQ zIPo5nN26A(k%iq9^|~s?WB4Z}C7dvAd-1Y}jq&G;rBDYq*p9>i%Ned_C-|!_N&_^u z>@=Xq<)le5twvJt@_PMNOF1Fgdy3yNP-c_u`WpBf{4Z>GBplai75SNEQ=(KPf)4u8 z`+cZ;Rl^W@iTqpizX-RrHe@kXVQT^DT_B&xofjRl?3P{YrXd1{v^Wqj#)G)9jYB?} znz7)ntIGBESJA?-wwNps2`|{P>XA_T0PWqRlVE>|0`(SL#9L0#i&`&NbpZX5lDX_& zbUZEF+xV0?B2kkZXHtayZj@1_K-EU~Sb)5?;U>r;OsD~~$+-n5{aWVYCnA)2+|2=$>0W~QjYg_CO)ln`S~u2luJ}W)B^Z0Tq)F4^V zR!y$@U*?iFgkrbL^=X=g7r*{|OQ;}!%XxR0++rTfS4~OO0E~1ZZx5x&Q@YoT@$Bgv z4?Y7IC`m=R;+o3FlsxfWg{vOdpAsbRuQ6}Mkrhp9Xl<~;;X3Fd(?pnb&U0TM z1E^X=LYs`4A{DFUwKkqsbRw@QN)K_;6ubCf;W??bD%EAC_o`o?`% z60OPF1~({OV^-6*2D~-iGXxziqb^(SBaU{_;4K)ORxQfD=!e_Y;Hg+M@gW|p6*+ev zH?cYe#F-%jhu@fDM-ZhVO=O4fd45C2kc9^h$w}dZ5oN~WRo9pq@(4gvKuq5qS1Uda z{!PGf{Pm0Ya>q)qE_9;99kyn6)4<^OiqhqNWGd_+PvvKC7?ixH6Agz4ZCF^eEy@bX zjf#<{F?I_z`0Kk0UG&sLuosI$KCC9{*T)1N3dlgmteucj`H_FuZ`|| zTE>}vj+)ciaQ76Uoqa+$9*u=Gb`60G!FkPzJ+Au~$CE3A&}VcUYTpH1K>uY4d_jEv&782X z+)4Z=7yb;JBP%Mo8#1hZknCXG-#R(q>O}qgI6BJ8AO&KSO+PK958AFgT0#VU5Rt?4 zW4u_{XgpBr3yZ53pcB`^xGskPS07S%x{yV`IaVr4CHwlv8}wUULkY`cbLPr!4#YE$ z1P5yv)KNKx{L}Qf2?x?PPyT6oB=yRLHxE~)rdP+(86$v#k2(+fW9JjC`#3d1>hwlI zHk3l(3WfaRs*NZ*zje=~ZN*uk#NudonbscNZrcA ztA!zZY2y?|5@>hMHGtuuL_`mXy)y0&H(@obLe;nTNSm(0Zb*8R@No{CbT&MQ3gpj> zlF5F=URDRcWgPp79&=~F%blv=57$hfA zA2$sijl{*Qk`z^v+7_{VP&?vtk?_o=YW-+j=Io1Dn}(id9H~cTk#pN&7}^Y7n>NR5 zx>BUY6O|2((-TwjB9skb$CU)W-G6gEXfTs$*2qCdt!mMBjmcR$7^NnT0V8f!sFSP3 zvo@WiZ?x4V3@REFS@THXjS9Vjrws+y+M9u;sVk>yg88~ZxkBprl#&~PSw!EX4y@#6_pS<-5G2nb^3 zSxu?@w$B1oBn76{KexHqu)OTmcMHus((^WX8F6NK_&v|KWE0ugh7QT1aVj`WM!j%@ z+@h*A(&+3HK1U<^2~uB>RQ;Ie9awGf!pGxoI{F)UMuRZt_d{qSU}BLgfbm-SF7;nY z@`mc%<2PoozX@ZUOEeaKX){wB@+t`?`bEy90B_CtzC#MsIK>0Wn9ss^GP!Kq@N*zr z{IW(v%#KNJLTd*ZKqn~bsXU2#=A2>6Zws+}Risg4Pj7rWv-DFEo_c1hd(ni~hT7@$ zyaZ8kGEz-i@u5%FL)NBxl~4Mpqx?Pkv+?+@A(X&?Uq}2TGn@V78c&@8HMJ>#b3Y1I zy*^EVU{#)&-E>DuxQ(VfJqf6J?trXteVfKPq>#t&Xz#?w4hAu&#n;t+f3buNa)Qf3 zCiN@QL`Qxa0#J>CCkesErjyoQtx4(cg=<2Il42WD)_=<|D86ZItZ?7%80EzCP5<>lkqP%jhglz57-^(rn%_*2pL9(y$P-Ao?>0A!p!<()P zrdj;W#UUsa(N0eIBRKm6I|VDUoRI?5^ity98>k_%L(De$*f>Gru0^j8?gYjq^f z?fri4EX4uCyT%8pI_{`zJfMD;bzMn>%mLZWSXNK~v?yMi$0QC%4b*cv#8f2z>qdup zRtHI3Ex_sYgqxzX=dN#G2~PBKFNf5Q`Iv7{bP7fBV+sm}E%h1Vw{az3@Yrkjj6*;c z?jXmV)1tKoa)3v-k;GtK5$oBk-FXl@@w=*X0Y&M13eQS*^) zlH@%4%gsr;255DSNnsK0Pvo;=NEZ$@q!gJbib#Y`}9#0JmaCSdFDnHU4~HBxd}x{)WQy#C$Et z_KVraaY@XWZjzZe>5F@_lJ6B<7cp(YV`syS3VIBmM~;j>;z0DMYt(o&$rnA?%NvnY z`$$D+@M>Mdq(-d?F8%acu@=e1yIm~E5E)%8%@HFlFpzN+hi@`>s)j!c+_E~ud~022 zosa1)TjtB~egY_VvE1zS0eM&6V#x&QX;1r{t{u^W(r!=0I7SfDluhWh;Wf|mmH7Ea zCdi9*Zs`vJPI|FvF0@#gdDF$|uw!f4=tlFN?Ae(2OO&x#$HBZIPj>`0j-T^A@d(Vy zTlXHZWjk0gf#k&cgDsO{xeo(zCXHC}3;s?*NMxZ#tGY_k41& z!VvnUso=*$?8}Qab(WzMQn$CKne9Au7FVu0&HSF}#nBG-7~FUFOwfQp9j5#-C9mSC z8KD%S?lSFZRx7idO(c-*f8`dc5(IQ96h^FJjV!eQ&KCp z(h_#(bG?YlJ(#VcRZDMIWj2}g)#T;^?L85WyztRD&g03JEA_rAdd;PnJHW$CBxPl&&@?v4x5Ecr;T&RJn-Wdx`r#xcEn;*hRLB~{P9FWd&SK+?$+OlrIA7P=!YJCh0HUH1G$eG8hRxarmas&!`43sZ;9LY8wQE}G=FHn zg}ai`XjhbGK-lRMSMz?Wv8Ad1Z;gI91?n=jFN+9NCM7kgcC}NP4A&tA8O)x5wt8;&hU>WMX?tlkyNzL)bO0koag>sUE)Ju?);TG>4 z*PTA@d3DlJV1z;+t{q}BMl3(NC^URTkU7mEr1s;C;a+~D)cE=&%I-4WhlZa5B zjDOdZ*dHcLt4taq@RI)adcNhoFUAB=B?%m&_dZ3!VAJ>z^~L$YJgk)VfZt7J4JD&h zA@Bl-S1eIKfG*}9POAkUN6J%1!!84Zqv{GOoY$%f{#2j#r()689wcQ~d}<>45Ga>{ zOPRd8Kr%8$m=6O)$0s_ej6d3fq!8U9Ekhx$thardqaMxrdiRVSCUpw-U+~EAacBJSgVpcP2U*W$;?V{8;~WHaqld(9WC zt;LMBD{;jaR4iXy>j$53+4Ab#2l~qy;svlM5Ts97^=f$T7oW*S@7tnum5}V{K$jkW zL@tKCi9Ar^J4I3X&I-}bjpGwKqB%h#I7Q=qEOP&9f!}el=#fA?(F&_T1U45oZP2;P zcg2V zXpy0sX3>NFXw$U}sw}SjQq|%KK;3d6yq)&<81L;8mi9Frx2Nb9QtxSgFb?UxAk)s|!owkgo$z*E^{3K{(&)|S&#LO zanls9i)DV>S~b4hm62ZMYt_LI)~X<5AciiVVa$dQ(T+ZO{X8@FSdOt2)EtgIE;WYMsdLAO=~Jl&5H-Hy6m=$eXYWZ*^&Ie zGQ5)uzi4yPI{g3{&p@8A70y)9))AH=xW;(F5q(!~voa$k$@#h;G;IfKdrDI66?E!H}-!}Mft&i*n>L?+lq|eYeP`3z8uo(Y;nL|1FpNt!U3`9(U0Pw?j zStx(Z%%R~O4b8Mn%8|x~EPNkE;hVfw@m&dx;_$_La%W+GS`Y>lGeLQ$3R#15@3;fl zPip?dDe86AbYRG=)&Tzvr2YE+8-4K?Sz9zDl?=sV1)=A0=uQEx8+`46tw_WQHI-|g)=*WWL@{HVEY=0PqLUj7q~v0A|6y5LslhmE^6 zs6QHf|Ak?Ah+uljjs;sS&t1*jYn@&|WX{O7OhRW3?s6(uFqy)0!y`koeaPtMwyp2Y zk2v;I3lx=8ei2ln+2V*OPx`g~W?a!9n;5Lu>yaEcm77P{sacD0m*iAS1{b2&X&o6M zQTujG*u8Sy6scce>-fwgr1GErxM%(1RmUldpz^{d5879l(q|eNycz`Bv1||KD*?nk zcT!q!OHacfHQ4}m52*Oz{WTZExX9gI>QH|69hzPVLw1Ms*Vk&pU!|E;ey3RfW3Cr= zrRh1avi`bc1vZIlCBvwB7tGkMEfBg01mCa`!q{5zz|$c67>xTDcCgAM!sBKOS#NBH z*&<$Vx02jtH7%2gQ|h|%+13d!QEskBYSHlGk)c1c0q$qihmqN$Lz{L=Vx~w+vl_kX6XnY8%MHdE01V^Q^%Y&!jLYSWphrpJ(6=?ibhEl05e zxNF5Gr_2?J{6GToIg9c{WNbdI>IA?=95g`?&MOViFIGsmR2mjNWPWa64BCn(N+$~- zA;Ju)Dx8w!NX9zhF5sE_kjurhNyCjX*IEluS6%%1D5aCeBTdU)6$*a8oOS~em2vjK z1qBdSDt>Ed7*&KPH#20EdNhN($on;uSIqV(Ys@N=u9vVWUUSo(2xR93`b+saC4}AE zw@B{I7oBKIWiMnMoztUgI(mI(JlQ}QGtw8Rc{L!Jr$P0*8|bJ-;A2r@jY+Azr`}eR z30Vdx;YAE_br5vP&s-nRC(#^3bYYWLkHFmks$R#{NI`x`thTI zKMaN+40pK!;!bQG~1j}$xduPTUJ zOF2Z2vV+k6G*N5`zxs|#2fR=aRQA6(QJBe}Znk?f1vZ~AL$QOCnx@XqdGF zX6nBlXYv=+Azt3okSwF&h>XaY9hEV+D6z&e<$UDD1L;dUC(G=HKPDo;+hALV`i|VF zdNumPVVhkt=999ZAWH4GIRdfC*7cCU>ZF7G0a+22T(2$c4v~aHjcmPFm)sv5o9%k~ z1E-A0ZGttL1dD(u%}Zr1NTVVi`Vel>)WPZLYKLhQVBU(vw^_Ii@=S2`xWk0=D0sCg zLP5Qh38&Hzd7f6;qJtiy);94m9Q~1CxNgA1{4!jxMRPeuqD9%*PzW*d!Du>}%nx@+ zsqKrZcntD62Y|-s0}Edl{v}XYTxl=%()X(7+apW1UXgh$El*@>zBV;A^k zy4k8hb1fEmgQZ2|Y2y(I(ZOyG%GUs$2^BIi9+yviA62IYn_#6AwB%HLk-sm zN(@jgHNeP<>D1t(A>D=46XWU>u+rFw@+bJciY(ZVbqblRrBm3YgbAX3G;HqiE-QK+ zdb0>(r8o>t=pe=i-!B8KZ(s_|O{UUG3(yF*eoM697Ef zs-e{Ws~p_oNt}B`s9%N-%?hMQ@w5mCR%7XJ316DrJEKSJFR+HK!BId`` z8H`%P_y1m~H{#K=U$%P0wX&Z;3^^}hDBzf+ST6}_dht|tSi$Z#Xvviy=jD?qtW{D2 z0fzaAC1=C_o*{HCj!h)x$-fekIyuou*L0@6+x0ISm&F77)ot6tNm`#;cP_&UQ&JhU zwCf=)lCp56#Z5%KgT@pv$P$=?rF8lVlCSG|>&(c+d&)mUsx}eyJ8aT|ttnohbHbc)KSd?H$*E*Y&k}O8eAXIk72oN# z@wk1&T!UxdOpyZ|UY=*ne&mCa^Cd4F29ri5fDg<=e4G!LXg*(|FlQJ>DWoadlx)?s z=>GVN4e{3)ON1}P#kmK&+vhLvd^2l~Li8Rg1oC|OUCyZyFxB{%i*Q2L+kPimtn#<6 zx_L$U*=&|e=dRKcKV@f!6Q$}Z3Qg_DTLxD&)8Us&t#_(*g^Q_#5Gq(p35v392Tp$25?4o|0ND3 ztX~QEjo_CzXNmkqjm0G1;NJ+T>*&G79RvYnCFYyj;Z>WL@bqZ@6(*+10@pRtZ;k~M zBZK{Ih5y>($eVz5>mhKq{XrNA9=VkULmCy1ok75*^YwhGAt&WI#|tRxk0o(7ljRMC zbK)ydfKSRBw$Q*b)@{4QnAEW6-F1!TBwO;!^Zq`yNp9VYxW^tx59rFKN#C_BSt}~O zDn4E}d^QSlS@@(xJRY9(Yd-f@RonxCvy@4%uYReWSB+uv9ED7MByKp0-`;628XwS^ zBI!hcH(9>tuA5#rXcFdz)xzGn-&Zbq{_8`cQua``yIR1io@qgBOpt@V4ZX8zGRu&V z8Z;=GUhp(&7tV-WbD61&>d^$4UCJb6d_-Itz&*^}UQ|mJai2UYQSpYR!qELfQnU@{ zd;V~X>kNmnpSKp28{njl#`dTT;GR6yID@W1khQ!|;SZ+ch{I4A#v!psT&he!fLz|` z4dhkhra|3+_Na=-+zhEsUv^JG+Ny-^fjdI!WBKt0z~K+KJb*aTd)iPe_-TJ{3p5QH zs$+}!nPOe#nc`=N{uY);=K4TAF{VLx=d}1hjW*!1V}l4Tv+X)>2DD`k%&$P-3hkFt z^TTh;atbE!7azPBoQQ7OsM#xlPb)THyD^he6GmRlJ>H+rC)i+sIR35_S2_p)zsg^~ znC`$P_9L@|m*d9eVXuMCA6gn__pcT3zZJR1PAvImB=-dUfZ zvhW1~ar)jQQhk~lpFx+ash{*(#vnzA*xnir;Sw&tUk(UX=q)~sy;-{OV;=|)ZHc|} zBkw13AW@@DV@!A9d8&Mi7;*?Rtnnp5&6POMT118qHduf!Qki8dTds-Is4O3>(u2Q= z>|qq*jtb^TTMK+64p)KJ7=I$-7*);v%lK8x8u;Xm)NC_Fy+HMTwf#IBKw`42_Wb_7 z9zy8N?Yt{kWByLMVN%CIyQZ(kmG8QQdO{m{f8*71824sgNuv};D7XpC2sY5aw&5E;Zn}*|o%X|Jn^#2% z*`V_%Jw7-GX6p)A7Pt)heF(zLT|J0}nqZY!d?c4U5MB$D-#ud;EBX7+$}=(lou@?m zD^7GSR%bT8D3L?+S)CE!|zRWfV^ zQ?H%mzCI*7Hg_gZ%4cj@m6L0l>@{3}jR-_ut(K=gt-4O}SrRFCDbS3-RBP2tX_b^A*H( zjzVQS@xrUFm=1t!JHWLkJYgPR&%b)SjHJhUYJx}949G6wNx07gOSl`MjiZ%Dqy1Wx zaRzFLwa`6DPTZAW>{jW2&ph+Zf$ZJwSDQD|dNloX##++N7JgbR!in1!Cw$xS85NI4 z$erAdi5sZo(ieQtEpsZ6<5mo$NK2Z(*azzHcweta8gdNuDSJ**)s(tV* zRmh9vE_oQ&r%7EpQ`NaiIQD1Q9g%t85zNk6fr|*QVPT(1U2E6;;UWgCR#*V@f~p|N z6FhGk^bu6%5ALaiRlqWAS|j@S?K1}Kdp8fnS7-}62!1*zu-a~X(PWV@tHs`M4}{mk z2zA5V8iE1;zFyjPOHG3MExbCh2hG=Nd0m-2y|H?JW~_FGiPj3os2O{wjtVLVxq)8J zMD)8C#F87mAGp>tzArTV(k}PigP63Fs*FX5v!$9L&~WN}(72D_-vi{M%fP2pNj`^i z6g5jcP-q?U@r}Jzzen9kV7Fs?mH!2VBQ;7}Vl|g3P@KD>Z!g^Mxl0EWye)v9m5!FiId#Odb_$Nu}ZCM*O#G-<&cA zl>@fSoLNYQq^7Hxw}>VxOHY+)c$nLc$d-m9V7XN*kLI(6tX1-VNS=)U&HVpI@?`rD z-N}H@#LQ0jAK3H1B~K<6M&|$J{{MgN|DWV(SF+tgjh%_}DLvY@Ed^n6tY>iop<84eum_Z)ipmBQ;ro}RXAAKa9>drG0EB@`urL@fVETRK zL(V(*_4;cqeGQQHE3SWF@T+UCe2!*;fqiP5W^>k%&BP^`x`XA&aR0L44Cvg z4pV0bgbtL211s&v5)z{Vz^T~RD+x~K$;J+BoduB4GU5{R;t~@w!-wn_Ox?GR4I$Uu z{FYjD^%eV&Yp00}#wqHz&5J7PSDzhO-B<`Z7yjdW0JXX9$)=H(&IwHRJDZXoA0Gdr zOZnKVy7G(G23OqP*vQQa9GIDj)xF>QbryYXh3-^l255sia{}-;4|#6>8E@1V5%`TY z^3Sh%!ojaT98&7@ZF4xcw+>CL7k%8g+ z@NM>0mvj3Uu=MK6%oJ3qmF_)s=vQ_`xA$rbP{*mtstSO^ga#FW5g7~3FEV@av^Ny1 zlZ^w&I{Wt<`sd&4HeQ1Idj|y40UW)rl6n>89zdtF^n;ZV zi%g@+odtO^yRuP5lUmp_{vvhx<9cxfsu(imRmOrGyNifwQ{TexkE5f=7Et)d2SkY0|iheuNts z=grfBP1~yX9C4|ifLQvnd46s#J(YwR5U~$sXlF3Dzsg>yM5=gFaQ!kVn5mUrpZl57 zWL%1RxX#mhtfSD^=F_{=QDGo5@y|y`;>UVKNv^&7T7eRjOvhPsybC=7X!!(}R=D=4ShE^# zs+I>UY-ro5q=f$2F(m0ktOGoK@dA8wRY+eDXdpQLM4JZCt{n5nR&t9!dQPZN=yiP$ z-|5)v95Y-V%6#0`G?}9m3k&-jj=|9B*)SH3jaek*+KYj@5*uNM>)CpJu=a>HdT{~d zbB%QCb->>%&{4o@8NMhqk?&VfQ~!HKLq1sOqY6?^>1_JxGYMwE;(S3et%J^;Zi z2s`Y&XcDe@vI80F{fXbj+OMjJ7qaap?P-CN;NgzuPZiJLNA_8ochUW#5r&Gdwbdsu zwIGtfs7gJJ#D}DrQkly7a=^$%T zD{QDlotTNhfDJB?=O<^d=ysdG$f(Q+HJ@hc9oUOMaD|1ZEL~<1R3jLeP0>o6k-fP2 z;>Ci#*l7?k$oi1wA%Apgk|^v%pKR3(C)uIGhP4=~pCWAs3=ij^a`JPA@H^g~5p)mc!(Z6f9XT6pV-wnwMY)aTn_V|ZuJi=0G4}n!q zHZ&4kst{+I*shNqoEe)v^O`Ri|1}G!X;;n6QYjxGpuA$ym z;Zu3i>Qr=}zC>IuI+r~4bZ$F+PdDw-2D+nLUeN3gFOd{T;3&}&>v8k9%qG$9eH`g3 zk%qT~)#zH^zmG)-Rj%UyAE9D#|isykfqFA*X6pZ{?f7|Jzj``k}ffte(k zI%9OInxtO$D&G?3lTqWZIE`U)mX95@EmZxag`J9<;1}FCHCh1-QcoaD!1;!7 z`@qHF+$7v749Af09lSXJMUfrY<;3_DGR=EKh z*m={hx`f>}&;V5cfks2}%Q}b2Y&TR z!G?K2bH&T#A|xzeuz_BiC_WKkO2+BUTW-m1U;DIUX_KPtva9kOXif)wGVHda*tA58 z)a08r$$a$nB|pQS0NY`;5>#!~*?euiJMUSoeY9uB8|SFdb`F7oLBsr0Amv~{b1 z8{x~5Z65(KGmID<&n_@wII2t?3czS5c+8W!y zu?RCLeXw_s6#V4f{ma&AR_8b$whV-881p=wGwDZ_j*$<2u6il%6oC4v=NoIWS}?)E z)rc2FyVQw*UvSRSdF}Qq+9WZg;|Pm160~T3SOwre(RUT<2~)WTG5sV1(LeIr<>gVP zIx|=(%@LdD6Q59rmp_ zFWsdPG3jeT-)7Kjmw0=tSTu8)Em4i4fE0MhVe3Cl21v}sq}xeV28_9^eN~)O19uAhHdzLA;1A65b^KwhVJ#g+2t+{)Dcx~Gmxxy z1#9==KU~TQK6vbQWg&ksAjdM|iv_S5lDvTjXa8Ntz&+^&M@U*&aWN<#eV{5ke0b<% z-xdpd8**FCnv`4Un~QQN(I@SN&TXy?c-G?~H*;h% z-JtFwIkM1m-HUYTa~?9SOEzOI{1dpQ2Y^;(vv!m4w}ckq7ii|Cs)VXl==~T zSH`_j8WJg`%QH$~2=Mm)Ln^^n{@*VvNLp(1*plMhw2=D_0^`+GJjZJF zOi03>z4zjkHIeYejp7Sle(h;G6AMz)xh}?DlI2p*^@Nm}cx6n?xKm4p5HC*L-h7AN^V+j5 z_VLoLZRW^%Fr#FVDs(L?o!DJ0WR;eT!5Ieey<4jc^1esWZAlUJ67uD~i}#bY&k>i= zo|=<-h;?}muXQ6GQ=B!1Z%we`*p>&@u@MbNVd+WM7IwDWGv50xZ)+Sk<<&-45OnDG zktFF?LZdOdka!DJ^my5DE!BVG)!b&U?NB#5RTHwL(DtJ_LVHl>g*E!Zu>pxMgdyI7 zmFww0xk=I1Uuc0gW*SHKs@+>*La>tXj&s?XTR5=hCg<*Q#)?gcT{&r_eL|b zA~hEeo=jX9V;U}+Io-s(^&Cgt(XWmD35h>wZ5S7y8%Cyl4%6oHz)MsQ3;iPvA;nFm z(wpy9!o8KKXEIgXPf)LwSm4MsESx*b>J)+VSn)#M0dgOhL=EnN6`p!?!+8ZcJmoU_ zZsYz0dCtS+lkczT^06loI?#GJQgkb7sDaU$&GE4%9vvoTyv&fbEf)Cm1d2}ImL#Tc6pP-YYkOL+eP+5W zved~TG{x>K$@XU;HijyTgvrG-*h6{M7c5OQy>Prdh)f6Cw!?T1C57s>G%!lJ z;KOttLA22FA#wMtuGed1wU_y46lx88KQtMMIxqNx(*69X8B%6qtZ#0o?6mMau8sBC zR2V&3xaj7O@UETh`Q0c)mB!5@KJ;JhBD|-YL6(e3cszPupSFtKJ^!+ri^y`^)aikC zcD1{>6~%XRd%e|GERJkr(Hx0&O;|;(G62m@obHi$1Kn6yNji65>X@*O3K zX@ahiDV!E4DrnZ2+uSazmmx@Y>suh;uzDA~7(T-7W6A@GBfL;Zj3z{R-=YyBkht1a z*}%tqQA}^jAq2|fQCzdB34*!mLI~1i4G0c$H)<@q3Ln0EcybYoNfldY$OOjQq|DeA z%|xPyCVWTVF>ff)EM7aPZ9ER|dnT%xpRc^3 z9mPbys~W#a1<9L|?YWH3uQ6E|X`iOjl6g#r<61A`m^Ho0eU2--6dDcKnr#~}*vzh| z9DmA+>XyGt1lEyag;1U`t(5vTh*^=ZHto1ton; zRv$eVQR52dcS}Fv;Mj>kv+?#O&7EQCn>uQ%apVV#42kZ@z{PD+j_qW|iA2W8enAb7 zobE~;in-ZoV~@?24naHOXBKvuzhGyDr!`+(ykMLj1qujSVQa6&vU}Y-B^^-|DPWoA z_edqmZP3}C#>1Y3PFY=MUEMRF0~r+x1emE{B}BZfnflHoK;-cT9{Rk<_{~g*GpbE*`K0-ta0c=Z|niRL7lfwiw6- zQSC&t&Y5eFsT_cpCSx9CGWS{XZy6%ki}!lVAzYn;birQNo$Pl~ex#fnWpT)KaTPz^ zhn<+mSviso2oUld?+~q}tPKiDqJ^wu(Q%_)Q1Y*44Y`m$)tM_+>b&X~EF)FDSAskrG*df|SIH;#AQlHk0OcoMEWFnxr|?MqTsFQez~w>l5f+qNX_hbi?Z zxAz=P5c(D*KpA<>ewX3{A(iB}Ul)o+#}N-eo+mu*Z)WDe=aW}sgrcD=NvfuG5m^%6H>i7 zFcy8Q2@A9h3S(k5!Srl8rtLljf0E<)YT2wxsS{&39JQu!Ola_)H+>}h^;?KK*AO_j zsY<_UXtmokqZQNGt1WT%iO3$$B|%9Oh^r-L+Wmv8ofVXC$x2%`?d3%xj-cXD`W-7} zMZVqWE}_F*8I{APl2ownmshcp%7pcc)LNsVWNK z7RUGJW?`)|Qz#4|JX?bm?xGj9HSV z3;8y4n`SImvYDbCQjCNjROPwXl&9c=eneH)Y5YmJ2|`Gd7!QGEkO$>kQLZWY<=>Uh zcIAqo8lD2w2kGG~ba+BOW-6TH%o(Aq+#}8?URu(398tavtL*|3R!m*uyHd4n^+>WbSq6MGqd(W|AcuL;5 z0j6iXka_Fc4ieBds#(uDm5yxa3tu!U)staQ;O(=Kp zuZ7a)S?@C29?dL@fO)q`rv7@w#e!DtA%(X0$&f$&ej^3FfUHff1oMNsj!NP8J>dw4 znt~4EA9Slp2PkcLPOXF2x$Z=8P)e!J0X$74=a6jWrYrG^uSzq&YR@@@C;t zWpUs~6SHP5Jubl(X5VhpSzzkuFyg@SQRR=FRSRPu>T-d`DQI;47#R<6Cg@W;DqBrW ztf(vkPR;bgdX@glLg4gfLaw~z<WCcVp1wwhMf3WHc$uo?!P!^iO_8f$xw|R*uaEu09 z6)aEH#bopIUDd991dpT<<7=+4j~cx3#ifPbzXV4s#>u}~3Ka4-TQ|sgFABCu-6g&y z`YplOXg>!8&q#{ZcUo>y|;n1pqF$e(|4cC&Lsp7&c+6-7fw~T5JPphVZWih`L)~ILPW)-&GiPO zAtCxH(nsM)rhO&?@u9?!BQMTy-O!hPQhpHlU@K%XA7kcDvAorucMeORE`^TZ(Dh5wIwUe=^ssfF z(HcR1#;hB69clzCd=6ohu6Z{*p0;9on#H4c_gQ|`AB+Y8=jGl_&l4(<&upG^4!qDH zUqD#IIvNvAb6ozEUn9$J!XRkx?B~ZWg(SZ|jIfqAXeoSsPdXkMRG2+r`7er~d|SQf zHw#(0Im;6~N#A1fyaT$uPgHaJrupyu$OtWL?o5b8AcCE#qkE;mvm-%wZ58ez3Z>h7 z)3nP)F&UqYXwOon9BAYrUD<#Qz zjhH;bf^-UTlw9F(%`8igt~f~H{XMJPaw~k7mEpu$wx1O`*mayMEYA+SH0*n-M;rX4 zf1YWajh0W*WwMPP*2@ znEJVAXjc0q9Q9KEc%LOa+Yu)^{1p}ECTF@%Igp)cRpd!7{w>)`PzGNCd_m(F=|WTX zK>uy+X$DI%>U*`Jdlk%MDgIFid$U?6Be=j%d)7q)P3)I)bUF_D^ZQUsl6q}KOzsGh zeo$Hf;hkbYa)a<_RX$$tmu3Rb{)e@Fz<#vDDdHgz4)OB!=Ug>%%AtSd7MS%oIeue7 z^~wdZ`v@9$MdyJgu*)BK3nHO~%;tclvy@9B7IX(eC<=f+#KHgn%Sqm54!W=5SM7VYIZfHcA;_dmRpu8>Cpp~nopOV zKFbJos$6bLw`O#Mc<*g{yPG>C_Jvie?Q7$W_{%ZM0a+wlTPa>p=FzG2BI9LbjMv@v zcW(*?`Rl;+2}!J(CB1%b5Du0yIdcB6B^9;FvlOUmCd&7HV-bw&Z(raDLFyw>k0iqI zO5Eov@0|lOLKo*J{w1MfAPkroR?|1BTD#P2K`yUiN2AVKNb-RyQPQXa*)i)xw?=QaZm5@1(_F0Kv-0KFapb{+n#khnTx~0l>B2Y&!v>F z&uGFnc=>BH36D2)n(1CH21u``bJywDMRz$NuGBAO1ss*cV}YVrK34eN$He4(q4b8MQ5( z7Wy$>du)xB0i9L&*o04)c{M*3MgkPW>0}PE6V*iN>GD}u^>M*~EbSFoj+H_&&vayM&{@t2wA|~CJg2cW0Lv9n zzoU#E8M9m2(lZE*cg7_yh+0M)*;BwZu6Xye4%ZqS+dizl6PU}@0RzaDtr-b-c?k~s za^sQ;b<~0q{D$FpTh%5=^pt5Nutv$slD~wT@Sn2wz+BCa`M_Ma#fTG$Ry=>J+0`)EV(T01ZLdwq@N z39?sDmhgO8RZz0&SehSAN^3yiAoec8GkxIv1I53?zK&CihD^x+$6oj}T_!73BBp*> zIuw4v$o*UQ3QKvxSHUFJ@;1wL{D?P#(i?r95;N%scHSuBP~`l8+Ov1a0k(~A zGR{*ML*IKWZB#qTW+|Air0|O^dag(thtz9i7T(xHG`{d~;{XWrA*Z@Tamn!B zGX4i{MM4y_2mIMbKaq07)PlduQ<&4<^!!ufxXCKG=P}N5a(Rs8dltf_E7Ruc-e~=k?Q$RUiBl0Hqyuy&6Qgj5ifN``* zI5RZCrlOznM|bUX)**?`kM3eL$FHr{5?LbquH}K+pD-+YiDK?4=`%BZlK55nrztu= zhALbx-MxD&TsCDXw=@ML@g8#90UjnAcUcU;p!3zvY7B$?KQb#e-)$~L)K$ukv}bkUoaaB94n#7pJ{b+okC{{Iv%~n5wuG;PN=*N%$!R)UZ)eWh0_p{dKcp{P8VF-mU+u1WkPFJ$O?u-V1jyDM`K; zv!YyTgVqfc`1U#^XhsQIs6Mem$4BYXwiJIyMAdg4_p=cSSE;j2*7?~Jmf(R961yxL zTcFI<`j0vy9bN}jVx}%nS(9wVY%k<@Grk=Sih%R98_ z*BsfTqGBXQAQREu6&eO4oSI6F1sv=)gfEG=!~9{a)quiiqQW zj3x2h5w$zmR;->%H#dHiMD7;|l(*&p8q$U_Pvez3B*h!Mm8n9nEtyrm#}* zIqd>X&wG@|cKiFj+8^c_@es8LmiA`t8~On<4hcvv56T9i_Qf|%@B-&T*%v;n$1NN*&Lsmji zBhD}lwH_Q!YVLT?2OeJ&XV9`Zt_sR**t`R$FUi1$ft_N3+Ce4#qM?je+Kfn9ac)ql zD;os_LQgSBoBm^6D}GX+ONm}VSJvN7*()BBC^hWQ;EJzn7E@=|Jy3A^@WFEd39wcH zR<}E>LGo8tof}JQ&n&EAYZbcL*{o@#DFeulD(`nbcl3^U(LC@x&=0DA`%3(>xAyGCecFTV6X(S2|H^x=27ot@1EUJ(qzcdZ-mlC|? z&2E7XQ)NU7*H;Y^gSk7TWkW|uB30Vtp|ugxh=7O~p5{`Iboaw!>Lx*7;k1ZubrdL? zsqE3Oz!WOrvh39U51qevv|HUG>Ug)E4ofXJK`x-OkY4ulukg?CnD!^0{eoejFFl(%rb~9QZX_EkbhF@rZ}+_1eb(YSsuDx zcElcuV~1bl1jL2YIuUHv`7{Ga!NqhxbwLyEE+nC;Fw)Z_!Q*`?HvK#i08gmRhcim`7<%k|rP+YzeH)M8-eXFcY5`P4>$=d_x@RdwIG2Lb4GZ z%ARza*i=cy&hpD>{Y=ly#@V1z(C07NJH!uB`&scFcQEqP55`H{UzA@Bwe4Sx+tVLh zgo7vB2tq2Qurw~E#d^)k*8__S7HvSwBJ+z!#^K@5*X+j z%XMl()RRjeWC)ogl7^hBgwQO1?|J+-0o%1$}*QJCx`)p&$ds9jrBW^xx0rGm0zKyy;mVq@c!?(T?!C*$%ki=*ON? zncaIl8idkOkZI<$7|~8`cQ0zPhr&c>)$vySNX9mIv8nZFMPWf znC)_`Moc^F(1&-k&ZW$(UNd(&ROZ;-mleUogNxb;44b4;^Ie ziY9=05xa@SEkSiy@iUm^TpYCgl^h=h7GB~uHhhfVJjwGP$y zfCl;wYDcrRH-E=q)Fd-Q%&cUcBFxvd$$G!omijx^78H`^lfwSS(!RX?+C$@ExM)J{ zG@A12rKmrRpJX;-7cA$)5LWO0p21vD^%@3(EYp$fI?r@oieWeUAd^DIRX_>+{Sfsh zS-Agx!CL<9@k}s;ONJ3h;qpK|g8$&ZxunDZ``i6@#rg07Gh=70@~}V>N)a>d(5TZn%8npsI#Va4EqeUhJF>820Un@zCH`l9)5OdPDs? z!xWaV(ZrWxvHV#g6gJ-vLTY=Ao7;*nyO#82NlR#nTQe#46PU*;N zW{SWyyv*oa;}Psp*Q;#kta}gI0lDL>XaCC4C2yTrG^8omY8%zJPWXK|wg7GCg0|wC zkj>2fIvE+IgyJ4~&Nu3JwP%xp$@zOpgcszt47-isA9$P2@w{Vi{XxSg0+2YCJjp;8 zo>vEO**^b`wwNR+Dtq6tuXE`p&8K7^&gRitbI?VqIId)$>|S=Y>^cr0_KKdqLFS%}c4(S@f?LauxAciI zc=78K)5VkMl!G@N_*vjnho#B?qvI8|be8Gsa=Po+zN3zZtiiaw>5MqD$xj9VIy*l$k|C z74242uQEnTNTjLK+F%0Ac2fOELR-3sRN4K)r7jF+BSZ>UQP8=oyf|QJ;}m3Xd{wEn zciV=yvgZrXsbrv39%eYU_%d=`lro4_Sn~qogHxXz;KVU^ zy^zX+>jzq!`eP>WN-|kV5ACR)3>Y#6OI|E?9-)&JHe%!HEN;7?+fkt3G^1p7!Ak{p zAwtkg)P0*9Ai#tL90I%63P?>mXyL>Th_T2xsVSKf+zXnWs|7a`tV3DH6}nXh0S_`@ zQ4G>f0}Ksaf|FEgLqDms%OBs(EihV^rV?}G^L^dL0J}r^(l-w(Os3l#qr}ZOBCNkT z7>B?lqIytDu72Q zt5{cOWazDKa`R}ZFZ?uPkIqGkUB?}WR**R*`knm#iz~pA5h=f0BcBg*B&GG7rl$12 zzbLIg{iP6u<)j9EVf&O`MqL|JfHx;lf4<#d5QwdZ=Y;Jlz`wrnc0GGTw*oKV**hr> zW4AX0ESsJi@T;x=K+p=tAMMxxS1hN!ZXC>cT3}!erb69bI5`1#agoKDQ}&{5c?b-< zr9U1JsfR1!VwM8)1;7z8C3LpaIoQKv9nww`6pYXE{K&z+d}uO9nmR$%#;%C`?2!D7 zZ9>>6h*2U<8sBZkp}aN}{DR)A#T#8*`@4mk3J-Q@eKBTh9bS&W{Y+WB+h=$Vm|eOL z$YTpdxAc6OiuDM~{90ia>L0io-5)68@4@quFi64ioypgcPK9y&GlML22qO4*HfApT z6vSmh`otm*m7l|TW|3-P7k`C71|j|$b5QRuY1D6{MSIF1)Q79XnV7pd9lY_iAt~)t zNjqo_EBjR$k0wG1 ztwC(Swn+yYTYB&<1pH##)l6aEaFHGm5`9(;9eT0@hX{ynWm@yNR(6XrqjxZ*>?^IM zgb@%-Vfx;D^$mD2Z%LuOv+w8>z!NfhVj&pp+`97uC;aUUI`OL7w>RO#Ar7qcwK2`S zEKgo)3~(a1G~{iJbgX0(CB{3hIDc3@TQk8&Dm)Pryk}qF6+bX~c}}A1FgVsL>oU z^=+#5+o)`(g-eR&YYiWb9grH-!N)!=FN2J8(bp-l5ai|Y$GI93nuQG?e~%gUanKDB z7nA~dz>fs<2;W7%*_$3xaT{o9tob*GGw;Or*5{U7MQb$B!n^nbM(uT1o(yh(BjbD_ zT~+?x&Y8GnRk@Hgh$RV|-J-EuWr ze`BjzGFWXAF0^e*P#M;eU>b1B(i?AQ3Pc}=>!wFpHW2~4y^KpObeg9Ah^-sd4Wz;U z9bJ;Q;XK1cz)c}gKCs!DEvMDa_fj_be9e#q3t5_g(~!J$0(w;lG`X&6M?}cP6)st_ zf;+}R`h5}8|CS?dKIN&1toGt+V5Vpg3Gut{rJ>e_*#4m}K+I=I#XC)cpE_?pci%wJ z<9a^~9Sb5(4AFn@`w1nO@~$UxLZokKa>sbWjf@`%f+?kh(zDjc{n zi@r|W&p+)Zt(A?xR#A%nz|9{2cCFD0-UK!AN@9|_n6-RqF_uB^67k*$??JLqkodv6 zw;GBQ->=eWiF<i7n-N?IraGN^KFQq?^AK>ZEUOq!E?E#PH z=kU{zCh;M3n@GWZS{1G!h%=%YX`!1>_F@PVNZ1A)3mF#w$bROytOmC@4Ev`_a><@+ zYs&zMn>wHS7_=tE>UbI^4p(V0dv(AOV#AD#KI=r@DiTBntBs_otxmL~cP|X#Ox1QT z#MH;H3I}#RoWsRA(ZXnRfr552j~(WEwhWM)U>bA5n|@RLMmYl@y%DSt$O%k@n;r#n zzk3$crB~&>ZAEwBhmvfW%w{mM821{sypDf2Gl-BK*}C4cEcXX9X%)>TM`N{{m&Hd| zJZe|l0Pf%E@aLnhL)C;SuHQ_dbC=ijOEYlK7`u)36SR>qx~V{OFGz?XSk)&OOss_n zJtm~7$QQX=DxB(xdC}}^D-l!HVFFp<(S?ohNyihNoydl5Ar(5RM}+cicNU`|K7Gf4 zjNFaH#2JoEa9@oWwpcVtCei;gO1 zXCy&JUXM;zV|@E^MwoY*5b5v~cnQ~D&-7w-h6j5Tf2s=y$(s?FDR+Ld(huceZoTyu+HR`UFUGMYl| z!FHwS3ja!LqTCss&{@vAY!LmLL3?31mnk34dDNeRi;3^ShaP~ZK_dl-{GGEaP|Xm` z&AqiOW%4PQpnN;HM4zy!lC_wQNq))=l8Ru}eQHzRSQkXYVPPprgpCyduMQk5WiTJ$pfkp)UVAn#W}Xw^jHPgm&RR(eKXGzJJU7QqA2zlPr21_pi~w zl5^q;1X4UIIL%v!w^SE5 zCP0ve`8aLD7=Hu4(r%;l>4ZB@bdIqN{!JcMBqRBBQ=6k!71`<8_PvE~ zpz!Aj8K1R`@i`nd0wupEqd1l$;R0k?sIZEjwDQc%d6ZD-Br<59;}aoIoOPUf_bG$~ z22*&0>O`%2>5i*h_o;g;F;sBol+~lF{L6Lf|zjy?Xmk>_6!^x>zi>YgW7A;AJAX6ywPxRmNH_U~cSY!0cMldXreqZ3F_XG|m%3xbhll)S0HMqj< zYFZO8H%u(k>6?}<($ZsuA#Xb9qJNmBVz28U zgBE1!%_~rm{}q_ZSOCW8DdgR%!c(`&YM+T)|0X?Owc5tD92IV6c{;4IEjy}aSVq!7 zy+3UI)Pskq3c+RCywkKMOt*OEQP+-`;2hI10a~|omRbU4f4$_5AUi*g(P-6QVpa1m zj<$0edaI3<1U59^xlT-v%|&Cc8C#s`$XyIZYIbK&WLr*YUH( zeuFl)JnW~dO(pLt2kRt3R3-5d6Yp+qha@x8K&?O$l5;Y!amTECYJj!&MY3Rycy!?N zTV_5dxF;O4MY3r{XO5>>13&n1|6*wS-t;+KFiaMYd!t#kH2*-i(oGRk%+#EKop4u! z#i}nM*Wot{S6hLBRZyO1R#_X~$nhZ`yJ5|t1&_DiqQD;383!1JYMiR`QN3o5ciA9Q%G@{Lw1EL9lhV}K=Qv1v(KXLc<_0t1u{Pxc zT>3go{`h=}!)Qhp=Zwxf3kwuRIs$HQDJLAy#xpzK=4Hs<#~Co9hX_IYintm3sJbEvID8sc3%@P2^1?{G9ZB z%|Y9|sO@tqbmsr6ykkpXIdZ2u^MiHuXG+#tw9|RQ)-%T zU_p*;+qP}nw(T>vZQHhO+qP|c_U$J7;l3ZyophyA&7c!NSUp?~FgH@Ax*DcgCuw}p zTrtlQ950^uDaFcMT3=F>1(Rx@C8NcDlFNo@%#Z7|8O51EdNkH z^r>0O#8qR1(JA&eoo4YyCYHCY2=%^m!3roRaa>u@7-qv5U{8RjQ3W3T4YXI%#mLXt z)nOJUy~Z5Bz0#~eG>AmDn3}#;Uyi5IDh;*Z_$sCdafa}tuxNH6?b?^USZAVD*T^Pf zR;v~BW!m5EI1AIejdkH_!Te0wIqpp;W9^vcu?x*)b_a^?=jkFaVXp47WB$IFS!|fE zf_*Q16%p!Xx2qgTEtvrh0Ut3ZtR1+JSW4UV<`5DYjl4~jw@3&=u zNuMercv>R+o~kku^eS$AW)@lrXKavs4Py63V9QU{_eo1AoVn9lYQ$>Tj zG!gpTLE1l*WTL%Tc3S1*JTaTTW(HM&X*kyv0(I;yPuNE??v4UNh< z%*{BsC2gZlatT2bMX~bQ$R^Q(#wzpSaY7d3GXe-pUjg|(og3T=l76l< z)ohq%FLsAWVYpP0B^k*trHq_68}=a1If5ceU77wUIKihmF9U`+7jHjP(|nCc>U-7S zWxhH!5cLX9tOdzXCQbL$uR3RZB^#C*cja_*{o zcu?`X$eZzb1cC~?#KfC3l^)J@gMq611d=aSE^bHHAY>wRRNetd@y}&2VcS>!4WCaT zi{;jNJ&fgRMQ9*wrAoaI{|{jy z_$k`mUNPcw)BVvKZTn|-5o^C z0N`8Z4cln|PfeS|@RujwtAVQZhk+=h{XNf3I*Ra;^$AZpqwsOLiELH`C?SZNZv+BV z>%u6P9wxwwWVg3IhTXk-<7t<6$W}2kr5~0GKngVhx$Oxugmq1y+_0OO>Qy)n29qFVq}h{m>J z;YvY;3h`st=*5UI5v1v`kd#6A-Y_}1<{i>-I|7ACZHmnShGvaGoxAPzh;rjX7Z{6* zy;bcX^PBoO@|zA{%wJL-s7#JMcj)G5xtj_D{@Jr|n~akY&=P;|CzfbDWW#a>V-%-4 z^}wO~4z?ab>=XI%tj^NzrKh)FV?JKFxX}yaA?ldZCLT7gr$(qq!0<^vC`1Q>=_ab1 z1F0M3DIKHB*ove&QcYZHE$<;&j;m@Xc{M$?Fq_d16Ix;!xto=&EEOfShQK*TW0{=9 ztTOiFixU#7iyC8%y!neiPaxCA!Lt8T`*21MXdPxRO#>fK?>Z4^Xr3mM<_%ZrOBS0{ zEN*$j)zk3X!LkTfC{A#k;UmU4ThxUBNsm=O#Q-58hd@ok6_&D!|dk z;Z*VjETQL{dkLfA6e4X_5mv5|LDCpq$27fe{x74fEk|WkX$s8O8Y``5@{jau^$yYz zbn2GT1pwI~qajp>PloXYshQ$CzDg9tL;w%4&Beujq6w6iPyV?aq>h1ggd<)}xzG=N=Xn8Cko_PFd4YI87eRZ0!_ zuA`_`Rjc{0sdMaFdsp#FRPN1A;liCr8Ln=?WYG)~Fm z1PQ%BA*w20Y|i_^#*V0%G$nNDxNUuRcW{ zd7k5Uh_>7?W{-Nw=Muu&v4~@0p5k@_8%_qTZT-S_2D;@!P%plm$^=blSpnVHEZ%P9 zqNc>E;M0jqOoS^0oIZGyGydeyaySF~KCbi(w%F2TKUzZbESNZDd?;kMk3PQ3a{ydc zkmY65Jj?4cLr5io3o<|(G3z?BeaEw;Q=#7!`HN5U!L`_Yk=+$)0Phie&ZUHyb)D@> zo%vY*wf0nxTx6cFSitCuGdrN}DNJJxnhoCmF6{LeHo@217>Az1?hC~bd)m>`36QPs zCl8-sQ_C?LJmayOD`al)W=!^fz&tL1sqIF5pXNu+dZr4fILfnjsXMX%fh(LGrGP~6 z1#fD}9{k*9Gt#WzYH4uGrFU%8N5hlm<)Y=K7TeKc1A*WB1i$~;%^T&(bW`nA-+|6& z6Ur|x=a9Ph-{ircV`;n*#LEfhr#JQ|INs4Ji$*q^5E_i*}!+Z3W|MPfU!|jT$<3jkZay;Qu4%E6x=S+}roTPde%dmiPkOA$L)ixdxdaH-Q2=F8Q?AgL65`9{Fupy# z3}2-ZV=4{h3Yh)ry*1KqD0eUwlEnPdfVg)y1s8pK&ZUNq8Ej z6T1O)KlD9E>7dj8y)1(IL*mx^Ug=gIiH z3edp`-=*%zc)X&V@wrbDHCyKp4HPQ|-ua7~4HLG0mE#qy0rd1RjwLo2P@{AG8W)6x zgwsejT`t51&GBZnQBbJJeq^z|*_Fc1-w;U#cHR*dFbliZvOHE8>ZzT*(;!uA6HpaM zywG~b#L@E%xG?itfrt;(a-2W< z_9L_UQsRB40~4`&w!X9a;5EG@;0FqDVd$jA-Sq_Ztp|0Z0xke@T1jA-j9XKwpBsrq zvpd}lTqsXArg830;dY^slUWxyY{rv!Ar?>}@`noyZeH_yaRUr!?ci4Ggn`-1CZpnhucq$$bk2GW6){diu$zGo&! z&|4k{CHbA*jDgLPpqt$5=ALBjawaSbf8u*b;jmwpwtv@`H>WZ56VLpJBYsh0noHC^ zwHS_OE~KBF6lGJxsRmgg+j$Cs$=%a65KB(c21qt&JlTIatV`rrq&&&hXHNW@n_rE0 z>?aW1^VWxd+qkRW&`M78q~syl(9eY z+cdW1VvJ57J~^n3!!@-InB%?p{-@2B5_=bI?gr|UI@jt^x03c#4B_P~_MxS$2Ten{ z4=%Noi_u!Ej9ukIYC-`NDs;4!UKg~B%msSmiC!#V5o_jjo>-$shNBkGz#ywXuc4nB z4q~!m>+R#Ba)41~Tl69t9Zb$PEZF_@N#L^Y$3O_g>N$s}e4~7Qc@@#-K^Og&FCs(; zKi{fGk�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 Date: Mon, 25 Jan 2021 23:50:04 -0500 Subject: [PATCH 96/96] Update paper --- doc/paper.md | 4 ++++ doc/paper.pdf | Bin 209097 -> 210163 bytes 2 files changed, 4 insertions(+) diff --git a/doc/paper.md b/doc/paper.md index 77f33a7d..e2ae58f0 100644 --- a/doc/paper.md +++ b/doc/paper.md @@ -118,6 +118,10 @@ Luego de que se chequea que el `AST` es consistente, se vuelve a recorrer el mis 1. **CILVisitor**: Para crear la representación en `CIL` del `AST`. Esta representación es un árbol. Los nodos del árbol están definidos en el archivo `/src/compiler/components/generation/CIL_definitions.py` 2. **MipsVisitor**: Para a partir del árbol `CIL`, obtener el archivo `.mips` correspondiente. Para traducir de uno a otro, se usan convenciones, teniendo en cuenta la función de cada registro y cómo se comportan las llamadas al sistema que hace `MIPS32`. +## Cómo correr el código + +Para ejecutar el código, debe tener la versión `3.8` de `python` o superior, instalar los requerimientos que aparecen en el archivo `requirement.txt`, correr el archivo `coolc.sh` con la dirección del archivo `.cl` a compilar. + # Conclusión La implementación posee detalles corregibles. No obstante, su correctitud y robustez se corresponden con lo exigido en los test de prueba que se evalúan en el *pull request*. diff --git a/doc/paper.pdf b/doc/paper.pdf index fe2fa9ef248670713c7c928ae385177bc2930895..8a6c1c1dff33e796eb803321bc8a8928e66785f4 100644 GIT binary patch delta 72648 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�pA*9QDm2` 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 LiAhdP9_Rl7(9rl{ delta 71559 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�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
  • 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