Compiler-Inlining.deploy.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. smalltalk.addPackage('Compiler-Inlining', {});
  2. smalltalk.addClass('IRInlinedAssignment', smalltalk.IRAssignment, [], 'Compiler-Inlining');
  3. smalltalk.addMethod(
  4. "_accept_",
  5. smalltalk.method({
  6. selector: "accept:",
  7. fn: function (aVisitor){
  8. var self=this;
  9. return smalltalk.send(aVisitor, "_visitIRInlinedAssignment_", [self]);
  10. return self;}
  11. }),
  12. smalltalk.IRInlinedAssignment);
  13. smalltalk.addMethod(
  14. "_isInlined",
  15. smalltalk.method({
  16. selector: "isInlined",
  17. fn: function (){
  18. var self=this;
  19. return true;
  20. return self;}
  21. }),
  22. smalltalk.IRInlinedAssignment);
  23. smalltalk.addClass('IRInlinedClosure', smalltalk.IRClosure, ['assignTo'], 'Compiler-Inlining');
  24. smalltalk.addMethod(
  25. "_accept_",
  26. smalltalk.method({
  27. selector: "accept:",
  28. fn: function (aVisitor) {
  29. var self=this;
  30. smalltalk.send(aVisitor, "_visitIRInlinedClosure_", [self]);
  31. return self;}
  32. }),
  33. smalltalk.IRInlinedClosure);
  34. smalltalk.addMethod(
  35. "_assignTo",
  36. smalltalk.method({
  37. selector: "assignTo",
  38. fn: function () {
  39. var self=this;
  40. return self['@assignTo'];
  41. return self;}
  42. }),
  43. smalltalk.IRInlinedClosure);
  44. smalltalk.addMethod(
  45. "_assignTo_",
  46. smalltalk.method({
  47. selector: "assignTo:",
  48. fn: function (aScopeVar){
  49. var self=this;
  50. (self['@assignTo']=aScopeVar);
  51. return self;}
  52. }),
  53. smalltalk.IRInlinedClosure);
  54. smalltalk.addMethod(
  55. "_isInlined",
  56. smalltalk.method({
  57. selector: "isInlined",
  58. fn: function (){
  59. var self=this;
  60. return true;
  61. return self;}
  62. }),
  63. smalltalk.IRInlinedClosure);
  64. smalltalk.addClass('IRInlinedNonLocalReturn', smalltalk.IRNonLocalReturn, [], 'Compiler-Inlining');
  65. smalltalk.addMethod(
  66. "_accept_",
  67. smalltalk.method({
  68. selector: "accept:",
  69. fn: function (aVisitor){
  70. var self=this;
  71. return smalltalk.send(aVisitor, "_visitIRInlinedNonLocalReturn_", [self]);
  72. return self;}
  73. }),
  74. smalltalk.IRInlinedNonLocalReturn);
  75. smalltalk.addMethod(
  76. "_isInlined",
  77. smalltalk.method({
  78. selector: "isInlined",
  79. fn: function (){
  80. var self=this;
  81. return true;
  82. return self;}
  83. }),
  84. smalltalk.IRInlinedNonLocalReturn);
  85. smalltalk.addClass('IRInlinedSend', smalltalk.IRSend, [], 'Compiler-Inlining');
  86. smalltalk.addMethod(
  87. "_accept_",
  88. smalltalk.method({
  89. selector: "accept:",
  90. fn: function (aVisitor) {
  91. var self=this;
  92. smalltalk.send(aVisitor, "_visitInlinedSend_", [self]);
  93. return self;}
  94. }),
  95. smalltalk.IRInlinedSend);
  96. smalltalk.addMethod(
  97. "_isInlined",
  98. smalltalk.method({
  99. selector: "isInlined",
  100. fn: function (){
  101. var self=this;
  102. return true;
  103. return self;}
  104. }),
  105. smalltalk.IRInlinedSend);
  106. smalltalk.addClass('IRInlinedIfTrue', smalltalk.IRInlinedSend, [], 'Compiler-Inlining');
  107. smalltalk.addMethod(
  108. "_accept_",
  109. smalltalk.method({
  110. selector: "accept:",
  111. fn: function (aVisitor) {
  112. var self=this;
  113. smalltalk.send(aVisitor, "_visitIRInlinedIfTrue_", [self]);
  114. return self;}
  115. }),
  116. smalltalk.IRInlinedIfTrue);
  117. smalltalk.addClass('IRInliner', smalltalk.IRVisitor, [], 'Compiler-Inlining');
  118. smalltalk.addMethod(
  119. "_assignmentInliner",
  120. smalltalk.method({
  121. selector: "assignmentInliner",
  122. fn: function () {
  123. var self=this;
  124. return (function($rec){smalltalk.send($rec, "_translator_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRAssignmentInliner || IRAssignmentInliner), "_new", []));
  125. return self;}
  126. }),
  127. smalltalk.IRInliner);
  128. smalltalk.addMethod(
  129. "_sendInliner",
  130. smalltalk.method({
  131. selector: "sendInliner",
  132. fn: function () {
  133. var self=this;
  134. return (function($rec){smalltalk.send($rec, "_translator_", [self]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.IRSendInliner || IRSendInliner), "_new", []));
  135. return self;}
  136. }),
  137. smalltalk.IRInliner);
  138. smalltalk.addMethod(
  139. "_shouldInlineAssignment_",
  140. smalltalk.method({
  141. selector: "shouldInlineAssignment:",
  142. fn: function (anIRAssignment){
  143. var self=this;
  144. 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", [])]);})]);})]);
  145. return self;}
  146. }),
  147. smalltalk.IRInliner);
  148. smalltalk.addMethod(
  149. "_shouldInlineSend_",
  150. smalltalk.method({
  151. selector: "shouldInlineSend:",
  152. fn: function (anIRSend){
  153. var self=this;
  154. 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", [])]);})]);
  155. return self;}
  156. }),
  157. smalltalk.IRInliner);
  158. smalltalk.addMethod(
  159. "_visitIRAssignment_",
  160. smalltalk.method({
  161. selector: "visitIRAssignment:",
  162. fn: function (anIRAssignment){
  163. var self=this;
  164. 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);})]));
  165. return self;}
  166. }),
  167. smalltalk.IRInliner);
  168. smalltalk.addMethod(
  169. "_visitIRSend_",
  170. smalltalk.method({
  171. selector: "visitIRSend:",
  172. fn: function (anIRSend){
  173. var self=this;
  174. 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);})]));
  175. return self;}
  176. }),
  177. smalltalk.IRInliner);
  178. smalltalk.addMethod(
  179. "_visitSendNode_",
  180. smalltalk.method({
  181. selector: "visitSendNode:",
  182. fn: function (aNode) {
  183. var self=this;
  184. ((($receiver = smalltalk.send(aNode, "_canBeInlined", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [aNode]);})() : (function(){return smalltalk.send(self, "_visitSendNode_", [aNode], smalltalk.IRInliningASTResolver.superclass || nil);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_sendInliner", []), "_inlineSend_", [aNode]);}), (function(){return smalltalk.send(self, "_visitSendNode_", [aNode], smalltalk.IRInliningASTResolver.superclass || nil);})]));
  185. return self;}
  186. }),
  187. smalltalk.IRInliner);
  188. smalltalk.addClass('IRInliningJSTranslator', smalltalk.IRJSTranslator, [], 'Compiler-Inlining');
  189. smalltalk.addMethod(
  190. "_visitIRInlinedAssignment_",
  191. smalltalk.method({
  192. selector: "visitIRInlinedAssignment:",
  193. fn: function (anIRInlinedAssignment){
  194. var self=this;
  195. smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedAssignment, "_instructions", []), "_last", [])]);
  196. return self;}
  197. }),
  198. smalltalk.IRInliningJSTranslator);
  199. smalltalk.addMethod(
  200. "_visitIRInlinedClosure_",
  201. smalltalk.method({
  202. selector: "visitIRInlinedClosure:",
  203. fn: function (anIRInlinedClosure){
  204. var self=this;
  205. smalltalk.send(smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_allButLast", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
  206. (($receiver = smalltalk.send(anIRInlinedClosure, "_assignTo", [])) != nil && $receiver != undefined) ? (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;
  207. smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedClosure, "_instructions", []), "_last", [])]);
  208. return self;}
  209. }),
  210. smalltalk.IRInliningJSTranslator);
  211. smalltalk.addMethod(
  212. "_visitIRInlinedIfTrue_",
  213. smalltalk.method({
  214. selector: "visitIRInlinedIfTrue:",
  215. fn: function (anIRInlinedIfTrue) {
  216. var self=this;
  217. smalltalk.send(smalltalk.send(self, "_stream", []), "_nextPutIf_with_", [(function(){return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedIfTrue, "_instructions", []), "_first", [])]);}), (function(){return smalltalk.send(self, "_visit_", [smalltalk.send(smalltalk.send(anIRInlinedIfTrue, "_instructions", []), "_last", [])]);})]);
  218. return self;}
  219. }),
  220. smalltalk.IRInliningJSTranslator);
  221. smalltalk.addClass('IRSendInliner', smalltalk.Object, ['send', 'translator'], 'Compiler-Inlining');
  222. smalltalk.addMethod(
  223. "_ifTrue_",
  224. smalltalk.method({
  225. selector: "ifTrue:",
  226. fn: function (anIRInstruction){
  227. var self=this;
  228. var inlinedSend=nil;
  229. var inlinedClosure=nil;
  230. ((($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"]);})]));
  231. ((($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"]);})]));
  232. (inlinedClosure=smalltalk.send(self, "_inlinedClosure", []));
  233. smalltalk.send(smalltalk.send(anIRInstruction, "_instructions", []), "_do_", [(function(each){(instruction=smalltalk.send(smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [each]), "_first", []));return smalltalk.send(inlinedClosure, "_add_", [(typeof instruction == 'undefined' ? nil : instruction)]);})]);
  234. (inlinedSend=smalltalk.send((smalltalk.IRInlinedIfTrue || IRInlinedIfTrue), "_new", []));
  235. (function($rec){smalltalk.send($rec, "_add_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_first", [])]);return smalltalk.send($rec, "_add_", [inlinedClosure]);})(inlinedSend);
  236. smalltalk.send(smalltalk.send(self, "_send", []), "_replaceWith_", [inlinedSend]);
  237. return inlinedSend;
  238. return self;}
  239. }),
  240. smalltalk.IRSendInliner);
  241. smalltalk.addMethod(
  242. "_inlineSend_",
  243. smalltalk.method({
  244. selector: "inlineSend:",
  245. fn: function (anIRSend){
  246. var self=this;
  247. smalltalk.send(self, "_send_", [anIRSend]);
  248. smalltalk.send(self, "_perform_withArguments_", [smalltalk.send(smalltalk.send(self, "_send", []), "_selector", []), smalltalk.send(smalltalk.send(smalltalk.send(self, "_send", []), "_instructions", []), "_allButFirst", [])]);
  249. return self;}
  250. }),
  251. smalltalk.IRSendInliner);
  252. smalltalk.addMethod(
  253. "_inlinedClosure",
  254. smalltalk.method({
  255. selector: "inlinedClosure",
  256. fn: function (){
  257. var self=this;
  258. return smalltalk.send((smalltalk.IRInlinedClosure || IRInlinedClosure), "_new", []);
  259. return self;}
  260. }),
  261. smalltalk.IRSendInliner);
  262. smalltalk.addMethod(
  263. "_inliningError_",
  264. smalltalk.method({
  265. selector: "inliningError:",
  266. fn: function (aString) {
  267. var self=this;
  268. smalltalk.send((smalltalk.InliningError || InliningError), "_signal_", [aString]);
  269. return self;}
  270. }),
  271. smalltalk.IRSendInliner);
  272. smalltalk.addMethod(
  273. "_send",
  274. smalltalk.method({
  275. selector: "send",
  276. fn: function () {
  277. var self=this;
  278. return self['@send'];
  279. return self;}
  280. }),
  281. smalltalk.IRSendInliner);
  282. smalltalk.addMethod(
  283. "_send_",
  284. smalltalk.method({
  285. selector: "send:",
  286. fn: function (anIRSend) {
  287. var self=this;
  288. (self['@send']=anIRSend);
  289. return self;}
  290. }),
  291. smalltalk.IRSendInliner);
  292. smalltalk.addMethod(
  293. "_translator",
  294. smalltalk.method({
  295. selector: "translator",
  296. fn: function () {
  297. var self=this;
  298. return self['@translator'];
  299. return self;}
  300. }),
  301. smalltalk.IRSendInliner);
  302. smalltalk.addMethod(
  303. "_translator_",
  304. smalltalk.method({
  305. selector: "translator:",
  306. fn: function (anASTTranslator) {
  307. var self=this;
  308. (self['@translator']=anASTTranslator);
  309. return self;}
  310. }),
  311. smalltalk.IRSendInliner);
  312. smalltalk.addMethod(
  313. "_inlinedSelectors",
  314. smalltalk.method({
  315. selector: "inlinedSelectors",
  316. fn: function () {
  317. var self=this;
  318. return ["ifTrue:"];
  319. return self;}
  320. }),
  321. smalltalk.IRSendInliner.klass);
  322. smalltalk.addClass('IRAssignmentInliner', smalltalk.IRSendInliner, ['assignment'], 'Compiler-Inlining');
  323. smalltalk.addMethod(
  324. "_assignment",
  325. smalltalk.method({
  326. selector: "assignment",
  327. fn: function () {
  328. var self=this;
  329. return self['@assignment'];
  330. return self;}
  331. }),
  332. smalltalk.IRAssignmentInliner);
  333. smalltalk.addMethod(
  334. "_assignment_",
  335. smalltalk.method({
  336. selector: "assignment:",
  337. fn: function (aNode) {
  338. var self=this;
  339. (self['@assignment']=aNode);
  340. return self;}
  341. }),
  342. smalltalk.IRAssignmentInliner);
  343. smalltalk.addMethod(
  344. "_inlineAssignment_",
  345. smalltalk.method({
  346. selector: "inlineAssignment:",
  347. fn: function (anIRAssignment){
  348. var self=this;
  349. var inlinedAssignment=nil;
  350. smalltalk.send(self, "_assignment_", [anIRAssignment]);
  351. (inlinedAssignment=smalltalk.send((smalltalk.IRInlinedAssignment || IRInlinedAssignment), "_new", []));
  352. smalltalk.send(smalltalk.send(anIRAssignment, "_instructions", []), "_do_", [(function(each){return smalltalk.send(inlinedAssignment, "_add_", [each]);})]);
  353. smalltalk.send(anIRAssignment, "_replaceWith_", [inlinedAssignment]);
  354. smalltalk.send(self, "_inlineSend_", [smalltalk.send(smalltalk.send(inlinedAssignment, "_instructions", []), "_last", [])]);
  355. return inlinedAssignment;
  356. return self;}
  357. }),
  358. smalltalk.IRAssignmentInliner);
  359. smalltalk.addMethod(
  360. "_inlinedClosure",
  361. smalltalk.method({
  362. selector: "inlinedClosure",
  363. fn: function (){
  364. var self=this;
  365. 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));
  366. return self;}
  367. }),
  368. smalltalk.IRAssignmentInliner);
  369. smalltalk.addClass('InliningCodeGenerator', smalltalk.CodeGenerator, [], 'Compiler-Inlining');
  370. smalltalk.addMethod(
  371. "_compileNode_",
  372. smalltalk.method({
  373. selector: "compileNode:",
  374. fn: function (aNode){
  375. var self=this;
  376. var ir=nil;
  377. var stream=nil;
  378. smalltalk.send(smalltalk.send(self, "_semanticAnalyzer", []), "_visit_", [aNode]);
  379. (ir=smalltalk.send(smalltalk.send(self, "_translator", []), "_visit_", [aNode]));
  380. smalltalk.send(smalltalk.send(self, "_inliner", []), "_visit_", [ir]);
  381. return (function($rec){smalltalk.send($rec, "_visit_", [ir]);return smalltalk.send($rec, "_contents", []);})(smalltalk.send(self, "_irTranslator", []));
  382. return self;}
  383. }),
  384. smalltalk.InliningCodeGenerator);
  385. smalltalk.addMethod(
  386. "_inliner",
  387. smalltalk.method({
  388. selector: "inliner",
  389. fn: function (){
  390. var self=this;
  391. return smalltalk.send((smalltalk.IRInliner || IRInliner), "_new", []);
  392. return self;}
  393. }),
  394. smalltalk.InliningCodeGenerator);
  395. smalltalk.addMethod(
  396. "_irTranslator",
  397. smalltalk.method({
  398. selector: "irTranslator",
  399. fn: function () {
  400. var self=this;
  401. return smalltalk.send((smalltalk.IRInliningJSTranslator || IRInliningJSTranslator), "_new", []);
  402. return self;}
  403. }),
  404. smalltalk.InliningCodeGenerator);