mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
refactoring some labels code
This commit is contained in:
parent
16b8cf491f
commit
ea2daf05ee
@ -4634,10 +4634,19 @@ class AsmSection:
|
|||||||
def to_asm(self):
|
def to_asm(self):
|
||||||
return self.line
|
return self.line
|
||||||
|
|
||||||
|
new_asm = None
|
||||||
|
def load_asm2(filename="../main.asm", force=False):
|
||||||
|
"""loads the asm source code into memory"""
|
||||||
|
global new_asm
|
||||||
|
if new_asm == None or force:
|
||||||
|
new_asm = Asm(filename=filename)
|
||||||
|
return new_asm
|
||||||
|
|
||||||
class Asm:
|
class Asm:
|
||||||
"""controls the overall asm output"""
|
"""controls the overall asm output"""
|
||||||
def __init__(self, filename="../main.asm", debug=True):
|
def __init__(self, filename="../main.asm", debug=True):
|
||||||
self.parts = []
|
self.parts = []
|
||||||
|
self.label_names = []
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
self.load_and_parse()
|
self.load_and_parse()
|
||||||
@ -4654,7 +4663,25 @@ class Asm:
|
|||||||
bank = thing.bank_id
|
bank = thing.bank_id
|
||||||
else:
|
else:
|
||||||
thing = AsmLine(line, bank=bank)
|
thing = AsmLine(line, bank=bank)
|
||||||
|
label = get_label_from_line(line)
|
||||||
|
if label:
|
||||||
|
self.label_names.append(label)
|
||||||
self.parts.append(thing)
|
self.parts.append(thing)
|
||||||
|
def is_label_name_in_file(self, label_name):
|
||||||
|
return label_name in self.label_names
|
||||||
|
def does_address_have_label(self, address):
|
||||||
|
""" Checks if an address has a label.
|
||||||
|
"""
|
||||||
|
# either something will directly have the address
|
||||||
|
# or- it's possibel that no label was given
|
||||||
|
# or there will be an Incbin that covers the range
|
||||||
|
for part in self.parts:
|
||||||
|
if issubtype(part, Incbin) and part.start_address <= address <= part.end_address:
|
||||||
|
return False
|
||||||
|
elif part.address == address and hasattr(part, "label"):
|
||||||
|
return part.label
|
||||||
|
|
||||||
|
return None
|
||||||
def insert(self, new_object):
|
def insert(self, new_object):
|
||||||
#if isinstance(new_object, TextScript):
|
#if isinstance(new_object, TextScript):
|
||||||
# print "ignoring TextScript object-- these seem very broken?"
|
# print "ignoring TextScript object-- these seem very broken?"
|
||||||
@ -4718,6 +4745,7 @@ class Asm:
|
|||||||
break
|
break
|
||||||
if not found:
|
if not found:
|
||||||
raise Exception, "unable to insert object into Asm"
|
raise Exception, "unable to insert object into Asm"
|
||||||
|
self.label_names.append(self.label.name)
|
||||||
return True
|
return True
|
||||||
def insert_single_with_dependencies(self, object0):
|
def insert_single_with_dependencies(self, object0):
|
||||||
objects = get_dependencies_for(object0) + [object0]
|
objects = get_dependencies_for(object0) + [object0]
|
||||||
@ -4891,19 +4919,48 @@ class Label:
|
|||||||
# label might not be in the file yet
|
# label might not be in the file yet
|
||||||
self.line_number = line_number
|
self.line_number = line_number
|
||||||
|
|
||||||
|
# -- These were some old attempts to check whether the label
|
||||||
|
# -- was already in use. They work, but the other method is
|
||||||
|
# -- better.
|
||||||
|
#
|
||||||
# check if the label is in the file already
|
# check if the label is in the file already
|
||||||
|
#self.is_in_file = is_in_file
|
||||||
|
#if is_in_file == None:
|
||||||
|
# self.old_check_is_in_file()
|
||||||
|
#
|
||||||
|
# check if the address of this label is already in use
|
||||||
|
#self.address_is_in_file = address_is_in_file
|
||||||
|
#if address_is_in_file == None:
|
||||||
|
# self.old_check_address_is_in_file()
|
||||||
|
|
||||||
self.is_in_file = is_in_file
|
self.is_in_file = is_in_file
|
||||||
if is_in_file == None:
|
if is_in_file == None:
|
||||||
self.check_is_in_file()
|
self.check_is_in_file()
|
||||||
|
|
||||||
# check if the address of this label is already in use
|
|
||||||
self.address_is_in_file = address_is_in_file
|
self.address_is_in_file = address_is_in_file
|
||||||
if address_is_in_file == None:
|
if address_is_in_file == None:
|
||||||
self.check_address_is_in_file()
|
self.check_address_is_in_file()
|
||||||
|
|
||||||
all_new_labels.append(self)
|
all_new_labels.append(self)
|
||||||
|
|
||||||
def get_line_number(self):
|
def check_is_in_file(self):
|
||||||
|
""" This method checks if the label appears in the file
|
||||||
|
based on the entries to the Asm.parts list.
|
||||||
|
"""
|
||||||
|
#assert new_asm != None, "new_asm should be an instance of Asm"
|
||||||
|
load_asm2()
|
||||||
|
is_in_file = new_asm.is_label_name_in_file(self.name)
|
||||||
|
self.is_in_file = is_in_file
|
||||||
|
return is_in_file
|
||||||
|
|
||||||
|
def check_address_is_in_file(self):
|
||||||
|
""" Checks if the address is in use by another label.
|
||||||
|
"""
|
||||||
|
load_asm2()
|
||||||
|
self.address_is_in_file = new_asm.does_address_have_label(self.address)
|
||||||
|
return self.address_is_in_file
|
||||||
|
|
||||||
|
def get_line_number_from_raw_file(self):
|
||||||
""" Reads the asm file to figure out the line number.
|
""" Reads the asm file to figure out the line number.
|
||||||
|
|
||||||
Note that this label might not be in the file yet, like
|
Note that this label might not be in the file yet, like
|
||||||
@ -4911,7 +4968,7 @@ class Label:
|
|||||||
has been run before and manipulated main.asm, then it is
|
has been run before and manipulated main.asm, then it is
|
||||||
possible that this label is already in the file.
|
possible that this label is already in the file.
|
||||||
"""
|
"""
|
||||||
lineno = is_label_in_asm(self.name)
|
lineno = old_is_label_in_asm(self.name)
|
||||||
if lineno:
|
if lineno:
|
||||||
self.line_number = lineno
|
self.line_number = lineno
|
||||||
self.is_in_file = True
|
self.is_in_file = True
|
||||||
@ -4921,14 +4978,14 @@ class Label:
|
|||||||
self.is_in_file = False
|
self.is_in_file = False
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def check_is_in_file(self):
|
def old_check_is_in_file(self):
|
||||||
""" Reads the asm file to figure out if this label
|
""" Reads the asm file to figure out if this label
|
||||||
is already inserted or not.
|
is already inserted or not.
|
||||||
"""
|
"""
|
||||||
self.get_line_number()
|
self.get_line_number_from_raw_file()
|
||||||
return self.is_in_file
|
return self.is_in_file
|
||||||
|
|
||||||
def check_address_is_in_file(self):
|
def old_check_address_is_in_file(self):
|
||||||
""" Checks whether or not the address of the object is
|
""" Checks whether or not the address of the object is
|
||||||
already in the file. This might happen if the label name
|
already in the file. This might happen if the label name
|
||||||
is different but the address is the same. Another scenario
|
is different but the address is the same. Another scenario
|
||||||
@ -5087,9 +5144,12 @@ def get_label_from_line(line):
|
|||||||
label = line.split(":")[0]
|
label = line.split(":")[0]
|
||||||
return label
|
return label
|
||||||
|
|
||||||
def is_label_in_asm(label):
|
def old_is_label_in_asm(label):
|
||||||
""" Returns the line number
|
""" Returns the line number or returns None if the
|
||||||
or returns None if the label is not in the file.
|
label is not in the file. This is an "old" method
|
||||||
|
because it looks directly at the list of lines
|
||||||
|
rather than reading a globally shared instance of
|
||||||
|
the Asm class.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# line numbering begins at 1 in vim
|
# line numbering begins at 1 in vim
|
||||||
|
Loading…
Reference in New Issue
Block a user