| 
					
				 | 
			
			
				@@ -35,6 +35,49 @@ referencedClasses: ["AliasVar", "IRVariable", "IRAssignment"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.IRASTTranslator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+"_aliasTemporally_", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+selector: "aliasTemporally:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+category: 'visiting', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn: function (aCollection){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx1) { 
var $1,$3,$2,$4,$6,$8,$7,$5,$9; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.locals.threshold=nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.locals.result=nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.locals.threshold=(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=aCollection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$2=(function(each,i){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx2) { 
$3=_st(each)._subtreeNeedsAliasing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if(smalltalk.assert($3)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.locals.threshold=i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return $ctx1.locals.threshold; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st($1)._withIndexDo_($2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.locals.result=_st((smalltalk.OrderedCollection || OrderedCollection))._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$4=aCollection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$5=(function(each,i){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx2) { 
$6=$ctx1.locals.result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$8=_st(i).__lt_eq($ctx1.locals.threshold); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if(smalltalk.assert($8)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$7=_st(self)._alias_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$7=_st(self)._visit_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return _st($6)._add_($7); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+})}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st($4)._withIndexDo_($5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$9=$ctx1.locals.result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return $9; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, self, "aliasTemporally:", [aCollection], smalltalk.IRASTTranslator)}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["aCollection"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "aliasTemporally: aCollection\x0a\x09\x22https://github.com/NicolasPetton/amber/issues/296\x0a    \x0a    If a node is aliased, all preceding ones are aliased as well.\x0a    The tree is iterated twice. First we get the aliasing dependency, \x0a    then the aliasing itself is done\x22\x0a\x0a\x09| threshold result |\x0a    threshold := 0.\x0a    \x0a    aCollection withIndexDo: [ :each :i |\x0a        each subtreeNeedsAliasing\x0a\x09\x09    ifTrue: [ 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    ^result", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["withIndexDo:", "ifTrue:", "subtreeNeedsAliasing", "new", "add:", "ifTrue:ifFalse:", "alias:", "visit:", "<="], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+referencedClasses: ["OrderedCollection"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.IRASTTranslator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 "_method", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.method({ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -163,49 +206,6 @@ referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.IRASTTranslator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-"_temporallyDependentList_", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-selector: "temporallyDependentList:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-category: 'visiting', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-fn: function (nodes){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return smalltalk.withContext(function($ctx1) { 
var $1,$3,$2,$4,$6,$8,$7,$5,$9; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$ctx1.locals.threshold=nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$ctx1.locals.result=nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$ctx1.locals.threshold=(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$1=nodes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$2=(function(each,i){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return smalltalk.withContext(function($ctx2) { 
$3=_st(each)._subtreeNeedsAliasing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-if(smalltalk.assert($3)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$ctx1.locals.threshold=i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return $ctx1.locals.threshold; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-})}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st($1)._withIndexDo_($2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$ctx1.locals.result=_st((smalltalk.OrderedCollection || OrderedCollection))._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$4=nodes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$5=(function(each,i){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return smalltalk.withContext(function($ctx2) { 
$6=$ctx1.locals.result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$8=_st(i).__lt_eq($ctx1.locals.threshold); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-if(smalltalk.assert($8)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$7=_st(self)._alias_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$7=_st(self)._visit_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return _st($6)._add_($7); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-})}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st($4)._withIndexDo_($5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$9=$ctx1.locals.result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return $9; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}, self, "temporallyDependentList:", [nodes], smalltalk.IRASTTranslator)}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-args: ["nodes"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "temporallyDependentList: nodes\x0a\x09| threshold result |\x0a    threshold := 0.\x0a    \x0a    nodes withIndexDo: [ :each :i |\x0a        each subtreeNeedsAliasing\x0a\x09\x09    ifTrue: [ threshold := i ]].\x0a\x0a\x09result := OrderedCollection new.\x0a\x09nodes 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    ^result", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["withIndexDo:", "ifTrue:", "subtreeNeedsAliasing", "new", "add:", "ifTrue:ifFalse:", "alias:", "visit:", "<="], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-referencedClasses: ["OrderedCollection"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-smalltalk.IRASTTranslator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 "_theClass", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.method({ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -380,15 +380,15 @@ var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) { 
var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $ctx1.locals.array=nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $ctx1.locals.array=_st((smalltalk.IRDynamicArray || IRDynamicArray))._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st(_st(self)._temporallyDependentList_(_st(aNode)._nodes()))._do_((function(each){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st(_st(self)._aliasTemporally_(_st(aNode)._nodes()))._do_((function(each){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx2) { 
return _st($ctx1.locals.array)._add_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 })})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $1=$ctx1.locals.array; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }, self, "visitDynamicArrayNode:", [aNode], smalltalk.IRASTTranslator)}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["aNode"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "visitDynamicArrayNode: aNode\x0a\x09| array |\x0a\x09array := IRDynamicArray new.\x0a\x09(self temporallyDependentList: aNode nodes) do: [:each | array add: each].\x0a\x09^ array", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["new", "do:", "add:", "temporallyDependentList:", "nodes"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "visitDynamicArrayNode: aNode\x0a\x09| array |\x0a\x09array := IRDynamicArray new.\x0a\x09(self aliasTemporally: aNode nodes) do: [:each | array add: each].\x0a\x09^ array", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["new", "do:", "add:", "aliasTemporally:", "nodes"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: ["IRDynamicArray"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.IRASTTranslator); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -403,15 +403,15 @@ var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) { 
var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $ctx1.locals.dictionary=nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $ctx1.locals.dictionary=_st((smalltalk.IRDynamicDictionary || IRDynamicDictionary))._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st(_st(self)._temporallyDependentList_(_st(aNode)._nodes()))._do_((function(each){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st(_st(self)._aliasTemporally_(_st(aNode)._nodes()))._do_((function(each){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx2) { 
return _st($ctx1.locals.dictionary)._add_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 })})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $1=$ctx1.locals.dictionary; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }, self, "visitDynamicDictionaryNode:", [aNode], smalltalk.IRASTTranslator)}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["aNode"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "visitDynamicDictionaryNode: aNode\x0a\x09| dictionary |\x0a\x09dictionary := IRDynamicDictionary new.\x0a    (self temporallyDependentList: aNode nodes) do: [:each | dictionary add: each].\x0a\x09^ dictionary", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["new", "do:", "add:", "temporallyDependentList:", "nodes"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "visitDynamicDictionaryNode: aNode\x0a\x09| dictionary |\x0a\x09dictionary := IRDynamicDictionary new.\x0a    (self aliasTemporally: aNode nodes) do: [:each | dictionary add: each].\x0a\x09^ dictionary", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["new", "do:", "add:", "aliasTemporally:", "nodes"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: ["IRDynamicDictionary"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.IRASTTranslator); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -532,7 +532,7 @@ $3=_st(aNode)._superSend(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 if(smalltalk.assert($3)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _st($ctx1.locals.send)._classSend_(_st(_st(self)._theClass())._superclass()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$ctx1.locals.all=_st(self)._temporallyDependentList_(_st([_st(aNode)._receiver()]).__comma(_st(aNode)._arguments())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.locals.all=_st(self)._aliasTemporally_(_st([_st(aNode)._receiver()]).__comma(_st(aNode)._arguments())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $ctx1.locals.receiver=_st($ctx1.locals.all)._first(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 $ctx1.locals.arguments=_st($ctx1.locals.all)._allButFirst(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _st($ctx1.locals.send)._add_($ctx1.locals.receiver); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -543,8 +543,8 @@ $4=$ctx1.locals.send; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return $4; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }, self, "visitSendNode:", [aNode], smalltalk.IRASTTranslator)}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["aNode"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "visitSendNode: aNode\x0a\x09| send all receiver arguments |\x0a\x09send := IRSend new.\x0a\x09send \x0a\x09\x09selector: aNode selector;\x0a\x09\x09index: aNode index.\x0a\x09aNode superSend ifTrue: [ send classSend: self theClass superclass ].\x0a    \x0a    all := self temporallyDependentList: { aNode receiver }, aNode arguments.\x0a\x09receiver := all first.\x0a\x09arguments := all allButFirst.\x0a\x0a\x09send add: receiver.\x0a\x09arguments do: [ :each | send add: each ].\x0a\x0a\x09^ send", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["new", "selector:", "selector", "index:", "index", "ifTrue:", "classSend:", "superclass", "theClass", "superSend", "temporallyDependentList:", ",", "arguments", "receiver", "first", "allButFirst", "add:", "do:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "visitSendNode: aNode\x0a\x09| send all receiver arguments |\x0a\x09send := IRSend new.\x0a\x09send \x0a\x09\x09selector: aNode selector;\x0a\x09\x09index: aNode index.\x0a\x09aNode superSend ifTrue: [ send classSend: self theClass superclass ].\x0a    \x0a    all := self aliasTemporally: { aNode receiver }, aNode arguments.\x0a\x09receiver := all first.\x0a\x09arguments := all allButFirst.\x0a\x0a\x09send add: receiver.\x0a\x09arguments do: [ :each | send add: each ].\x0a\x0a\x09^ send", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["new", "selector:", "selector", "index:", "index", "ifTrue:", "classSend:", "superclass", "theClass", "superSend", "aliasTemporally:", ",", "arguments", "receiver", "first", "allButFirst", "add:", "do:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: ["IRSend"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.IRASTTranslator); 
			 |