Browse Source

PseudoVar class >> dictionary et al.

Herby Vojčík 4 years ago
parent
commit
7e9848c309

+ 23 - 0
lang/src/Compiler-Core.js

@@ -1212,6 +1212,29 @@ return $recv($self._new())._parse_(aString);
 }; }),
 $globals.Compiler.a$cls);
 
+$core.addMethod(
+$core.method({
+selector: "pseudoVariableNames",
+protocol: "parsing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "pseudoVariableNames\x0a\x09^ PseudoVar dictionary keys asArray",
+referencedClasses: ["PseudoVar"],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["asArray", "keys", "dictionary"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($recv($recv($globals.PseudoVar)._dictionary())._keys())._asArray();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"pseudoVariableNames",{})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.Compiler.a$cls);
+
 $core.addMethod(
 $core.method({
 selector: "recompile:",

+ 4 - 0
lang/src/Compiler-Core.st

@@ -311,6 +311,10 @@ initialize
 
 parse: aString
 	^ self new parse: aString
+!
+
+pseudoVariableNames
+	^ PseudoVar dictionary keys asArray
 ! !
 
 Object subclass: #DoIt

+ 62 - 52
lang/src/Compiler-Semantic.js

@@ -993,76 +993,33 @@ selector: "pseudoVars",
 protocol: "accessing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "pseudoVars\x0a\x09pseudoVars ifNil: [\x0a\x09\x09pseudoVars := Dictionary new.\x0a\x09\x09Smalltalk pseudoVariableNames do: [ :each |\x0a\x09\x09\x09pseudoVars at: each put: ((PseudoVar on: each)\x0a\x09\x09\x09\x09scope: self methodScope;\x0a\x09\x09\x09\x09yourself) ].\x0a\x09\x09pseudoVars\x0a\x09\x09\x09at: #super put: ((SuperVar on: #super) scope: self methodScope; yourself);\x0a\x09\x09\x09at: #thisContext put: ((ThisContextVar on: #thisContext) scope: self methodScope; yourself) ].\x0a\x09^ pseudoVars",
-referencedClasses: ["Dictionary", "Smalltalk", "PseudoVar", "SuperVar", "ThisContextVar"],
+source: "pseudoVars\x0a\x09pseudoVars ifNil: [\x0a\x09\x09pseudoVars := Dictionary new.\x0a\x09\x09PseudoVar dictionary keysAndValuesDo: [ :each :impl |\x0a\x09\x09\x09pseudoVars at: each put: ((impl on: each)\x0a\x09\x09\x09\x09scope: self methodScope;\x0a\x09\x09\x09\x09yourself) ] ].\x0a\x09^ pseudoVars",
+referencedClasses: ["Dictionary", "PseudoVar"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifNil:", "new", "do:", "pseudoVariableNames", "at:put:", "scope:", "on:", "methodScope", "yourself"]
+messageSends: ["ifNil:", "new", "keysAndValuesDo:", "dictionary", "at:put:", "scope:", "on:", "methodScope", "yourself"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$4,$5,$6,$3,$7,$9,$10,$11,$8,$13,$12,$receiver;
+var $1,$2,$4,$3,$receiver;
 $1=$self.pseudoVars;
 if(($receiver = $1) == null || $receiver.a$nil){
 $self.pseudoVars=$recv($globals.Dictionary)._new();
-$recv($recv($globals.Smalltalk)._pseudoVariableNames())._do_((function(each){
+$recv($recv($globals.PseudoVar)._dictionary())._keysAndValuesDo_((function(each,impl){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx2) {
 //>>excludeEnd("ctx");
 $2=$self.pseudoVars;
-$4=$recv($globals.PseudoVar)._on_(each);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["on:"]=1;
-//>>excludeEnd("ctx");
-$5=$self._methodScope();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["methodScope"]=1;
-//>>excludeEnd("ctx");
-$recv($4)._scope_($5);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["scope:"]=1;
-//>>excludeEnd("ctx");
-$6=$recv($4)._yourself();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["yourself"]=1;
-//>>excludeEnd("ctx");
-$3=$6;
+$4=$recv(impl)._on_(each);
+$recv($4)._scope_($self._methodScope());
+$3=$recv($4)._yourself();
 return $recv($2)._at_put_(each,$3);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["at:put:"]=1;
-//>>excludeEnd("ctx");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)});
+}, function($ctx2) {$ctx2.fillBlock({each:each,impl:impl},$ctx1,2)});
 //>>excludeEnd("ctx");
 }));
-$7=$self.pseudoVars;
-$9=$recv($globals.SuperVar)._on_("super");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["on:"]=2;
-//>>excludeEnd("ctx");
-$10=$self._methodScope();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["methodScope"]=2;
-//>>excludeEnd("ctx");
-$recv($9)._scope_($10);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["scope:"]=2;
-//>>excludeEnd("ctx");
-$11=$recv($9)._yourself();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["yourself"]=2;
-//>>excludeEnd("ctx");
-$8=$11;
-$recv($7)._at_put_("super",$8);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:put:"]=2;
-//>>excludeEnd("ctx");
-$13=$recv($globals.ThisContextVar)._on_("thisContext");
-$recv($13)._scope_($self._methodScope());
-$12=$recv($13)._yourself();
-$recv($7)._at_put_("thisContext",$12);
 } else {
 $1;
 }
@@ -1762,6 +1719,59 @@ return $recv($self.name).__eq("self");
 $globals.PseudoVar);
 
 
+$core.setSlots($globals.PseudoVar.a$cls, ["dictionary"]);
+$core.addMethod(
+$core.method({
+selector: "dictionary",
+protocol: "accessing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "dictionary\x0a\x09^ dictionary ifNil: [ dictionary := Dictionary new\x0a\x09\x09at: #self put: PseudoVar;\x0a\x09\x09at: #super put: SuperVar;\x0a\x09\x09at: #nil put: PseudoVar;\x0a\x09\x09at: #false put: PseudoVar;\x0a\x09\x09at: #true put: PseudoVar;\x0a\x09\x09at: #thisContext put: ThisContextVar;\x0a\x09\x09yourself ]",
+referencedClasses: ["Dictionary", "PseudoVar", "SuperVar", "ThisContextVar"],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["ifNil:", "at:put:", "new", "yourself"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$2,$receiver;
+$1=$self.dictionary;
+if(($receiver = $1) == null || $receiver.a$nil){
+$2=$recv($globals.Dictionary)._new();
+$recv($2)._at_put_("self",$globals.PseudoVar);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["at:put:"]=1;
+//>>excludeEnd("ctx");
+$recv($2)._at_put_("super",$globals.SuperVar);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["at:put:"]=2;
+//>>excludeEnd("ctx");
+$recv($2)._at_put_("nil",$globals.PseudoVar);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["at:put:"]=3;
+//>>excludeEnd("ctx");
+$recv($2)._at_put_("false",$globals.PseudoVar);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["at:put:"]=4;
+//>>excludeEnd("ctx");
+$recv($2)._at_put_("true",$globals.PseudoVar);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["at:put:"]=5;
+//>>excludeEnd("ctx");
+$recv($2)._at_put_("thisContext",$globals.ThisContextVar);
+$self.dictionary=$recv($2)._yourself();
+return $self.dictionary;
+} else {
+return $1;
+}
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"dictionary",{})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.PseudoVar.a$cls);
+
 
 $core.addClass("SuperVar", $globals.PseudoVar, [], "Compiler-Semantic");
 //>>excludeStart("ide", pragmas.excludeIdeData);

+ 18 - 6
lang/src/Compiler-Semantic.st

@@ -163,13 +163,10 @@ nonLocalReturns
 pseudoVars
 	pseudoVars ifNil: [
 		pseudoVars := Dictionary new.
-		Smalltalk pseudoVariableNames do: [ :each |
-			pseudoVars at: each put: ((PseudoVar on: each)
+		PseudoVar dictionary keysAndValuesDo: [ :each :impl |
+			pseudoVars at: each put: ((impl on: each)
 				scope: self methodScope;
-				yourself) ].
-		pseudoVars
-			at: #super put: ((SuperVar on: #super) scope: self methodScope; yourself);
-			at: #thisContext put: ((ThisContextVar on: #thisContext) scope: self methodScope; yourself) ].
+				yourself) ] ].
 	^ pseudoVars
 !
 
@@ -400,6 +397,21 @@ isSelf
 	^ name = 'self'
 ! !
 
+PseudoVar class slots: {#dictionary}!
+
+!PseudoVar class methodsFor: 'accessing'!
+
+dictionary
+	^ dictionary ifNil: [ dictionary := Dictionary new
+		at: #self put: PseudoVar;
+		at: #super put: SuperVar;
+		at: #nil put: PseudoVar;
+		at: #false put: PseudoVar;
+		at: #true put: PseudoVar;
+		at: #thisContext put: ThisContextVar;
+		yourself ]
+! !
+
 PseudoVar subclass: #SuperVar
 	slots: {}
 	package: 'Compiler-Semantic'!

+ 10 - 5
lang/src/Kernel-Infrastructure.js

@@ -3563,15 +3563,20 @@ selector: "pseudoVariableNames",
 protocol: "accessing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "pseudoVariableNames\x0a\x09^ #('self' 'super' 'nil' 'true' 'false' 'thisContext')",
-referencedClasses: [],
+source: "pseudoVariableNames\x0a\x09^ Compiler pseudoVariableNames",
+referencedClasses: ["Compiler"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: []
+messageSends: ["pseudoVariableNames"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
-return ["self", "super", "nil", "true", "false", "thisContext"];
-
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($globals.Compiler)._pseudoVariableNames();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"pseudoVariableNames",{})});
+//>>excludeEnd("ctx");
 }; }),
 $globals.SmalltalkImage);
 

+ 1 - 1
lang/src/Kernel-Infrastructure.st

@@ -835,7 +835,7 @@ parse: aString
 !
 
 pseudoVariableNames
-	^ #('self' 'super' 'nil' 'true' 'false' 'thisContext')
+	^ Compiler pseudoVariableNames
 !
 
 readJSObject: anObject