|
@@ -34,7 +34,7 @@ smalltalk.IRInlinedAssignment);
|
|
|
|
|
|
|
|
|
|
|
|
-smalltalk.addClass('IRInlinedClosure', smalltalk.IRClosure, ['assignTo'], 'Compiler-Inlining');
|
|
|
+smalltalk.addClass('IRInlinedClosure', smalltalk.IRClosure, [], 'Compiler-Inlining');
|
|
|
smalltalk.addMethod(
|
|
|
"_accept_",
|
|
|
smalltalk.method({
|
|
@@ -52,36 +52,39 @@ referencedClasses: []
|
|
|
smalltalk.IRInlinedClosure);
|
|
|
|
|
|
smalltalk.addMethod(
|
|
|
-"_assignTo",
|
|
|
+"_isInlined",
|
|
|
smalltalk.method({
|
|
|
-selector: "assignTo",
|
|
|
-category: 'accessing',
|
|
|
+selector: "isInlined",
|
|
|
+category: 'testing',
|
|
|
fn: function () {
|
|
|
var self=this;
|
|
|
-return self['@assignTo'];
|
|
|
+return true;
|
|
|
return self;},
|
|
|
args: [],
|
|
|
-source: "assignTo\x0a\x09^ assignTo",
|
|
|
+source: "isInlined\x0a\x09^ true",
|
|
|
messageSends: [],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.IRInlinedClosure);
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+smalltalk.addClass('IRInlinedReturn', smalltalk.IRReturn, [], 'Compiler-Inlining');
|
|
|
smalltalk.addMethod(
|
|
|
-"_assignTo_",
|
|
|
+"_accept_",
|
|
|
smalltalk.method({
|
|
|
-selector: "assignTo:",
|
|
|
-category: 'accessing',
|
|
|
-fn: function (aScopeVar) {
|
|
|
+selector: "accept:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (aVisitor) {
|
|
|
var self=this;
|
|
|
-(self['@assignTo']=aScopeVar);
|
|
|
+return smalltalk.send(aVisitor, "_visitIRInlinedReturn_", [self]);
|
|
|
return self;},
|
|
|
-args: ["aScopeVar"],
|
|
|
-source: "assignTo: aScopeVar\x0a\x09assignTo := aScopeVar",
|
|
|
-messageSends: [],
|
|
|
+args: ["aVisitor"],
|
|
|
+source: "accept: aVisitor\x0a\x09^ aVisitor visitIRInlinedReturn: self",
|
|
|
+messageSends: ["visitIRInlinedReturn:"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
-smalltalk.IRInlinedClosure);
|
|
|
+smalltalk.IRInlinedReturn);
|
|
|
|
|
|
smalltalk.addMethod(
|
|
|
"_isInlined",
|
|
@@ -97,11 +100,11 @@ source: "isInlined\x0a\x09^ true",
|
|
|
messageSends: [],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
-smalltalk.IRInlinedClosure);
|
|
|
+smalltalk.IRInlinedReturn);
|
|
|
|
|
|
|
|
|
|
|
|
-smalltalk.addClass('IRInlinedNonLocalReturn', smalltalk.IRReturn, [], 'Compiler-Inlining');
|
|
|
+smalltalk.addClass('IRInlinedNonLocalReturn', smalltalk.IRInlinedReturn, [], 'Compiler-Inlining');
|
|
|
smalltalk.addMethod(
|
|
|
"_accept_",
|
|
|
smalltalk.method({
|
|
@@ -209,12 +212,136 @@ smalltalk.IRInlinedIfTrue);
|
|
|
|
|
|
|
|
|
|
|
|
+smalltalk.addClass('IRInlinedSequence', smalltalk.IRBlockSequence, [], 'Compiler-Inlining');
|
|
|
+smalltalk.addMethod(
|
|
|
+"_accept_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "accept:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (aVisitor) {
|
|
|
+var self=this;
|
|
|
+smalltalk.send(aVisitor, "_visitIRInlinedSequence_", [self]);
|
|
|
+return self;},
|
|
|
+args: ["aVisitor"],
|
|
|
+source: "accept: aVisitor\x0a\x09aVisitor visitIRInlinedSequence: self",
|
|
|
+messageSends: ["visitIRInlinedSequence:"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInlinedSequence);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_isInlined",
|
|
|
+smalltalk.method({
|
|
|
+selector: "isInlined",
|
|
|
+category: 'testing',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return true;
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "isInlined\x0a\x09^ true",
|
|
|
+messageSends: [],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+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]);
|
|
|
+return 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'];
|
|
|
+return self;},
|
|
|
+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]);
|
|
|
+return 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]);
|
|
|
+return self;},
|
|
|
+args: ["aVisitor"],
|
|
|
+source: "accept: aVisitor\x0a\x09^ aVisitor visitIRNonLocalReturningInlinedSequence: self",
|
|
|
+messageSends: ["visitIRNonLocalReturningInlinedSequence:"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRNonLocalReturningInlinedSequence);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
smalltalk.addClass('IRInliner', smalltalk.IRVisitor, [], 'Compiler-Inlining');
|
|
|
smalltalk.addMethod(
|
|
|
"_assignmentInliner",
|
|
|
smalltalk.method({
|
|
|
selector: "assignmentInliner",
|
|
|
-category: 'visiting',
|
|
|
+category: 'factory',
|
|
|
fn: function () {
|
|
|
var self=this;
|
|
|
return (function($rec){smalltalk.send($rec, "_translator_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRAssignmentInliner || IRAssignmentInliner), "_new", []));
|
|
@@ -226,11 +353,43 @@ referencedClasses: ["IRAssignmentInliner"]
|
|
|
}),
|
|
|
smalltalk.IRInliner);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_nonLocalReturnInliner",
|
|
|
+smalltalk.method({
|
|
|
+selector: "nonLocalReturnInliner",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return (function($rec){smalltalk.send($rec, "_translator_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRNonLocalReturnInliner || IRNonLocalReturnInliner), "_new", []));
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "nonLocalReturnInliner\x0a\x09^ IRNonLocalReturnInliner new \x0a\x09\x09translator: self;\x0a\x09\x09yourself",
|
|
|
+messageSends: ["translator:", "yourself", "new"],
|
|
|
+referencedClasses: ["IRNonLocalReturnInliner"]
|
|
|
+}),
|
|
|
+smalltalk.IRInliner);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_returnInliner",
|
|
|
+smalltalk.method({
|
|
|
+selector: "returnInliner",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return (function($rec){smalltalk.send($rec, "_translator_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRReturnInliner || IRReturnInliner), "_new", []));
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "returnInliner\x0a\x09^ IRReturnInliner new \x0a\x09\x09translator: self;\x0a\x09\x09yourself",
|
|
|
+messageSends: ["translator:", "yourself", "new"],
|
|
|
+referencedClasses: ["IRReturnInliner"]
|
|
|
+}),
|
|
|
+smalltalk.IRInliner);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_sendInliner",
|
|
|
smalltalk.method({
|
|
|
selector: "sendInliner",
|
|
|
-category: 'visiting',
|
|
|
+category: 'factory',
|
|
|
fn: function () {
|
|
|
var self=this;
|
|
|
return (function($rec){smalltalk.send($rec, "_translator_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRSendInliner || IRSendInliner), "_new", []));
|
|
@@ -258,6 +417,22 @@ referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.IRInliner);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_shouldInlineReturn_",
|
|
|
+smalltalk.method({
|
|
|
+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", [])]);})]);})]);
|
|
|
+return self;},
|
|
|
+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) ]]",
|
|
|
+messageSends: ["and:", "not", "isInlined", "isSend", "first", "instructions", "shouldInlineSend:"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInliner);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_shouldInlineSend_",
|
|
|
smalltalk.method({
|
|
@@ -265,15 +440,35 @@ 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.send((smalltalk.IRSendInliner || IRSendInliner), "_inlinedSelectors", []), "_includes_", [smalltalk.send(anIRSend, "_selector", [])]);})]);
|
|
|
+return smalltalk.send(smalltalk.send(smalltalk.send(anIRSend, "_isInlined", []), "_not", []), "_and_", [(function(){return smalltalk.send((smalltalk.IRSendInliner || IRSendInliner), "_shouldInline_", [anIRSend]);})]);
|
|
|
return self;},
|
|
|
args: ["anIRSend"],
|
|
|
-source: "shouldInlineSend: anIRSend\x0a\x09^ anIRSend isInlined not and: [\x0a\x09\x09IRSendInliner inlinedSelectors includes: anIRSend selector ]",
|
|
|
-messageSends: ["and:", "not", "isInlined", "includes:", "inlinedSelectors", "selector"],
|
|
|
+source: "shouldInlineSend: anIRSend\x0a\x09^ anIRSend isInlined not and: [\x0a\x09\x09IRSendInliner shouldInline: anIRSend ]",
|
|
|
+messageSends: ["and:", "not", "isInlined", "shouldInline:"],
|
|
|
referencedClasses: ["IRSendInliner"]
|
|
|
}),
|
|
|
smalltalk.IRInliner);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_transformNonLocalReturn_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "transformNonLocalReturn:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (anIRNonLocalReturn) {
|
|
|
+var self=this;
|
|
|
+var $early={};
|
|
|
+try{var localReturn=nil;
|
|
|
+((($receiver = smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_canInlineNonLocalReturns", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_methodScope", []), "_removeNonLocalReturn_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);(localReturn=(function($rec){smalltalk.send($rec, "_scope_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRReturn || IRReturn), "_new", [])));smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_instructions", []), "_do_", [(function(each){return smalltalk.send(localReturn, "_add_", [each]);})]);smalltalk.send(anIRNonLocalReturn, "_replaceWith_", [localReturn]);return (function(){throw $early=[localReturn]})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_methodScope", []), "_removeNonLocalReturn_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);(localReturn=(function($rec){smalltalk.send($rec, "_scope_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRReturn || IRReturn), "_new", [])));smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_instructions", []), "_do_", [(function(each){return smalltalk.send(localReturn, "_add_", [each]);})]);smalltalk.send(anIRNonLocalReturn, "_replaceWith_", [localReturn]);return (function(){throw $early=[localReturn]})();})]));
|
|
|
+return smalltalk.send(self, "_visitIRNonLocalReturn_", [anIRNonLocalReturn], smalltalk.IRInliner.superclass || nil);
|
|
|
+return self;
|
|
|
+} catch(e) {if(e===$early)return e[0]; throw e}},
|
|
|
+args: ["anIRNonLocalReturn"],
|
|
|
+source: "transformNonLocalReturn: anIRNonLocalReturn\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",
|
|
|
+messageSends: ["ifTrue:", "canInlineNonLocalReturns", "scope", "removeNonLocalReturn:", "methodScope", "scope:", "yourself", "new", "do:", "instructions", "add:", "replaceWith:", "visitIRNonLocalReturn:"],
|
|
|
+referencedClasses: ["IRReturn"]
|
|
|
+}),
|
|
|
+smalltalk.IRInliner);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_visitIRAssignment_",
|
|
|
smalltalk.method({
|
|
@@ -281,10 +476,10 @@ selector: "visitIRAssignment:",
|
|
|
category: 'visiting',
|
|
|
fn: function (anIRAssignment) {
|
|
|
var self=this;
|
|
|
-((($receiver = smalltalk.send(self, "_shouldInlineAssignment_", [anIRAssignment])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_assignmentInliner", []), "_inlineAssignment_", [anIRAssignment]);})() : (function(){return smalltalk.send(self, "_visitIRAssignment_", [anIRAssignment], smalltalk.IRInliner.superclass || nil);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_assignmentInliner", []), "_inlineAssignment_", [anIRAssignment]);}), (function(){return smalltalk.send(self, "_visitIRAssignment_", [anIRAssignment], smalltalk.IRInliner.superclass || nil);})]));
|
|
|
+return ((($receiver = smalltalk.send(self, "_shouldInlineAssignment_", [anIRAssignment])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_assignmentInliner", []), "_inlineAssignment_", [anIRAssignment]);})() : (function(){return smalltalk.send(self, "_visitIRAssignment_", [anIRAssignment], smalltalk.IRInliner.superclass || nil);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_assignmentInliner", []), "_inlineAssignment_", [anIRAssignment]);}), (function(){return smalltalk.send(self, "_visitIRAssignment_", [anIRAssignment], smalltalk.IRInliner.superclass || nil);})]));
|
|
|
return self;},
|
|
|
args: ["anIRAssignment"],
|
|
|
-source: "visitIRAssignment: anIRAssignment\x0a\x09(self shouldInlineAssignment: anIRAssignment) \x0a\x09\x09ifTrue: [ self assignmentInliner inlineAssignment: anIRAssignment ]\x0a\x09\x09ifFalse: [ super visitIRAssignment: anIRAssignment ]",
|
|
|
+source: "visitIRAssignment: anIRAssignment\x0a\x09^ (self shouldInlineAssignment: anIRAssignment) \x0a\x09\x09ifTrue: [ self assignmentInliner inlineAssignment: anIRAssignment ]\x0a\x09\x09ifFalse: [ super visitIRAssignment: anIRAssignment ]",
|
|
|
messageSends: ["ifTrue:ifFalse:", "shouldInlineAssignment:", "inlineAssignment:", "assignmentInliner", "visitIRAssignment:"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
@@ -297,14 +492,28 @@ selector: "visitIRNonLocalReturn:",
|
|
|
category: 'visiting',
|
|
|
fn: function (anIRNonLocalReturn) {
|
|
|
var self=this;
|
|
|
-var localReturn=nil;
|
|
|
-((($receiver = smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_canInlineNonLocalReturns", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_methodScope", []), "_removeNonLocalReturn_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);(localReturn=(function($rec){smalltalk.send($rec, "_scope_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRInlinedNonLocalReturn || IRInlinedNonLocalReturn), "_new", [])));smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_instructions", []), "_do_", [(function(each){return smalltalk.send(localReturn, "_add_", [each]);})]);return smalltalk.send(anIRNonLocalReturn, "_replaceWith_", [localReturn]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_scope", []), "_methodScope", []), "_removeNonLocalReturn_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);(localReturn=(function($rec){smalltalk.send($rec, "_scope_", [smalltalk.send(anIRNonLocalReturn, "_scope", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRInlinedNonLocalReturn || IRInlinedNonLocalReturn), "_new", [])));smalltalk.send(smalltalk.send(anIRNonLocalReturn, "_instructions", []), "_do_", [(function(each){return smalltalk.send(localReturn, "_add_", [each]);})]);return smalltalk.send(anIRNonLocalReturn, "_replaceWith_", [localReturn]);})]));
|
|
|
-smalltalk.send(self, "_visitIRNonLocalReturn_", [anIRNonLocalReturn], smalltalk.IRInliner.superclass || nil);
|
|
|
+return ((($receiver = smalltalk.send(self, "_shouldInlineReturn_", [anIRNonLocalReturn])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_nonLocalReturnInliner", []), "_inlineReturn_", [anIRNonLocalReturn]);})() : (function(){return smalltalk.send(self, "_transformNonLocalReturn_", [anIRNonLocalReturn]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_nonLocalReturnInliner", []), "_inlineReturn_", [anIRNonLocalReturn]);}), (function(){return smalltalk.send(self, "_transformNonLocalReturn_", [anIRNonLocalReturn]);})]));
|
|
|
return self;},
|
|
|
args: ["anIRNonLocalReturn"],
|
|
|
-source: "visitIRNonLocalReturn: anIRNonLocalReturn\x0a\x09| localReturn |\x0a\x09anIRNonLocalReturn scope canInlineNonLocalReturns ifTrue: [\x0a\x09\x09anIRNonLocalReturn scope methodScope removeNonLocalReturn: anIRNonLocalReturn scope.\x0a\x09\x09localReturn := IRInlinedNonLocalReturn 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\x09super visitIRNonLocalReturn: anIRNonLocalReturn",
|
|
|
-messageSends: ["ifTrue:", "canInlineNonLocalReturns", "scope", "removeNonLocalReturn:", "methodScope", "scope:", "yourself", "new", "do:", "instructions", "add:", "replaceWith:", "visitIRNonLocalReturn:"],
|
|
|
-referencedClasses: ["IRInlinedNonLocalReturn"]
|
|
|
+source: "visitIRNonLocalReturn: anIRNonLocalReturn\x0a\x09^ (self shouldInlineReturn: anIRNonLocalReturn) \x0a\x09\x09ifTrue: [ self nonLocalReturnInliner inlineReturn: anIRNonLocalReturn ]\x0a\x09\x09ifFalse: [ self transformNonLocalReturn: anIRNonLocalReturn ]",
|
|
|
+messageSends: ["ifTrue:ifFalse:", "shouldInlineReturn:", "inlineReturn:", "nonLocalReturnInliner", "transformNonLocalReturn:"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInliner);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_visitIRReturn_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "visitIRReturn:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (anIRReturn) {
|
|
|
+var self=this;
|
|
|
+return ((($receiver = smalltalk.send(self, "_shouldInlineReturn_", [anIRReturn])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_returnInliner", []), "_inlineReturn_", [anIRReturn]);})() : (function(){return smalltalk.send(self, "_visitIRReturn_", [anIRReturn], smalltalk.IRInliner.superclass || nil);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_returnInliner", []), "_inlineReturn_", [anIRReturn]);}), (function(){return smalltalk.send(self, "_visitIRReturn_", [anIRReturn], smalltalk.IRInliner.superclass || nil);})]));
|
|
|
+return self;},
|
|
|
+args: ["anIRReturn"],
|
|
|
+source: "visitIRReturn: anIRReturn\x0a\x09^ (self shouldInlineReturn: anIRReturn) \x0a\x09\x09ifTrue: [ self returnInliner inlineReturn: anIRReturn ]\x0a\x09\x09ifFalse: [ super visitIRReturn: anIRReturn ]",
|
|
|
+messageSends: ["ifTrue:ifFalse:", "shouldInlineReturn:", "inlineReturn:", "returnInliner", "visitIRReturn:"],
|
|
|
+referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.IRInliner);
|
|
|
|
|
@@ -315,10 +524,10 @@ selector: "visitIRSend:",
|
|
|
category: 'visiting',
|
|
|
fn: function (anIRSend) {
|
|
|
var self=this;
|
|
|
-((($receiver = smalltalk.send(self, "_shouldInlineSend_", [anIRSend])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [anIRSend]);})() : (function(){return smalltalk.send(self, "_visitIRSend_", [anIRSend], smalltalk.IRInliner.superclass || nil);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [anIRSend]);}), (function(){return smalltalk.send(self, "_visitIRSend_", [anIRSend], smalltalk.IRInliner.superclass || nil);})]));
|
|
|
+return ((($receiver = smalltalk.send(self, "_shouldInlineSend_", [anIRSend])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [anIRSend]);})() : (function(){return smalltalk.send(self, "_visitIRSend_", [anIRSend], smalltalk.IRInliner.superclass || nil);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [anIRSend]);}), (function(){return smalltalk.send(self, "_visitIRSend_", [anIRSend], smalltalk.IRInliner.superclass || nil);})]));
|
|
|
return self;},
|
|
|
args: ["anIRSend"],
|
|
|
-source: "visitIRSend: anIRSend\x0a\x09(self shouldInlineSend: anIRSend)\x0a\x09\x09ifTrue: [ self sendInliner inlineSend: anIRSend ]\x0a\x09\x09ifFalse: [ super visitIRSend: anIRSend ]",
|
|
|
+source: "visitIRSend: anIRSend\x0a\x09^ (self shouldInlineSend: anIRSend)\x0a\x09\x09ifTrue: [ self sendInliner inlineSend: anIRSend ]\x0a\x09\x09ifFalse: [ super visitIRSend: anIRSend ]",
|
|
|
messageSends: ["ifTrue:ifFalse:", "shouldInlineSend:", "inlineSend:", "sendInliner", "visitIRSend:"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
@@ -327,6 +536,23 @@ smalltalk.IRInliner);
|
|
|
|
|
|
|
|
|
smalltalk.addClass('IRInliningJSTranslator', smalltalk.IRJSTranslator, [], 'Compiler-Inlining');
|
|
|
+smalltalk.addMethod(
|
|
|
+"_visitIRAssigningInlinedSequence_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "visitIRAssigningInlinedSequence:",
|
|
|
+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 ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", []), "_canBeAssigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_assignTo", []), "_variable", []), "_alias", [])]);return smalltalk.send($rec, "_nextPutAssignment", []);})(smalltalk.send(self, "_stream", []));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", [])]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_assignTo", []), "_variable", []), "_alias", [])]);return smalltalk.send($rec, "_nextPutAssignment", []);})(smalltalk.send(self, "_stream", []));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:", "allButLast", "instructions", "nextPutStatementWith:", "stream", "visit:", "ifTrue:ifFalse:", "canBeAssigned", "last", "nextPutAll:", "alias", "variable", "assignTo", "nextPutAssignment"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInliningJSTranslator);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_visitIRInlinedAssignment_",
|
|
|
smalltalk.method({
|
|
@@ -350,11 +576,11 @@ selector: "visitIRInlinedClosure:",
|
|
|
category: 'visiting',
|
|
|
fn: function (anIRInlinedClosure) {
|
|
|
var self=this;
|
|
|
-smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_ifNotEmpty_", [(function(){smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_allButLast", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedClosure, "_assignTo", []), "_notNil", []), "_and_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_last", []), "_canBeAssigned", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedClosure, "_assignTo", []), "_variable", []), "_alias", [])]);return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAssignment", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAll_", [smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedClosure, "_assignTo", []), "_variable", []), "_alias", [])]);return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAssignment", []);})]));return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_last", [])]);})]);
|
|
|
+smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
|
|
|
return self;},
|
|
|
args: ["anIRInlinedClosure"],
|
|
|
-source: "visitIRInlinedClosure: anIRInlinedClosure\x0a\x09anIRInlinedClosure instructions ifNotEmpty: [\x0a\x09\x09anIRInlinedClosure instructions allButLast do: [ :each | self visit: each ].\x0a\x09\x09(anIRInlinedClosure assignTo notNil and: [\x0a\x09\x09\x09anIRInlinedClosure instructions last canBeAssigned ]) ifTrue: [\x0a\x09\x09\x09\x09self stream nextPutAll: anIRInlinedClosure assignTo variable alias.\x0a\x09\x09\x09\x09self stream nextPutAssignment ].\x0a\x09\x09self visit: anIRInlinedClosure instructions last ]",
|
|
|
-messageSends: ["ifNotEmpty:", "instructions", "do:", "allButLast", "visit:", "ifTrue:", "and:", "notNil", "assignTo", "canBeAssigned", "last", "nextPutAll:", "stream", "alias", "variable", "nextPutAssignment"],
|
|
|
+source: "visitIRInlinedClosure: anIRInlinedClosure\x0a\x09anIRInlinedClosure instructions do: [ :each |\x0a\x09\x09self visit: each ]",
|
|
|
+messageSends: ["do:", "instructions", "visit:"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.IRInliningJSTranslator);
|
|
@@ -369,7 +595,7 @@ var self=this;
|
|
|
smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutIf_with_", [(function(){smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAll_", ["! smalltalk.assert("]);smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedIfFalse, "_instructions", []), "_first", [])]);return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAll_", [")"]);}), (function(){return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedIfFalse, "_instructions", []), "_last", [])]);})]);
|
|
|
return self;},
|
|
|
args: ["anIRInlinedIfFalse"],
|
|
|
-source: "visitIRInlinedIfFalse: anIRInlinedIfFalse\x0a\x09self stream \x0a\x09\x09nextPutIf: [ \x0a\x09\x09\x09self stream nextPutAll: '! smalltalk.assert('.\x0a\x09\x09\x09self visit: anIRInlinedIfFalse instructions first.\x0a\x09\x09\x09self stream nextPutAll: ')' ]\x0a\x09\x09with: [ self visit: anIRInlinedIfFalse instructions last ]",
|
|
|
+source: "visitIRInlinedIfFalse: anIRInlinedIfFalse\x0a\x09self stream nextPutIf: [ \x0a\x09\x09self stream nextPutAll: '! smalltalk.assert('.\x0a\x09\x09self visit: anIRInlinedIfFalse instructions first.\x0a\x09\x09self stream nextPutAll: ')' ]\x0a\x09\x09with: [ self visit: anIRInlinedIfFalse instructions last ]",
|
|
|
messageSends: ["nextPutIf:with:", "stream", "nextPutAll:", "visit:", "first", "instructions", "last"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
@@ -385,12 +611,95 @@ var self=this;
|
|
|
smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutIf_with_", [(function(){smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAll_", ["smalltalk.assert("]);smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedIfTrue, "_instructions", []), "_first", [])]);return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutAll_", [")"]);}), (function(){return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedIfTrue, "_instructions", []), "_last", [])]);})]);
|
|
|
return self;},
|
|
|
args: ["anIRInlinedIfTrue"],
|
|
|
-source: "visitIRInlinedIfTrue: anIRInlinedIfTrue\x0a\x09self stream \x0a\x09\x09nextPutIf: [ \x0a\x09\x09\x09self stream nextPutAll: 'smalltalk.assert('. \x0a\x09\x09\x09self visit: anIRInlinedIfTrue instructions first.\x0a\x09\x09\x09self stream nextPutAll: ')' ]\x0a\x09\x09with: [ self visit: anIRInlinedIfTrue instructions last ]",
|
|
|
+source: "visitIRInlinedIfTrue: anIRInlinedIfTrue\x0a\x09self stream nextPutIf: [ \x0a\x09\x09self stream nextPutAll: 'smalltalk.assert('. \x0a\x09\x09self visit: anIRInlinedIfTrue instructions first.\x0a\x09\x09self stream nextPutAll: ')' ]\x0a\x09\x09with: [ self visit: anIRInlinedIfTrue instructions last ]",
|
|
|
messageSends: ["nextPutIf:with:", "stream", "nextPutAll:", "visit:", "first", "instructions", "last"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.IRInliningJSTranslator);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_visitIRInlinedNonLocalReturn_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "visitIRInlinedNonLocalReturn:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (anIRInlinedReturn) {
|
|
|
+var self=this;
|
|
|
+smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [(function(){return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedReturn, "_instructions", []), "_last", [])]);})]);
|
|
|
+smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutNonLocalReturnWith_", [(function(){return nil;})]);
|
|
|
+return self;},
|
|
|
+args: ["anIRInlinedReturn"],
|
|
|
+source: "visitIRInlinedNonLocalReturn: anIRInlinedReturn\x0a\x09self stream nextPutStatementWith: [\x0a\x09\x09self visit: anIRInlinedReturn instructions last ].\x0a\x09self stream nextPutNonLocalReturnWith: [ ]",
|
|
|
+messageSends: ["nextPutStatementWith:", "stream", "visit:", "last", "instructions", "nextPutNonLocalReturnWith:"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInliningJSTranslator);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_visitIRInlinedReturn_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "visitIRInlinedReturn:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (anIRInlinedReturn) {
|
|
|
+var self=this;
|
|
|
+smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedReturn, "_instructions", []), "_last", [])]);
|
|
|
+return self;},
|
|
|
+args: ["anIRInlinedReturn"],
|
|
|
+source: "visitIRInlinedReturn: anIRInlinedReturn\x0a\x09self visit: anIRInlinedReturn instructions last",
|
|
|
+messageSends: ["visit:", "last", "instructions"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInliningJSTranslator);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_visitIRInlinedSequence_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "visitIRInlinedSequence:",
|
|
|
+category: 'visiting',
|
|
|
+fn: function (anIRInlinedSequence) {
|
|
|
+var self=this;
|
|
|
+smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutStatementWith_", [(function(){return smalltalk.send(self, "_visit_", [each]);})]);})]);
|
|
|
+return self;},
|
|
|
+args: ["anIRInlinedSequence"],
|
|
|
+source: "visitIRInlinedSequence: anIRInlinedSequence\x0a\x09anIRInlinedSequence instructions do: [ :each | \x0a\x09\x09self stream nextPutStatementWith: [ self visit: each ]]",
|
|
|
+messageSends: ["do:", "instructions", "nextPutStatementWith:", "stream", "visit:"],
|
|
|
+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 ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", []), "_canBeAssigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (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", [])]);})()) : smalltalk.send($receiver, "_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:", "allButLast", "instructions", "nextPutStatementWith:", "stream", "visit:", "ifTrue:ifFalse:", "canBeAssigned", "last", "nextPutNonLocalReturnWith:"],
|
|
|
+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 ((($receiver = smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedSequence, "_instructions", []), "_last", []), "_canBeAssigned", [])).klass === smalltalk.Boolean) ? ($receiver ? (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", [])]);})()) : smalltalk.send($receiver, "_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:", "allButLast", "instructions", "nextPutStatementWith:", "stream", "visit:", "ifTrue:ifFalse:", "canBeAssigned", "last", "nextPutReturn"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRInliningJSTranslator);
|
|
|
+
|
|
|
|
|
|
|
|
|
smalltalk.addClass('IRSendInliner', smalltalk.Object, ['send', 'translator'], 'Compiler-Inlining');
|
|
@@ -451,14 +760,20 @@ 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(smalltalk.send(smalltalk.send(anIRClosure, "_instructions", []), "_first", []), "_instructions", []), "_do_", [(function(each){return smalltalk.send(inlinedClosure, "_add_", [smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [each])]);})]);
|
|
|
+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;},
|
|
|
args: ["anIRClosure"],
|
|
|
-source: "inlineClosure: anIRClosure\x0a\x09| inlinedClosure |\x0a\x09inlinedClosure := self inlinedClosure.\x0a\x09inlinedClosure scope: anIRClosure scope.\x0a\x09anIRClosure instructions first instructions do: [ :each |\x0a\x09\x09inlinedClosure add: (self translator visit: each) ].\x0a\x09^ inlinedClosure",
|
|
|
-messageSends: ["inlinedClosure", "scope:", "scope", "do:", "instructions", "first", "add:", "visit:", "translator"],
|
|
|
+source: "inlineClosure: anIRClosure\x0a\x09| inlinedClosure sequence statements |\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);
|
|
@@ -484,7 +799,7 @@ smalltalk.addMethod(
|
|
|
"_inlinedClosure",
|
|
|
smalltalk.method({
|
|
|
selector: "inlinedClosure",
|
|
|
-category: 'accessing',
|
|
|
+category: 'factory',
|
|
|
fn: function () {
|
|
|
var self=this;
|
|
|
return smalltalk.send((smalltalk.IRInlinedClosure || IRInlinedClosure), "_new", []);
|
|
@@ -496,6 +811,22 @@ referencedClasses: ["IRInlinedClosure"]
|
|
|
}),
|
|
|
smalltalk.IRSendInliner);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_inlinedSequence",
|
|
|
+smalltalk.method({
|
|
|
+selector: "inlinedSequence",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return smalltalk.send((smalltalk.IRInlinedSequence || IRInlinedSequence), "_new", []);
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "inlinedSequence\x0a\x09^ IRInlinedSequence new",
|
|
|
+messageSends: ["new"],
|
|
|
+referencedClasses: ["IRInlinedSequence"]
|
|
|
+}),
|
|
|
+smalltalk.IRSendInliner);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_inliningError_",
|
|
|
smalltalk.method({
|
|
@@ -593,6 +924,26 @@ referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.IRSendInliner.klass);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_shouldInline_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "shouldInline:",
|
|
|
+category: 'accessing',
|
|
|
+fn: function (anIRInstruction) {
|
|
|
+var self=this;
|
|
|
+var $early={};
|
|
|
+try{((($receiver = smalltalk.send(smalltalk.send(self, "_inlinedSelectors", []), "_includes_", [smalltalk.send(anIRInstruction, "_selector", [])])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw $early=[false]})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw $early=[false]})();})]));
|
|
|
+smalltalk.send(smalltalk.send(smalltalk.send(anIRInstruction, "_instructions", []), "_allButFirst", []), "_do_", [(function(each){return ((($receiver = smalltalk.send(each, "_isClosure", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return (function(){throw $early=[false]})();})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return (function(){throw $early=[false]})();})]));})]);
|
|
|
+return true;
|
|
|
+return self;
|
|
|
+} catch(e) {if(e===$early)return e[0]; throw e}},
|
|
|
+args: ["anIRInstruction"],
|
|
|
+source: "shouldInline: anIRInstruction\x0a\x09(self inlinedSelectors includes: anIRInstruction selector) ifFalse: [ ^ false ].\x0a\x09anIRInstruction instructions allButFirst do: [ :each |\x0a\x09\x09each isClosure ifFalse: [ ^ false ]].\x0a\x09^ true",
|
|
|
+messageSends: ["ifFalse:", "includes:", "inlinedSelectors", "selector", "do:", "allButFirst", "instructions", "isClosure"],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.IRSendInliner.klass);
|
|
|
+
|
|
|
|
|
|
smalltalk.addClass('IRAssignmentInliner', smalltalk.IRSendInliner, ['assignment'], 'Compiler-Inlining');
|
|
|
smalltalk.addMethod(
|
|
@@ -650,23 +1001,114 @@ referencedClasses: ["IRInlinedAssignment"]
|
|
|
smalltalk.IRAssignmentInliner);
|
|
|
|
|
|
smalltalk.addMethod(
|
|
|
-"_inlinedClosure",
|
|
|
+"_inlinedSequence",
|
|
|
smalltalk.method({
|
|
|
-selector: "inlinedClosure",
|
|
|
-category: 'accessing',
|
|
|
+selector: "inlinedSequence",
|
|
|
+category: 'factory',
|
|
|
fn: function () {
|
|
|
var self=this;
|
|
|
-return (function($rec){smalltalk.send($rec, "_assignTo_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_assignment", []), "_instructions", []), "_first", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_inlinedClosure", [], smalltalk.IRAssignmentInliner.superclass || nil));
|
|
|
+return (function($rec){smalltalk.send($rec, "_assignTo_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_assignment", []), "_instructions", []), "_first", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRAssigningInlinedSequence || IRAssigningInlinedSequence), "_new", []));
|
|
|
return self;},
|
|
|
args: [],
|
|
|
-source: "inlinedClosure\x0a\x09^ super inlinedClosure\x0a\x09\x09assignTo: self assignment instructions first;\x0a\x09\x09yourself",
|
|
|
-messageSends: ["assignTo:", "first", "instructions", "assignment", "yourself", "inlinedClosure"],
|
|
|
-referencedClasses: []
|
|
|
+source: "inlinedSequence\x0a\x09^ IRAssigningInlinedSequence new\x0a\x09\x09assignTo: self assignment instructions first;\x0a\x09\x09yourself",
|
|
|
+messageSends: ["assignTo:", "first", "instructions", "assignment", "yourself", "new"],
|
|
|
+referencedClasses: ["IRAssigningInlinedSequence"]
|
|
|
}),
|
|
|
smalltalk.IRAssignmentInliner);
|
|
|
|
|
|
|
|
|
|
|
|
+smalltalk.addClass('IRReturnInliner', smalltalk.IRSendInliner, [], 'Compiler-Inlining');
|
|
|
+smalltalk.addMethod(
|
|
|
+"_inlineReturn_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "inlineReturn:",
|
|
|
+category: 'inlining',
|
|
|
+fn: function (anIRReturn) {
|
|
|
+var self=this;
|
|
|
+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: ["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.IRReturnInliner);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_inlinedReturn",
|
|
|
+smalltalk.method({
|
|
|
+selector: "inlinedReturn",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return smalltalk.send((smalltalk.IRInlinedReturn || IRInlinedReturn), "_new", []);
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "inlinedReturn\x0a\x09^ IRInlinedReturn new",
|
|
|
+messageSends: ["new"],
|
|
|
+referencedClasses: ["IRInlinedReturn"]
|
|
|
+}),
|
|
|
+smalltalk.IRReturnInliner);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_inlinedSequence",
|
|
|
+smalltalk.method({
|
|
|
+selector: "inlinedSequence",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return smalltalk.send((smalltalk.IRReturningInlinedSequence || IRReturningInlinedSequence), "_new", []);
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "inlinedSequence\x0a\x09^ IRReturningInlinedSequence new",
|
|
|
+messageSends: ["new"],
|
|
|
+referencedClasses: ["IRReturningInlinedSequence"]
|
|
|
+}),
|
|
|
+smalltalk.IRReturnInliner);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+smalltalk.addClass('IRNonLocalReturnInliner', smalltalk.IRReturnInliner, [], 'Compiler-Inlining');
|
|
|
+smalltalk.addMethod(
|
|
|
+"_inlinedReturn",
|
|
|
+smalltalk.method({
|
|
|
+selector: "inlinedReturn",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return smalltalk.send((smalltalk.IRInlinedNonLocalReturn || IRInlinedNonLocalReturn), "_new", []);
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "inlinedReturn\x0a\x09^ IRInlinedNonLocalReturn new",
|
|
|
+messageSends: ["new"],
|
|
|
+referencedClasses: ["IRInlinedNonLocalReturn"]
|
|
|
+}),
|
|
|
+smalltalk.IRNonLocalReturnInliner);
|
|
|
+
|
|
|
+smalltalk.addMethod(
|
|
|
+"_inlinedSequence",
|
|
|
+smalltalk.method({
|
|
|
+selector: "inlinedSequence",
|
|
|
+category: 'factory',
|
|
|
+fn: function () {
|
|
|
+var self=this;
|
|
|
+return smalltalk.send((smalltalk.IRNonLocalReturningInlinedSequence || IRNonLocalReturningInlinedSequence), "_new", []);
|
|
|
+return self;},
|
|
|
+args: [],
|
|
|
+source: "inlinedSequence\x0a\x09^ IRNonLocalReturningInlinedSequence new",
|
|
|
+messageSends: ["new"],
|
|
|
+referencedClasses: ["IRNonLocalReturningInlinedSequence"]
|
|
|
+}),
|
|
|
+smalltalk.IRNonLocalReturnInliner);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
smalltalk.addClass('InliningCodeGenerator', smalltalk.CodeGenerator, [], 'Compiler-Inlining');
|
|
|
smalltalk.addMethod(
|
|
|
"_compileNode_",
|