1214 newroot = Select() |
1214 newroot = Select() |
1215 self.sources = sorted(sources) |
1215 self.sources = sorted(sources) |
1216 self.terms = terms |
1216 self.terms = terms |
1217 self.solindices = solindices |
1217 self.solindices = solindices |
1218 self.final = final |
1218 self.final = final |
|
1219 self._pending_vrefs = [] |
1219 # terms which appear in unsupported branches |
1220 # terms which appear in unsupported branches |
1220 needsel |= self.extneedsel |
1221 needsel |= self.extneedsel |
1221 self.needsel = needsel |
1222 self.needsel = needsel |
1222 # terms which appear in supported branches |
1223 # terms which appear in supported branches |
1223 self.mayneedsel = set() |
1224 self.mayneedsel = set() |
1367 rel, node = self.visit_default(node, newroot, terms) |
1368 rel, node = self.visit_default(node, newroot, terms) |
1368 return rel, node |
1369 return rel, node |
1369 else: |
1370 else: |
1370 raise UnsupportedBranch() |
1371 raise UnsupportedBranch() |
1371 rschema = self.schema.rschema(node.r_type) |
1372 rschema = self.schema.rschema(node.r_type) |
|
1373 self._pending_vrefs = [] |
1372 try: |
1374 try: |
1373 res = self.visit_default(node, newroot, terms)[0] |
1375 res = self.visit_default(node, newroot, terms)[0] |
1374 except Exception, ex: |
1376 except: |
|
1377 for vref in self._pending_vrefs: |
|
1378 vref.unregister_reference() |
1375 raise |
1379 raise |
1376 ored = node.ored() |
1380 ored = node.ored() |
1377 if rschema.is_final() or rschema.inlined: |
1381 if rschema.is_final() or rschema.inlined: |
1378 vrefs = node.children[1].get_nodes(VariableRef) |
1382 vrefs = node.children[1].get_nodes(VariableRef) |
1379 if not vrefs: |
1383 if not vrefs: |
1432 raise UnsupportedBranch(node.name) |
1436 raise UnsupportedBranch(node.name) |
1433 self.mayneedsel.add(node.name) |
1437 self.mayneedsel.add(node.name) |
1434 # set scope so we can insert types restriction properly |
1438 # set scope so we can insert types restriction properly |
1435 newvar = newroot.get_variable(node.name) |
1439 newvar = newroot.get_variable(node.name) |
1436 newvar.stinfo['scope'] = self.scopes.get(node.variable.scope, newroot) |
1440 newvar.stinfo['scope'] = self.scopes.get(node.variable.scope, newroot) |
1437 return VariableRef(newvar), node |
1441 vref = VariableRef(newvar) |
|
1442 self._pending_vrefs.append(vref) |
|
1443 return vref, node |
1438 |
1444 |
1439 def visit_constant(self, node, newroot, terms): |
1445 def visit_constant(self, node, newroot, terms): |
1440 return copy_node(newroot, node), node |
1446 return copy_node(newroot, node), node |
1441 |
1447 |
1442 def visit_default(self, node, newroot, terms): |
1448 def visit_default(self, node, newroot, terms): |