Commit 2df03ff6 authored by Guido van Rossum's avatar Guido van Rossum

Move details for compiling macros into TALGenerator.

parent 57488183
...@@ -192,44 +192,28 @@ class METALCompiler(DOMVisitor, TALGenerator): ...@@ -192,44 +192,28 @@ class METALCompiler(DOMVisitor, TALGenerator):
def expandElement(self, node): def expandElement(self, node):
macroName = node.getAttributeNS(ZOPE_METAL_NS, "use-macro") macroName = node.getAttributeNS(ZOPE_METAL_NS, "use-macro")
if macroName: if macroName:
slotDict = slotIndexer(node)
compiledSlots = {}
if slotDict:
# Compile the slots
for slotName, slotNode in slotDict.items():
self.pushProgram()
self.visitElement(slotNode)
compiledSlots[slotName] = self.popProgram()
cexpr = self.compileExpression(macroName)
self.pushProgram() self.pushProgram()
self.pushSlots()
self.compileElement(node) self.compileElement(node)
block = self.popProgram() self.emitUseMacro(macroName)
self.emit("useMacro", cexpr, compiledSlots, block)
return return
macroName = node.getAttributeNS(ZOPE_METAL_NS, "define-macro") macroName = node.getAttributeNS(ZOPE_METAL_NS, "define-macro")
if macroName: if macroName:
# Save macro definitions
if self.macros.has_key(macroName):
raise METALError("duplicate macro definition: %s" % macroName)
self.pushProgram() self.pushProgram()
self.compileElement(node) self.compileElement(node)
macro = self.popProgram() self.emitDefineMacro(macroName)
self.macros[macroName] = macro
self.emit("defineMacro", macroName, macro)
return return
slotName = node.getAttributeNS(ZOPE_METAL_NS, "define-slot") slotName = node.getAttributeNS(ZOPE_METAL_NS, "define-slot")
if slotName: if slotName:
self.pushProgram() self.pushProgram()
self.compileElement(node) self.compileElement(node)
block = self.popProgram() self.emitDefineSlot(slotName)
self.emit("defineSlot", slotName, block)
return return
slotName = node.getAttributeNS(ZOPE_METAL_NS, "fill-slot") slotName = node.getAttributeNS(ZOPE_METAL_NS, "fill-slot")
if slotName: if slotName:
self.pushProgram() self.pushProgram()
self.compileElement(node) self.compileElement(node)
block = self.popProgram() self.emitFillSlot(slotName)
self.emit("fillSlot", slotName, block)
return return
self.compileElement(node) self.compileElement(node)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment