|
@@ -2829,30 +2829,66 @@ $globals.ASTInterpreter);
|
|
|
|
|
|
$core.addMethod(
|
|
|
$core.method({
|
|
|
-selector: "sendMessage:to:superSend:",
|
|
|
+selector: "sendJavaScript:superMessage:to:",
|
|
|
protocol: "private",
|
|
|
|
|
|
-args: ["aMessage", "anObject", "aBoolean"],
|
|
|
-source: "sendMessage: aMessage to: anObject superSend: aBoolean\x0a\x09| method |\x0a\x09\x0a\x09aBoolean ifFalse: [ ^ aMessage sendTo: anObject ].\x0a\x09anObject class superclass ifNil: [ ^ self messageNotUnderstood: aMessage receiver: anObject ].\x0a\x09\x0a\x09method := (self context method methodClass superclass lookupSelector: aMessage selector)\x0a\x09\x09ifNil: [ ^ self messageNotUnderstood: aMessage receiver: anObject ].\x0a\x09\x09\x0a\x09^ method sendTo: anObject arguments: aMessage arguments",
|
|
|
+args: ["aString", "aMessage", "anObject"],
|
|
|
+source: "sendJavaScript: aString superMessage: aMessage to: anObject\x0a\x09| methodBlock parent |\x0a\x09\x0a\x09parent := self context method methodClass superPrototype.\x0a\x09parent ifNil: [ ^ self messageNotUnderstood: aMessage receiver: anObject ].\x0a\x09\x0a\x09methodBlock := (parent at: aString)\x0a\x09\x09ifNil: [ ^ self messageNotUnderstood: aMessage receiver: anObject ].\x0a\x09\x09\x0a\x09^ methodBlock applyTo: anObject arguments: aMessage arguments",
|
|
|
referencedClasses: [],
|
|
|
|
|
|
pragmas: [],
|
|
|
-messageSends: ["ifFalse:", "sendTo:", "ifNil:", "superclass", "class", "messageNotUnderstood:receiver:", "lookupSelector:", "methodClass", "method", "context", "selector", "sendTo:arguments:", "arguments"]
|
|
|
-}, function ($methodClass){ return function (aMessage,anObject,aBoolean){
|
|
|
+messageSends: ["superPrototype", "methodClass", "method", "context", "ifNil:", "messageNotUnderstood:receiver:", "at:", "applyTo:arguments:", "arguments"]
|
|
|
+}, function ($methodClass){ return function (aString,aMessage,anObject){
|
|
|
var self=this,$self=this;
|
|
|
-var method;
|
|
|
+var methodBlock,parent;
|
|
|
|
|
|
return $core.withContext(function($ctx1) {
|
|
|
|
|
|
var $1,$2;
|
|
|
-if(!$core.assert(aBoolean)){
|
|
|
-return $recv(aMessage)._sendTo_(anObject);
|
|
|
-}
|
|
|
-$1=[$recv($recv(anObject)._class())._superclass()
|
|
|
+parent=$recv($recv($recv($self._context())._method())._methodClass())._superPrototype();
|
|
|
+$1=parent;
|
|
|
+if($1 == null || $1.a$nil){
|
|
|
+return [$self._messageNotUnderstood_receiver_(aMessage,anObject)
|
|
|
|
|
|
-,$ctx1.sendIdx["superclass"]=1
|
|
|
+,$ctx1.sendIdx["messageNotUnderstood:receiver:"]=1
|
|
|
|
|
|
][0];
|
|
|
+} else {
|
|
|
+$1;
|
|
|
+}
|
|
|
+$2=$recv(parent)._at_(aString);
|
|
|
+if($2 == null || $2.a$nil){
|
|
|
+return $self._messageNotUnderstood_receiver_(aMessage,anObject);
|
|
|
+} else {
|
|
|
+methodBlock=$2;
|
|
|
+}
|
|
|
+return $recv(methodBlock)._applyTo_arguments_(anObject,$recv(aMessage)._arguments());
|
|
|
+
|
|
|
+}, function($ctx1) {$ctx1.fill(self,"sendJavaScript:superMessage:to:",{aString:aString,aMessage:aMessage,anObject:anObject,methodBlock:methodBlock,parent:parent})});
|
|
|
+
|
|
|
+}; }),
|
|
|
+$globals.ASTInterpreter);
|
|
|
+
|
|
|
+$core.addMethod(
|
|
|
+$core.method({
|
|
|
+selector: "sendSuperMessage:to:",
|
|
|
+protocol: "private",
|
|
|
+
|
|
|
+args: ["aMessage", "anObject"],
|
|
|
+source: "sendSuperMessage: aMessage to: anObject\x0a\x09| method parent |\x0a\x09\x0a\x09parent := self context method methodClass superclass.\x0a\x09parent ifNil: [ ^ self messageNotUnderstood: aMessage receiver: anObject ].\x0a\x09\x0a\x09method := (parent lookupSelector: aMessage selector)\x0a\x09\x09ifNil: [ ^ self messageNotUnderstood: aMessage receiver: anObject ].\x0a\x09\x09\x0a\x09^ method sendTo: anObject arguments: aMessage arguments",
|
|
|
+referencedClasses: [],
|
|
|
+
|
|
|
+pragmas: [],
|
|
|
+messageSends: ["superclass", "methodClass", "method", "context", "ifNil:", "messageNotUnderstood:receiver:", "lookupSelector:", "selector", "sendTo:arguments:", "arguments"]
|
|
|
+}, function ($methodClass){ return function (aMessage,anObject){
|
|
|
+var self=this,$self=this;
|
|
|
+var method,parent;
|
|
|
+
|
|
|
+return $core.withContext(function($ctx1) {
|
|
|
+
|
|
|
+var $1,$2;
|
|
|
+parent=$recv($recv($recv($self._context())._method())._methodClass())._superclass();
|
|
|
+$1=parent;
|
|
|
if($1 == null || $1.a$nil){
|
|
|
return [$self._messageNotUnderstood_receiver_(aMessage,anObject)
|
|
|
|
|
@@ -2862,7 +2898,7 @@ return [$self._messageNotUnderstood_receiver_(aMessage,anObject)
|
|
|
} else {
|
|
|
$1;
|
|
|
}
|
|
|
-$2=$recv($recv($recv($recv($self._context())._method())._methodClass())._superclass())._lookupSelector_($recv(aMessage)._selector());
|
|
|
+$2=$recv(parent)._lookupSelector_($recv(aMessage)._selector());
|
|
|
if($2 == null || $2.a$nil){
|
|
|
return $self._messageNotUnderstood_receiver_(aMessage,anObject);
|
|
|
} else {
|
|
@@ -2870,7 +2906,7 @@ method=$2;
|
|
|
}
|
|
|
return $recv(method)._sendTo_arguments_(anObject,$recv(aMessage)._arguments());
|
|
|
|
|
|
-}, function($ctx1) {$ctx1.fill(self,"sendMessage:to:superSend:",{aMessage:aMessage,anObject:anObject,aBoolean:aBoolean,method:method})});
|
|
|
+}, function($ctx1) {$ctx1.fill(self,"sendSuperMessage:to:",{aMessage:aMessage,anObject:anObject,method:method,parent:parent})});
|
|
|
|
|
|
}; }),
|
|
|
$globals.ASTInterpreter);
|
|
@@ -3311,11 +3347,11 @@ selector: "visitSendNode:",
|
|
|
protocol: "visiting",
|
|
|
|
|
|
args: ["aNode"],
|
|
|
-source: "visitSendNode: aNode\x0a\x09| receiver args message result |\x0a\x09\x0a\x09args := aNode arguments collect: [ :each | self pop ].\x0a\x09receiver := self peek.\x0a\x09\x0a\x09message := self\x0a\x09\x09messageFromSendNode: aNode\x0a\x09\x09arguments: args reversed.\x0a\x09\x0a\x09result := self sendMessage: message to: receiver superSend: aNode superSend.\x0a\x09\x0a\x09\x22For cascade sends, push the reciever if the send is not the last one\x22\x0a\x09aNode isSideEffect ifFalse: [ self pop; push: result ]",
|
|
|
+source: "visitSendNode: aNode\x0a\x09| receiver args message result |\x0a\x09\x0a\x09args := aNode arguments collect: [ :each | self pop ].\x0a\x09receiver := self peek.\x0a\x09\x0a\x09message := self\x0a\x09\x09messageFromSendNode: aNode\x0a\x09\x09arguments: args reversed.\x0a\x09\x0a\x09result := aNode superSend\x0a\x09\x09ifFalse: [ message sendTo: receiver ]\x0a\x09\x09ifTrue: [ aNode receiver binding isJavaScriptSuper\x0a\x09\x09\x09ifFalse: [ self sendSuperMessage: message to: receiver ]\x0a\x09\x09\x09ifTrue: [ self sendJavaScript: aNode javaScriptSelector superMessage: message to: receiver ] ].\x0a\x09\x0a\x09\x22For cascade sends, push the reciever if the send is not the last one\x22\x0a\x09aNode isSideEffect ifFalse: [ self pop; push: result ]",
|
|
|
referencedClasses: [],
|
|
|
|
|
|
pragmas: [],
|
|
|
-messageSends: ["collect:", "arguments", "pop", "peek", "messageFromSendNode:arguments:", "reversed", "sendMessage:to:superSend:", "superSend", "ifFalse:", "isSideEffect", "push:"]
|
|
|
+messageSends: ["collect:", "arguments", "pop", "peek", "messageFromSendNode:arguments:", "reversed", "ifFalse:ifTrue:", "superSend", "sendTo:", "isJavaScriptSuper", "binding", "receiver", "sendSuperMessage:to:", "sendJavaScript:superMessage:to:", "javaScriptSelector", "ifFalse:", "isSideEffect", "push:"]
|
|
|
}, function ($methodClass){ return function (aNode){
|
|
|
var self=this,$self=this;
|
|
|
var receiver,args,message,result;
|
|
@@ -3337,7 +3373,15 @@ return [$self._pop()
|
|
|
}));
|
|
|
receiver=$self._peek();
|
|
|
message=$self._messageFromSendNode_arguments_(aNode,$recv(args)._reversed());
|
|
|
-result=$self._sendMessage_to_superSend_(message,receiver,$recv(aNode)._superSend());
|
|
|
+if($core.assert($recv(aNode)._superSend())){
|
|
|
+if($core.assert($recv($recv($recv(aNode)._receiver())._binding())._isJavaScriptSuper())){
|
|
|
+result=$self._sendJavaScript_superMessage_to_($recv(aNode)._javaScriptSelector(),message,receiver);
|
|
|
+} else {
|
|
|
+result=$self._sendSuperMessage_to_(message,receiver);
|
|
|
+}
|
|
|
+} else {
|
|
|
+result=$recv(message)._sendTo_(receiver);
|
|
|
+}
|
|
|
if(!$core.assert($recv(aNode)._isSideEffect())){
|
|
|
$self._pop();
|
|
|
$self._push_(result);
|
|
@@ -3972,6 +4016,24 @@ return true;
|
|
|
}; }),
|
|
|
$globals.JSStatementNode);
|
|
|
|
|
|
+$core.addMethod(
|
|
|
+$core.method({
|
|
|
+selector: "isJavaScriptSuper",
|
|
|
+protocol: "*Compiler-Interpreter",
|
|
|
+
|
|
|
+args: [],
|
|
|
+source: "isJavaScriptSuper\x0a\x09^ true",
|
|
|
+referencedClasses: [],
|
|
|
+
|
|
|
+pragmas: [],
|
|
|
+messageSends: []
|
|
|
+}, function ($methodClass){ return function (){
|
|
|
+var self=this,$self=this;
|
|
|
+return true;
|
|
|
+
|
|
|
+}; }),
|
|
|
+$globals.JavaScriptSuperVar);
|
|
|
+
|
|
|
$core.addMethod(
|
|
|
$core.method({
|
|
|
selector: "inContext:",
|
|
@@ -4099,6 +4161,24 @@ return $recv(aContext)._localAt_("self");
|
|
|
}; }),
|
|
|
$globals.SuperVar);
|
|
|
|
|
|
+$core.addMethod(
|
|
|
+$core.method({
|
|
|
+selector: "isJavaScriptSuper",
|
|
|
+protocol: "*Compiler-Interpreter",
|
|
|
+
|
|
|
+args: [],
|
|
|
+source: "isJavaScriptSuper\x0a\x09^ false",
|
|
|
+referencedClasses: [],
|
|
|
+
|
|
|
+pragmas: [],
|
|
|
+messageSends: []
|
|
|
+}, function ($methodClass){ return function (){
|
|
|
+var self=this,$self=this;
|
|
|
+return false;
|
|
|
+
|
|
|
+}; }),
|
|
|
+$globals.SuperVar);
|
|
|
+
|
|
|
$core.addMethod(
|
|
|
$core.method({
|
|
|
selector: "inContext:put:",
|