ref: 39a71c55c7dbfe2147f5ce4016c062be8a08ff1f
parent: ce35b436ed2a8317bd02e931de03cb5ab356ded5
author: Bryan Bishop <[email protected]>
date: Fri Apr 27 09:41:44 EDT 2012
prevent dependencies from being recomputed
--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -1256,6 +1256,7 @@
debug = False
def __init__(self, *args, **kwargs):
+ self.dependencies = None
#bank can be overriden
if "bank" in kwargs.keys():
if kwargs["bank"] != False and kwargs["bank"] != None and kwargs["bank"] in [True, "reverse"]:
@@ -1273,10 +1274,12 @@
self.parsed_address = calculate_pointer_from_bytes_at(self.address, bank=self.bank)
MultiByteParam.parse(self)
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
dependencies = []
if self.parsed_address == self.address:
return dependencies
+ if self.dependencies != None and not recompute:
+ return self.dependencies
thing = script_parse_table[self.parsed_address]
if thing and thing.address == self.parsed_address and not (thing is self):
if self.debug:
@@ -1283,6 +1286,7 @@
print "parsed address is: " + hex(self.parsed_address) + " with label: " + thing.label.name + " of type: " + str(thing.__class__)
dependencies.append(thing)
dependencies.extend(thing.get_dependencies())
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -1525,6 +1529,7 @@
self.label = Label(name=label, address=address, object=self)
#params are where this command's byte parameters are stored
self.params = {}
+ self.dependencies = None
#override default settings
defaults.update(kwargs)
#set everything
@@ -1535,13 +1540,16 @@
#start parsing this command's parameter bytes
self.parse()
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
dependencies = []
+ if self.dependencies != None and not recompute:
+ return self.dependencies
for (key, param) in self.params.items():
if hasattr(param, "get_dependencies") and param != self:
deps = param.get_dependencies()
if deps != None and not self in deps:
dependencies.extend(deps)
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -1957,6 +1965,7 @@
self.address = address
elif len(args) > 1:
raise Exception, "don't know what to do with second (or later) positional arguments"
+ self.dependencies = None
if "label" in kwargs.keys():
label = kwargs["label"]
else:
@@ -2055,8 +2064,8 @@
self.commands = commands
return commands
- def get_dependencies(self):
- if self.dependencies != None:
+ def get_dependencies(self, recompute=False):
+ if self.dependencies != None and not recompute:
return self.dependencies
dependencies = []
for command in self.commands:
@@ -2188,13 +2197,17 @@
def __init__(self, *args, **kwargs):
self.id = kwargs["id"]
+ self.dependencies = None
Command.__init__(self, *args, **kwargs)
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
dependencies = []
+ if self.dependencies != None and not recompute:
+ return self.dependencies
thing = script_parse_table[self.params[4].parsed_address]
if thing and thing != self.params[4]:
dependencies.append(thing)
+ self.dependencies = dependencies
return dependencies
all_xy_triggers = []
@@ -2264,6 +2277,7 @@
self.map_id = map_id
self.debug = debug
self.params = {}
+ self.dependencies = None
self.args = {"debug": debug, "map_group": map_group, "map_id": map_id, "bank": bank}
script_parse_table[self.address : self.last_address] = self
self.parse()
@@ -2330,11 +2344,14 @@
self.include_in_asm = False
return
script_parse_table[self.address : self.last_address] = self
+ self.dependencies = None
Command.__init__(self, *args, **kwargs)
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
deps = []
if not is_valid_address(self.address): return deps
+ if self.dependencies != None and not recompute:
+ return self.dependencies
deps.append(self.params[3])
deps.extend(self.params[3].get_dependencies())
deps.append(self.params[4])
@@ -2343,6 +2360,7 @@
deps.extend(self.params[5].get_dependencies())
deps.append(self.params[6])
deps.extend(self.params[6].get_dependencies())
+ self.dependencies = dep
return deps
def to_asm(self):
@@ -2374,11 +2392,14 @@
self.dependencies = [trainerfrag]
PointerLabelParam.parse(self)
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
deps = []
+ if self.dependencies != None and not recompute:
+ return self.dependencies
deps.extend(self.dependencies)
if len(self.dependencies) > 0:
deps.extend(self.dependencies[0].get_dependencies())
+ self.dependencies = deps
return deps
class PeopleEvent(Command):
@@ -2421,6 +2442,7 @@
self.debug = debug
self.force = force
self.params = {}
+ self.dependencies = None
#PeopleEvent should probably not be in the global script_parse_table
#script_parse_table[self.address : self.last_address] = self
self.parse()
@@ -2631,13 +2653,17 @@
if not label:
label = self.base_label + hex(address)
self.label = Label(name=label, address=address, object=self)
+ self.dependencies = None
self.parse()
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
dependencies = []
+ if self.dependencies != None and not recompute:
+ return self.dependencies
for p in self.params:
deps = p.get_dependencies()
dependencies.extend(deps)
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -2767,6 +2793,7 @@
#script_parse_table[self.address : self.last_address] = self
self.remotes = []
self.params = []
+ self.dependencies = None
self.parse()
def parse(self):
@@ -2873,10 +2900,13 @@
else:
raise Exception, "unknown signpost type byte="+hex(func) + " signpost@"+hex(self.address)
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
dependencies = []
+ if self.dependencies != None and not recompute:
+ return self.dependencies
for p in self.params:
dependencies.extend(p.get_dependencies())
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -2969,6 +2999,7 @@
self.map_id = map_id
self.bank = bank
self.debug = debug
+ self.dependencies = None
if not label:
label = self.base_label + hex(address)
self.label = Label(name=label, address=address, object=self)
@@ -2991,9 +3022,12 @@
self.time_of_day = DecimalParam(address=address+7)
self.fishing_group = DecimalParam(address=address+8)
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
+ if self.dependencies != None and not recompute:
+ return self.dependencies
dependencies = [self.second_map_header]
dependencies.append(self.second_map_header.get_dependencies())
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -3058,6 +3092,7 @@
self.map_id = map_id
self.debug = debug
self.bank = bank
+ self.dependencies = None
if not label:
label = self.base_label + hex(address)
self.label = Label(name=label, address=address, object=self)
@@ -3123,10 +3158,13 @@
return True
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
+ if self.dependencies != None and not recompute:
+ return self.dependencies
dependencies = [self.script_header, self.event_header, self.blockdata]
dependencies.append(self.script_header.get_dependencies())
dependencies.append(self.event_header.get_dependencies())
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -3241,6 +3279,7 @@
self.map_id = map_id
self.debug = debug
self.bank = bank
+ self.dependencies = None
if not label:
label = self.base_label + hex(address)
self.label = Label(name=label, address=address, object=self)
@@ -3297,7 +3336,9 @@
self.last_address = after_signposts+1
return True
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
+ if self.dependencies != None and not recompute:
+ return self.dependencies
bases = []
bases += self.people_events
bases += self.signposts
@@ -3307,6 +3348,7 @@
dependencies = []
for p in bases:
dependencies.extend(p.get_dependencies())
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -3459,6 +3501,7 @@
self.map_id = map_id
self.debug = debug
self.bank = bank
+ self.dependencies = None
if not label:
label = self.base_label + hex(address)
self.label = Label(name=label, address=address, object=self)
@@ -3499,7 +3542,9 @@
print "done parsing a MapScriptHeader map_group="+str(map_group)+" map_id="+str(map_id)
return True
- def get_dependencies(self):
+ def get_dependencies(self, recompute=False):
+ if self.dependencies != None and not recompute:
+ return self.dependencies
dependencies = []
for p in list(self.triggers):
#dependencies.append(p[0])
@@ -3507,6 +3552,7 @@
for callback in self.callbacks:
dependencies.append(callback["callback"])
dependencies.extend(callback["callback"].get_dependencies())
+ self.dependencies = dependencies
return dependencies
def to_asm(self):
@@ -4332,7 +4378,7 @@
"flattens a list of sublists into just one list"
return list(flattener(x))
-def get_dependencies_for(some_object):
+def get_dependencies_for(some_object, recompute=False):
"""
calculates which labels need to be satisfied for an object
to be inserted into the asm and compile successfully.
@@ -4343,7 +4389,9 @@
"""
if isinstance(some_object, int):
some_object = script_parse_table[some_object]
- deps = some_object.get_dependencies()
+ if some_object.dependencies != None and not recompute:
+ return list(flatten(some_object.dependencies))
+ deps = some_object.get_dependencies(recompute=recompute)
return list(flatten(deps))
def isolate_incbins():