|  | @@ -8,7 +8,9 @@ selector: "accept:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (aVisitor) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(aVisitor, "_visitIRInlinedAssignment_", [self]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(aVisitor, "_visitIRInlinedAssignment_", [self]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aVisitor"],
 | 
	
		
			
				|  |  |  source: "accept: aVisitor\x0a\x09^ aVisitor visitIRInlinedAssignment: self",
 | 
	
	
		
			
				|  | @@ -81,7 +83,9 @@ selector: "accept:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (aVisitor) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(aVisitor, "_visitIRInlinedReturn_", [self]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(aVisitor, "_visitIRInlinedReturn_", [self]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aVisitor"],
 | 
	
		
			
				|  |  |  source: "accept: aVisitor\x0a\x09^ aVisitor visitIRInlinedReturn: self",
 | 
	
	
		
			
				|  | @@ -117,7 +121,9 @@ selector: "accept:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (aVisitor) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(aVisitor, "_visitIRInlinedNonLocalReturn_", [self]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(aVisitor, "_visitIRInlinedNonLocalReturn_", [self]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aVisitor"],
 | 
	
		
			
				|  |  |  source: "accept: aVisitor\x0a\x09^ aVisitor visitIRInlinedNonLocalReturn: self",
 | 
	
	
		
			
				|  | @@ -298,96 +304,6 @@ smalltalk.IRInlinedSequence);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addClass('IRAssigningInlinedSequence', smalltalk.IRInlinedSequence, ['assignTo'], 'Compiler-Inlining');
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_accept_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "accept:",
 | 
	
		
			
				|  |  | -category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (aVisitor) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(aVisitor, "_visitIRAssigningInlinedSequence_", [self]);
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["aVisitor"],
 | 
	
		
			
				|  |  | -source: "accept: aVisitor\x0a\x09^ aVisitor visitIRAssigningInlinedSequence: self",
 | 
	
		
			
				|  |  | -messageSends: ["visitIRAssigningInlinedSequence:"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRAssigningInlinedSequence);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_assignTo",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "assignTo",
 | 
	
		
			
				|  |  | -category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function () {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    return self['@assignTo'];
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "assignTo\x0a\x09^ assignTo",
 | 
	
		
			
				|  |  | -messageSends: [],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRAssigningInlinedSequence);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_assignTo_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "assignTo:",
 | 
	
		
			
				|  |  | -category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (anIRInstruction) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    self['@assignTo'] = anIRInstruction;
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["anIRInstruction"],
 | 
	
		
			
				|  |  | -source: "assignTo: anIRInstruction\x0a\x09assignTo := anIRInstruction",
 | 
	
		
			
				|  |  | -messageSends: [],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRAssigningInlinedSequence);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addClass('IRReturningInlinedSequence', smalltalk.IRInlinedSequence, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_accept_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "accept:",
 | 
	
		
			
				|  |  | -category: 'visiting',
 | 
	
		
			
				|  |  | -fn: function (aVisitor) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(aVisitor, "_visitIRReturningInlinedSequence_", [self]);
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["aVisitor"],
 | 
	
		
			
				|  |  | -source: "accept: aVisitor\x0a\x09^ aVisitor visitIRReturningInlinedSequence: self",
 | 
	
		
			
				|  |  | -messageSends: ["visitIRReturningInlinedSequence:"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRReturningInlinedSequence);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addClass('IRNonLocalReturningInlinedSequence', smalltalk.IRReturningInlinedSequence, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_accept_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "accept:",
 | 
	
		
			
				|  |  | -category: 'visiting',
 | 
	
		
			
				|  |  | -fn: function (aVisitor) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(aVisitor, "_visitIRNonLocalReturningInlinedSequence_", [self]);
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["aVisitor"],
 | 
	
		
			
				|  |  | -source: "accept: aVisitor\x0a\x09^ aVisitor visitIRNonLocalReturningInlinedSequence: self",
 | 
	
		
			
				|  |  | -messageSends: ["visitIRNonLocalReturningInlinedSequence:"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRNonLocalReturningInlinedSequence);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addClass('IRInliner', smalltalk.IRVisitor, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  |  smalltalk.IRInliner.comment="I visit an IR tree, inlining message sends and block closures.\x0a\x0aMessage selectors that can be inlined are answered by `IRSendInliner >> #inlinedSelectors`"
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
	
		
			
				|  | @@ -397,11 +313,12 @@ selector: "assignmentInliner",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(smalltalk.IRAssignmentInliner || IRAssignmentInliner, "_new", []);
 | 
	
		
			
				|  |  | -    smalltalk.send($1, "_translator_", [self]);
 | 
	
		
			
				|  |  | -    $2 = smalltalk.send($1, "_yourself", []);
 | 
	
		
			
				|  |  | -    return $2;
 | 
	
		
			
				|  |  | +    var $2, $3, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(smalltalk.IRAssignmentInliner || IRAssignmentInliner, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_translator_", [self]);
 | 
	
		
			
				|  |  | +    $3 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +    $1 = $3;
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "assignmentInliner\x0a\x09^ IRAssignmentInliner new \x0a\x09\x09translator: self;\x0a\x09\x09yourself",
 | 
	
	
		
			
				|  | @@ -417,11 +334,12 @@ selector: "nonLocalReturnInliner",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(smalltalk.IRNonLocalReturnInliner || IRNonLocalReturnInliner, "_new", []);
 | 
	
		
			
				|  |  | -    smalltalk.send($1, "_translator_", [self]);
 | 
	
		
			
				|  |  | -    $2 = smalltalk.send($1, "_yourself", []);
 | 
	
		
			
				|  |  | -    return $2;
 | 
	
		
			
				|  |  | +    var $2, $3, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(smalltalk.IRNonLocalReturnInliner || IRNonLocalReturnInliner, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_translator_", [self]);
 | 
	
		
			
				|  |  | +    $3 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +    $1 = $3;
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "nonLocalReturnInliner\x0a\x09^ IRNonLocalReturnInliner new \x0a\x09\x09translator: self;\x0a\x09\x09yourself",
 | 
	
	
		
			
				|  | @@ -437,11 +355,12 @@ selector: "returnInliner",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(smalltalk.IRReturnInliner || IRReturnInliner, "_new", []);
 | 
	
		
			
				|  |  | -    smalltalk.send($1, "_translator_", [self]);
 | 
	
		
			
				|  |  | -    $2 = smalltalk.send($1, "_yourself", []);
 | 
	
		
			
				|  |  | -    return $2;
 | 
	
		
			
				|  |  | +    var $2, $3, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(smalltalk.IRReturnInliner || IRReturnInliner, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_translator_", [self]);
 | 
	
		
			
				|  |  | +    $3 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +    $1 = $3;
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "returnInliner\x0a\x09^ IRReturnInliner new \x0a\x09\x09translator: self;\x0a\x09\x09yourself",
 | 
	
	
		
			
				|  | @@ -457,11 +376,12 @@ selector: "sendInliner",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(smalltalk.IRSendInliner || IRSendInliner, "_new", []);
 | 
	
		
			
				|  |  | -    smalltalk.send($1, "_translator_", [self]);
 | 
	
		
			
				|  |  | -    $2 = smalltalk.send($1, "_yourself", []);
 | 
	
		
			
				|  |  | -    return $2;
 | 
	
		
			
				|  |  | +    var $2, $3, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(smalltalk.IRSendInliner || IRSendInliner, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_translator_", [self]);
 | 
	
		
			
				|  |  | +    $3 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +    $1 = $3;
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "sendInliner\x0a\x09^ IRSendInliner new \x0a\x09\x09translator: self;\x0a\x09\x09yourself",
 | 
	
	
		
			
				|  | @@ -477,7 +397,9 @@ selector: "shouldInlineAssignment:",
 | 
	
		
			
				|  |  |  category: 'testing',
 | 
	
		
			
				|  |  |  fn: function (anIRAssignment) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(smalltalk.send(anIRAssignment, "_isInlined", []), "_not", []), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRAssignment, "_instructions", []), "_last", []), "_isSend", []), "_and_", [function () {return smalltalk.send(self, "_shouldInlineSend_", [smalltalk.send(smalltalk.send(anIRAssignment, "_instructions", []), "_last", [])]);}]);}]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.send(smalltalk.send(anIRAssignment, "_isInlined", []), "_not", []), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRAssignment, "_instructions", []), "_last", []), "_isSend", []), "_and_", [function () {return smalltalk.send(self, "_shouldInlineSend_", [smalltalk.send(smalltalk.send(anIRAssignment, "_instructions", []), "_last", [])]);}]);}]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRAssignment"],
 | 
	
		
			
				|  |  |  source: "shouldInlineAssignment: anIRAssignment\x0a\x09^ anIRAssignment isInlined not and: [ \x0a\x09\x09anIRAssignment instructions last isSend and: [\x09\x0a\x09\x09\x09self shouldInlineSend: (anIRAssignment instructions last) ]]",
 | 
	
	
		
			
				|  | @@ -493,7 +415,9 @@ selector: "shouldInlineReturn:",
 | 
	
		
			
				|  |  |  category: 'testing',
 | 
	
		
			
				|  |  |  fn: function (anIRReturn) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(smalltalk.send(anIRReturn, "_isInlined", []), "_not", []), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRReturn, "_instructions", []), "_first", []), "_isSend", []), "_and_", [function () {return smalltalk.send(self, "_shouldInlineSend_", [smalltalk.send(smalltalk.send(anIRReturn, "_instructions", []), "_first", [])]);}]);}]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.send(smalltalk.send(anIRReturn, "_isInlined", []), "_not", []), "_and_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRReturn, "_instructions", []), "_first", []), "_isSend", []), "_and_", [function () {return smalltalk.send(self, "_shouldInlineSend_", [smalltalk.send(smalltalk.send(anIRReturn, "_instructions", []), "_first", [])]);}]);}]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRReturn"],
 | 
	
		
			
				|  |  |  source: "shouldInlineReturn: anIRReturn\x0a\x09^ anIRReturn isInlined not and: [ \x0a\x09\x09anIRReturn instructions first isSend and: [\x09\x0a\x09\x09\x09self shouldInlineSend: (anIRReturn instructions first) ]]",
 | 
	
	
		
			
				|  | @@ -509,7 +433,9 @@ selector: "shouldInlineSend:",
 | 
	
		
			
				|  |  |  category: 'testing',
 | 
	
		
			
				|  |  |  fn: function (anIRSend) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(smalltalk.send(anIRSend, "_isInlined", []), "_not", []), "_and_", [function () {return smalltalk.send(smalltalk.IRSendInliner || IRSendInliner, "_shouldInline_", [anIRSend]);}]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.send(smalltalk.send(anIRSend, "_isInlined", []), "_not", []), "_and_", [function () {return smalltalk.send(smalltalk.IRSendInliner || IRSendInliner, "_shouldInline_", [anIRSend]);}]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRSend"],
 | 
	
		
			
				|  |  |  source: "shouldInlineSend: anIRSend\x0a\x09^ anIRSend isInlined not and: [\x0a\x09\x09IRSendInliner shouldInline: anIRSend ]",
 | 
	
	
		
			
				|  | @@ -525,19 +451,21 @@ selector: "transformNonLocalReturn:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (anIRNonLocalReturn) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | +    var $1, $2, $3, $4;
 | 
	
		
			
				|  |  |      var localReturn;
 | 
	
		
			
				|  |  | -    if (smalltalk.assert(smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_canInlineNonLocalReturns", []))) {
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_canInlineNonLocalReturns", []);
 | 
	
		
			
				|  |  | +    if (smalltalk.assert($1)) {
 | 
	
		
			
				|  |  |          smalltalk.send(smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_methodScope", []), "_removeNonLocalReturn_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);
 | 
	
		
			
				|  |  | -        $1 = smalltalk.send(smalltalk.IRReturn || IRReturn, "_new", []);
 | 
	
		
			
				|  |  | -        smalltalk.send($1, "_scope_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);
 | 
	
		
			
				|  |  | -        $2 = smalltalk.send($1, "_yourself", []);
 | 
	
		
			
				|  |  | -        localReturn = $2;
 | 
	
		
			
				|  |  | +        $2 = smalltalk.send(smalltalk.IRReturn || IRReturn, "_new", []);
 | 
	
		
			
				|  |  | +        smalltalk.send($2, "_scope_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);
 | 
	
		
			
				|  |  | +        $3 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +        localReturn = $3;
 | 
	
		
			
				|  |  |          smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_instructions", []), "_do_", [function (each) {return smalltalk.send(localReturn, "_add_", [each]);}]);
 | 
	
		
			
				|  |  |          smalltalk.send(anIRNonLocalReturn, "_replaceWith_", [localReturn]);
 | 
	
		
			
				|  |  |          return localReturn;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_visitIRNonLocalReturn_", [anIRNonLocalReturn], smalltalk.IRVisitor);
 | 
	
		
			
				|  |  | +    $4 = smalltalk.send(self, "_visitIRNonLocalReturn_", [anIRNonLocalReturn], smalltalk.IRVisitor);
 | 
	
		
			
				|  |  | +    return $4;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRNonLocalReturn"],
 | 
	
		
			
				|  |  |  source: "transformNonLocalReturn: anIRNonLocalReturn\x0a\x09\x22Replace a non local return into a local return\x22\x0a\x0a\x09| localReturn |\x0a\x09anIRNonLocalReturn scope canInlineNonLocalReturns ifTrue: [\x0a\x09\x09anIRNonLocalReturn scope methodScope removeNonLocalReturn: anIRNonLocalReturn scope.\x0a\x09\x09localReturn := IRReturn new\x0a\x09\x09\x09scope: anIRNonLocalReturn scope;\x0a\x09\x09\x09yourself.\x0a\x09\x09anIRNonLocalReturn instructions do: [ :each |\x0a\x09\x09\x09localReturn add: each ].\x0a\x09\x09anIRNonLocalReturn replaceWith: localReturn.\x0a\x09\x09^ localReturn ].\x0a\x09^ super visitIRNonLocalReturn: anIRNonLocalReturn",
 | 
	
	
		
			
				|  | @@ -553,7 +481,14 @@ selector: "visitIRAssignment:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (anIRAssignment) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(self, "_shouldInlineAssignment_", [anIRAssignment]), "_ifTrue_ifFalse_", [function () {return smalltalk.send(smalltalk.send(self, "_assignmentInliner", []), "_inlineAssignment_", [anIRAssignment]);}, function () {return smalltalk.send(self, "_visitIRAssignment_", [anIRAssignment], smalltalk.IRVisitor);}]);
 | 
	
		
			
				|  |  | +    var $2, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(self, "_shouldInlineAssignment_", [anIRAssignment]);
 | 
	
		
			
				|  |  | +    if (smalltalk.assert($2)) {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(smalltalk.send(self, "_assignmentInliner", []), "_inlineAssignment_", [anIRAssignment]);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(self, "_visitIRAssignment_", [anIRAssignment], smalltalk.IRVisitor);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRAssignment"],
 | 
	
		
			
				|  |  |  source: "visitIRAssignment: anIRAssignment\x0a\x09^ (self shouldInlineAssignment: anIRAssignment) \x0a\x09\x09ifTrue: [ self assignmentInliner inlineAssignment: anIRAssignment ]\x0a\x09\x09ifFalse: [ super visitIRAssignment: anIRAssignment ]",
 | 
	
	
		
			
				|  | @@ -569,7 +504,14 @@ selector: "visitIRNonLocalReturn:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (anIRNonLocalReturn) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(self, "_shouldInlineReturn_", [anIRNonLocalReturn]), "_ifTrue_ifFalse_", [function () {return smalltalk.send(smalltalk.send(self, "_nonLocalReturnInliner", []), "_inlineReturn_", [anIRNonLocalReturn]);}, function () {return smalltalk.send(self, "_transformNonLocalReturn_", [anIRNonLocalReturn]);}]);
 | 
	
		
			
				|  |  | +    var $2, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(self, "_shouldInlineReturn_", [anIRNonLocalReturn]);
 | 
	
		
			
				|  |  | +    if (smalltalk.assert($2)) {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(smalltalk.send(self, "_nonLocalReturnInliner", []), "_inlineReturn_", [anIRNonLocalReturn]);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(self, "_transformNonLocalReturn_", [anIRNonLocalReturn]);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRNonLocalReturn"],
 | 
	
		
			
				|  |  |  source: "visitIRNonLocalReturn: anIRNonLocalReturn\x0a\x09^ (self shouldInlineReturn: anIRNonLocalReturn) \x0a\x09\x09ifTrue: [ self nonLocalReturnInliner inlineReturn: anIRNonLocalReturn ]\x0a\x09\x09ifFalse: [ self transformNonLocalReturn: anIRNonLocalReturn ]",
 | 
	
	
		
			
				|  | @@ -585,7 +527,14 @@ selector: "visitIRReturn:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (anIRReturn) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(self, "_shouldInlineReturn_", [anIRReturn]), "_ifTrue_ifFalse_", [function () {return smalltalk.send(smalltalk.send(self, "_returnInliner", []), "_inlineReturn_", [anIRReturn]);}, function () {return smalltalk.send(self, "_visitIRReturn_", [anIRReturn], smalltalk.IRVisitor);}]);
 | 
	
		
			
				|  |  | +    var $2, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(self, "_shouldInlineReturn_", [anIRReturn]);
 | 
	
		
			
				|  |  | +    if (smalltalk.assert($2)) {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(smalltalk.send(self, "_returnInliner", []), "_inlineReturn_", [anIRReturn]);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(self, "_visitIRReturn_", [anIRReturn], smalltalk.IRVisitor);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRReturn"],
 | 
	
		
			
				|  |  |  source: "visitIRReturn: anIRReturn\x0a\x09^ (self shouldInlineReturn: anIRReturn) \x0a\x09\x09ifTrue: [ self returnInliner inlineReturn: anIRReturn ]\x0a\x09\x09ifFalse: [ super visitIRReturn: anIRReturn ]",
 | 
	
	
		
			
				|  | @@ -601,7 +550,14 @@ selector: "visitIRSend:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (anIRSend) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.send(self, "_shouldInlineSend_", [anIRSend]), "_ifTrue_ifFalse_", [function () {return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [anIRSend]);}, function () {return smalltalk.send(self, "_visitIRSend_", [anIRSend], smalltalk.IRVisitor);}]);
 | 
	
		
			
				|  |  | +    var $2, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(self, "_shouldInlineSend_", [anIRSend]);
 | 
	
		
			
				|  |  | +    if (smalltalk.assert($2)) {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [anIRSend]);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(self, "_visitIRSend_", [anIRSend], smalltalk.IRVisitor);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRSend"],
 | 
	
		
			
				|  |  |  source: "visitIRSend: anIRSend\x0a\x09^ (self shouldInlineSend: anIRSend)\x0a\x09\x09ifTrue: [ self sendInliner inlineSend: anIRSend ]\x0a\x09\x09ifFalse: [ super visitIRSend: anIRSend ]",
 | 
	
	
		
			
				|  | @@ -614,25 +570,6 @@ smalltalk.IRInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addClass('IRInliningJSTranslator', smalltalk.IRJSTranslator, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  |  smalltalk.IRInliningJSTranslator.comment="I am a specialized JavaScript translator able to write inlined IR instructions to JavaScript stream (`JSStream` instance)."
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_visitIRAssigningInlinedSequence_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "visitIRAssigningInlinedSequence:",
 | 
	
		
			
				|  |  | -category: 'visiting',
 | 
	
		
			
				|  |  | -fn: function (anIRInlinedSequence) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_allButLast", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [function () {return smalltalk.send(self, "_visit_", [each]);}]);}]);
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", []), "_canBeAssigned", []), "_ifTrue_ifFalse_", [function () {$1 = smalltalk.send(self, "_stream", []);smalltalk.send($1, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_assignTo", []), "_variable", []), "_alias", [])]);$2 = smalltalk.send($1, "_nextPutAssignment", []);$2;return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", [])]);}, function () {return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", [])]);}]);}]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["anIRInlinedSequence"],
 | 
	
		
			
				|  |  | -source: "visitIRAssigningInlinedSequence: anIRInlinedSequence\x0a\x0a\x09anIRInlinedSequence instructions allButLast do: [ :each | \x0a\x09\x09self stream nextPutStatementWith: [ self visit: each ]].\x0a\x0a\x09self stream nextPutStatementWith: [\x0a\x09\x09anIRInlinedSequence instructions last canBeAssigned \x0a\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09self stream \x0a\x09\x09\x09\x09\x09nextPutAll: anIRInlinedSequence assignTo variable alias;\x0a                                \x09nextPutAssignment.\x0a\x09\x09\x09\x09self visit: anIRInlinedSequence instructions last ]\x0a\x09\x09\x09ifFalse: [ self visit: anIRInlinedSequence instructions last ]]",
 | 
	
		
			
				|  |  | -messageSends: ["do:", "nextPutStatementWith:", "visit:", "stream", "allButLast", "instructions", "ifTrue:ifFalse:", "nextPutAll:", "alias", "variable", "assignTo", "nextPutAssignment", "last", "canBeAssigned"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRInliningJSTranslator);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_visitIRInlinedAssignment_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
	
		
			
				|  | @@ -713,7 +650,7 @@ fn: function (anIRInlinedIfNilIfNotNil) {
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInlinedIfNilIfNotNil"],
 | 
	
		
			
				|  |  |  source: "visitIRInlinedIfNilIfNotNil: anIRInlinedIfNilIfNotNil\x0a\x09self stream \x0a\x09\x09nextPutIfElse: [ \x0a\x09\x09\x09self stream nextPutAll: '($receiver = '. \x0a\x09\x09\x09self visit: anIRInlinedIfNilIfNotNil instructions first.\x0a\x09\x09\x09self stream nextPutAll: ') == nil || $receiver == undefined' ]\x0a\x09\x09with: [ self visit: anIRInlinedIfNilIfNotNil instructions second ]\x0a\x09\x09with: [ self visit: anIRInlinedIfNilIfNotNil instructions third ]",
 | 
	
		
			
				|  |  | -messageSends: ["nextPutIfElse:with:with:", "stream", "nextPutAll:", "visit:", "first", "instructions", "second", "third"],
 | 
	
		
			
				|  |  | +messageSends: ["nextPutIfElse:with:with:", "nextPutAll:", "stream", "visit:", "first", "instructions", "second", "third"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRInliningJSTranslator);
 | 
	
	
		
			
				|  | @@ -804,42 +741,6 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRInliningJSTranslator);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_visitIRNonLocalReturningInlinedSequence_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "visitIRNonLocalReturningInlinedSequence:",
 | 
	
		
			
				|  |  | -category: 'visiting',
 | 
	
		
			
				|  |  | -fn: function (anIRInlinedSequence) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_allButLast", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [function () {return smalltalk.send(self, "_visit_", [each]);}]);}]);
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", []), "_canBeAssigned", []), "_ifTrue_ifFalse_", [function () {return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutNonLocalReturnWith_", [function () {return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", [])]);}]);}, function () {return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", [])]);}]);}]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["anIRInlinedSequence"],
 | 
	
		
			
				|  |  | -source: "visitIRNonLocalReturningInlinedSequence: anIRInlinedSequence\x0a\x0a\x09anIRInlinedSequence instructions allButLast do: [ :each | \x0a\x09\x09self stream nextPutStatementWith: [ self visit: each ]].\x0a\x0a\x09self stream nextPutStatementWith: [\x0a\x09\x09anIRInlinedSequence instructions last canBeAssigned \x0a\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09self stream nextPutNonLocalReturnWith: [\x0a\x09\x09\x09\x09\x09self visit: anIRInlinedSequence instructions last ]]\x0a\x09\x09\x09ifFalse: [ self visit: anIRInlinedSequence instructions last ]]",
 | 
	
		
			
				|  |  | -messageSends: ["do:", "nextPutStatementWith:", "visit:", "stream", "allButLast", "instructions", "ifTrue:ifFalse:", "nextPutNonLocalReturnWith:", "last", "canBeAssigned"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRInliningJSTranslator);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_visitIRReturningInlinedSequence_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "visitIRReturningInlinedSequence:",
 | 
	
		
			
				|  |  | -category: 'visiting',
 | 
	
		
			
				|  |  | -fn: function (anIRInlinedSequence) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_allButLast", []), "_do_", [function (each) {return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [function () {return smalltalk.send(self, "_visit_", [each]);}]);}]);
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [function () {return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", []), "_canBeAssigned", []), "_ifTrue_ifFalse_", [function () {smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutReturn", []);return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", [])]);}, function () {return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", [])]);}]);}]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["anIRInlinedSequence"],
 | 
	
		
			
				|  |  | -source: "visitIRReturningInlinedSequence: anIRInlinedSequence\x0a\x0a\x09anIRInlinedSequence instructions allButLast do: [ :each | \x0a\x09\x09self stream nextPutStatementWith: [ self visit: each ]].\x0a\x0a\x09self stream nextPutStatementWith: [\x0a\x09\x09anIRInlinedSequence instructions last canBeAssigned \x0a\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09self stream nextPutReturn.\x0a\x09\x09\x09\x09self visit: anIRInlinedSequence instructions last ]\x0a\x09\x09\x09ifFalse: [ self visit: anIRInlinedSequence instructions last ]]",
 | 
	
		
			
				|  |  | -messageSends: ["do:", "nextPutStatementWith:", "visit:", "stream", "allButLast", "instructions", "ifTrue:ifFalse:", "nextPutReturn", "last", "canBeAssigned"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRInliningJSTranslator);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addClass('IRSendInliner', smalltalk.Object, ['send', 'translator'], 'Compiler-Inlining');
 | 
	
	
		
			
				|  | @@ -851,7 +752,9 @@ selector: "ifFalse:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_", [smalltalk.send(smalltalk.IRInlinedIfFalse || IRInlinedIfFalse, "_new", []), anIRInstruction]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_", [smalltalk.send(smalltalk.IRInlinedIfFalse || IRInlinedIfFalse, "_new", []), anIRInstruction]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifFalse: anIRInstruction\x0a\x09^ self inlinedSend: IRInlinedIfFalse new with: anIRInstruction",
 | 
	
	
		
			
				|  | @@ -867,7 +770,9 @@ selector: "ifFalse:ifTrue:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction, anotherIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_perform_withArguments_", [smalltalk.symbolFor("ifTrue:ifFalse:"), [anotherIRInstruction, anIRInstruction]]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_perform_withArguments_", [smalltalk.symbolFor("ifTrue:ifFalse:"), [anotherIRInstruction, anIRInstruction]]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction", "anotherIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifFalse: anIRInstruction ifTrue: anotherIRInstruction\x0a\x09^ self perform: #ifTrue:ifFalse: withArguments: { anotherIRInstruction. anIRInstruction }",
 | 
	
	
		
			
				|  | @@ -883,13 +788,21 @@ selector: "ifNil:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), anIRInstruction, function ($rec) {smalltalk.send($rec, "_scope_", [smalltalk.send(smalltalk.send(anIRInstruction, "_scope", []), "_copy", [])]);smalltalk.send($rec, "_add_", [function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRBlockSequence || IRBlockSequence, "_new", []))]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRClosure || IRClosure, "_new", []))]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | +    var $2, $3, $4, $5, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(smalltalk.IRClosure || IRClosure, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_scope_", [smalltalk.send(smalltalk.send(anIRInstruction, "_scope", []), "_copy", [])]);
 | 
	
		
			
				|  |  | +    $3 = smalltalk.send(smalltalk.IRBlockSequence || IRBlockSequence, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($3, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);
 | 
	
		
			
				|  |  | +    $4 = smalltalk.send($3, "_yourself", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_add_", [$4]);
 | 
	
		
			
				|  |  | +    $5 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), anIRInstruction, $5]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifNil: anIRInstruction\x0a\x09^ self \x0a\x09\x09inlinedSend: IRInlinedIfNilIfNotNil new \x0a\x09\x09with: anIRInstruction\x0a\x09\x09with: (IRClosure new\x0a\x09\x09\x09scope: anIRInstruction scope copy;\x0a\x09\x09\x09add: (IRBlockSequence new\x0a\x09\x09\x09\x09add: self send instructions first;\x0a\x09\x09\x09\x09yourself);\x0a\x09\x09\x09yourself)",
 | 
	
		
			
				|  |  |  messageSends: ["inlinedSend:with:with:", "new", "scope:", "copy", "scope", "add:", "first", "instructions", "send", "yourself"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRInlinedIfNilIfNotNil", "IRBlockSequence", "IRClosure"]
 | 
	
		
			
				|  |  | +referencedClasses: ["IRInlinedIfNilIfNotNil", "IRClosure", "IRBlockSequence"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRSendInliner);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -900,8 +813,9 @@ selector: "ifNil:ifNotNil:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction, anotherIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), anIRInstruction, anotherIRInstruction]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), anIRInstruction, anotherIRInstruction]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction", "anotherIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifNil: anIRInstruction ifNotNil: anotherIRInstruction\x0a\x09^ self inlinedSend: IRInlinedIfNilIfNotNil new with: anIRInstruction with: anotherIRInstruction",
 | 
	
	
		
			
				|  | @@ -917,13 +831,21 @@ selector: "ifNotNil:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), function ($rec) {smalltalk.send($rec, "_scope_", [smalltalk.send(smalltalk.send(anIRInstruction, "_scope", []), "_copy", [])]);smalltalk.send($rec, "_add_", [function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRBlockSequence || IRBlockSequence, "_new", []))]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRClosure || IRClosure, "_new", [])), anIRInstruction]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | +    var $2, $3, $4, $5, $1;
 | 
	
		
			
				|  |  | +    $2 = smalltalk.send(smalltalk.IRClosure || IRClosure, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_scope_", [smalltalk.send(smalltalk.send(anIRInstruction, "_scope", []), "_copy", [])]);
 | 
	
		
			
				|  |  | +    $3 = smalltalk.send(smalltalk.IRBlockSequence || IRBlockSequence, "_new", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($3, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);
 | 
	
		
			
				|  |  | +    $4 = smalltalk.send($3, "_yourself", []);
 | 
	
		
			
				|  |  | +    smalltalk.send($2, "_add_", [$4]);
 | 
	
		
			
				|  |  | +    $5 = smalltalk.send($2, "_yourself", []);
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), $5, anIRInstruction]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifNotNil: anIRInstruction\x0a\x09^ self \x0a\x09\x09inlinedSend: IRInlinedIfNilIfNotNil new\x0a\x09\x09with: (IRClosure new\x0a\x09\x09\x09scope: anIRInstruction scope copy;\x0a\x09\x09\x09add: (IRBlockSequence new\x0a\x09\x09\x09\x09add: self send instructions first;\x0a\x09\x09\x09\x09yourself);\x0a\x09\x09\x09yourself)\x0a\x09\x09with: anIRInstruction",
 | 
	
		
			
				|  |  |  messageSends: ["inlinedSend:with:with:", "new", "scope:", "copy", "scope", "add:", "first", "instructions", "send", "yourself"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRInlinedIfNilIfNotNil", "IRBlockSequence", "IRClosure"]
 | 
	
		
			
				|  |  | +referencedClasses: ["IRInlinedIfNilIfNotNil", "IRClosure", "IRBlockSequence"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRSendInliner);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -934,8 +856,9 @@ selector: "ifNotNil:ifNil:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction, anotherIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), anotherIRInstruction, anIRInstruction]);
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfNilIfNotNil || IRInlinedIfNilIfNotNil, "_new", []), anotherIRInstruction, anIRInstruction]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction", "anotherIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifNotNil: anIRInstruction ifNil: anotherIRInstruction\x0a\x09^ self inlinedSend: IRInlinedIfNilIfNotNil new with: anotherIRInstruction with: anIRInstruction",
 | 
	
	
		
			
				|  | @@ -951,7 +874,9 @@ selector: "ifTrue:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_", [smalltalk.send(smalltalk.IRInlinedIfTrue || IRInlinedIfTrue, "_new", []), anIRInstruction]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_", [smalltalk.send(smalltalk.IRInlinedIfTrue || IRInlinedIfTrue, "_new", []), anIRInstruction]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifTrue: anIRInstruction\x0a\x09^ self inlinedSend: IRInlinedIfTrue new with: anIRInstruction",
 | 
	
	
		
			
				|  | @@ -967,7 +892,9 @@ selector: "ifTrue:ifFalse:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction, anotherIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfTrueIfFalse || IRInlinedIfTrueIfFalse, "_new", []), anIRInstruction, anotherIRInstruction]);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(self, "_inlinedSend_with_with_", [smalltalk.send(smalltalk.IRInlinedIfTrueIfFalse || IRInlinedIfTrueIfFalse, "_new", []), anIRInstruction, anotherIRInstruction]);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRInstruction", "anotherIRInstruction"],
 | 
	
		
			
				|  |  |  source: "ifTrue: anIRInstruction ifFalse: anotherIRInstruction\x0a\x09^ self inlinedSend: IRInlinedIfTrueIfFalse new with: anIRInstruction with: anotherIRInstruction",
 | 
	
	
		
			
				|  | @@ -981,54 +908,23 @@ smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "inlineClosure:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  | -fn: function (anIRClosure) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    var inlinedClosure = nil;
 | 
	
		
			
				|  |  | -    var sequence = nil;
 | 
	
		
			
				|  |  | -    var statements = nil;
 | 
	
		
			
				|  |  | -    inlinedClosure = smalltalk.send(self, "_inlinedClosure", []);
 | 
	
		
			
				|  |  | -    smalltalk.send(inlinedClosure, "_scope_", [smalltalk.send(anIRClosure, "_scope", [])]);
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(anIRClosure, "_instructions", []), "_do_", [function (each) {return ($receiver = smalltalk.send(each, "_isSequence", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(inlinedClosure, "_add_", [each]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(inlinedClosure, "_add_", [each]);}]);}]);
 | 
	
		
			
				|  |  | -    sequence = smalltalk.send(self, "_inlinedSequence", []);
 | 
	
		
			
				|  |  | -    smalltalk.send(inlinedClosure, "_add_", [sequence]);
 | 
	
		
			
				|  |  | -    statements = smalltalk.send(smalltalk.send(smalltalk.send(anIRClosure, "_instructions", []), "_last", []), "_instructions", []);
 | 
	
		
			
				|  |  | -    smalltalk.send(statements, "_ifNotEmpty_", [function () {smalltalk.send(smalltalk.send(statements, "_allButLast", []), "_do_", [function (each) {return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [each])]);}]);return ($receiver = smalltalk.send(smalltalk.send(statements, "_last", []), "_isLocalReturn", [])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(smalltalk.send(smalltalk.send(statements, "_last", []), "_instructions", []), "_first", [])])]);}() : function () {return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(statements, "_last", [])])]);}() : smalltalk.send($receiver, "_ifTrue_ifFalse_", [function () {return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(smalltalk.send(smalltalk.send(statements, "_last", []), "_instructions", []), "_first", [])])]);}, function () {return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(statements, "_last", [])])]);}]);}]);
 | 
	
		
			
				|  |  | -    return inlinedClosure;
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | +fn: function (anIRClosure){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var inlinedClosure=nil;
 | 
	
		
			
				|  |  | +var sequence=nil;
 | 
	
		
			
				|  |  | +var statements=nil;
 | 
	
		
			
				|  |  | +(inlinedClosure=smalltalk.send(self, "_inlinedClosure", []));
 | 
	
		
			
				|  |  | +smalltalk.send(inlinedClosure, "_scope_", [smalltalk.send(anIRClosure, "_scope", [])]);
 | 
	
		
			
				|  |  | +smalltalk.send(smalltalk.send(anIRClosure, "_instructions", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(each, "_isSequence", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(inlinedClosure, "_add_", [each]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(inlinedClosure, "_add_", [each]);})]));})]);
 | 
	
		
			
				|  |  | +(sequence=smalltalk.send(self, "_inlinedSequence", []));
 | 
	
		
			
				|  |  | +smalltalk.send(inlinedClosure, "_add_", [sequence]);
 | 
	
		
			
				|  |  | +(statements=smalltalk.send(smalltalk.send(smalltalk.send(anIRClosure, "_instructions", []), "_last", []), "_instructions", []));
 | 
	
		
			
				|  |  | +smalltalk.send(statements, "_ifNotEmpty_", [(function(){smalltalk.send(smalltalk.send(statements, "_allButLast", []), "_do_", [(function(each){return smalltalk.send(sequence, "_add_", [each]);})]);return ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(statements, "_last", []), "_isReturn", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(statements, "_last", []), "_isBlockReturn", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(statements, "_last", []), "_instructions", []), "_first", [])]);})() : (function(){return smalltalk.send(sequence, "_add_", [smalltalk.send(statements, "_last", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(sequence, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(statements, "_last", []), "_instructions", []), "_first", [])]);}), (function(){return smalltalk.send(sequence, "_add_", [smalltalk.send(statements, "_last", [])]);})]));})]);
 | 
	
		
			
				|  |  | +return inlinedClosure;
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  |  args: ["anIRClosure"],
 | 
	
		
			
				|  |  | -source: "inlineClosure: anIRClosure\x0a\x09| inlinedClosure sequence statements |\x0a\x0a\x09inlinedClosure := self inlinedClosure.\x0a\x09inlinedClosure scope: anIRClosure scope.\x0a\x0a\x09\x22Add the possible temp declarations\x22\x0a\x09anIRClosure instructions do: [ :each | \x0a\x09\x09each isSequence ifFalse: [\x0a\x09\x09\x09inlinedClosure add: each ]].\x0a\x0a\x09\x22Add a block sequence\x22\x0a\x09sequence := self inlinedSequence.\x0a\x09inlinedClosure add: sequence.\x0a\x0a\x09\x22Get all the statements\x22\x0a\x09statements := anIRClosure instructions last instructions.\x0a\x09\x0a\x09statements ifNotEmpty: [\x0a\x09\x09statements allButLast do: [ :each | sequence add: (self translator visit: each) ].\x0a\x09\x09\x22Inlined closures don't have implicit local returns\x22\x0a\x09\x09statements last isLocalReturn \x0a\x09\x09\x09ifTrue: [ sequence add: (self translator visit: statements last instructions first) ]\x0a\x09\x09\x09ifFalse: [ sequence add: (self translator visit: statements last) ]].\x0a\x0a\x09^ inlinedClosure",
 | 
	
		
			
				|  |  | -messageSends: ["inlinedClosure", "scope:", "scope", "do:", "instructions", "ifFalse:", "isSequence", "add:", "inlinedSequence", "last", "ifNotEmpty:", "allButLast", "visit:", "translator", "ifTrue:ifFalse:", "isLocalReturn", "first"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.IRSendInliner);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_inlineMessageBlock_with_",
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "inlineMessageBlock:with:",
 | 
	
		
			
				|  |  | -category: 'inlining',
 | 
	
		
			
				|  |  | -fn: function (anIRInstruction, anotherIRInstruction) {
 | 
	
		
			
				|  |  | -    var self = this;
 | 
	
		
			
				|  |  | -    var $1;
 | 
	
		
			
				|  |  | -    var inlinedSend;
 | 
	
		
			
				|  |  | -    var inlinedClosure;
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(anIRInstruction, "_isClosure", []))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_arguments", []), "_size", []), "__eq", [0]))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    inlinedClosure = smalltalk.send(self, "_inlineClosure_", [anIRInstruction]);
 | 
	
		
			
				|  |  | -    inlinedSend = anotherIRInstruction;
 | 
	
		
			
				|  |  | -    smalltalk.send(inlinedSend, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(inlinedSend, "_add_", [inlinedClosure]);
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(self, "_send", []), "_replaceWith_", [inlinedSend]);
 | 
	
		
			
				|  |  | -    return inlinedSend;
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: ["anIRInstruction", "anotherIRInstruction"],
 | 
	
		
			
				|  |  | -source: "inlineMessageBlock: anIRInstruction with: anotherIRInstruction\x0a\x09| inlinedSend inlinedClosure |\x0a\x0a\x09anIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09inlinedClosure := self inlineClosure: anIRInstruction.\x0a\x0a\x09inlinedSend := anotherIRInstruction.\x0a\x09inlinedSend\x0a\x09\x09add: self send instructions first;\x0a\x09\x09add: inlinedClosure.\x0a\x0a\x09self send replaceWith: inlinedSend.\x0a\x09^ inlinedSend",
 | 
	
		
			
				|  |  | -messageSends: ["ifFalse:", "inliningError:", "isClosure", "=", "size", "arguments", "inlineClosure:", "add:", "first", "instructions", "send", "replaceWith:"],
 | 
	
		
			
				|  |  | +source: "inlineClosure: anIRClosure\x0a\x09| inlinedClosure sequence statements |\x0a\x0a\x09inlinedClosure := self inlinedClosure.\x0a\x09inlinedClosure scope: anIRClosure scope.\x0a\x0a\x09\x22Add the possible temp declarations\x22\x0a\x09anIRClosure instructions do: [ :each | \x0a\x09\x09each isSequence ifFalse: [\x0a\x09\x09\x09inlinedClosure add: each ]].\x0a\x0a\x09\x22Add a block sequence\x22\x0a\x09sequence := self inlinedSequence.\x0a\x09inlinedClosure add: sequence.\x0a\x0a\x09\x22Get all the statements\x22\x0a\x09statements := anIRClosure instructions last instructions.\x0a\x09\x0a\x09statements ifNotEmpty: [\x0a\x09\x09statements allButLast do: [ :each | sequence add: each ].\x0a\x0a\x09\x09\x22Inlined closures don't have implicit local returns\x22\x0a\x09\x09(statements last isReturn and: [ statements last isBlockReturn ])\x0a\x09\x09\x09ifTrue: [ sequence add: statements last instructions first ]\x0a\x09\x09\x09ifFalse: [ sequence add: statements last ] ].\x0a\x0a\x09^ inlinedClosure",
 | 
	
		
			
				|  |  | +messageSends: ["inlinedClosure", "scope:", "scope", "do:", "instructions", "ifFalse:", "isSequence", "add:", "inlinedSequence", "last", "ifNotEmpty:", "allButLast", "ifTrue:ifFalse:", "and:", "isReturn", "isBlockReturn", "first"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRSendInliner);
 | 
	
	
		
			
				|  | @@ -1042,9 +938,10 @@ fn: function (anIRSend) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  |      smalltalk.send(self, "_send_", [anIRSend]);
 | 
	
		
			
				|  |  |      return smalltalk.send(self, "_perform_withArguments_", [smalltalk.send(smalltalk.send(self, "_send", []), "_selector", []), smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_allButFirst", [])]);
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["anIRSend"],
 | 
	
		
			
				|  |  | -source: "inlineSend: anIRSend\x0a\x09self send: anIRSend.\x0a\x09^ self perform: self send selector withArguments: self send instructions allButFirst",
 | 
	
		
			
				|  |  | +source: "inlineSend: anIRSend\x0a\x09self send: anIRSend.\x0a\x09^ self \x0a\x09\x09perform: self send selector \x0a\x09\x09withArguments: self send instructions allButFirst",
 | 
	
		
			
				|  |  |  messageSends: ["send:", "perform:withArguments:", "selector", "send", "allButFirst", "instructions"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
	
		
			
				|  | @@ -1057,7 +954,9 @@ selector: "inlinedClosure",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRInlinedClosure || IRInlinedClosure, "_new", []);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.IRInlinedClosure || IRInlinedClosure, "_new", []);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "inlinedClosure\x0a\x09^ IRInlinedClosure new",
 | 
	
	
		
			
				|  | @@ -1073,23 +972,18 @@ selector: "inlinedSend:with:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (inlinedSend, anIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1;
 | 
	
		
			
				|  |  | -    var inlinedClosure;
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(anIRInstruction, "_isClosure", []))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_arguments", []), "_size", []), "__eq", [0]))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    inlinedClosure = smalltalk.send(self, "_inlineClosure_", [anIRInstruction]);
 | 
	
		
			
				|  |  | -    smalltalk.send(inlinedSend, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(inlinedSend, "_add_", [inlinedClosure]);
 | 
	
		
			
				|  |  | +    var inlinedClosure = nil;
 | 
	
		
			
				|  |  | +    ($receiver = smalltalk.send(anIRInstruction, "_isClosure", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);}]);
 | 
	
		
			
				|  |  | +    ($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_arguments", []), "_size", []), "__eq", [0])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);}]);
 | 
	
		
			
				|  |  | +    inlinedClosure = smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(self, "_inlineClosure_", [anIRInstruction])]);
 | 
	
		
			
				|  |  | +    (function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);return smalltalk.send($rec, "_add_", [inlinedClosure]);}(inlinedSend));
 | 
	
		
			
				|  |  |      smalltalk.send(smalltalk.send(self, "_send", []), "_replaceWith_", [inlinedSend]);
 | 
	
		
			
				|  |  |      return inlinedSend;
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["inlinedSend", "anIRInstruction"],
 | 
	
		
			
				|  |  | -source: "inlinedSend: inlinedSend with: anIRInstruction\x0a\x09| inlinedClosure |\x0a\x0a\x09anIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09inlinedClosure := self inlineClosure: anIRInstruction.\x0a\x0a\x09inlinedSend\x0a\x09\x09add: self send instructions first;\x0a\x09\x09add: inlinedClosure.\x0a\x0a\x09self send replaceWith: inlinedSend.\x0a\x09^ inlinedSend",
 | 
	
		
			
				|  |  | -messageSends: ["ifFalse:", "inliningError:", "isClosure", "=", "size", "arguments", "inlineClosure:", "add:", "first", "instructions", "send", "replaceWith:"],
 | 
	
		
			
				|  |  | +source: "inlinedSend: inlinedSend with: anIRInstruction\x0a\x09| inlinedClosure |\x0a\x0a\x09anIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09inlinedClosure := self translator visit: (self inlineClosure: anIRInstruction).\x0a\x0a\x09inlinedSend\x0a\x09\x09add: self send instructions first;\x0a\x09\x09add: inlinedClosure.\x0a\x0a\x09self send replaceWith: inlinedSend.\x0a\x0a\x09^ inlinedSend",
 | 
	
		
			
				|  |  | +messageSends: ["ifFalse:", "isClosure", "inliningError:", "=", "size", "arguments", "visit:", "translator", "inlineClosure:", "add:", "first", "instructions", "send", "replaceWith:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRSendInliner);
 | 
	
	
		
			
				|  | @@ -1101,32 +995,22 @@ selector: "inlinedSend:with:with:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  |  fn: function (inlinedSend, anIRInstruction, anotherIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1;
 | 
	
		
			
				|  |  | -    var inlinedClosure1;
 | 
	
		
			
				|  |  | -    var inclinedClosure2;
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(anIRInstruction, "_isClosure", []))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_arguments", []), "_size", []), "__eq", [0]))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(anotherIRInstruction, "_isClosure", []))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (!smalltalk.assert(smalltalk.send(smalltalk.send(smalltalk.send(anotherIRInstruction, "_arguments", []), "_size", []), "__eq", [0]))) {
 | 
	
		
			
				|  |  | -        smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    inlinedClosure = smalltalk.send(self, "_inlineClosure_", [anIRInstruction]);
 | 
	
		
			
				|  |  | -    inlinedClosure2 = smalltalk.send(self, "_inlineClosure_", [anotherIRInstruction]);
 | 
	
		
			
				|  |  | -    smalltalk.send(inlinedSend, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);
 | 
	
		
			
				|  |  | -    smalltalk.send(inlinedSend, "_add_", [inlinedClosure]);
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(inlinedSend, "_add_", [inlinedClosure2]);
 | 
	
		
			
				|  |  | +    var inlinedClosure1 = nil;
 | 
	
		
			
				|  |  | +    var inlinedClosure2 = nil;
 | 
	
		
			
				|  |  | +    ($receiver = smalltalk.send(anIRInstruction, "_isClosure", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);}]);
 | 
	
		
			
				|  |  | +    ($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_arguments", []), "_size", []), "__eq", [0])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);}]);
 | 
	
		
			
				|  |  | +    ($receiver = smalltalk.send(anotherIRInstruction, "_isClosure", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(self, "_inliningError_", ["Message argument should be a block"]);}]);
 | 
	
		
			
				|  |  | +    ($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anotherIRInstruction, "_arguments", []), "_size", []), "__eq", [0])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(self, "_inliningError_", ["Inlined block should have zero argument"]);}]);
 | 
	
		
			
				|  |  | +    inlinedClosure1 = smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(self, "_inlineClosure_", [anIRInstruction])]);
 | 
	
		
			
				|  |  | +    inlinedClosure2 = smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [smalltalk.send(self, "_inlineClosure_", [anotherIRInstruction])]);
 | 
	
		
			
				|  |  | +    (function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);smalltalk.send($rec, "_add_", [inlinedClosure1]);return smalltalk.send($rec, "_add_", [inlinedClosure2]);}(inlinedSend));
 | 
	
		
			
				|  |  |      smalltalk.send(smalltalk.send(self, "_send", []), "_replaceWith_", [inlinedSend]);
 | 
	
		
			
				|  |  |      return inlinedSend;
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["inlinedSend", "anIRInstruction", "anotherIRInstruction"],
 | 
	
		
			
				|  |  | -source: "inlinedSend: inlinedSend with: anIRInstruction with: anotherIRInstruction\x0a\x09| inlinedClosure1 inclinedClosure2 |\x0a\x0a\x09anIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09anotherIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anotherIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09inlinedClosure := self inlineClosure: anIRInstruction.\x0a\x09inlinedClosure2 := self inlineClosure: anotherIRInstruction.\x0a\x0a\x09inlinedSend\x0a\x09\x09add: self send instructions first;\x0a\x09\x09add: inlinedClosure;\x0a\x09\x09add: inlinedClosure2.\x0a\x0a\x09self send replaceWith: inlinedSend.\x0a\x09^ inlinedSend",
 | 
	
		
			
				|  |  | -messageSends: ["ifFalse:", "inliningError:", "isClosure", "=", "size", "arguments", "inlineClosure:", "add:", "first", "instructions", "send", "replaceWith:"],
 | 
	
		
			
				|  |  | +source: "inlinedSend: inlinedSend with: anIRInstruction with: anotherIRInstruction\x0a\x09| inlinedClosure1 inlinedClosure2 |\x0a\x0a\x09anIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09anotherIRInstruction isClosure ifFalse: [ self inliningError: 'Message argument should be a block' ].\x0a\x09anotherIRInstruction arguments size = 0 ifFalse: [ self inliningError: 'Inlined block should have zero argument' ].\x0a\x0a\x09inlinedClosure1 := self translator visit: (self inlineClosure: anIRInstruction).\x0a\x09inlinedClosure2 := self translator visit: (self inlineClosure: anotherIRInstruction).\x0a\x0a\x0a\x09inlinedSend\x0a\x09\x09add: self send instructions first;\x0a\x09\x09add: inlinedClosure1;\x0a\x09\x09add: inlinedClosure2.\x0a\x0a\x09self send replaceWith: inlinedSend.\x0a\x09^ inlinedSend",
 | 
	
		
			
				|  |  | +messageSends: ["ifFalse:", "isClosure", "inliningError:", "=", "size", "arguments", "visit:", "translator", "inlineClosure:", "add:", "first", "instructions", "send", "replaceWith:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRSendInliner);
 | 
	
	
		
			
				|  | @@ -1138,7 +1022,9 @@ selector: "inlinedSequence",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRInlinedSequence || IRInlinedSequence, "_new", []);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.IRInlinedSequence || IRInlinedSequence, "_new", []);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "inlinedSequence\x0a\x09^ IRInlinedSequence new",
 | 
	
	
		
			
				|  | @@ -1239,7 +1125,6 @@ category: 'accessing',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  |      return ["ifTrue:", "ifFalse:", "ifTrue:ifFalse:", "ifFalse:ifTrue:", "ifNil:", "ifNotNil:", "ifNil:ifNotNil:", "ifNotNil:ifNil"];
 | 
	
		
			
				|  |  | -    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "inlinedSelectors\x0a\x09^ #('ifTrue:' 'ifFalse:' 'ifTrue:ifFalse:' 'ifFalse:ifTrue:' 'ifNil:' 'ifNotNil:' 'ifNil:ifNotNil:' 'ifNotNil:ifNil')",
 | 
	
	
		
			
				|  | @@ -1255,12 +1140,14 @@ selector: "shouldInline:",
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (anIRInstruction) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | +    var $1, $2;
 | 
	
		
			
				|  |  |      var $early = {};
 | 
	
		
			
				|  |  |      try {
 | 
	
		
			
				|  |  | -        if (!smalltalk.assert(smalltalk.send(smalltalk.send(self, "_inlinedSelectors", []), "_includes_", [smalltalk.send(anIRInstruction, "_selector", [])]))) {
 | 
	
		
			
				|  |  | +        $1 = smalltalk.send(smalltalk.send(self, "_inlinedSelectors", []), "_includes_", [smalltalk.send(anIRInstruction, "_selector", [])]);
 | 
	
		
			
				|  |  | +        if (!smalltalk.assert($1)) {
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_instructions", []), "_allButFirst", []), "_do_", [function (each) {if (!smalltalk.assert(smalltalk.send(each, "_isClosure", []))) {throw $early = [false];}}]);
 | 
	
		
			
				|  |  | +        smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_instructions", []), "_allButFirst", []), "_do_", [function (each) {$2 = smalltalk.send(each, "_isClosure", []);if (!smalltalk.assert($2)) {throw $early = [false];}}]);
 | 
	
		
			
				|  |  |          return true;
 | 
	
		
			
				|  |  |      } catch (e) {
 | 
	
		
			
				|  |  |          if (e === $early) {
 | 
	
	
		
			
				|  | @@ -1335,49 +1222,46 @@ referencedClasses: ["IRInlinedAssignment"]
 | 
	
		
			
				|  |  |  smalltalk.IRAssignmentInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_inlinedSequence",
 | 
	
		
			
				|  |  | +"_inlineClosure_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "inlinedSequence",
 | 
	
		
			
				|  |  | -category: 'factory',
 | 
	
		
			
				|  |  | -fn: function () {
 | 
	
		
			
				|  |  | +selector: "inlineClosure:",
 | 
	
		
			
				|  |  | +category: 'inlining',
 | 
	
		
			
				|  |  | +fn: function (anIRClosure) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(smalltalk.IRAssigningInlinedSequence || IRAssigningInlinedSequence, "_new", []);
 | 
	
		
			
				|  |  | -    smalltalk.send($1, "_assignTo_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_assignment", []), "_instructions", []), "_first", [])]);
 | 
	
		
			
				|  |  | -    $2 = smalltalk.send($1, "_yourself", []);
 | 
	
		
			
				|  |  | -    return $2;
 | 
	
		
			
				|  |  | +    var inlinedClosure = nil;
 | 
	
		
			
				|  |  | +    var statements = nil;
 | 
	
		
			
				|  |  | +    inlinedClosure = smalltalk.send(self, "_inlineClosure_", [anIRClosure], smalltalk.IRAssignmentInliner.superclass || nil);
 | 
	
		
			
				|  |  | +    statements = smalltalk.send(smalltalk.send(smalltalk.send(inlinedClosure, "_instructions", []), "_last", []), "_instructions", []);
 | 
	
		
			
				|  |  | +    smalltalk.send(statements, "_ifNotEmpty_", [function () {return ($receiver = smalltalk.send(smalltalk.send(statements, "_last", []), "_canBeAssigned", [])).klass === smalltalk.Boolean ? $receiver ? function () {return smalltalk.send(smalltalk.send(statements, "_last", []), "_replaceWith_", [function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_assignment", []), "_instructions", []), "_first", [])]);smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(statements, "_last", []), "_copy", [])]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRAssignment || IRAssignment, "_new", []))]);}() : nil : smalltalk.send($receiver, "_ifTrue_", [function () {return smalltalk.send(smalltalk.send(statements, "_last", []), "_replaceWith_", [function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_assignment", []), "_instructions", []), "_first", [])]);smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(statements, "_last", []), "_copy", [])]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRAssignment || IRAssignment, "_new", []))]);}]);}]);
 | 
	
		
			
				|  |  | +    return inlinedClosure;
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "inlinedSequence\x0a\x09^ IRAssigningInlinedSequence new\x0a\x09\x09assignTo: self assignment instructions first;\x0a\x09\x09yourself",
 | 
	
		
			
				|  |  | -messageSends: ["assignTo:", "first", "instructions", "assignment", "new", "yourself"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRAssigningInlinedSequence"]
 | 
	
		
			
				|  |  | +args: ["anIRClosure"],
 | 
	
		
			
				|  |  | +source: "inlineClosure: anIRClosure\x0a\x09| inlinedClosure statements |\x0a\x0a\x09inlinedClosure := super inlineClosure: anIRClosure.\x0a\x09statements := inlinedClosure instructions last instructions.\x0a\x09\x0a\x09statements ifNotEmpty: [\x0a\x09\x09statements last canBeAssigned ifTrue: [\x0a\x09\x09\x09statements last replaceWith: (IRAssignment new\x0a\x09\x09\x09\x09add: self assignment instructions first;\x0a\x09\x09\x09\x09add: statements last copy;\x0a\x09\x09\x09\x09yourself) ] ].\x0a\x0a\x09^ inlinedClosure",
 | 
	
		
			
				|  |  | +messageSends: ["inlineClosure:", "instructions", "last", "ifNotEmpty:", "ifTrue:", "canBeAssigned", "replaceWith:", "add:", "first", "assignment", "copy", "yourself", "new"],
 | 
	
		
			
				|  |  | +referencedClasses: ["IRAssignment"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRAssignmentInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addClass('IRReturnInliner', smalltalk.IRSendInliner, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  | -smalltalk.IRReturnInliner.comment="I inline message sends with inlined closure together with a return instruction."
 | 
	
		
			
				|  |  | +smalltalk.addClass('IRNonLocalReturnInliner', smalltalk.IRSendInliner, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_inlineReturn_",
 | 
	
		
			
				|  |  | +"_inlineClosure_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "inlineReturn:",
 | 
	
		
			
				|  |  | +selector: "inlineClosure:",
 | 
	
		
			
				|  |  |  category: 'inlining',
 | 
	
		
			
				|  |  | -fn: function (anIRReturn) {
 | 
	
		
			
				|  |  | +fn: function (anIRClosure) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var return_;
 | 
	
		
			
				|  |  | -    return_ = smalltalk.send(self, "_inlinedReturn", []);
 | 
	
		
			
				|  |  | -    smalltalk.send(smalltalk.send(anIRReturn, "_instructions", []), "_do_", [function (each) {return smalltalk.send(return_, "_add_", [each]);}]);
 | 
	
		
			
				|  |  | -    smalltalk.send(anIRReturn, "_replaceWith_", [return_]);
 | 
	
		
			
				|  |  | -    smalltalk.send(self, "_inlineSend_", [smalltalk.send(smalltalk.send(return_, "_instructions", []), "_last", [])]);
 | 
	
		
			
				|  |  | -    return return_;
 | 
	
		
			
				|  |  | +    return smalltalk.send(self, "_inlineCLosure_", [anIRClosure], smalltalk.IRNonLocalReturnInliner.superclass || nil);
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  | -args: ["anIRReturn"],
 | 
	
		
			
				|  |  | -source: "inlineReturn: anIRReturn\x0a\x09| return |\x0a\x09return := self inlinedReturn.\x0a\x09anIRReturn instructions do: [ :each |\x0a\x09\x09return add: each ].\x0a\x09anIRReturn replaceWith: return.\x0a\x09self inlineSend: return instructions last.\x0a\x09^ return",
 | 
	
		
			
				|  |  | -messageSends: ["inlinedReturn", "do:", "add:", "instructions", "replaceWith:", "inlineSend:", "last"],
 | 
	
		
			
				|  |  | +args: ["anIRClosure"],
 | 
	
		
			
				|  |  | +source: "inlineClosure: anIRClosure\x0a\x09\x22| inlinedClosure statements |\x0a\x0a\x09inlinedClosure := super inlineClosure: anIRClosure.\x0a\x09statements := inlinedClosure instructions last instructions.\x0a\x09\x0a\x09statements ifNotEmpty: [\x0a\x09\x09statements last replaceWith: (IRNonLocalReturn new\x0a\x09\x09\x09add: statements last copy;\x0a\x09\x09\x09yourself) ].\x0a\x0a\x09^ inlinedClosure\x22\x0a\x0a\x09^ super inlineCLosure: anIRClosure",
 | 
	
		
			
				|  |  | +messageSends: ["inlineCLosure:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.IRReturnInliner);
 | 
	
		
			
				|  |  | +smalltalk.IRNonLocalReturnInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_inlinedReturn",
 | 
	
	
		
			
				|  | @@ -1386,66 +1270,82 @@ selector: "inlinedReturn",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRInlinedReturn || IRInlinedReturn, "_new", []);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.IRInlinedNonLocalReturn || IRInlinedNonLocalReturn, "_new", []);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "inlinedReturn\x0a\x09^ IRInlinedReturn new",
 | 
	
		
			
				|  |  | +source: "inlinedReturn\x0a\x09^ IRInlinedNonLocalReturn new",
 | 
	
		
			
				|  |  |  messageSends: ["new"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRInlinedReturn"]
 | 
	
		
			
				|  |  | +referencedClasses: ["IRInlinedNonLocalReturn"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.IRReturnInliner);
 | 
	
		
			
				|  |  | +smalltalk.IRNonLocalReturnInliner);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addClass('IRReturnInliner', smalltalk.IRSendInliner, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  | +smalltalk.IRReturnInliner.comment="I inline message sends with inlined closure together with a return instruction."
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_inlinedSequence",
 | 
	
		
			
				|  |  | +"_inlineClosure_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "inlinedSequence",
 | 
	
		
			
				|  |  | -category: 'factory',
 | 
	
		
			
				|  |  | -fn: function () {
 | 
	
		
			
				|  |  | +selector: "inlineClosure:",
 | 
	
		
			
				|  |  | +category: 'inlining',
 | 
	
		
			
				|  |  | +fn: function (anIRClosure) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRReturningInlinedSequence || IRReturningInlinedSequence, "_new", []);
 | 
	
		
			
				|  |  | +    var closure = nil;
 | 
	
		
			
				|  |  | +    var statements = nil;
 | 
	
		
			
				|  |  | +    closure = smalltalk.send(self, "_inlineClosure_", [anIRClosure], smalltalk.IRReturnInliner.superclass || nil);
 | 
	
		
			
				|  |  | +    statements = smalltalk.send(smalltalk.send(smalltalk.send(closure, "_instructions", []), "_last", []), "_instructions", []);
 | 
	
		
			
				|  |  | +    smalltalk.send(statements, "_ifNotEmpty_", [function () {return ($receiver = smalltalk.send(smalltalk.send(statements, "_last", []), "_isReturn", [])).klass === smalltalk.Boolean ? !$receiver ? function () {return smalltalk.send(smalltalk.send(statements, "_last", []), "_replaceWith_", [function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(statements, "_last", []), "_copy", [])]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRReturn || IRReturn, "_new", []))]);}() : nil : smalltalk.send($receiver, "_ifFalse_", [function () {return smalltalk.send(smalltalk.send(statements, "_last", []), "_replaceWith_", [function ($rec) {smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(statements, "_last", []), "_copy", [])]);return smalltalk.send($rec, "_yourself", []);}(smalltalk.send(smalltalk.IRReturn || IRReturn, "_new", []))]);}]);}]);
 | 
	
		
			
				|  |  | +    return closure;
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "inlinedSequence\x0a\x09^ IRReturningInlinedSequence new",
 | 
	
		
			
				|  |  | -messageSends: ["new"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRReturningInlinedSequence"]
 | 
	
		
			
				|  |  | +args: ["anIRClosure"],
 | 
	
		
			
				|  |  | +source: "inlineClosure: anIRClosure\x0a\x09| closure statements |\x0a\x0a\x09closure := super inlineClosure: anIRClosure.\x0a\x09statements := closure instructions last instructions.\x0a\x09\x0a\x09statements ifNotEmpty: [\x0a\x09\x09statements last isReturn\x0a\x09\x09\x09ifFalse: [ statements last replaceWith: (IRReturn new\x0a\x09\x09\x09\x09add: statements last copy;\x0a\x09\x09\x09\x09yourself)] ].\x0a\x0a\x09^ closure",
 | 
	
		
			
				|  |  | +messageSends: ["inlineClosure:", "instructions", "last", "ifNotEmpty:", "ifFalse:", "isReturn", "replaceWith:", "add:", "copy", "yourself", "new"],
 | 
	
		
			
				|  |  | +referencedClasses: ["IRReturn"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRReturnInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addClass('IRNonLocalReturnInliner', smalltalk.IRReturnInliner, [], 'Compiler-Inlining');
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_inlinedReturn",
 | 
	
		
			
				|  |  | +"_inlineReturn_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "inlinedReturn",
 | 
	
		
			
				|  |  | -category: 'factory',
 | 
	
		
			
				|  |  | -fn: function () {
 | 
	
		
			
				|  |  | +selector: "inlineReturn:",
 | 
	
		
			
				|  |  | +category: 'inlining',
 | 
	
		
			
				|  |  | +fn: function (anIRReturn) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRInlinedNonLocalReturn || IRInlinedNonLocalReturn, "_new", []);
 | 
	
		
			
				|  |  | +    var return_ = nil;
 | 
	
		
			
				|  |  | +    return_ = smalltalk.send(self, "_inlinedReturn", []);
 | 
	
		
			
				|  |  | +    smalltalk.send(smalltalk.send(anIRReturn, "_instructions", []), "_do_", [function (each) {return smalltalk.send(return_, "_add_", [each]);}]);
 | 
	
		
			
				|  |  | +    smalltalk.send(anIRReturn, "_replaceWith_", [return_]);
 | 
	
		
			
				|  |  | +    smalltalk.send(self, "_inlineSend_", [smalltalk.send(smalltalk.send(return_, "_instructions", []), "_last", [])]);
 | 
	
		
			
				|  |  | +    return return_;
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "inlinedReturn\x0a\x09^ IRInlinedNonLocalReturn new",
 | 
	
		
			
				|  |  | -messageSends: ["new"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRInlinedNonLocalReturn"]
 | 
	
		
			
				|  |  | +args: ["anIRReturn"],
 | 
	
		
			
				|  |  | +source: "inlineReturn: anIRReturn\x0a\x09| return |\x0a\x09return := self inlinedReturn.\x0a\x09anIRReturn instructions do: [ :each |\x0a\x09\x09return add: each ].\x0a\x09anIRReturn replaceWith: return.\x0a\x09self inlineSend: return instructions last.\x0a\x09^ return",
 | 
	
		
			
				|  |  | +messageSends: ["inlinedReturn", "do:", "instructions", "add:", "replaceWith:", "inlineSend:", "last"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.IRNonLocalReturnInliner);
 | 
	
		
			
				|  |  | +smalltalk.IRReturnInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_inlinedSequence",
 | 
	
		
			
				|  |  | +"_inlinedReturn",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "inlinedSequence",
 | 
	
		
			
				|  |  | +selector: "inlinedReturn",
 | 
	
		
			
				|  |  |  category: 'factory',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRNonLocalReturningInlinedSequence ||
 | 
	
		
			
				|  |  | -        IRNonLocalReturningInlinedSequence, "_new", []);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.IRInlinedReturn || IRInlinedReturn, "_new", []);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "inlinedSequence\x0a\x09^ IRNonLocalReturningInlinedSequence new",
 | 
	
		
			
				|  |  | +source: "inlinedReturn\x0a\x09^ IRInlinedReturn new",
 | 
	
		
			
				|  |  |  messageSends: ["new"],
 | 
	
		
			
				|  |  | -referencedClasses: ["IRNonLocalReturningInlinedSequence"]
 | 
	
		
			
				|  |  | +referencedClasses: ["IRInlinedReturn"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.IRNonLocalReturnInliner);
 | 
	
		
			
				|  |  | +smalltalk.IRReturnInliner);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1458,20 +1358,17 @@ selector: "compileNode:",
 | 
	
		
			
				|  |  |  category: 'compiling',
 | 
	
		
			
				|  |  |  fn: function (aNode) {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    var $1, $2;
 | 
	
		
			
				|  |  | -    var ir;
 | 
	
		
			
				|  |  | -    var stream;
 | 
	
		
			
				|  |  | +    var ir = nil;
 | 
	
		
			
				|  |  | +    var stream = nil;
 | 
	
		
			
				|  |  |      smalltalk.send(smalltalk.send(self, "_semanticAnalyzer", []), "_visit_", [aNode]);
 | 
	
		
			
				|  |  |      ir = smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [aNode]);
 | 
	
		
			
				|  |  |      smalltalk.send(smalltalk.send(self, "_inliner", []), "_visit_", [ir]);
 | 
	
		
			
				|  |  | -    $1 = smalltalk.send(self, "_irTranslator", []);
 | 
	
		
			
				|  |  | -    smalltalk.send($1, "_visit_", [ir]);
 | 
	
		
			
				|  |  | -    $2 = smalltalk.send($1, "_contents", []);
 | 
	
		
			
				|  |  | -    return $2;
 | 
	
		
			
				|  |  | +    return function ($rec) {smalltalk.send($rec, "_visit_", [ir]);return smalltalk.send($rec, "_contents", []);}(smalltalk.send(self, "_irTranslator", []));
 | 
	
		
			
				|  |  | +    return self;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aNode"],
 | 
	
		
			
				|  |  | -source: "compileNode: aNode\x0a\x09| ir stream |\x0a\x09self semanticAnalyzer visit: aNode.\x0a\x09ir := self translator visit: aNode.\x0a\x09self inliner visit: ir.\x0a\x09^ self irTranslator\x0a\x09\x09visit: ir;\x0a\x09\x09contents",
 | 
	
		
			
				|  |  | -messageSends: ["visit:", "semanticAnalyzer", "translator", "inliner", "irTranslator", "contents"],
 | 
	
		
			
				|  |  | +source: "compileNode: aNode\x0a\x09| ir stream |\x0a\x0a\x09self semanticAnalyzer visit: aNode.\x0a\x09ir := self translator visit: aNode.\x0a\x09self inliner visit: ir.\x0a\x0a\x09^ self irTranslator\x0a\x09\x09visit: ir;\x0a\x09\x09contents",
 | 
	
		
			
				|  |  | +messageSends: ["visit:", "semanticAnalyzer", "translator", "inliner", "contents", "irTranslator"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.InliningCodeGenerator);
 | 
	
	
		
			
				|  | @@ -1483,7 +1380,9 @@ selector: "inliner",
 | 
	
		
			
				|  |  |  category: 'compiling',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRInliner || IRInliner, "_new", []);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.IRInliner || IRInliner, "_new", []);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "inliner\x0a\x09^ IRInliner new",
 | 
	
	
		
			
				|  | @@ -1499,7 +1398,9 @@ selector: "irTranslator",
 | 
	
		
			
				|  |  |  category: 'compiling',
 | 
	
		
			
				|  |  |  fn: function () {
 | 
	
		
			
				|  |  |      var self = this;
 | 
	
		
			
				|  |  | -    return smalltalk.send(smalltalk.IRInliningJSTranslator || IRInliningJSTranslator, "_new", []);
 | 
	
		
			
				|  |  | +    var $1;
 | 
	
		
			
				|  |  | +    $1 = smalltalk.send(smalltalk.IRInliningJSTranslator || IRInliningJSTranslator, "_new", []);
 | 
	
		
			
				|  |  | +    return $1;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  |  source: "irTranslator\x0a\x09^ IRInliningJSTranslator new",
 |