Browse Source

Pseudovars including nil, true, false actually parsed as such.

The nil, true and false still parsed as values
in pragmas and literal array, though.
Only parsed as variables in operand context.
May be hackish, but works atm.

Includes hotfix to ASTInterpreter.
Herby Vojčík 4 years ago
parent
commit
d97910b6ec
4 changed files with 49 additions and 13 deletions
  1. 2 2
      lang/base/parser.js
  2. 1 1
      lang/base/parser.pegjs
  3. 42 9
      lang/src/Compiler-Interpreter.js
  4. 4 1
      lang/src/Compiler-Interpreter.st

+ 2 - 2
lang/base/parser.js

@@ -3349,9 +3349,9 @@ define(["./boot"], function(__boot) {
         return cached.result;
       }
 
-      s0 = peg$parseliteral();
+      s0 = peg$parsevariable();
       if (s0 === peg$FAILED) {
-        s0 = peg$parsevariable();
+        s0 = peg$parseliteral();
         if (s0 === peg$FAILED) {
           s0 = peg$parsesubexpression();
         }

+ 1 - 1
lang/base/parser.pegjs

@@ -194,7 +194,7 @@ block = '[' params:wsBlockParamList? sequence:wsBlockSequenceWs ']' {
 	return newNode($globals.BlockNode)._parameters_(params || [])._dagChildren_([sequence]);
 }
 
-operand = literal / reference / subexpression
+operand = reference / literal / subexpression
 
 wsUnaryMessage = ws selector:unarySelector !':' {
 	return newNode($globals.SendNode)._selector_(selector);

+ 42 - 9
lang/src/Compiler-Interpreter.js

@@ -3404,17 +3404,17 @@ selector: "visitVariableNode:",
 protocol: "visiting",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aNode"],
-source: "visitVariableNode: aNode\x0a\x09aNode binding isExternallyKnownVar ifTrue: [\x0a\x09\x09^ self push: (Platform globals at: aNode value ifAbsent: [ self error: 'Unknown variable' ]) ].\x0a\x09\x09\x0a\x09self push: (aNode binding isInstanceVar\x0a\x09\x09ifTrue: [ self context receiver instVarAt: aNode value ]\x0a\x09\x09ifFalse: [ self context \x0a\x09\x09\x09localAt: (aNode binding isSuper ifTrue: [ 'self' ] ifFalse: [ aNode value ])\x0a\x09\x09\x09ifAbsent: [\x0a\x09\x09\x09\x09aNode value isCapitalized\x0a\x09\x09\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09\x09\x09Smalltalk globals \x0a\x09\x09\x09\x09\x09\x09\x09at: aNode value \x0a\x09\x09\x09\x09\x09\x09\x09ifAbsent: [ Platform globals at: aNode value ] ] ] ])",
+source: "visitVariableNode: aNode\x0a\x09aNode binding isExternallyKnownVar ifTrue: [\x0a\x09\x09^ self push: (Platform globals at: aNode value ifAbsent: [ self error: 'Unknown variable' ]) ].\x0a\x09\x09\x0a\x09self push: (aNode binding isInstanceVar\x0a\x09\x09ifTrue: [ self context receiver instVarAt: aNode value ]\x0a\x09\x09ifFalse: [ self context \x0a\x09\x09\x09localAt: (aNode binding isSuper ifTrue: [ 'self' ] ifFalse: [ aNode value ])\x0a\x09\x09\x09ifAbsent: [\x0a\x09\x09\x09\x09aNode value = 'nil' ifTrue: [ nil ] ifFalse: [\x0a\x09\x09\x09\x09aNode value = 'true' ifTrue: [ true ] ifFalse: [\x0a\x09\x09\x09\x09aNode value = 'false' ifTrue: [ false ] ifFalse: [\x0a\x09\x09\x09\x09aNode value isCapitalized\x0a\x09\x09\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09\x09\x09Smalltalk globals \x0a\x09\x09\x09\x09\x09\x09\x09at: aNode value \x0a\x09\x09\x09\x09\x09\x09\x09ifAbsent: [ Platform globals at: aNode value ] ] ] ] ] ] ])",
 referencedClasses: ["Platform", "Smalltalk"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifTrue:", "isExternallyKnownVar", "binding", "push:", "at:ifAbsent:", "globals", "value", "error:", "ifTrue:ifFalse:", "isInstanceVar", "instVarAt:", "receiver", "context", "localAt:ifAbsent:", "isSuper", "isCapitalized", "at:"]
+messageSends: ["ifTrue:", "isExternallyKnownVar", "binding", "push:", "at:ifAbsent:", "globals", "value", "error:", "ifTrue:ifFalse:", "isInstanceVar", "instVarAt:", "receiver", "context", "localAt:ifAbsent:", "isSuper", "=", "isCapitalized", "at:"]
 }, function ($methodClass){ return function (aNode){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$5,$6,$4,$3,$9,$8,$11,$10,$12,$13,$15,$14,$17,$16,$18,$19,$7;
+var $2,$1,$5,$6,$4,$3,$9,$8,$11,$10,$12,$13,$15,$14,$17,$16,$19,$18,$21,$20,$23,$22,$24,$25,$7;
 $2=$recv(aNode)._binding();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["binding"]=1;
@@ -3482,26 +3482,59 @@ $17=$recv(aNode)._value();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx2.sendIdx["value"]=4;
 //>>excludeEnd("ctx");
-$16=$recv($17)._isCapitalized();
-if($core.assert($16)){
-$18=$recv($globals.Smalltalk)._globals();
+$16=$recv($17).__eq("nil");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["globals"]=2;
+$ctx2.sendIdx["="]=1;
 //>>excludeEnd("ctx");
+if($core.assert($16)){
+return nil;
+} else {
 $19=$recv(aNode)._value();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx2.sendIdx["value"]=5;
 //>>excludeEnd("ctx");
-return $recv($18)._at_ifAbsent_($19,(function(){
+$18=$recv($19).__eq("true");
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["="]=2;
+//>>excludeEnd("ctx");
+if($core.assert($18)){
+return true;
+} else {
+$21=$recv(aNode)._value();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["value"]=6;
+//>>excludeEnd("ctx");
+$20=$recv($21).__eq("false");
+if($core.assert($20)){
+return false;
+} else {
+$23=$recv(aNode)._value();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["value"]=7;
+//>>excludeEnd("ctx");
+$22=$recv($23)._isCapitalized();
+if($core.assert($22)){
+$24=$recv($globals.Smalltalk)._globals();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["globals"]=2;
+//>>excludeEnd("ctx");
+$25=$recv(aNode)._value();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["value"]=8;
+//>>excludeEnd("ctx");
+return $recv($24)._at_ifAbsent_($25,(function(){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx3) {
 //>>excludeEnd("ctx");
 return $recv($recv($globals.Platform)._globals())._at_($recv(aNode)._value());
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx3) {$ctx3.fillBlock({},$ctx2,9)});
+}, function($ctx3) {$ctx3.fillBlock({},$ctx2,15)});
 //>>excludeEnd("ctx");
 }));
 }
+}
+}
+}
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1,7)});
 //>>excludeEnd("ctx");

+ 4 - 1
lang/src/Compiler-Interpreter.st

@@ -895,11 +895,14 @@ visitVariableNode: aNode
 		ifFalse: [ self context 
 			localAt: (aNode binding isSuper ifTrue: [ 'self' ] ifFalse: [ aNode value ])
 			ifAbsent: [
+				aNode value = 'nil' ifTrue: [ nil ] ifFalse: [
+				aNode value = 'true' ifTrue: [ true ] ifFalse: [
+				aNode value = 'false' ifTrue: [ false ] ifFalse: [
 				aNode value isCapitalized
 					ifTrue: [
 						Smalltalk globals 
 							at: aNode value 
-							ifAbsent: [ Platform globals at: aNode value ] ] ] ])
+							ifAbsent: [ Platform globals at: aNode value ] ] ] ] ] ] ])
 ! !
 
 Error subclass: #ASTInterpreterError