UNPKG

amber

Version:

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

1,433 lines (1,367 loc) 201 kB
define(["amber/boot", "amber_core/Compiler-AST", "amber_core/Kernel-Dag", "amber_core/Kernel-Methods", "amber_core/Kernel-Objects"], function($boot){"use strict"; if(!("nilAsValue" in $boot))$boot.nilAsValue=$boot.nilAsReceiver; var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals; $core.addPackage("Compiler-IR"); ($core.packageDescriptors||$core.packages)["Compiler-IR"].innerEval = function (expr) { return eval(expr); }; ($core.packageDescriptors||$core.packages)["Compiler-IR"].transport = {"type":"amd","amdNamespace":"amber_core"}; $core.addClass("IRASTTranslator", $globals.NodeVisitor, ["source", "theClass", "method", "sequence", "nextAlias"], "Compiler-IR"); //>>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", fn: function (anInstruction){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; if(($receiver = anInstruction) == null || $receiver.a$nil){ anInstruction; } else { $1=$recv(anInstruction)._isVariable(); if(!$core.assert($1)){ $recv($self._sequence())._add_(anInstruction); } } return anInstruction; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"addToSequence:",{anInstruction:anInstruction},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["ifNotNil:", "ifFalse:", "isVariable", "add:", "sequence"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "alias:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; var variable; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3,$5,$4,$6,$8,$7; $1=$recv(aNode)._isImmutable(); if($core.assert($1)){ $2=$self._visit_(aNode); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["visit:"]=1; //>>excludeEnd("ctx"); return $2; } $3=$recv($globals.IRVariable)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=1; //>>excludeEnd("ctx"); $5=$recv($globals.AliasVar)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=2; //>>excludeEnd("ctx"); $4=$recv($5)._name_("$".__comma($self._nextAlias())); $recv($3)._variable_($4); $6=$recv($3)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["yourself"]=1; //>>excludeEnd("ctx"); variable=$6; $8=$recv($globals.IRAssignment)._new(); $recv($8)._add_(variable); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["add:"]=1; //>>excludeEnd("ctx"); $recv($8)._add_($self._visit_(aNode)); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["add:"]=2; //>>excludeEnd("ctx"); $7=$recv($8)._yourself(); $self._addToSequence_($7); $recv($recv($self._method())._internalVariables())._add_(variable); return variable; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"alias:",{aNode:aNode,variable:variable},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "alias: aNode\x0a\x09| variable |\x0a\x0a\x09aNode isImmutable ifTrue: [ ^ self visit: aNode ].\x0a\x0a\x09variable := IRVariable new\x0a\x09\x09variable: (AliasVar new name: '$', self nextAlias);\x0a\x09\x09yourself.\x0a\x0a\x09self addToSequence: (IRAssignment new\x0a\x09\x09add: variable;\x0a\x09\x09add: (self visit: aNode);\x0a\x09\x09yourself).\x0a\x0a\x09self method internalVariables add: variable.\x0a\x0a\x09^ variable", referencedClasses: ["IRVariable", "AliasVar", "IRAssignment"], //>>excludeEnd("ide"); messageSends: ["ifTrue:", "isImmutable", "visit:", "variable:", "new", "name:", ",", "nextAlias", "yourself", "addToSequence:", "add:", "internalVariables", "method"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "aliasTemporally:", protocol: "visiting", fn: function (aCollection){ var self=this,$self=this; var threshold,result; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$4,$3; threshold=(0); $recv(aCollection)._withIndexDo_((function(each,i){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $1=$recv(each)._subtreeNeedsAliasing(); if($core.assert($1)){ threshold=i; return threshold; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each,i:i},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["withIndexDo:"]=1; //>>excludeEnd("ctx"); result=$recv($globals.OrderedCollection)._new(); $recv(aCollection)._withIndexDo_((function(each,i){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $2=result; $4=$recv(i).__lt_eq(threshold); if($core.assert($4)){ $3=$self._alias_(each); } else { $3=$self._visit_(each); } return $recv($2)._add_($3); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each,i:i},$ctx1,3)}); //>>excludeEnd("ctx"); })); return result; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"aliasTemporally:",{aCollection:aCollection,threshold:threshold,result:result},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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 result |\x0a\x09threshold := 0.\x0a\x09\x0a\x09aCollection withIndexDo: [ :each :i |\x0a\x09\x09each subtreeNeedsAliasing\x0a\x09\x09\x09ifTrue: [ threshold := i ] ].\x0a\x0a\x09result := OrderedCollection new.\x0a\x09aCollection withIndexDo: [ :each :i |\x0a\x09\x09result add: (i <= threshold\x0a\x09\x09\x09ifTrue: [ self alias: each ]\x0a\x09\x09\x09ifFalse: [ self visit: each ]) ].\x0a\x0a\x09^ result", referencedClasses: ["OrderedCollection"], //>>excludeEnd("ide"); messageSends: ["withIndexDo:", "ifTrue:", "subtreeNeedsAliasing", "new", "add:", "ifTrue:ifFalse:", "<=", "alias:", "visit:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "method", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@method"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "method\x0a\x09^ method", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "method:", protocol: "accessing", fn: function (anIRMethod){ var self=this,$self=this; $self["@method"]=anIRMethod; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRMethod"], source: "method: anIRMethod\x0a\x09method := anIRMethod", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "nextAlias", protocol: "accessing", fn: function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$receiver; $1=$self["@nextAlias"]; if(($receiver = $1) == null || $receiver.a$nil){ $self["@nextAlias"]=(0); $self["@nextAlias"]; } else { $1; } $self["@nextAlias"]=$recv($self["@nextAlias"]).__plus((1)); return $recv($self["@nextAlias"])._asString(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"nextAlias",{},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "nextAlias\x0a\x09nextAlias ifNil: [ nextAlias := 0 ].\x0a\x09nextAlias := nextAlias + 1.\x0a\x09^ nextAlias asString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifNil:", "+", "asString"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "sequence", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@sequence"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "sequence\x0a\x09^ sequence", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "sequence:", protocol: "accessing", fn: function (anIRSequence){ var self=this,$self=this; $self["@sequence"]=anIRSequence; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRSequence"], source: "sequence: anIRSequence\x0a\x09sequence := anIRSequence", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "source", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@source"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "source\x0a\x09^ source", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "source:", protocol: "accessing", fn: function (aString){ var self=this,$self=this; $self["@source"]=aString; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "source: aString\x0a\x09source := aString", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "theClass", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@theClass"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "theClass\x0a\x09^ theClass", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "theClass:", protocol: "accessing", fn: function (aClass){ var self=this,$self=this; $self["@theClass"]=aClass; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aClass"], source: "theClass: aClass\x0a\x09theClass := aClass", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitAssignmentNode:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; var left,right,assignment; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $2,$1; right=$self._visit_($recv(aNode)._right()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["visit:"]=1; //>>excludeEnd("ctx"); left=$self._visit_($recv(aNode)._left()); $2=$recv($globals.IRAssignment)._new(); $recv($2)._add_(left); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["add:"]=1; //>>excludeEnd("ctx"); $recv($2)._add_(right); $1=$recv($2)._yourself(); $self._addToSequence_($1); return left; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitAssignmentNode:",{aNode:aNode,left:left,right:right,assignment:assignment},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["visit:", "right", "left", "addToSequence:", "add:", "new", "yourself"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitBlockNode:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; var closure; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$3,$5,$4,$6,$8,$7; $1=$recv($globals.IRClosure)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=1; //>>excludeEnd("ctx"); $recv($1)._arguments_($recv(aNode)._parameters()); $recv($1)._requiresSmalltalkContext_($recv(aNode)._requiresSmalltalkContext()); $2=$recv(aNode)._scope(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope"]=1; //>>excludeEnd("ctx"); $recv($1)._scope_($2); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope:"]=1; //>>excludeEnd("ctx"); $3=$recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["yourself"]=1; //>>excludeEnd("ctx"); closure=$3; $5=$recv(aNode)._scope(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope"]=2; //>>excludeEnd("ctx"); $4=$recv($5)._temps(); $recv($4)._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $6=closure; $8=$recv($globals.IRTempDeclaration)._new(); $recv($8)._name_($recv(each)._name()); $recv($8)._scope_($recv(aNode)._scope()); $7=$recv($8)._yourself(); return $recv($6)._add_($7); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["add:"]=1; //>>excludeEnd("ctx"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["do:"]=1; //>>excludeEnd("ctx"); $recv($recv(aNode)._dagChildren())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(closure)._add_($self._visit_(each)); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)}); //>>excludeEnd("ctx"); })); return closure; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitBlockNode:",{aNode:aNode,closure:closure},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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\x09aNode dagChildren do: [ :each | closure add: (self visit: each) ].\x0a\x09^ closure", referencedClasses: ["IRClosure", "IRTempDeclaration"], //>>excludeEnd("ide"); messageSends: ["arguments:", "new", "parameters", "requiresSmalltalkContext:", "requiresSmalltalkContext", "scope:", "scope", "yourself", "do:", "temps", "add:", "name:", "name", "dagChildren", "visit:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitBlockSequenceNode:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$4,$3,$5,$8,$7,$6,$10,$13,$12,$11,$9; $1=$recv($globals.IRBlockSequence)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=1; //>>excludeEnd("ctx"); return $self._withSequence_do_($1,(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $2=$recv(aNode)._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["dagChildren"]=1; //>>excludeEnd("ctx"); return $recv($2)._ifNotEmpty_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); $4=$recv(aNode)._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["dagChildren"]=2; //>>excludeEnd("ctx"); $3=$recv($4)._allButLast(); $recv($3)._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx4) { //>>excludeEnd("ctx"); $5=$self._visitOrAlias_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx4.sendIdx["visitOrAlias:"]=1; //>>excludeEnd("ctx"); return $self._addToSequence_($5); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx4.sendIdx["addToSequence:"]=1; //>>excludeEnd("ctx"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx4) {$ctx4.fillBlock({each:each},$ctx3,3)}); //>>excludeEnd("ctx"); })); $8=$recv(aNode)._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["dagChildren"]=3; //>>excludeEnd("ctx"); $7=$recv($8)._last(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["last"]=1; //>>excludeEnd("ctx"); $6=$recv($7)._isReturnNode(); if($core.assert($6)){ return $self._addToSequence_($self._visitOrAlias_($recv($recv(aNode)._dagChildren())._last())); } else { $10=$recv($globals.IRBlockReturn)._new(); $13=$recv(aNode)._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["dagChildren"]=4; //>>excludeEnd("ctx"); $12=$recv($13)._last(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["last"]=2; //>>excludeEnd("ctx"); $11=$self._visitOrAlias_($12); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["visitOrAlias:"]=2; //>>excludeEnd("ctx"); $recv($10)._add_($11); $9=$recv($10)._yourself(); return $self._addToSequence_($9); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.sendIdx["addToSequence:"]=2; //>>excludeEnd("ctx"); } //>>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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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 visitOrAlias: each) ].\x0a\x09\x09\x09\x09aNode dagChildren last isReturnNode\x0a\x09\x09\x09\x09\x09ifFalse: [ self addToSequence: (IRBlockReturn new add: (self visitOrAlias: aNode dagChildren last); yourself) ]\x0a\x09\x09\x09\x09\x09ifTrue: [ self addToSequence: (self visitOrAlias: aNode dagChildren last) ] ]]", referencedClasses: ["IRBlockSequence", "IRBlockReturn"], //>>excludeEnd("ide"); messageSends: ["withSequence:do:", "new", "ifNotEmpty:", "dagChildren", "do:", "allButLast", "addToSequence:", "visitOrAlias:", "ifFalse:ifTrue:", "isReturnNode", "last", "add:", "yourself"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitCascadeNode:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; var receiver; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1,$2,$4,$3; receiver=$recv(aNode)._receiver(); $1=$recv(receiver)._isImmutable(); if(!$core.assert($1)){ var alias; alias=$self._alias_(receiver); receiver=$recv($recv($globals.VariableNode)._new())._binding_($recv(alias)._variable()); receiver; } $2=$recv(aNode)._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["dagChildren"]=1; //>>excludeEnd("ctx"); $recv($2)._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"); $4=$recv(aNode)._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["dagChildren"]=2; //>>excludeEnd("ctx"); $3=$recv($4)._allButLast(); $recv($3)._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._addToSequence_($self._visit_(each)); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,3)}); //>>excludeEnd("ctx"); })); return $self._visitOrAlias_($recv($recv(aNode)._dagChildren())._last()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitCascadeNode:",{aNode:aNode,receiver:receiver},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitCascadeNode: aNode\x0a\x09| receiver |\x0a\x09receiver := aNode receiver.\x0a\x09receiver isImmutable 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 visitOrAlias: aNode dagChildren last", referencedClasses: ["VariableNode"], //>>excludeEnd("ide"); messageSends: ["receiver", "ifFalse:", "isImmutable", "alias:", "binding:", "new", "variable", "do:", "dagChildren", "receiver:", "allButLast", "addToSequence:", "visit:", "visitOrAlias:", "last"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitDynamicArrayNode:", protocol: "visiting", fn: 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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["new", "do:", "aliasTemporally:", "dagChildren", "add:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitDynamicDictionaryNode:", protocol: "visiting", fn: 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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["new", "do:", "aliasTemporally:", "dagChildren", "add:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitJSStatementNode:", protocol: "visiting", fn: 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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["source:", "new", "crlfSanitized", "source", "yourself"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitMethodNode:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $2,$3,$4,$1,$6,$5,$7,$9,$10,$11,$8,$12,$14,$13,$15,$17,$19,$20,$18,$21,$16,$23,$22; $2=$recv($globals.IRMethod)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=1; //>>excludeEnd("ctx"); $recv($2)._source_($recv($self._source())._crlfSanitized()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["source:"]=1; //>>excludeEnd("ctx"); $recv($2)._theClass_($self._theClass()); $recv($2)._arguments_($recv(aNode)._arguments()); $recv($2)._selector_($recv(aNode)._selector()); $recv($2)._sendIndexes_($recv(aNode)._sendIndexes()); $recv($2)._requiresSmalltalkContext_($recv(aNode)._requiresSmalltalkContext()); $recv($2)._classReferences_($recv(aNode)._classReferences()); $3=$recv(aNode)._scope(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope"]=1; //>>excludeEnd("ctx"); $recv($2)._scope_($3); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope:"]=1; //>>excludeEnd("ctx"); $4=$recv($2)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["yourself"]=1; //>>excludeEnd("ctx"); $1=$4; $self._method_($1); $6=$recv(aNode)._scope(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope"]=2; //>>excludeEnd("ctx"); $5=$recv($6)._temps(); $recv($5)._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $7=$self._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["method"]=1; //>>excludeEnd("ctx"); $9=$recv($globals.IRTempDeclaration)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["new"]=2; //>>excludeEnd("ctx"); $recv($9)._name_($recv(each)._name()); $10=$recv(aNode)._scope(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["scope"]=3; //>>excludeEnd("ctx"); $recv($9)._scope_($10); $11=$recv($9)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["yourself"]=2; //>>excludeEnd("ctx"); $8=$11; return $recv($7)._add_($8); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["add:"]=1; //>>excludeEnd("ctx"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["do:"]=1; //>>excludeEnd("ctx"); $recv($recv(aNode)._dagChildren())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $12=$self._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["method"]=2; //>>excludeEnd("ctx"); return $recv($12)._add_($self._visit_(each)); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.sendIdx["add:"]=2; //>>excludeEnd("ctx"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)}); //>>excludeEnd("ctx"); })); $14=$recv(aNode)._scope(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["scope"]=4; //>>excludeEnd("ctx"); $13=$recv($14)._hasLocalReturn(); if(!$core.assert($13)){ $15=$self._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["method"]=3; //>>excludeEnd("ctx"); $17=$recv($globals.IRReturn)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=3; //>>excludeEnd("ctx"); $19=$recv($globals.IRVariable)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=4; //>>excludeEnd("ctx"); $recv($19)._variable_($recv($recv($recv(aNode)._scope())._pseudoVars())._at_("self")); $20=$recv($19)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["yourself"]=3; //>>excludeEnd("ctx"); $18=$20; $recv($17)._add_($18); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["add:"]=4; //>>excludeEnd("ctx"); $21=$recv($17)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["yourself"]=4; //>>excludeEnd("ctx"); $16=$21; $recv($15)._add_($16); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["add:"]=3; //>>excludeEnd("ctx"); $23=$recv($globals.IRVerbatim)._new(); $recv($23)._source_(";".__comma($recv($globals.String)._lf())); $22=$recv($23)._yourself(); $recv($15)._add_($22); } return $self._method(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitMethodNode:",{aNode:aNode},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitMethodNode: aNode\x0a\x0a\x09self method: (IRMethod new\x0a\x09\x09source: self source crlfSanitized;\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\x09aNode dagChildren do: [ :each | self method add: (self visit: each) ].\x0a\x0a\x09aNode scope hasLocalReturn ifFalse: [self method\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\x09\x09add: (IRVerbatim new source: ';', String lf; yourself) ].\x0a\x0a\x09^ self method", referencedClasses: ["IRMethod", "IRTempDeclaration", "IRReturn", "IRVariable", "IRVerbatim", "String"], //>>excludeEnd("ide"); messageSends: ["method:", "source:", "new", "crlfSanitized", "source", "theClass:", "theClass", "arguments:", "arguments", "selector:", "selector", "sendIndexes:", "sendIndexes", "requiresSmalltalkContext:", "requiresSmalltalkContext", "classReferences:", "classReferences", "scope:", "scope", "yourself", "do:", "temps", "add:", "method", "name:", "name", "dagChildren", "visit:", "ifFalse:", "hasLocalReturn", "variable:", "at:", "pseudoVars", ",", "lf"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitOrAlias:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv(aNode)._shouldBeAliased(); if($core.assert($1)){ return $self._alias_(aNode); } else { return $self._visit_(aNode); } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitOrAlias:",{aNode:aNode},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitOrAlias: aNode\x0a\x09^ aNode shouldBeAliased\x0a\x09\x09ifTrue: [ self alias: aNode ]\x0a\x09\x09ifFalse: [ self visit: aNode ]", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["ifTrue:ifFalse:", "shouldBeAliased", "alias:", "visit:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitReturnNode:", protocol: "visiting", fn: function (aNode){ var self=this,$self=this; var return_; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$recv(aNode)._nonLocalReturn(); if($core.assert($1)){ return_=$recv($globals.IRNonLocalReturn)._new(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["new"]=1; //>>excludeEnd("ctx"); } else { return_=$recv($globals.IRReturn)._new(); } $recv(return_)._scope_($recv(aNode)._scope()); $recv($recv(aNode)._dagChildren())._do_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(return_)._add_($self._visitOrAlias_(each)); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,3)}); //>>excludeEnd("ctx"); })); return return_; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"visitReturnNode:",{aNode:aNode,return_:return_},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNode"], source: "visitReturnNode: aNode\x0a\x09| return |\x0a\x09return := aNode nonLocalReturn\x0a\x09\x09ifTrue: [ IRNonLocalReturn new ]\x0a\x09\x09ifFalse: [ IRReturn new ].\x0a\x09return scope: aNode scope.\x0a\x09aNode dagChildren do: [ :each |\x0a\x09\x09return add: (self visitOrAlias: each) ].\x0a\x09^ return", referencedClasses: ["IRNonLocalReturn", "IRReturn"], //>>excludeEnd("ide"); messageSends: ["ifTrue:ifFalse:", "nonLocalReturn", "new", "scope:", "scope", "do:", "dagChildren", "add:", "visitOrAlias:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitSendNode:", protocol: "visiting", fn: 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)._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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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\x09index: aNode index.\x0a\x09\x0a\x09(self aliasTemporally: aNode dagChildren) do: [ :each | send add: each ].\x0a\x0a\x09^ send", referencedClasses: ["IRSend"], //>>excludeEnd("ide"); messageSends: ["new", "selector:", "selector", "index:", "index", "do:", "aliasTemporally:", "dagChildren", "add:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitSequenceNode:", protocol: "visiting", fn: 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._visitOrAlias_(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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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 visitOrAlias: each) ] ]", referencedClasses: ["IRSequence"], //>>excludeEnd("ide"); messageSends: ["withSequence:do:", "new", "do:", "dagChildren", "addToSequence:", "visitOrAlias:"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitValueNode:", protocol: "visiting", fn: 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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["value:", "new", "value", "yourself"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "visitVariableNode:", protocol: "visiting", fn: 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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["variable:", "new", "binding", "yourself"] }), $globals.IRASTTranslator); $core.addMethod( $core.method({ selector: "withSequence:do:", protocol: "accessing", fn: 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"); $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},$globals.IRASTTranslator)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["sequence", "sequence:", "value"] }), $globals.IRASTTranslator); $core.addClass("IRInstruction", $globals.DagParentNode, ["parent"], "Compiler-IR"); //>>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", fn: function (anObject){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv(anObject)._parent_(self); return $recv($self._dagChildren())._add_(anObject); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"add:",{anObject:anObject},$globals.IRInstruction)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anObject"], source: "add: anObject\x0a\x09anObject parent: self.\x0a\x09^ self dagChildren add: anObject", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["parent:", "add:", "dagChildren"] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isClosure", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isClosure\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isInlined", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isInlined\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isMethod", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isMethod\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSelf", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSelf\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSend", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSend\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSequence", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSequence\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isSuper", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isSuper\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isTempDeclaration", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isTempDeclaration\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "isVariable", protocol: "testing", fn: function (){ var self=this,$self=this; return false; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isVariable\x0a\x09^ false", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "method", protocol: "accessing", fn: 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",{},$globals.IRInstruction)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "method\x0a\x09^ self parent method", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["method", "parent"] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "needsBoxingAsReceiver", protocol: "testing", fn: function (){ var self=this,$self=this; return true; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "needsBoxingAsReceiver\x0a\x09^ true", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "parent", protocol: "accessing", fn: function (){ var self=this,$self=this; return $self["@parent"]; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "parent\x0a\x09^ parent", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "parent:", protocol: "accessing", fn: function (anIRInstruction){ var self=this,$self=this; $self["@parent"]=anIRInstruction; return self; }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRInstruction"], source: "parent: anIRInstruction\x0a\x09parent := anIRInstruction", referencedClasses: [], //>>excludeEnd("ide"); messageSends: [] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "remove:", protocol: "building", fn: 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},$globals.IRInstruction)}); //>>excludeEnd("ctx"); }, //>>excludeStart("ide", pragmas.excludeIdeData); args: ["anIRInstruction"], source: "remove: anIRInstruction\x0a\x09self dagChildren remove: anIRInstruction", referencedClasses: [], //>>excludeEnd("ide"); messageSends: ["remove:", "dagChildren"] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "replace:with:", protocol: "building", fn: function (anIRInstruction,anotherIRInstruction){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $recv(anotherIRInstruction)._parent_(self); $1=$self._dagChildren(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx1.sendIdx["dagChildren"]=1; //>>excludeEnd("ctx"); $recv($1)._at_put_($recv($self._dagChildren())._indexOf_(anIRInstruction),anotherIRInstruction); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"replace:with:",{anIRInstruction:anIRInstruction,anotherIRInstruction:anotherIRInstruction},$globals.IRInstruction)}); //>>excludeEnd("ctx"); }, //>>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"); messageSends: ["parent:", "at:put:", "dagChildren", "indexOf:"] }), $globals.IRInstruction); $core.addMethod( $core.method({ selector: "replaceWith:", protocol: "building", fn: function (anIRInstruction){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._parent())._replace_with_(self,anIRInstruction); return self; //>>excludeStart("ctx", pragmas.excludeDebugCon