UNPKG

@ambers/lang

Version:

An implementation of the Smalltalk language that runs on top of the JS runtime.

1,392 lines (1,325 loc) 213 kB
define(["amber/boot", "require", "amber/core/Compiler-AST", "amber/core/Compiler-Core", "amber/core/Compiler-Semantic", "amber/core/Kernel-Dag", "amber/core/Kernel-Objects"], function($boot,requirejs){"use strict"; var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals; var $pkg = $core.addPackage("Compiler-IR"); $pkg.transport = {"type":"amd","amdNamespace":"amber/core"}; $core.addClass("IRASTTranslator", $globals.NodeVisitor, "Compiler-IR"); $core.setSlots($globals.IRASTTranslator, ["source", "theClass", "method", "sequence"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.IRASTTranslator.comment="I am the AST (abstract syntax tree) visitor responsible for building the intermediate representation graph."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "addToSequence:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anInstruction"], source: "addToSequence: anInstruction\x0a\x09anInstruction ifNotNil: [\x0a\x09\x09anInstruction isVariable ifFalse: [\x0a\x09\x09\x09self sequence add: anInstruction ] ].\x0a\x09^ anInstruction", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ifNotNil:", "ifFalse:", "isVariable", "add:", "sequence"] }, function ($methodClass){ return function (anInstruction){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); if(anInstruction != null && !anInstruction.a$nil){ if(!$core.assert($recv(anInstruction)._isVariable())){ $recv($self._sequence())._add_(anInstruction); } } return anInstruction; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"addToSequence:",{anInstruction:anInstruction})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "alias:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anExpressionNode"], source: "alias: anExpressionNode\x0a\x09| assignment |\x0a\x0a\x09anExpressionNode isIdempotent ifTrue: [ ^ self visit: anExpressionNode ].\x0a\x0a\x09assignment := self method newAliasingOf: (self visit: anExpressionNode).\x0a\x09self addToSequence: assignment.\x0a\x0a\x09^ assignment left", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ifTrue:", "isIdempotent", "visit:", "newAliasingOf:", "method", "addToSequence:", "left"] }, function ($methodClass){ return function (anExpressionNode){ var self=this,$self=this; var assignment; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); if($core.assert($recv(anExpressionNode)._isIdempotent())){ return [$self._visit_(anExpressionNode) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["visit:"]=1 //>>excludeEnd("ctx"); ][0]; } assignment=$recv($self._method())._newAliasingOf_($self._visit_(anExpressionNode)); $self._addToSequence_(assignment); return $recv(assignment)._left(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"alias:",{anExpressionNode:anExpressionNode,assignment:assignment})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "aliasTemporally:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aCollection"], source: "aliasTemporally: aCollection\x0a\x09\x22https://lolg.it/amber/amber/issues/296\x0a\x09\x0a\x09If a node is aliased, all preceding ones are aliased as well.\x0a\x09The tree is iterated twice. First we get the aliasing dependency,\x0a\x09then the aliasing itself is done\x22\x0a\x0a\x09| threshold shouldAlias |\x0a\x09shouldAlias := false.\x0a\x09threshold := aCollection reversed\x0a\x09\x09detect: [ :each |\x0a\x09\x09\x09shouldAlias or: [\x0a\x09\x09\x09\x09each shouldBeAliased or: [\x0a\x09\x09\x09\x09\x09(each hasOpeningStatements or: [ each subtreeNeedsAliasing ]) ifTrue: [ shouldAlias := true ].\x0a\x09\x09\x09\x09\x09false ] ] ]\x0a\x09\x09ifNone: [ nil ].\x0a\x09threshold ifNil: [ ^ self visitAll: aCollection ].\x0a\x0a\x09shouldAlias := true.\x0a\x09^ aCollection collect: [ :each |\x0a\x09\x09shouldAlias\x0a\x09\x09\x09ifTrue: [ each == threshold ifTrue: [ shouldAlias := false ]. self alias: each ]\x0a\x09\x09\x09ifFalse: [ self visit: each ] ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["detect:ifNone:", "reversed", "or:", "shouldBeAliased", "ifTrue:", "hasOpeningStatements", "subtreeNeedsAliasing", "ifNil:", "visitAll:", "collect:", "ifTrue:ifFalse:", "==", "alias:", "visit:"] }, function ($methodClass){ return function (aCollection){ var self=this,$self=this; var threshold,shouldAlias; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2; shouldAlias=false; threshold=$recv($recv(aCollection)._reversed())._detect_ifNone_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); if($core.assert(shouldAlias)){ return true; } else { if($core.assert($recv(each)._shouldBeAliased())){ return true; } else { if($core.assert($recv(each)._hasOpeningStatements())){ $1=true; } else { $1=$recv(each)._subtreeNeedsAliasing(); } if($core.assert($1)){ shouldAlias=true; shouldAlias; } return false; } } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); }),(function(){ return nil; })); $2=threshold; if($2 == null || $2.a$nil){ return $self._visitAll_(aCollection); } shouldAlias=true; return $recv(aCollection)._collect_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); if($core.assert(shouldAlias)){ if($core.assert($recv(each).__eq_eq(threshold))){ shouldAlias=false; shouldAlias; } return $self._alias_(each); } else { return $self._visit_(each); } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,8)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"aliasTemporally:",{aCollection:aCollection,threshold:threshold,shouldAlias:shouldAlias})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "method", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "method\x0a\x09^ method", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.method; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "method:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRMethod"], source: "method: anIRMethod\x0a\x09method := anIRMethod", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (anIRMethod){ var self=this,$self=this; $self.method=anIRMethod; return self; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "sequence", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "sequence\x0a\x09^ sequence", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.sequence; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "sequence:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRSequence"], source: "sequence: anIRSequence\x0a\x09sequence := anIRSequence", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (anIRSequence){ var self=this,$self=this; $self.sequence=anIRSequence; return self; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "source", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "source\x0a\x09^ source", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.source; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "source:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "source: aString\x0a\x09source := aString", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aString){ var self=this,$self=this; $self.source=aString; return self; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "theClass", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "theClass\x0a\x09^ theClass", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.theClass; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "theClass:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aClass"], source: "theClass: aClass\x0a\x09theClass := aClass", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aClass){ var self=this,$self=this; $self.theClass=aClass; return self; }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitAssignmentNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitAssignmentNode: aNode\x0a\x09| left right assignment |\x0a\x09right := self visit: aNode right.\x0a\x09left := self visit: aNode left.\x0a\x09self addToSequence: (IRAssignment new\x0a\x09\x09add: left;\x0a\x09\x09add: right;\x0a\x09\x09yourself).\x0a\x09^ left", referencedClasses: ["IRAssignment"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["visit:", "right", "left", "addToSequence:", "add:", "new", "yourself"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var left,right,assignment; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; right=[$self._visit_($recv(aNode)._right()) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["visit:"]=1 //>>excludeEnd("ctx"); ][0]; left=$self._visit_($recv(aNode)._left()); $1=$recv($globals.IRAssignment)._new(); [$recv($1)._add_(left) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["add:"]=1 //>>excludeEnd("ctx"); ][0]; $recv($1)._add_(right); $self._addToSequence_($recv($1)._yourself()); return left; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitAssignmentNode:",{aNode:aNode,left:left,right:right,assignment:assignment})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitBlockNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitBlockNode: aNode\x0a\x09| closure |\x0a\x09closure := IRClosure new\x0a\x09\x09arguments: aNode parameters;\x0a\x09\x09requiresSmalltalkContext: aNode requiresSmalltalkContext;\x0a\x09\x09scope: aNode scope;\x0a\x09\x09yourself.\x0a\x09aNode scope temps do: [ :each |\x0a\x09\x09closure add: (IRTempDeclaration new\x0a\x09\x09\x09name: each name;\x0a\x09\x09\x09scope: aNode scope;\x0a\x09\x09\x09yourself) ].\x0a\x09closure add: (self visit: aNode sequenceNode).\x0a\x09^ closure", referencedClasses: ["IRClosure", "IRTempDeclaration"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["arguments:", "new", "parameters", "requiresSmalltalkContext:", "requiresSmalltalkContext", "scope:", "scope", "yourself", "do:", "temps", "add:", "name:", "name", "visit:", "sequenceNode"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var closure; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3; $1=[$recv($globals.IRClosure)._new() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["new"]=1 //>>excludeEnd("ctx"); ][0]; $recv($1)._arguments_($recv(aNode)._parameters()); $recv($1)._requiresSmalltalkContext_($recv(aNode)._requiresSmalltalkContext()); [$recv($1)._scope_([$recv(aNode)._scope() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope"]=1 //>>excludeEnd("ctx"); ][0]) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope:"]=1 //>>excludeEnd("ctx"); ][0]; closure=[$recv($1)._yourself() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["yourself"]=1 //>>excludeEnd("ctx"); ][0]; $recv($recv([$recv(aNode)._scope() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope"]=2 //>>excludeEnd("ctx"); ][0])._temps())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $2=closure; $3=$recv($globals.IRTempDeclaration)._new(); $recv($3)._name_($recv(each)._name()); $recv($3)._scope_($recv(aNode)._scope()); return [$recv($2)._add_($recv($3)._yourself()) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["add:"]=1 //>>excludeEnd("ctx"); ][0]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); $recv(closure)._add_($self._visit_($recv(aNode)._sequenceNode())); return closure; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitBlockNode:",{aNode:aNode,closure:closure})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitBlockSequenceNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitBlockSequenceNode: aNode\x0a\x09^ self\x0a\x09\x09withSequence: IRBlockSequence new\x0a\x09\x09do: [\x0a\x09\x09\x09aNode dagChildren ifNotEmpty: [\x0a\x09\x09\x09\x09aNode dagChildren allButLast do: [ :each |\x0a\x09\x09\x09\x09\x09self addToSequence: (self visit: each) ].\x0a\x09\x09\x09\x09aNode dagChildren last isReturnNode\x0a\x09\x09\x09\x09\x09ifFalse: [ self addToSequence: (IRBlockReturn new add: (self visit: aNode dagChildren last); yourself) ]\x0a\x09\x09\x09\x09\x09ifTrue: [ self addToSequence: (self visit: aNode dagChildren last) ] ]]", referencedClasses: ["IRBlockSequence", "IRBlockReturn"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["withSequence:do:", "new", "ifNotEmpty:", "dagChildren", "do:", "allButLast", "addToSequence:", "visit:", "ifFalse:ifTrue:", "isReturnNode", "last", "add:", "yourself"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; return $self._withSequence_do_([$recv($globals.IRBlockSequence)._new() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["new"]=1 //>>excludeEnd("ctx"); ][0],(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv([$recv(aNode)._dagChildren() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["dagChildren"]=1 //>>excludeEnd("ctx"); ][0])._ifNotEmpty_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); $recv($recv([$recv(aNode)._dagChildren() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["dagChildren"]=2 //>>excludeEnd("ctx"); ][0])._allButLast())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx4) { //>>excludeEnd("ctx"); return [$self._addToSequence_([$self._visit_(each) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx4.sendIdx["visit:"]=1 //>>excludeEnd("ctx"); ][0]) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx4.sendIdx["addToSequence:"]=1 //>>excludeEnd("ctx"); ][0]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx4) {$ctx4.fillBlock({each:each},$ctx3,3)}); //>>excludeEnd("ctx"); })); if($core.assert($recv([$recv([$recv(aNode)._dagChildren() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["dagChildren"]=3 //>>excludeEnd("ctx"); ][0])._last() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["last"]=1 //>>excludeEnd("ctx"); ][0])._isReturnNode())){ return $self._addToSequence_($self._visit_($recv($recv(aNode)._dagChildren())._last())); } else { $1=$recv($globals.IRBlockReturn)._new(); $recv($1)._add_([$self._visit_([$recv([$recv(aNode)._dagChildren() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["dagChildren"]=4 //>>excludeEnd("ctx"); ][0])._last() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["last"]=2 //>>excludeEnd("ctx"); ][0]) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["visit:"]=2 //>>excludeEnd("ctx"); ][0]); return [$self._addToSequence_($recv($1)._yourself()) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["addToSequence:"]=2 //>>excludeEnd("ctx"); ][0]; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitBlockSequenceNode:",{aNode:aNode})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitCascadeNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitCascadeNode: aNode\x0a\x09| receiver |\x0a\x09receiver := aNode receiver.\x0a\x09receiver isIdempotent ifFalse: [\x0a\x09\x09| alias |\x0a\x09\x09alias := self alias: receiver.\x0a\x09\x09receiver := VariableNode new binding: alias variable ].\x0a\x09aNode dagChildren do: [ :each | each receiver: receiver ].\x0a\x0a\x09aNode dagChildren allButLast do: [ :each |\x0a\x09\x09self addToSequence: (self visit: each) ].\x0a\x0a\x09^ self visit: aNode dagChildren last", referencedClasses: ["VariableNode"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["receiver", "ifFalse:", "isIdempotent", "alias:", "binding:", "new", "variable", "do:", "dagChildren", "receiver:", "allButLast", "addToSequence:", "visit:", "last"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var receiver; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); receiver=$recv(aNode)._receiver(); if(!$core.assert($recv(receiver)._isIdempotent())){ var alias; alias=$self._alias_(receiver); receiver=$recv($recv($globals.VariableNode)._new())._binding_($recv(alias)._variable()); receiver; } [$recv([$recv(aNode)._dagChildren() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["dagChildren"]=1 //>>excludeEnd("ctx"); ][0])._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(each)._receiver_(receiver); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)}); //>>excludeEnd("ctx"); })) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["do:"]=1 //>>excludeEnd("ctx"); ][0]; $recv($recv([$recv(aNode)._dagChildren() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["dagChildren"]=2 //>>excludeEnd("ctx"); ][0])._allButLast())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._addToSequence_([$self._visit_(each) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["visit:"]=1 //>>excludeEnd("ctx"); ][0]); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,3)}); //>>excludeEnd("ctx"); })); return $self._visit_($recv($recv(aNode)._dagChildren())._last()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitCascadeNode:",{aNode:aNode,receiver:receiver})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitDynamicArrayNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitDynamicArrayNode: aNode\x0a\x09| array |\x0a\x09array := IRDynamicArray new.\x0a\x09(self aliasTemporally: aNode dagChildren) do: [ :each | array add: each ].\x0a\x09^ array", referencedClasses: ["IRDynamicArray"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["new", "do:", "aliasTemporally:", "dagChildren", "add:"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var array; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); array=$recv($globals.IRDynamicArray)._new(); $recv($self._aliasTemporally_($recv(aNode)._dagChildren()))._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(array)._add_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); return array; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitDynamicArrayNode:",{aNode:aNode,array:array})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitDynamicDictionaryNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitDynamicDictionaryNode: aNode\x0a\x09| dictionary |\x0a\x09dictionary := IRDynamicDictionary new.\x0a\x09(self aliasTemporally: aNode dagChildren) do: [ :each | dictionary add: each ].\x0a\x09^ dictionary", referencedClasses: ["IRDynamicDictionary"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["new", "do:", "aliasTemporally:", "dagChildren", "add:"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var dictionary; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); dictionary=$recv($globals.IRDynamicDictionary)._new(); $recv($self._aliasTemporally_($recv(aNode)._dagChildren()))._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(dictionary)._add_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); return dictionary; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitDynamicDictionaryNode:",{aNode:aNode,dictionary:dictionary})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitJSStatementNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitJSStatementNode: aNode\x0a\x09^ IRVerbatim new\x0a\x09\x09source: aNode source crlfSanitized;\x0a\x09\x09yourself", referencedClasses: ["IRVerbatim"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["source:", "new", "crlfSanitized", "source", "yourself"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv($globals.IRVerbatim)._new(); $recv($1)._source_($recv($recv(aNode)._source())._crlfSanitized()); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitJSStatementNode:",{aNode:aNode})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitMethodNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitMethodNode: aNode\x0a\x09| irSequence |\x0a\x0a\x09self method: (IRMethod new\x0a\x09\x09source: self source;\x0a\x09\x09pragmas: (aNode pragmas collect: [ :each |\x0a\x09\x09\x09Message\x0a\x09\x09\x09\x09selector: each selector\x0a\x09\x09\x09\x09arguments: (each arguments collect: [ :eachArg |\x0a\x09\x09\x09\x09\x09eachArg isString ifTrue: [ eachArg crlfSanitized ] ifFalse: [ eachArg ]])]);\x0a\x09\x09theClass: self theClass;\x0a\x09\x09arguments: aNode arguments;\x0a\x09\x09selector: aNode selector;\x0a\x09\x09sendIndexes: aNode sendIndexes;\x0a\x09\x09requiresSmalltalkContext: aNode requiresSmalltalkContext;\x0a\x09\x09classReferences: aNode classReferences;\x0a\x09\x09scope: aNode scope;\x0a\x09\x09yourself).\x0a\x0a\x09aNode scope temps do: [ :each |\x0a\x09\x09self method add: (IRTempDeclaration new\x0a\x09\x09\x09name: each name;\x0a\x09\x09\x09scope: aNode scope;\x0a\x09\x09\x09yourself) ].\x0a\x0a\x09self method add: (irSequence := self visit: aNode sequenceNode).\x0a\x0a\x09aNode scope hasLocalReturn ifFalse: [ irSequence\x0a\x09\x09add: (IRReturn new\x0a\x09\x09\x09add: (IRVariable new\x0a\x09\x09\x09\x09variable: (aNode scope pseudoVars at: 'self');\x0a\x09\x09\x09\x09yourself);\x0a\x09\x09\x09yourself) ].\x0a\x0a\x09^ self method", referencedClasses: ["IRMethod", "Message", "IRTempDeclaration", "IRReturn", "IRVariable"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["method:", "source:", "new", "source", "pragmas:", "collect:", "pragmas", "selector:arguments:", "selector", "arguments", "ifTrue:ifFalse:", "isString", "crlfSanitized", "theClass:", "theClass", "arguments:", "selector:", "sendIndexes:", "sendIndexes", "requiresSmalltalkContext:", "requiresSmalltalkContext", "classReferences:", "classReferences", "scope:", "scope", "yourself", "do:", "temps", "add:", "method", "name:", "name", "visit:", "sequenceNode", "ifFalse:", "hasLocalReturn", "variable:", "at:", "pseudoVars"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var irSequence; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3,$4,$5,$6,$7; $1=[$recv($globals.IRMethod)._new() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["new"]=1 //>>excludeEnd("ctx"); ][0]; $recv($1)._source_($self._source()); $recv($1)._pragmas_([$recv($recv(aNode)._pragmas())._collect_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv($globals.Message)._selector_arguments_([$recv(each)._selector() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["selector"]=1 //>>excludeEnd("ctx"); ][0],$recv([$recv(each)._arguments() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["arguments"]=1 //>>excludeEnd("ctx"); ][0])._collect_((function(eachArg){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); if($core.assert($recv(eachArg)._isString())){ return $recv(eachArg)._crlfSanitized(); } else { return eachArg; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({eachArg:eachArg},$ctx2,2)}); //>>excludeEnd("ctx"); }))); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["collect:"]=1 //>>excludeEnd("ctx"); ][0]); $recv($1)._theClass_($self._theClass()); $recv($1)._arguments_($recv(aNode)._arguments()); $recv($1)._selector_($recv(aNode)._selector()); $recv($1)._sendIndexes_($recv(aNode)._sendIndexes()); $recv($1)._requiresSmalltalkContext_($recv(aNode)._requiresSmalltalkContext()); $recv($1)._classReferences_($recv(aNode)._classReferences()); [$recv($1)._scope_([$recv(aNode)._scope() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope"]=1 //>>excludeEnd("ctx"); ][0]) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope:"]=1 //>>excludeEnd("ctx"); ][0]; $self._method_([$recv($1)._yourself() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["yourself"]=1 //>>excludeEnd("ctx"); ][0]); $recv($recv([$recv(aNode)._scope() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope"]=2 //>>excludeEnd("ctx"); ][0])._temps())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $2=[$self._method() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["method"]=1 //>>excludeEnd("ctx"); ][0]; $3=[$recv($globals.IRTempDeclaration)._new() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["new"]=2 //>>excludeEnd("ctx"); ][0]; $recv($3)._name_($recv(each)._name()); $recv($3)._scope_([$recv(aNode)._scope() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["scope"]=3 //>>excludeEnd("ctx"); ][0]); return [$recv($2)._add_([$recv($3)._yourself() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["yourself"]=2 //>>excludeEnd("ctx"); ][0]) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["add:"]=1 //>>excludeEnd("ctx"); ][0]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,5)}); //>>excludeEnd("ctx"); })); $4=[$self._method() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["method"]=2 //>>excludeEnd("ctx"); ][0]; irSequence=$self._visit_($recv(aNode)._sequenceNode()); [$recv($4)._add_(irSequence) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["add:"]=2 //>>excludeEnd("ctx"); ][0]; if(!$core.assert($recv([$recv(aNode)._scope() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["scope"]=4 //>>excludeEnd("ctx"); ][0])._hasLocalReturn())){ $5=irSequence; $6=[$recv($globals.IRReturn)._new() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["new"]=3 //>>excludeEnd("ctx"); ][0]; $7=$recv($globals.IRVariable)._new(); $recv($7)._variable_($recv($recv($recv(aNode)._scope())._pseudoVars())._at_("self")); $recv($6)._add_([$recv($7)._yourself() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["yourself"]=3 //>>excludeEnd("ctx"); ][0]); [$recv($5)._add_($recv($6)._yourself()) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["add:"]=3 //>>excludeEnd("ctx"); ][0]; } return $self._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitMethodNode:",{aNode:aNode,irSequence:irSequence})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitReturnNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitReturnNode: aNode\x0a\x09^ (aNode nonLocalReturn\x0a\x09\x09ifTrue: [ IRNonLocalReturn new ]\x0a\x09\x09ifFalse: [ IRReturn new ])\x0a\x09\x09scope: aNode scope;\x0a\x09\x09add: (self visit: aNode expression);\x0a\x09\x09yourself", referencedClasses: ["IRNonLocalReturn", "IRReturn"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["scope:", "ifTrue:ifFalse:", "nonLocalReturn", "new", "scope", "add:", "visit:", "expression", "yourself"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; if($core.assert($recv(aNode)._nonLocalReturn())){ $1=[$recv($globals.IRNonLocalReturn)._new() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["new"]=1 //>>excludeEnd("ctx"); ][0]; } else { $1=$recv($globals.IRReturn)._new(); } $recv($1)._scope_($recv(aNode)._scope()); $recv($1)._add_($self._visit_($recv(aNode)._expression())); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitReturnNode:",{aNode:aNode})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitSendNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitSendNode: aNode\x0a\x09| send |\x0a\x09send := IRSend new.\x0a\x09send\x0a\x09\x09selector: aNode selector;\x0a\x09\x09javaScriptSelector: aNode javaScriptSelector;\x0a\x09\x09argumentSwitcher: aNode argumentSwitcher;\x0a\x09\x09index: aNode index.\x0a\x09\x0a\x09(self aliasTemporally: aNode dagChildren) do: [ :each | send add: each ].\x0a\x0a\x09^ send", referencedClasses: ["IRSend"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["new", "selector:", "selector", "javaScriptSelector:", "javaScriptSelector", "argumentSwitcher:", "argumentSwitcher", "index:", "index", "do:", "aliasTemporally:", "dagChildren", "add:"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; var send; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; send=$recv($globals.IRSend)._new(); $1=send; $recv($1)._selector_($recv(aNode)._selector()); $recv($1)._javaScriptSelector_($recv(aNode)._javaScriptSelector()); $recv($1)._argumentSwitcher_($recv(aNode)._argumentSwitcher()); $recv($1)._index_($recv(aNode)._index()); $recv($self._aliasTemporally_($recv(aNode)._dagChildren()))._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(send)._add_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); return send; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitSendNode:",{aNode:aNode,send:send})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitSequenceNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitSequenceNode: aNode\x0a\x09^ self\x0a\x09\x09withSequence: IRSequence new\x0a\x09\x09do: [ aNode dagChildren do: [ :each |\x0a\x09\x09\x09self addToSequence: (self visit: each) ] ]", referencedClasses: ["IRSequence"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["withSequence:do:", "new", "do:", "dagChildren", "addToSequence:", "visit:"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._withSequence_do_($recv($globals.IRSequence)._new(),(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv($recv(aNode)._dagChildren())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); return $self._addToSequence_($self._visit_(each)); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({each:each},$ctx2,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitSequenceNode:",{aNode:aNode})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitValueNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitValueNode: aNode\x0a\x09^ IRValue new\x0a\x09\x09value: aNode value;\x0a\x09\x09yourself", referencedClasses: ["IRValue"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["value:", "new", "value", "yourself"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv($globals.IRValue)._new(); $recv($1)._value_($recv(aNode)._value()); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitValueNode:",{aNode:aNode})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitVariableNode:", protocol: "visiting", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitVariableNode: aNode\x0a\x09^ IRVariable new\x0a\x09\x09variable: aNode binding;\x0a\x09\x09yourself", referencedClasses: ["IRVariable"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["variable:", "new", "binding", "yourself"] }, function ($methodClass){ return function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv($globals.IRVariable)._new(); $recv($1)._variable_($recv(aNode)._binding()); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitVariableNode:",{aNode:aNode})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "withSequence:do:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aSequence", "aBlock"], source: "withSequence: aSequence do: aBlock\x0a\x09| outerSequence |\x0a\x09outerSequence := self sequence.\x0a\x09self sequence: aSequence.\x0a\x09aBlock value.\x0a\x09self sequence: outerSequence.\x0a\x09^ aSequence", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["sequence", "sequence:", "value"] }, function ($methodClass){ return function (aSequence,aBlock){ var self=this,$self=this; var outerSequence; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); outerSequence=$self._sequence(); [$self._sequence_(aSequence) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["sequence:"]=1 //>>excludeEnd("ctx"); ][0]; $recv(aBlock)._value(); $self._sequence_(outerSequence); return aSequence; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"withSequence:do:",{aSequence:aSequence,aBlock:aBlock,outerSequence:outerSequence})}); //>>excludeEnd("ctx"); }; }), $globals.IRASTTranslator); $core.addClass("IRAliasFactory", $globals.Object, "Compiler-IR"); $core.setSlots($globals.IRAliasFactory, ["counter"]); $core.addMethod( $core.method({ selector: "initialize", protocol: "initialization", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "initialize\x0a\x09super initialize.\x0a\x09counter := 0", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["initialize"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); [( //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.supercall = true, //>>excludeEnd("ctx"); ($methodClass.superclass||$boot.nilAsClass).fn.prototype._initialize.call($self)) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.supercall = false //>>excludeEnd("ctx"); ][0]; $self.counter=(0); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"initialize",{})}); //>>excludeEnd("ctx"); }; }), $globals.IRAliasFactory); $core.addMethod( $core.method({ selector: "next", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "next\x0a\x09counter := counter + 1.\x0a\x09^ AliasVar new\x0a\x09\x09name: '$', counter asString;\x0a\x09\x09yourself", referencedClasses: ["AliasVar"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["+", "name:", "new", ",", "asString", "yourself"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $self.counter=$recv($self.counter).__plus((1)); $1=$recv($globals.AliasVar)._new(); $recv($1)._name_("$".__comma($recv($self.counter)._asString())); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"next",{})}); //>>excludeEnd("ctx"); }; }), $globals.IRAliasFactory); $core.addClass("IRInstruction", $globals.DagParentNode, "Compiler-IR"); $core.setSlots($globals.IRInstruction, ["parent"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.IRInstruction.comment="I am the abstract root class of the IR (intermediate representation) instructions class hierarchy.\x0aThe IR graph is used to emit JavaScript code using a JSStream."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "add:", protocol: "building", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anObject"], source: "add: anObject\x0a\x09^ self addDagChild: anObject", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["addDagChild:"] }, function ($methodClass){ return function (anObject){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._addDagChild_(anObject); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"add:",{anObject:anObject})}); //>>excludeEnd("ctx"); }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "asReceiver", protocol: "converting", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "asReceiver\x0a\x09\x22Return customized form to act as receiver.\x0a\x09Return self to use standard $recv(...) boxing.\x22\x0a\x09^ nil", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return nil; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isClosure", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isClosure\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isInlined", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isInlined\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isMethod", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isMethod\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSend", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSend\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSequence", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSequence\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSuper", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSuper\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isTempDeclaration", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isTempDeclaration\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isVariable", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isVariable\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return false; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "method", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "method\x0a\x09^ self parent method", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["method", "parent"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._parent())._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"method",{})}); //>>excludeEnd("ctx"); }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "needsBoxingAsReceiver", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "needsBoxingAsReceiver\x0a\x09self deprecatedAPI: 'Use asReceiver isNil instead.'.\x0a\x09^ self asReceiver isNil", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["deprecatedAPI:", "isNil", "asReceiver"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._deprecatedAPI_("Use asReceiver isNil instead."); return $recv($self._asReceiver())._isNil(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"needsBoxingAsReceiver",{})}); //>>excludeEnd("ctx"); }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "parent", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "parent\x0a\x09^ parent", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.parent; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "parent:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRInstruction"], source: "parent: anIRInstruction\x0a\x09parent := anIRInstruction", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (anIRInstruction){ var self=this,$self=this; $self.parent=anIRInstruction; return self; }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "remove:", protocol: "building", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRInstruction"], source: "remove: anIRInstruction\x0a\x09self dagChildren remove: anIRInstruction", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["remove:", "dagChildren"] }, function ($methodClass){ return function (anIRInstruction){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._dagChildren())._remove_(anIRInstruction); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"remove:",{anIRInstruction:anIRInstruction})}); //>>excludeEnd("ctx"); }; }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "replace:with:", protocol: "building", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRInstruction", "anotherIRInstruction"], source: "replace: anIRInstruction with: anotherIRInstruction\x0a\x09anotherIRInstruction parent: self.\x0a\x09self dagChildren\x0a\x09\x09at: (self dagChildren indexOf: anIRInstruction)\x0a\x09\x09put: anotherIRInstruction", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["parent:", "at:put:", "dagChildren", "indexOf:"] }, function ($methodClass){ return function (anIRInstruction,anotherIRInstruction){ var self=this,$self=this; //>>excludeStar