Browse Source

InliningSemanticAnalyzer

Breaking strange reverse-dependency of general SemanticAnalyzer
on inline-specific SendInliner.
Herbert Vojčík 7 years ago
parent
commit
3bc1bbd18a

+ 21 - 3
src/Compiler-Core.js

@@ -254,7 +254,7 @@ var self=this;
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 var $1;
-$1=$recv($globals.SemanticAnalyzer)._on_(self._currentClass());
+$1=$recv(self._semanticAnalyzerClass())._on_(self._currentClass());
 $recv($1)._thePackage_(self._currentPackage());
 return $recv($1)._yourself();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -263,10 +263,28 @@ return $recv($1)._yourself();
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "semanticAnalyzer\x0a\x09^ (SemanticAnalyzer on: self currentClass)\x0a\x09\x09thePackage: self currentPackage;\x0a\x09\x09yourself",
+source: "semanticAnalyzer\x0a\x09^ (self semanticAnalyzerClass on: self currentClass)\x0a\x09\x09thePackage: self currentPackage;\x0a\x09\x09yourself",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["thePackage:", "on:", "semanticAnalyzerClass", "currentClass", "currentPackage", "yourself"]
+}),
+$globals.CodeGenerator);
+
+$core.addMethod(
+$core.method({
+selector: "semanticAnalyzerClass",
+protocol: 'compiling',
+fn: function (){
+var self=this;
+return $globals.SemanticAnalyzer;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "semanticAnalyzerClass\x0a\x09^ SemanticAnalyzer",
 referencedClasses: ["SemanticAnalyzer"],
 //>>excludeEnd("ide");
-messageSends: ["thePackage:", "on:", "currentClass", "currentPackage", "yourself"]
+messageSends: []
 }),
 $globals.CodeGenerator);
 

+ 5 - 1
src/Compiler-Core.st

@@ -65,11 +65,15 @@ irTranslator
 !
 
 semanticAnalyzer
-	^ (SemanticAnalyzer on: self currentClass)
+	^ (self semanticAnalyzerClass on: self currentClass)
 		thePackage: self currentPackage;
 		yourself
 !
 
+semanticAnalyzerClass
+	^ SemanticAnalyzer
+!
+
 translator
 	^ IRASTTranslator new
 		source: self source;

+ 68 - 0
src/Compiler-Inlining.js

@@ -2205,6 +2205,24 @@ messageSends: ["new"]
 }),
 $globals.InliningCodeGenerator);
 
+$core.addMethod(
+$core.method({
+selector: "semanticAnalyzerClass",
+protocol: 'compiling',
+fn: function (){
+var self=this;
+return $globals.InliningSemanticAnalyzer;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "semanticAnalyzerClass\x0a\x09^ InliningSemanticAnalyzer",
+referencedClasses: ["InliningSemanticAnalyzer"],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.InliningCodeGenerator);
+
 
 
 $core.addClass('InliningError', $globals.SemanticError, [], 'Compiler-Inlining');
@@ -2212,6 +2230,56 @@ $core.addClass('InliningError', $globals.SemanticError, [], 'Compiler-Inlining')
 $globals.InliningError.comment="Instances of InliningError are signaled when using an `InliningCodeGenerator`in a `Compiler`.";
 //>>excludeEnd("ide");
 
+
+$core.addClass('InliningSemanticAnalyzer', $globals.SemanticAnalyzer, [], 'Compiler-Inlining');
+$core.addMethod(
+$core.method({
+selector: "visitSendNode:",
+protocol: 'visiting',
+fn: function (aNode){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$2,$3,$receiver;
+$1=$recv(aNode)._superSend();
+if(!$core.assert($1)){
+$2=$recv($recv($globals.IRSendInliner)._inlinedSelectors())._includes_($recv(aNode)._selector());
+if($core.assert($2)){
+$recv(aNode)._shouldBeInlined_(true);
+$3=$recv(aNode)._receiver();
+if(($receiver = $3) == null || $receiver.isNil){
+$3;
+} else {
+var receiver;
+receiver=$receiver;
+$recv(receiver)._shouldBeAliased_(true);
+};
+};
+};
+(
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.supercall = true,
+//>>excludeEnd("ctx");
+($globals.InliningSemanticAnalyzer.superclass||$boot.nilAsClass).fn.prototype._visitSendNode_.apply($recv(self), [aNode]));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.supercall = false;
+//>>excludeEnd("ctx");;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"visitSendNode:",{aNode:aNode},$globals.InliningSemanticAnalyzer)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aNode"],
+source: "visitSendNode: aNode\x0a\x0a\x09aNode superSend ifFalse: [ \x0a\x09\x09(IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [\x0a\x09\x09\x09aNode shouldBeInlined: true.\x0a\x09\x09\x09aNode receiver ifNotNil: [ :receiver |\x0a\x09\x09\x09\x09receiver shouldBeAliased: true ] ] ].\x0a\x0a\x09super visitSendNode: aNode",
+referencedClasses: ["IRSendInliner"],
+//>>excludeEnd("ide");
+messageSends: ["ifFalse:", "superSend", "ifTrue:", "includes:", "inlinedSelectors", "selector", "shouldBeInlined:", "ifNotNil:", "receiver", "shouldBeAliased:", "visitSendNode:"]
+}),
+$globals.InliningSemanticAnalyzer);
+
+
 $core.addMethod(
 $core.method({
 selector: "asInlinedBlockResult",

+ 21 - 0
src/Compiler-Inlining.st

@@ -569,6 +569,10 @@ inliner
 
 irTranslator
 	^ IRInliningJSTranslator new
+!
+
+semanticAnalyzerClass
+	^ InliningSemanticAnalyzer
 ! !
 
 SemanticError subclass: #InliningError
@@ -577,6 +581,23 @@ SemanticError subclass: #InliningError
 !InliningError commentStamp!
 Instances of InliningError are signaled when using an `InliningCodeGenerator`in a `Compiler`.!
 
+SemanticAnalyzer subclass: #InliningSemanticAnalyzer
+	instanceVariableNames: ''
+	package: 'Compiler-Inlining'!
+
+!InliningSemanticAnalyzer methodsFor: 'visiting'!
+
+visitSendNode: aNode
+
+	aNode superSend ifFalse: [ 
+		(IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [
+			aNode shouldBeInlined: true.
+			aNode receiver ifNotNil: [ :receiver |
+				receiver shouldBeAliased: true ] ] ].
+
+	super visitSendNode: aNode
+! !
+
 !IRBlockReturn methodsFor: '*Compiler-Inlining'!
 
 asInlinedBlockResult

+ 4 - 25
src/Compiler-Semantic.js

@@ -2379,34 +2379,13 @@ var sends;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$3,$4,$2,$5,$receiver;
-$1=$recv(aNode)._superSend();
-if(!$core.assert($1)){
-$3=$recv($globals.IRSendInliner)._inlinedSelectors();
-$4=$recv(aNode)._selector();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["selector"]=1;
-//>>excludeEnd("ctx");
-$2=$recv($3)._includes_($4);
-if($core.assert($2)){
-$recv(aNode)._shouldBeInlined_(true);
-$5=$recv(aNode)._receiver();
-if(($receiver = $5) == null || $receiver.isNil){
-$5;
-} else {
-var receiver;
-receiver=$receiver;
-$recv(receiver)._shouldBeAliased_(true);
-};
-};
-};
 sends=$recv(self._messageSends())._at_ifAbsentPut_($recv(aNode)._selector(),(function(){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx2) {
 //>>excludeEnd("ctx");
 return $recv($globals.OrderedCollection)._new();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,4)});
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
 //>>excludeEnd("ctx");
 }));
 $recv(sends)._add_(aNode);
@@ -2426,10 +2405,10 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aNode"],
-source: "visitSendNode: aNode\x0a\x0a\x09| sends |\x0a\x09aNode superSend ifFalse: [ \x0a\x09\x09(IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [\x0a\x09\x09\x09aNode shouldBeInlined: true.\x0a\x09\x09\x09aNode receiver ifNotNil: [ :receiver |\x0a\x09\x09\x09\x09receiver shouldBeAliased: true ] ] ].\x0a\x0a\x09sends := self messageSends at: aNode selector ifAbsentPut: [ OrderedCollection new ].\x0a\x09sends add: aNode.\x0a\x0a\x09aNode index: sends size.\x0a\x0a\x09super visitSendNode: aNode",
-referencedClasses: ["IRSendInliner", "OrderedCollection"],
+source: "visitSendNode: aNode\x0a\x0a\x09| sends |\x0a\x09sends := self messageSends at: aNode selector ifAbsentPut: [ OrderedCollection new ].\x0a\x09sends add: aNode.\x0a\x0a\x09aNode index: sends size.\x0a\x0a\x09super visitSendNode: aNode",
+referencedClasses: ["OrderedCollection"],
 //>>excludeEnd("ide");
-messageSends: ["ifFalse:", "superSend", "ifTrue:", "includes:", "inlinedSelectors", "selector", "shouldBeInlined:", "ifNotNil:", "receiver", "shouldBeAliased:", "at:ifAbsentPut:", "messageSends", "new", "add:", "index:", "size", "visitSendNode:"]
+messageSends: ["at:ifAbsentPut:", "messageSends", "selector", "new", "add:", "index:", "size", "visitSendNode:"]
 }),
 $globals.SemanticAnalyzer);
 

+ 0 - 6
src/Compiler-Semantic.st

@@ -584,12 +584,6 @@ visitReturnNode: aNode
 visitSendNode: aNode
 
 	| sends |
-	aNode superSend ifFalse: [ 
-		(IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [
-			aNode shouldBeInlined: true.
-			aNode receiver ifNotNil: [ :receiver |
-				receiver shouldBeAliased: true ] ] ].
-
 	sends := self messageSends at: aNode selector ifAbsentPut: [ OrderedCollection new ].
 	sends add: aNode.