Преглед на файлове

Optimizes pieces of forwarding code.

Herbert Vojčík преди 11 години
родител
ревизия
b1bc36deb2
променени са 6 файла, в които са добавени 125 реда и са изтрити 29 реда
  1. 2 2
      js/Kernel-Collections.deploy.js
  2. 3 3
      js/Kernel-Collections.js
  3. 43 9
      js/Kernel-Objects.deploy.js
  4. 54 10
      js/Kernel-Objects.js
  5. 1 1
      st/Kernel-Collections.st
  6. 22 4
      st/Kernel-Objects.st

+ 2 - 2
js/Kernel-Collections.deploy.js

@@ -2672,10 +2672,10 @@ fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=_st(_st(_st(self)._asSelector())._replace_with_("^_",""))._replace_with_("_.*","");
+$1=_st(self)._replace_with_("^([a-zA-Z0-9]*).*$","$1");
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"asJavaScriptSelector",{},smalltalk.String)})},
-messageSends: ["replace:with:", "asSelector"]}),
+messageSends: ["replace:with:"]}),
 smalltalk.String);
 
 smalltalk.addMethod(

+ 3 - 3
js/Kernel-Collections.js

@@ -3527,12 +3527,12 @@ fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=_st(_st(_st(self)._asSelector())._replace_with_("^_",""))._replace_with_("_.*","");
+$1=_st(self)._replace_with_("^([a-zA-Z0-9]*).*$","$1");
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"asJavaScriptSelector",{},smalltalk.String)})},
 args: [],
-source: "asJavaScriptSelector\x0a\x09^(self asSelector replace: '^_' with: '') replace: '_.*' with: ''.",
-messageSends: ["replace:with:", "asSelector"],
+source: "asJavaScriptSelector\x0a\x09^self replace: '^([a-zA-Z0-9]*).*$' with: '$1'",
+messageSends: ["replace:with:"],
 referencedClasses: []
 }),
 smalltalk.String);

+ 43 - 9
js/Kernel-Objects.deploy.js

@@ -1687,20 +1687,21 @@ smalltalk.addMethod(
 "_doesNotUnderstand_",
 smalltalk.method({
 selector: "doesNotUnderstand:",
-fn: function (aMessage) {
+fn: function (aMessage){
 var self=this;
+var jsSelector;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$3,$1;
-$2=_st(self)._canForwardMessage_(aMessage);
-if(smalltalk.assert($2)){
-$1=_st(self)._forwardMessage_(aMessage);
+var $2,$1;
+jsSelector=_st(self)._selectorToForwardMessage_(aMessage);
+$2=jsSelector;
+if(($receiver = $2) == nil || $receiver == undefined){
+$1=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
 } else {
-$3=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
-return $3;
+$1=_st(self)._forwardMessage_jsSelector_(aMessage,jsSelector);
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage},smalltalk.JSObjectProxy)});},
-messageSends: ["ifTrue:ifFalse:", "forwardMessage:", "doesNotUnderstand:", "canForwardMessage:"]}),
+}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage,jsSelector:jsSelector},smalltalk.JSObjectProxy)})},
+messageSends: ["selectorToForwardMessage:", "ifNotNil:ifNil:", "forwardMessage:jsSelector:", "doesNotUnderstand:"]}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
@@ -1717,6 +1718,20 @@ return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:",{aMessage:aMess
 messageSends: []}),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_forwardMessage_jsSelector_",
+smalltalk.method({
+selector: "forwardMessage:jsSelector:",
+fn: function (aMessage,aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+
+		return smalltalk.send(self._jsObject(), aString, aMessage._arguments());
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:jsSelector:",{aMessage:aMessage,aString:aString},smalltalk.JSObjectProxy)})},
+messageSends: []}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_inspectOn_",
 smalltalk.method({
@@ -1790,6 +1805,25 @@ return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smal
 messageSends: ["nextPutAll:", "toString", "jsObject"]}),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_selectorToForwardMessage_",
+smalltalk.method({
+selector: "selectorToForwardMessage:",
+fn: function (aMessage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+
+		var jsSelector = aMessage._selector()._asJavaScriptSelector();
+		if(jsSelector in self._jsObject()) {
+			return jsSelector;
+		} else {
+			return nil;
+		}
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"selectorToForwardMessage:",{aMessage:aMessage},smalltalk.JSObjectProxy)})},
+messageSends: []}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_value",
 smalltalk.method({

+ 54 - 10
js/Kernel-Objects.js

@@ -2307,22 +2307,23 @@ smalltalk.addMethod(
 smalltalk.method({
 selector: "doesNotUnderstand:",
 category: 'proxy',
-fn: function (aMessage) {
+fn: function (aMessage){
 var self=this;
+var jsSelector;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$3,$1;
-$2=_st(self)._canForwardMessage_(aMessage);
-if(smalltalk.assert($2)){
-$1=_st(self)._forwardMessage_(aMessage);
+var $2,$1;
+jsSelector=_st(self)._selectorToForwardMessage_(aMessage);
+$2=jsSelector;
+if(($receiver = $2) == nil || $receiver == undefined){
+$1=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
 } else {
-$3=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
-return $3;
+$1=_st(self)._forwardMessage_jsSelector_(aMessage,jsSelector);
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage},smalltalk.JSObjectProxy)});},
+}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage,jsSelector:jsSelector},smalltalk.JSObjectProxy)})},
 args: ["aMessage"],
-source: "doesNotUnderstand: aMessage\x0a\x09\x0a\x09^ (self canForwardMessage: aMessage)\x0a\x09\x09ifTrue: [ self forwardMessage: aMessage ]\x0a\x09\x09ifFalse: [ ^ super doesNotUnderstand: aMessage ]",
-messageSends: ["ifTrue:ifFalse:", "forwardMessage:", "doesNotUnderstand:", "canForwardMessage:"],
+source: "doesNotUnderstand: aMessage\x0a\x09| jsSelector |\x0a\x09jsSelector := self selectorToForwardMessage: aMessage.\x0a\x09^ jsSelector\x0a\x09\x09ifNotNil: [ self forwardMessage: aMessage jsSelector: jsSelector ]\x0a\x09\x09ifNil: [ super doesNotUnderstand: aMessage ]",
+messageSends: ["selectorToForwardMessage:", "ifNotNil:ifNil:", "forwardMessage:jsSelector:", "doesNotUnderstand:"],
 referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
@@ -2346,6 +2347,25 @@ referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_forwardMessage_jsSelector_",
+smalltalk.method({
+selector: "forwardMessage:jsSelector:",
+category: 'proxy',
+fn: function (aMessage,aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+
+		return smalltalk.send(self._jsObject(), aString, aMessage._arguments());
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:jsSelector:",{aMessage:aMessage,aString:aString},smalltalk.JSObjectProxy)})},
+args: ["aMessage", "aString"],
+source: "forwardMessage: aMessage jsSelector: aString\x0a\x09<\x0a\x09\x09return smalltalk.send(self._jsObject(), aString, aMessage._arguments());\x0a\x09>",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_inspectOn_",
 smalltalk.method({
@@ -2444,6 +2464,30 @@ referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_selectorToForwardMessage_",
+smalltalk.method({
+selector: "selectorToForwardMessage:",
+category: 'testing',
+fn: function (aMessage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+
+		var jsSelector = aMessage._selector()._asJavaScriptSelector();
+		if(jsSelector in self._jsObject()) {
+			return jsSelector;
+		} else {
+			return nil;
+		}
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"selectorToForwardMessage:",{aMessage:aMessage},smalltalk.JSObjectProxy)})},
+args: ["aMessage"],
+source: "selectorToForwardMessage: aMessage\x0a\x09<\x0a\x09\x09var jsSelector = aMessage._selector()._asJavaScriptSelector();\x0a\x09\x09if(jsSelector in self._jsObject()) {\x0a\x09\x09\x09return jsSelector;\x0a\x09\x09} else {\x0a\x09\x09\x09return nil;\x0a\x09\x09}\x0a\x09>",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_value",
 smalltalk.method({

+ 1 - 1
st/Kernel-Collections.st

@@ -1155,7 +1155,7 @@ asJSON
 !
 
 asJavaScriptSelector
-	^(self asSelector replace: '^_' with: '') replace: '_.*' with: ''.
+	^self replace: '^([a-zA-Z0-9]*).*$' with: '$1'
 !
 
 asJavascript

+ 22 - 4
st/Kernel-Objects.st

@@ -753,10 +753,11 @@ addObjectVariablesTo: aDictionary
 !
 
 doesNotUnderstand: aMessage
-	
-	^ (self canForwardMessage: aMessage)
-		ifTrue: [ self forwardMessage: aMessage ]
-		ifFalse: [ ^ super doesNotUnderstand: aMessage ]
+	| jsSelector |
+	jsSelector := self selectorToForwardMessage: aMessage.
+	^ jsSelector
+		ifNotNil: [ self forwardMessage: aMessage jsSelector: jsSelector ]
+		ifNil: [ super doesNotUnderstand: aMessage ]
 !
 
 forwardMessage: aMessage
@@ -765,6 +766,12 @@ forwardMessage: aMessage
 	>
 !
 
+forwardMessage: aMessage jsSelector: aString
+	<
+		return smalltalk.send(self._jsObject(), aString, aMessage._arguments());
+	>
+!
+
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
@@ -785,6 +792,17 @@ canForwardMessage: aMessage
 			return false;
 		}
 	>
+!
+
+selectorToForwardMessage: aMessage
+	<
+		var jsSelector = aMessage._selector()._asJavaScriptSelector();
+		if(jsSelector in self._jsObject()) {
+			return jsSelector;
+		} else {
+			return nil;
+		}
+	>
 ! !
 
 !JSObjectProxy class methodsFor: 'instance creation'!