'From Croquet1.0beta of 11 April 2006 [latest update: #1] on 6 August 2008 at 12:52:57 pm'! Object subclass: #ParseNodeVisitor instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Compiler-Support'! !ParseNodeVisitor commentStamp: '' prior: 0! I am an abstract superclass for ParseNode visitors that functions as a null visitor. Here's the code that defines my interface: (SystemNavigation default allImplementorsOf: #accept: localTo: ParseNode) do: [:methodReference| methodReference compiledMethod messages do: [:sel| ((sel beginsWith: 'visit') and: [sel numArgs = 1]) ifTrue: [ParseNodeVisitor compile: (String streamContents: [:str| str nextPutAll: sel; space; nextPut: $a. methodReference classSymbol first isVowel ifTrue: [str nextPut: $n]. str nextPutAll: methodReference classSymbol]) classified: 'visiting']]]! ]style[(245 14 245 11 89 11 32)i,cblack;,i,cblack;,i,cblack;,i! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitAssignmentNode: anAssignmentNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitBlockNode: aBlockNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitBraceNode: aBraceNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitCascadeNode: aCascadeNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitCommentNode: aCommentNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitConsArrayNode: aConsArrayNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitFieldNode: aFieldNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitFutureNode: aFutureNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitInstanceVariableNode: anInstanceVariableNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitLiteralNode: aLiteralNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitLiteralVariableNode: aLiteralVariableNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitMessageNode: aMessageNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitMethodNode: aMethodNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitNewArrayNode: aNewArrayNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitRemoteTempVectorNode: aRemoteTempVectorNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitReturnNode: aReturnNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitSelectorNode: aSelectorNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:07'! visitTempVariableNode: aTempVariableNode! ! !ParseNodeVisitor methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:32'! visitVariableNode: aVariableNode! ! !ParseNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:36'! accept: aVisitor ^self subclassResponsibility! ! !AssignmentNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:38'! accept: aVisitor aVisitor visitAssignmentNode: self. "N.B. since assigment happens _after_ the value is evaluated the value is visited _first_." value accept: aVisitor. variable accept: aVisitor! ! !BlockNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:40'! accept: aVisitor aVisitor visitBlockNode: self. statements do: [:statement| statement accept: aVisitor]! ! !BraceNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:41'! accept: aVisitor aVisitor visitBraceNode: self. elements do: [:element| element accept: aVisitor]! ! !CommentNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:43'! accept: aVisitor aVisitor visitCommentNode: self! ! !DecompilerConstructor methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:44'! accept: aVisitor "I am not really a ParseNode. Only here to access constants defined in parseNode." self shouldNotImplement! ! !Encoder methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:44'! accept: aVisitor "I am not really a ParseNode. Only here to access constants defined in parseNode." self shouldNotImplement! ! !LiteralNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:48'! accept: aVisitor aVisitor visitLiteralNode: self! ! !MessageNode methodsFor: 'visiting' stamp: 'eem 6/20/2008 15:12'! accept: aVisitor aVisitor visitMessageNode: self. receiver notNil ifTrue: "receiver is nil for cascades" [receiver accept: aVisitor]. selector accept: aVisitor. arguments do: "argument may be nil in a transformed to:do: loop. sigh..." [:argument| argument notNil ifTrue: [argument accept: aVisitor]]! ! !MethodNode methodsFor: 'visiting' stamp: 'eem 7/24/2008 12:07'! accept: aVisitor aVisitor visitMethodNode: self. block accept: aVisitor. ^aVisitor! ! !NewArrayNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:55'! accept: aVisitor aVisitor visitNewArrayNode: self! ! !ReturnNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:58'! accept: aVisitor aVisitor visitReturnNode: self. expr accept: aVisitor! ! !SelectorNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:48'! accept: aVisitor aVisitor visitSelectorNode: self! ! !VariableNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 10:32'! accept: aVisitor aVisitor visitVariableNode: self! ! !FieldNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:49'! accept: aVisitor aVisitor visitFieldNode: self! ! !InstanceVariableNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:50'! accept: aVisitor aVisitor visitInstanceVariableNode: self! ! !LiteralVariableNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:50'! accept: aVisitor aVisitor visitLiteralVariableNode: self! ! !TempVariableNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:51'! accept: aVisitor aVisitor visitTempVariableNode: self! ! !RemoteTempVectorNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:51'! accept: aVisitor aVisitor visitRemoteTempVectorNode: self! ! !CascadeNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:43'! accept: aVisitor aVisitor visitCascadeNode: self. receiver accept: aVisitor. messages do: [:message| message accept: aVisitor]! ! !ConsArrayNode methodsFor: 'visiting' stamp: 'eem 5/30/2008 09:56'! accept: aVisitor aVisitor visitConsArrayNode: self! ! !RemoteTempVectorNode reorganize! ('code generation (closures)' addRemoteTemp:encoder: emitCodeForIndexOf:stack:encoder: emitCodeForLoadFor:stack:encoder: emitCodeForStoreInto:stack:encoder: emitCodeForStorePopInto:stack:encoder: emitCodeForValueOf:stack:encoder: isIndirectTempVector nodeToInitialize: referenceScopesAndIndicesDo: scope sizeCodeForIndexOf:encoder: sizeCodeForLoadFor:encoder: sizeCodeForStoreInto:encoder: sizeCodeForStorePopInto:encoder: sizeCodeForValueOf:encoder:) ('visiting' accept:) ('accessing' remoteTemps) ('debugger access' cleanUpForRegeneration) ('printing' printDefinitionForClosureAnalysisOn:) ! !TempVariableNode reorganize! ('initialize-release' isArg: name:index:type:scope: nowHasDef nowHasRef scope:) ('testing' assignmentCheck:at: isArg isRemote isTemp isUndefTemp isUnusedTemp remoteNode scope) ('printing' printDefinitionForClosureAnalysisOn: printOn:indent: printWithClosureAnalysisOn:indent:) ('tiles' asMorphicSyntaxIn:) ('code generation (new scheme)' emitCodeForLoad:encoder: emitCodeForStorePop:encoder: emitCodeForStore:encoder: emitCodeForValue:encoder: sizeCodeForLoad: sizeCodeForStorePop: sizeCodeForStore: sizeCodeForValue:) ('code generation (closures)' addReadWithin:at: addWriteWithin:at: analyseClosure: analyseTempsWithin:rootNode: beingAssignedToAnalyseTempsWithin:rootNode: definingScope: index: isDefinedWithinBlockExtent: isIndirectTempVector isReferencedWithinBlockExtent: referenceScopesAndIndicesDo:) ('visiting' accept:) ('debugger access' cleanUpForRegeneration) ! !LiteralVariableNode reorganize! ('code generation' emitForValue:on: emitLoad:on: emitStore:on: emitStorePop:on: sizeForStore: sizeForStorePop: sizeForValue:) ('code generation (new scheme)' emitCodeForLoad:encoder: emitCodeForStorePop:encoder: emitCodeForStore:encoder: emitCodeForValue:encoder: sizeCodeForLoad: sizeCodeForStorePop: sizeCodeForStore: sizeCodeForValue:) ('visiting' accept:) ! !InstanceVariableNode reorganize! ('initialize-release' name:index:) ('code generation (new scheme)' emitCodeForStorePop:encoder: emitCodeForStore:encoder: emitCodeForValue:encoder: sizeCodeForStorePop: sizeCodeForStore: sizeCodeForValue:) ('visiting' accept:) ! !FieldNode reorganize! ('testing' assignmentCheck:at:) ('code generation' emitForEffect:on: emitForValue:on: emitLoad:on: emitStorePop:on: emitStore:on: encodeReceiverOn: sizeForEffect: sizeForStorePop: sizeForStore: sizeForValue:) ('accessing' fieldDef) ('initialize-release' fieldDefinition: name:key:index:type:) ('code generation (new scheme)' emitCodeForEffect:encoder: emitCodeForLoad:encoder: emitCodeForStorePop:encoder: emitCodeForStore:encoder: emitCodeForValue:encoder: sizeCodeForEffect: sizeCodeForStorePop: sizeCodeForStore: sizeCodeForValue:) ('visiting' accept:) ! !VariableNode reorganize! ('initialize-release' asStorableNode: name:index:type: name:key:code: name:key:index:type:) ('testing' assignmentCheck:at: canBeSpecialArgument index isSelfPseudoVariable isVariableNode isVariableReference type) ('code generation' emitForReturn:on: emitForValue:on: emitLoad:on: emitStore:on: emitStorePop:on: fieldOffset sizeForReturn: sizeForStore: sizeForStorePop:) ('printing' printOn:indent: printWithClosureAnalysisOn:indent:) ('tiles' asMorphicSyntaxIn: currentValueIn: variableGetterBlockIn:) ('accessing' name) ('code generation (new scheme)' emitCodeForLoad:encoder: emitCodeForReturn:encoder: emitCodeForStorePop:encoder: emitCodeForStore:encoder: emitCodeForValue:encoder: sizeCodeForReturn: sizeCodeForStorePop: sizeCodeForStore: sizeCodeForValue:) ('code generation (closures)' beingAssignedToAnalyseTempsWithin:rootNode:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ! !SelectorNode reorganize! ('code generation' emit:args:on: emit:args:on:super: reserve: size:args:super:) ('printing' printOn:indent: printWithClosureAnalysisOn:indent:) ('inappropriate' emitForEffect:on: emitForValue:on: sizeForEffect: sizeForValue:) ('testing' isPvtSelector) ('initialize-release' name:key:index:type:) ('code generation (new scheme)' emitCodeForEffect:encoder: emitCodeForValue:encoder: emitCode:args:encoder: emitCode:args:encoder:super: sizeCodeForEffect: sizeCodeForValue: sizeCode:args:super:) ('visiting' accept:) ! !ReturnNode reorganize! ('initialize-release' expr: expr:encoder:sourceRange:) ('converting' asReturnNode) ('testing' isReturnSelf isSpecialConstant isVariableReference) ('code generation' code emitForReturn:on: emitForValue:on: sizeForReturn: sizeForValue:) ('printing' expr printOn:indent: printWithClosureAnalysisOn:indent:) ('tiles' asMorphicSyntaxIn:) ('code generation (new scheme)' emitCodeForReturn:encoder: emitCodeForValue:encoder: sizeCodeForReturn: sizeCodeForValue:) ('code generation (closures)' analyseTempsWithin:rootNode:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ! !NewArrayNode reorganize! ('code generation (new scheme)' emitCodeForValue:encoder: sizeCodeForValue:) ('accessing' numElements numElements:) ('visiting' accept:) ('code generation (closures)' analyseTempsWithin:rootNode:) ! !MethodNode reorganize! ('initialize-release' block selector: selector:arguments:precedence:temporaries:block:encoder:primitive: selector:arguments:precedence:temporaries:block:encoder:primitive:properties: sourceText:) ('code generation' encoder generate: generate:ifQuick: parserClass selector) ('converting' asColorizedSmalltalk80Text decompileString decompileText prepareForRegeneration) ('printing' methodClass printOn: printPrimitiveOn: printPropertiesOn: printWithClosureAnalysisOn: sourceText tempNames) ('source mapping' rawSourceRanges rawSourceRangesAndMethodDo:) ('tiles' asMorphicSyntaxIn: asMorphicSyntaxUsing:) ('*VMMaker-C translation' asTranslationMethodOfClass:) ('visiting' accept:) ! !MessageNode reorganize! ('initialize-release' receiver:selector:arguments:precedence: receiver:selector:arguments:precedence:from: receiver:selector:arguments:precedence:from:sourceRange: selector:) ('testing' canCascade isComplex isMessageNode isMessage:receiver:arguments: isReturningIf toDoIncrement: toDoLimit:) ('cascading' cascadeReceiver) ('macro transformations' noteSpecialSelector: toDoFromWhileWithInit: transformCase: transform: transformAnd: transformBoolean: transformIfFalse: transformIfFalseIfTrue: transformIfNil: transformIfNilIfNotNil: transformIfNotNilIfNil: transformIfTrue: transformIfTrueIfFalse: transformOr: transformToDo: transformWhile:) ('code generation' emitCase:on:value: emitForEffect:on: emitForValue:on: emitIf:on:value: emitIfNil:on:value: emitToDo:on:value: emitWhile:on:value: sizeCase:value: sizeForEffect: sizeForValue: sizeIf:value: sizeIfNil:value: sizeToDo:value: sizeWhile:value:) ('printing' asMorphicCaseOn:indent: macroPrinter precedence printCaseOn:indent: printIfNil:indent: printIfNilNotNil:indent: printIfOn:indent: printKeywords:arguments:on:indent: printKeywords:arguments:on:indent:prefix: printOn:indent: printOn:indent:precedence: printParenReceiver:on:indent: printReceiver:on:indent: printToDoOn:indent: printWhileOn:indent: printWithClosureAnalysisCaseOn:indent: printWithClosureAnalysisIfNilNotNil:indent: printWithClosureAnalysisIfNil:indent: printWithClosureAnalysisIfOn:indent: printWithClosureAnalysisKeywords:arguments:on:indent: printWithClosureAnalysisKeywords:arguments:on:indent:prefix: printWithClosureAnalysisOn:indent: printWithClosureAnalysisOn:indent:precedence: printWithClosureAnalysisParenReceiver:on:indent: printWithClosureAnalysisReceiver:on:indent: printWithClosureAnalysisToDoOn:indent: printWithClosureAnalysisWhileOn:indent: test) ('private' checkBlock:as:from: checkBlock:as:from:maxArgs: ifNilReceiver pvtCheckForPvtSelector: receiver:arguments:precedence:) ('equation translation' arguments arguments: eval receiver receiver: selector) ('tiles' asMorphicSyntaxIn: morphFromKeywords:arguments:on:indent:) ('code generation (new scheme)' emitCodeForCase:encoder:value: emitCodeForEffect:encoder: emitCodeForIfNil:encoder:value: emitCodeForIf:encoder:value: emitCodeForToDo:encoder:value: emitCodeForValue:encoder: emitCodeForWhile:encoder:value: sizeCodeForCase:value: sizeCodeForEffect: sizeCodeForIfNil:value: sizeCodeForIf:value: sizeCodeForToDo:value: sizeCodeForValue: sizeCodeForWhile:value:) ('code generation (closures)' analyseTempsWithin:rootNode:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ! !LiteralNode reorganize! ('code generation' emitForValue:on:) ('testing' isConstantNumber isLiteral isSpecialConstant literalValue) ('printing' printOn:indent: printWithClosureAnalysisOn:indent:) ('evaluation' eval) ('tiles' asMorphicSyntaxIn:) ('initialize-release' name:key:index:type:) ('code generation (new scheme)' emitCodeForValue:encoder: sizeCodeForValue:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ! !Encoder reorganize! ('initialize-release' fillDict:with:mapping:to: initScopeAndLiteralTables init:context:notifying: noteSuper nTemps:literals:class: release temps:literals:class:) ('accessing' methodNodeClass selector selector:) ('encoding' cantStoreInto: doItInContextName encodeLiteral: encodeSelector: encodeVariable: encodeVariable:ifUnknown: encodeVariable:sourceRange:ifUnknown: litIndex: sharableLitIndex: undeclared:) ('temps' autoBind: bindAndJuggle: bindArg: bindBlockArg:within: bindBlockTemp: bindBlockTemp:within: bindTemp: bindTemp:in: maxTemp newTemp:) ('results' allLiterals associationForClass literals tempNames tempNodes tempsAndBlockArgs unusedTempNames) ('error handling' notify: notify:at: requestor:) ('source mapping' globalSourceRanges noteSourceRange:forNode: rawSourceRanges sourceMap sourceRangeFor:) ('visiting' accept:) ('private' classEncoding global:name: interactive lookupInPools:ifFound: name:key:class:type:set: possibleNamesFor: possibleVariablesFor: reallyBind: warnAboutShadowed:) ! !DecompilerConstructor reorganize! ('initialize-release' method:class:literals:) ('constructor' codeAnyLitInd: codeAnyLiteral: codeAnySelector: codeArguments:block: codeArguments:temps:block: codeAssignTo:value: codeBlock:returns: codeBrace: codeCascade:messages: codeCascadedMessage:arguments: codeConstants codeEmptyBlock codeInst: codeMessage:selector:arguments: codeMethod:block:tempVars:primitive:class: codeSelector:code: codeSuper codeTemp: codeTemp:named: codeThisContext decodeIfNilWithReceiver:selector:arguments:) ('accessing' maxTempIndex) ('visiting' accept:) ('testing' isForClosures) ! !CommentNode reorganize! ('visiting' accept:) ! !CascadeNode reorganize! ('initialize-release' receiver:messages:) ('code generation' emitForValue:on: sizeForValue:) ('printing' printOn:indent: printOn:indent:precedence: printWithClosureAnalysisOn:indent: printWithClosureAnalysisOn:indent:precedence:) ('tiles' asMorphicSyntaxIn:) ('accessing' receiver) ('code generation (new scheme)' emitCodeForValue:encoder: sizeCodeForValue:) ('code generation (closures)' analyseTempsWithin:rootNode:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ! !BraceNode reorganize! ('initialize-release' elements: elements:sourceLocations: matchBraceStreamReceiver:messages: matchBraceWithReceiver:selector:arguments:) ('testing' blockAssociationCheck: numElements) ('code generation' emitForValue:on: selectorForShortForm: sizeForValue:) ('enumerating' casesForwardDo: casesReverseDo:) ('printing' printOn:indent: printWithClosureAnalysisOn:indent:) ('tiles' asMorphicSyntaxIn:) ('code generation (new scheme)' emitCodeForValue:encoder: sizeCodeForValue:) ('code generation (closures)' analyseTempsWithin:rootNode: elements maxElementsForConsArray) ('visiting' accept:) ! !BlockNode reorganize! ('initialize-release' arguments:statements:returns:from: noteSourceRangeStart:end:encoder: statements:returns:) ('accessing' addArgument: arguments arguments: block closureCreationNode firstArgument nArgsSlot nArgsSlot: numberOfArguments optimized returnLast returnNilIfNoOther returnSelfIfNoOther: startOfLastStatement startOfLastStatement: temporaries temporaries:) ('testing' canBeSpecialArgument generateAsClosure isComplex isJust: isJustCaseError isQuick returns) ('code generation' code emitExceptLast:on: emitForEvaluatedEffect:on: emitForEvaluatedValue:on: emitForValue:on: sizeExceptLast: sizeForEvaluatedEffect: sizeForEvaluatedValue: sizeForValue:) ('printing' printArgumentsOn:indent: printOn:indent: printStatementsOn:indent: printTemporariesOn:indent: printWithClosureAnalysisArgumentsOn:indent: printWithClosureAnalysisOn:indent: printWithClosureAnalysisStatementsOn:indent: printWithClosureAnalysisTemporariesOn:indent:) ('equation translation' statements statements:) ('tiles' asMorphicCollectSyntaxIn: asMorphicSyntaxIn:) ('code generation (new scheme)' emitCodeExceptLast:encoder: emitCodeForEvaluatedEffect:encoder: emitCodeForEvaluatedValue:encoder: emitCodeForValue:encoder: sizeCodeExceptLast: sizeCodeForEvaluatedEffect: sizeCodeForEvaluatedValue: sizeCodeForValue:) ('code generation (closures)' addHoistedTemps: addRemoteTemp:rootNode: analyseArguments:temporaries:rootNode: analyseTempsWithin:rootNode: blockExtent computeCopiedValues: constructClosureCreationNode: emitCodeForClosureValue:encoder: emitCodeForEvaluatedClosureValue:encoder: ifOptimizedBlockHoistTempsInto: noteOptimized postNumberingProcessTemps: reindexingLocalsDo:encoder: sizeCodeForClosureValue: sizeCodeForEvaluatedClosureValue:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ('debugger access' cleanUpForRegeneration) ! !AssignmentNode reorganize! ('initialize-release' toDoIncrement: value variable:value: variable:value:from: variable:value:from:sourceRange:) ('code generation' emitForEffect:on: emitForValue:on: sizeForEffect: sizeForValue:) ('printing' printOn:indent: printOn:indent:precedence: printWithClosureAnalysisOn:indent: printWithClosureAnalysisOn:indent:precedence:) ('equation translation' variable) ('tiles' asMorphicSyntaxIn:) ('code generation (new scheme)' emitCodeForEffect:encoder: emitCodeForValue:encoder: sizeCodeForEffect: sizeCodeForValue:) ('code generation (closures)' analyseTempsWithin:rootNode:) ('*VMMaker-C translation' asTranslatorNode) ('visiting' accept:) ('testing' isAssignmentNode) ! !ParseNode reorganize! ('testing' assignmentCheck:at: canBeSpecialArgument canCascade isArg isAssignmentNode isComplex isConstantNumber isFutureNode isJust: isLiteral isMessageNode isMessage:receiver:arguments: isReturnSelf isReturningIf isSelfPseudoVariable isSpecialConstant isTemp isUndefTemp isUnusedTemp isVariableNode isVariableReference nowHasDef nowHasRef toDoIncrement:) ('code generation' emitBranchOn:dist:pop:on: emitForBlockValue:on: emitForEffect:on: emitForReturn:on: emitJump:on: emitLong:code:on: emitShortOrLong:code:on: pc pc: sizeBranchOn:dist: sizeForBlockValue: sizeForEffect: sizeForReturn: sizeJump: sizeShortOrLong:) ('encoding' encodeSelector:) ('comment' comment comment:) ('converting' asReturnNode) ('printing' nodePrintOn:indent: printCommentOn:indent: printOn: printOn:indent: printOn:indent:precedence: printWithClosureAnalysis printWithClosureAnalysisOn: printWithClosureAnalysisOn:indent: printWithClosureAnalysisOn:indent:precedence:) ('private' ifNilReceiver nextWordFrom:setCharacter: notYetImplemented printSingleComment:on:indent:) ('tiles' addCommentToMorph: asMorphicSyntaxIn: currentValueIn:) ('code generation (new scheme)' emitCodeForBlockValue:encoder: emitCodeForBranchOn:dist:pop:encoder: emitCodeForEffect:encoder: emitCodeForJump:encoder: emitCodeForReturn:encoder: sizeCodeForBlockValue: sizeCodeForEffect: sizeCodeForReturn: sizeCode:forBranchOn:dist: sizeCode:forJump:) ('code generation (closures)' ifOptimizedBlockHoistTempsInto:) ('visiting' accept:) !