Browse Source

More reworking in aliasing.

Result is even less aliasing
and clearer implementation
of #shouldBeAliased, #hasOpeningStatements and #subtreeNeedsAliasing.
Herby Vojčík 4 years ago
parent
commit
b516aa0afb

+ 6 - 8
cli/src/AmberCli.js

@@ -1268,7 +1268,7 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$4,$5;
+var $1,$2,$3,$4;
 $1=$recv([$recv(aUrl)._pathname()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["pathname"]=1
@@ -1288,12 +1288,11 @@ $4="";
 } else {
 $4=$3;
 }
-$5=[$recv($2).__comma($4)
+$self._respondRedirect_to_([$recv($2).__comma($4)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx[","]=2
 //>>excludeEnd("ctx");
-][0];
-$self._respondRedirect_to_($5,aResponse);
+][0],aResponse);
 }
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -2491,7 +2490,7 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3;
+var $1,$2;
 return $self._parseAssignment_do_(buffer,(function(name,expr){
 var varName,value;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -2513,12 +2512,11 @@ $2=buffer;
 } else {
 $2=expr;
 }
-$3=[$recv($1).__comma($2)
+value=$self._eval_on_([$recv($1).__comma($2)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx3.sendIdx[","]=1
 //>>excludeEnd("ctx");
-][0];
-value=$self._eval_on_($3,$self.session);
+][0],$self.session);
 return value;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx3) {$ctx3.fillBlock({},$ctx2,3)});

+ 37 - 65
lang/src/Compiler-IR.js

@@ -81,18 +81,18 @@ selector: "aliasTemporally:",
 protocol: "visiting",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aCollection"],
-source: "aliasTemporally: aCollection\x0a\x09\x22https://lolg.it/amber/amber/issues/296\x0a\x09\x0a\x09If a node is aliased, all preceding ones are aliased as well.\x0a\x09The tree is iterated twice. First we get the aliasing dependency,\x0a\x09then the aliasing itself is done\x22\x0a\x0a\x09| threshold shouldAlias |\x0a\x09shouldAlias := false.\x0a\x09threshold := aCollection reversed\x0a\x09\x09detect: [ :each |\x0a\x09\x09\x09shouldAlias\x0a\x09\x09\x09\x09ifTrue: [ true ]\x0a\x09\x09\x09\x09ifFalse: [\x0a\x09\x09\x09\x09\x09each hasOpeningStatements ifTrue: [ shouldAlias := true ].\x0a\x09\x09\x09\x09\x09each subtreeNeedsAliasing ] ]\x0a\x09\x09ifNone: [ nil ].\x0a\x09threshold ifNil: [ ^ self visitAll: aCollection ].\x0a\x0a\x09shouldAlias := true.\x0a\x09^ aCollection collect: [ :each |\x0a\x09\x09shouldAlias\x0a\x09\x09\x09ifTrue: [ each == threshold ifTrue: [ shouldAlias := false ]. self alias: each ]\x0a\x09\x09\x09ifFalse: [ self visit: each ] ]",
+source: "aliasTemporally: aCollection\x0a\x09\x22https://lolg.it/amber/amber/issues/296\x0a\x09\x0a\x09If a node is aliased, all preceding ones are aliased as well.\x0a\x09The tree is iterated twice. First we get the aliasing dependency,\x0a\x09then the aliasing itself is done\x22\x0a\x0a\x09| threshold shouldAlias |\x0a\x09shouldAlias := false.\x0a\x09threshold := aCollection reversed\x0a\x09\x09detect: [ :each |\x0a\x09\x09\x09shouldAlias\x0a\x09\x09\x09\x09ifTrue: [ true ]\x0a\x09\x09\x09\x09ifFalse: [\x0a\x09\x09\x09\x09\x09(each hasOpeningStatements ifTrue: [ true ] ifFalse: [ each subtreeNeedsAliasing ]) ifTrue: [ shouldAlias := true ].\x0a\x09\x09\x09\x09\x09each shouldBeAliased ] ]\x0a\x09\x09ifNone: [ nil ].\x0a\x09threshold ifNil: [ ^ self visitAll: aCollection ].\x0a\x0a\x09shouldAlias := true.\x0a\x09^ aCollection collect: [ :each |\x0a\x09\x09shouldAlias\x0a\x09\x09\x09ifTrue: [ each == threshold ifTrue: [ shouldAlias := false ]. self alias: each ]\x0a\x09\x09\x09ifFalse: [ self visit: each ] ]",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["detect:ifNone:", "reversed", "ifTrue:ifFalse:", "ifTrue:", "hasOpeningStatements", "subtreeNeedsAliasing", "ifNil:", "visitAll:", "collect:", "==", "alias:", "visit:"]
+messageSends: ["detect:ifNone:", "reversed", "ifTrue:ifFalse:", "ifTrue:", "hasOpeningStatements", "subtreeNeedsAliasing", "shouldBeAliased", "ifNil:", "visitAll:", "collect:", "==", "alias:", "visit:"]
 }, function ($methodClass){ return function (aCollection){
 var self=this,$self=this;
 var threshold,shouldAlias;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$4,$5;
+var $1,$2,$3,$4,$5,$6;
 shouldAlias=false;
 threshold=$recv($recv(aCollection)._reversed())._detect_ifNone_((function(each){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -104,10 +104,15 @@ return true;
 } else {
 $2=$recv(each)._hasOpeningStatements();
 if($core.assert($2)){
+$3=true;
+} else {
+$3=$recv(each)._subtreeNeedsAliasing();
+}
+if($core.assert($3)){
 shouldAlias=true;
 shouldAlias;
 }
-return $recv(each)._subtreeNeedsAliasing();
+return $recv(each)._shouldBeAliased();
 }
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
@@ -116,21 +121,21 @@ return $recv(each)._subtreeNeedsAliasing();
 return nil;
 
 }));
-$3=threshold;
-if($3 == null || $3.a$nil){
+$4=threshold;
+if($4 == null || $4.a$nil){
 return $self._visitAll_(aCollection);
 } else {
-$3;
+$4;
 }
 shouldAlias=true;
 return $recv(aCollection)._collect_((function(each){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx2) {
 //>>excludeEnd("ctx");
-$4=shouldAlias;
-if($core.assert($4)){
-$5=$recv(each).__eq_eq(threshold);
+$5=shouldAlias;
 if($core.assert($5)){
+$6=$recv(each).__eq_eq(threshold);
+if($core.assert($6)){
 shouldAlias=false;
 shouldAlias;
 }
@@ -139,7 +144,7 @@ return $self._alias_(each);
 return $self._visit_(each);
 }
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,7)});
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,9)});
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -6052,11 +6057,11 @@ $globals.AssignmentNode);
 
 $core.addMethod(
 $core.method({
-selector: "hasOpeningStatements",
+selector: "subtreeNeedsAliasing",
 protocol: "*Compiler-IR",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "hasOpeningStatements\x0a\x09^ false",
+source: "subtreeNeedsAliasing\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -6068,29 +6073,6 @@ return false;
 }; }),
 $globals.BlockNode);
 
-$core.addMethod(
-$core.method({
-selector: "subtreeNeedsAliasing",
-protocol: "*Compiler-IR",
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "subtreeNeedsAliasing\x0a\x09^ self shouldBeAliased",
-referencedClasses: [],
-//>>excludeEnd("ide");
-pragmas: [],
-messageSends: ["shouldBeAliased"]
-}, function ($methodClass){ return function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $self._shouldBeAliased();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"subtreeNeedsAliasing",{})});
-//>>excludeEnd("ctx");
-}; }),
-$globals.BlockNode);
-
 $core.addMethod(
 $core.method({
 selector: "hasOpeningStatements",
@@ -6115,28 +6097,15 @@ selector: "hasOpeningStatements",
 protocol: "*Compiler-IR",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "hasOpeningStatements\x0a\x09^ self dagChildren anySatisfy: [ :each | each hasOpeningStatements ]",
+source: "hasOpeningStatements\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["anySatisfy:", "dagChildren", "hasOpeningStatements"]
+messageSends: []
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self._dagChildren())._anySatisfy_((function(each){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv(each)._hasOpeningStatements();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"hasOpeningStatements",{})});
-//>>excludeEnd("ctx");
+return false;
+
 }; }),
 $globals.ExpressionNode);
 
@@ -6146,31 +6115,34 @@ selector: "subtreeNeedsAliasing",
 protocol: "*Compiler-IR",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "subtreeNeedsAliasing\x0a\x09^ self shouldBeAliased or: [\x0a\x09\x09self dagChildren anySatisfy: [ :each | each subtreeNeedsAliasing ] ]",
+source: "subtreeNeedsAliasing\x0a\x09^ self dagChildren anySatisfy: [ :each |\x0a\x09\x09each shouldBeAliased ifTrue: [ true ] ifFalse: [\x0a\x09\x09\x09each hasOpeningStatements ifTrue: [ true ] ifFalse: [\x0a\x09\x09\x09\x09each subtreeNeedsAliasing ] ] ]",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["or:", "shouldBeAliased", "anySatisfy:", "dagChildren", "subtreeNeedsAliasing"]
+messageSends: ["anySatisfy:", "dagChildren", "ifTrue:ifFalse:", "shouldBeAliased", "hasOpeningStatements", "subtreeNeedsAliasing"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-return $recv($self._shouldBeAliased())._or_((function(){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
+var $1,$2;
 return $recv($self._dagChildren())._anySatisfy_((function(each){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx3) {
+return $core.withContext(function($ctx2) {
 //>>excludeEnd("ctx");
+$1=$recv(each)._shouldBeAliased();
+if($core.assert($1)){
+return true;
+} else {
+$2=$recv(each)._hasOpeningStatements();
+if($core.assert($2)){
+return true;
+} else {
 return $recv(each)._subtreeNeedsAliasing();
+}
+}
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx2,2)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
 //>>excludeEnd("ctx");
 }));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);

+ 8 - 10
lang/src/Compiler-IR.st

@@ -82,8 +82,8 @@ aliasTemporally: aCollection
 			shouldAlias
 				ifTrue: [ true ]
 				ifFalse: [
-					each hasOpeningStatements ifTrue: [ shouldAlias := true ].
-					each subtreeNeedsAliasing ] ]
+					(each hasOpeningStatements ifTrue: [ true ] ifFalse: [ each subtreeNeedsAliasing ]) ifTrue: [ shouldAlias := true ].
+					each shouldBeAliased ] ]
 		ifNone: [ nil ].
 	threshold ifNil: [ ^ self visitAll: aCollection ].
 
@@ -1407,12 +1407,8 @@ hasOpeningStatements
 
 !BlockNode methodsFor: '*Compiler-IR'!
 
-hasOpeningStatements
-	^ false
-!
-
 subtreeNeedsAliasing
-	^ self shouldBeAliased
+	^ false
 ! !
 
 !CascadeNode methodsFor: '*Compiler-IR'!
@@ -1424,12 +1420,14 @@ hasOpeningStatements
 !ExpressionNode methodsFor: '*Compiler-IR'!
 
 hasOpeningStatements
-	^ self dagChildren anySatisfy: [ :each | each hasOpeningStatements ]
+	^ false
 !
 
 subtreeNeedsAliasing
-	^ self shouldBeAliased or: [
-		self dagChildren anySatisfy: [ :each | each subtreeNeedsAliasing ] ]
+	^ self dagChildren anySatisfy: [ :each |
+		each shouldBeAliased ifTrue: [ true ] ifFalse: [
+			each hasOpeningStatements ifTrue: [ true ] ifFalse: [
+				each subtreeNeedsAliasing ] ] ]
 ! !
 
 !JSStatementNode methodsFor: '*Compiler-IR'!

+ 7 - 2
lang/src/Compiler-Inlining.js

@@ -11,11 +11,11 @@ selector: "visitSendNode:",
 protocol: "visiting",
 //>>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 receiver ifNotNil: [ :receiver |\x0a\x09\x09\x09\x09receiver shouldBeAliased: true ] ] ].\x0a\x0a\x09^ super visitSendNode: aNode",
+source: "visitSendNode: aNode\x0a\x0a\x09aNode superSend ifFalse: [ \x0a\x09\x09(IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [\x0a\x09\x09\x09aNode shouldBeAliased: true.\x0a\x09\x09\x09aNode receiver ifNotNil: [ :receiver |\x0a\x09\x09\x09\x09receiver shouldBeAliased: true ] ] ].\x0a\x0a\x09^ super visitSendNode: aNode",
 referencedClasses: ["IRSendInliner"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifFalse:", "superSend", "ifTrue:", "includes:", "inlinedSelectors", "selector", "ifNotNil:", "receiver", "shouldBeAliased:", "visitSendNode:"]
+messageSends: ["ifFalse:", "superSend", "ifTrue:", "includes:", "inlinedSelectors", "selector", "shouldBeAliased:", "ifNotNil:", "receiver", "visitSendNode:"]
 }, function ($methodClass){ return function (aNode){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -26,6 +26,11 @@ $1=$recv(aNode)._superSend();
 if(!$core.assert($1)){
 $2=$recv($recv($globals.IRSendInliner)._inlinedSelectors())._includes_($recv(aNode)._selector());
 if($core.assert($2)){
+[$recv(aNode)._shouldBeAliased_(true)
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+,$ctx1.sendIdx["shouldBeAliased:"]=1
+//>>excludeEnd("ctx");
+][0];
 $3=$recv(aNode)._receiver();
 if($3 == null || $3.a$nil){
 $3;

+ 1 - 0
lang/src/Compiler-Inlining.st

@@ -9,6 +9,7 @@ visitSendNode: aNode
 
 	aNode superSend ifFalse: [ 
 		(IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [
+			aNode shouldBeAliased: true.
 			aNode receiver ifNotNil: [ :receiver |
 				receiver shouldBeAliased: true ] ] ].
 

+ 12 - 14
lang/src/Kernel-Methods.js

@@ -896,7 +896,7 @@ var result;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10;
+var $1,$2,$3,$4,$5,$6,$7,$8;
 result=[$recv(aClass)._name()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["name"]=1
@@ -935,19 +935,18 @@ $4=[$recv([$self._methodClass()
 //>>excludeEnd("ctx");
 ][0];
 }
-$5=[$recv($2).__comma($4)
+result=[$recv([$recv($2).__comma($4)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx[","]=2
 //>>excludeEnd("ctx");
-][0];
-result=[$recv($5).__comma(")")
+][0]).__comma(")")
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx[","]=1
 //>>excludeEnd("ctx");
 ][0];
 result;
 }
-$6=$recv([$recv([$self._origin()
+$5=$recv([$recv([$self._origin()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["origin"]=1
 //>>excludeEnd("ctx");
@@ -960,28 +959,27 @@ $6=$recv([$recv([$self._origin()
 ,$ctx1.sendIdx["origin"]=2
 //>>excludeEnd("ctx");
 ][0]).__eq($self._methodClass()));
-if(!$core.assert($6)){
-$7=[$recv(result).__comma(" /")
+if(!$core.assert($5)){
+$6=[$recv(result).__comma(" /")
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx[","]=6
 //>>excludeEnd("ctx");
 ][0];
-$8=[$self._origin()
+$7=[$self._origin()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["origin"]=3
 //>>excludeEnd("ctx");
 ][0];
-if($8 == null || $8.a$nil){
-$9="nil";
+if($7 == null || $7.a$nil){
+$8="nil";
 } else {
-$9=$recv($self._origin())._name();
+$8=$recv($self._origin())._name();
 }
-$10=[$recv($7).__comma($9)
+result=[$recv([$recv($6).__comma($8)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx[","]=5
 //>>excludeEnd("ctx");
-][0];
-result=[$recv($10).__comma("/")
+][0]).__comma("/")
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx[","]=4
 //>>excludeEnd("ctx");

+ 26 - 29
lang/src/Kernel-Tests.js

@@ -14631,7 +14631,7 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$4,$5,$6,$7,$8,$9;
+var $1,$2,$3,$4,$5,$6,$7,$8;
 [$self._deny_($recv([$recv($globals.Object)._new()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["new"]=1
@@ -14651,45 +14651,44 @@ $2=true;
 } else {
 $2=$1;
 }
-$3=$recv($2).__eq(true);
-$self._deny_($3);
-$4=[$recv($globals.Object)._new()
+$self._deny_($recv($2).__eq(true));
+$3=[$recv($globals.Object)._new()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["new"]=3
 //>>excludeEnd("ctx");
 ][0];
-if($4 == null || $4.a$nil){
-$5=$4;
+if($3 == null || $3.a$nil){
+$4=$3;
 } else {
-$5=true;
+$4=true;
 }
-[$self._assert_equals_($5,true)
+[$self._assert_equals_($4,true)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["assert:equals:"]=1
 //>>excludeEnd("ctx");
 ][0];
-$6=[$recv($globals.Object)._new()
+$5=[$recv($globals.Object)._new()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["new"]=4
 //>>excludeEnd("ctx");
 ][0];
-if($6 == null || $6.a$nil){
-$7=false;
+if($5 == null || $5.a$nil){
+$6=false;
 } else {
-$7=true;
+$6=true;
 }
-[$self._assert_equals_($7,true)
+[$self._assert_equals_($6,true)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["assert:equals:"]=2
 //>>excludeEnd("ctx");
 ][0];
-$8=$recv($globals.Object)._new();
-if($8 == null || $8.a$nil){
-$9=false;
+$7=$recv($globals.Object)._new();
+if($7 == null || $7.a$nil){
+$8=false;
 } else {
-$9=true;
+$8=true;
 }
-$self._assert_equals_($9,true);
+$self._assert_equals_($8,true);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"testIfNil",{})});
@@ -17370,7 +17369,7 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$4,$5,$6;
+var $1,$2,$3,$4;
 if(nil == null || nil.a$nil){
 $1=true;
 } else {
@@ -17386,29 +17385,27 @@ $2=nil;
 } else {
 $2=true;
 }
-$3=[$recv($2).__eq(true)
+[$self._deny_([$recv($2).__eq(true)
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["="]=1
 //>>excludeEnd("ctx");
-][0];
-[$self._deny_($3)
+][0])
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["deny:"]=1
 //>>excludeEnd("ctx");
 ][0];
 if(nil == null || nil.a$nil){
-$4=true;
+$3=true;
 } else {
-$4=false;
+$3=false;
 }
-$self._assert_equals_($4,true);
+$self._assert_equals_($3,true);
 if(nil == null || nil.a$nil){
-$5=false;
+$4=false;
 } else {
-$5=true;
+$4=true;
 }
-$6=$recv($5).__eq(true);
-$self._deny_($6);
+$self._deny_($recv($4).__eq(true));
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"testIfNil",{})});

+ 3 - 4
lang/src/Platform-ImportExport.js

@@ -1131,7 +1131,7 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$2,$3,$4;
+var $1,$2,$3;
 [$recv(aStream)._lf()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["lf"]=1
@@ -1154,7 +1154,7 @@ $3=[$recv(superclass)._asJavaScriptSource()
 //>>excludeEnd("ctx");
 ][0];
 }
-$4=["$core.addClass(",$1,", ",$3,", ",[$recv($recv(aClass)._instanceVariableNames())._asJavaScriptSource()
+[$recv(aStream)._write_(["$core.addClass(",$1,", ",$3,", ",[$recv($recv(aClass)._instanceVariableNames())._asJavaScriptSource()
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["asJavaScriptSource"]=3
 //>>excludeEnd("ctx");
@@ -1162,8 +1162,7 @@ $4=["$core.addClass(",$1,", ",$3,", ",[$recv($recv(aClass)._instanceVariableName
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["asJavaScriptSource"]=4
 //>>excludeEnd("ctx");
-][0],");"];
-[$recv(aStream)._write_($4)
+][0],");"])
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 ,$ctx1.sendIdx["write:"]=1
 //>>excludeEnd("ctx");