72 | 72 |
|
73 | 73 |
def clear_statics(self):
|
74 | 74 |
self.context.statics = {}
|
|
75 |
|
|
76 |
def resolve_symbols(self, program):
|
|
77 |
|
|
78 |
def backpatch_constraint_labels(type_, resolver):
|
|
79 |
def resolve(w):
|
|
80 |
if not isinstance(w, str):
|
|
81 |
return w
|
|
82 |
return resolver(w)
|
|
83 |
if isinstance(type_, TableType):
|
|
84 |
backpatch_constraint_labels(type_.of_type, resolver)
|
|
85 |
elif isinstance(type_, VectorType):
|
|
86 |
backpatch_constraint_labels(type_.of_type, resolver)
|
|
87 |
elif isinstance(type_, RoutineType):
|
|
88 |
type_.inputs = set([resolve(w) for w in type_.inputs])
|
|
89 |
type_.outputs = set([resolve(w) for w in type_.outputs])
|
|
90 |
type_.trashes = set([resolve(w) for w in type_.trashes])
|
|
91 |
|
|
92 |
for defn in program.defns:
|
|
93 |
backpatch_constraint_labels(defn.location.type, lambda w: self.lookup(w))
|
|
94 |
for routine in program.routines:
|
|
95 |
backpatch_constraint_labels(routine.location.type, lambda w: self.lookup(w))
|
|
96 |
|
|
97 |
def resolve_fwd_reference(obj, field):
|
|
98 |
field_value = getattr(obj, field, None)
|
|
99 |
if isinstance(field_value, ForwardReference):
|
|
100 |
setattr(obj, field, self.lookup(field_value.name))
|
|
101 |
elif isinstance(field_value, IndexedRef):
|
|
102 |
if isinstance(field_value.ref, ForwardReference):
|
|
103 |
field_value.ref = self.lookup(field_value.ref.name)
|
|
104 |
|
|
105 |
for node in program.all_children():
|
|
106 |
if isinstance(node, SingleOp):
|
|
107 |
resolve_fwd_reference(node, 'location')
|
|
108 |
resolve_fwd_reference(node, 'src')
|
|
109 |
resolve_fwd_reference(node, 'dest')
|
75 | 110 |
|
76 | 111 |
# --- grammar productions
|
77 | 112 |
|
|
101 | 136 |
routines.append(routine)
|
102 | 137 |
self.scanner.check_type('EOF')
|
103 | 138 |
|
104 | |
# now backpatch the executable types.
|
105 | |
#for type_name, type_ in self.context.typedefs.items():
|
106 | |
# type_.backpatch_constraint_labels(lambda w: self.lookup(w))
|
107 | |
for defn in defns:
|
108 | |
defn.location.type.backpatch_constraint_labels(lambda w: self.lookup(w))
|
109 | |
for routine in routines:
|
110 | |
routine.location.type.backpatch_constraint_labels(lambda w: self.lookup(w))
|
111 | |
|
112 | 139 |
program = Program(self.scanner.line_number, defns=defns, routines=routines)
|
113 | |
|
114 | |
def resolve_fwd_reference(obj, field):
|
115 | |
field_value = getattr(obj, field, None)
|
116 | |
if isinstance(field_value, ForwardReference):
|
117 | |
setattr(obj, field, self.lookup(field_value.name))
|
118 | |
elif isinstance(field_value, IndexedRef):
|
119 | |
if isinstance(field_value.ref, ForwardReference):
|
120 | |
field_value.ref = self.lookup(field_value.ref.name)
|
121 | |
|
122 | |
for node in program.all_children():
|
123 | |
if isinstance(node, SingleOp):
|
124 | |
resolve_fwd_reference(node, 'location')
|
125 | |
resolve_fwd_reference(node, 'src')
|
126 | |
resolve_fwd_reference(node, 'dest')
|
127 | |
|
|
140 |
self.resolve_symbols(program)
|
128 | 141 |
return program
|
129 | 142 |
|
130 | 143 |
def typedef(self):
|