Переглянути джерело

dnu: lookupProperty:, forwardMessage:WithArguments: used

The semantics is cleaner.
Inline JS does only very specific tasks.
Herbert Vojčík 11 роки тому
батько
коміт
48a6a0d2f2
3 змінених файлів з 89 додано та 71 видалено
  1. 32 25
      js/Kernel-Objects.deploy.js
  2. 43 31
      js/Kernel-Objects.js
  3. 14 15
      st/Kernel-Objects.st

+ 32 - 25
js/Kernel-Objects.deploy.js

@@ -1689,19 +1689,19 @@ smalltalk.method({
 selector: "doesNotUnderstand:",
 fn: function (aMessage){
 var self=this;
-var jsSelector;
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
-jsSelector=_st(self)._selectorToForwardMessage_(aMessage);
-$2=jsSelector;
+$2=_st(self)._lookupProperty_(_st(_st(aMessage)._selector())._asJavaScriptSelector());
 if(($receiver = $2) == nil || $receiver == undefined){
 $1=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
 } else {
-$1=_st(self)._forwardMessage_jsSelector_(aMessage,jsSelector);
+var jsSelector;
+jsSelector=$receiver;
+$1=_st(self)._forwardMessage_withArguments_(jsSelector,_st(aMessage)._arguments());
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage,jsSelector:jsSelector},smalltalk.JSObjectProxy)})},
-messageSends: ["selectorToForwardMessage:", "ifNotNil:ifNil:", "forwardMessage:jsSelector:", "doesNotUnderstand:"]}),
+}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage},smalltalk.JSObjectProxy)})},
+messageSends: ["ifNotNil:ifNil:", "forwardMessage:withArguments:", "arguments", "doesNotUnderstand:", "lookupProperty:", "asJavaScriptSelector", "selector"]}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
@@ -1732,6 +1732,20 @@ return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:jsSelector:",{aMe
 messageSends: []}),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_forwardMessage_withArguments_",
+smalltalk.method({
+selector: "forwardMessage:withArguments:",
+fn: function (aString,anArray){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+
+		return smalltalk.send(self._jsObject(), aString, anArray);
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:withArguments:",{aString:aString,anArray:anArray},smalltalk.JSObjectProxy)})},
+messageSends: []}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_inspectOn_",
 smalltalk.method({
@@ -1794,34 +1808,27 @@ messageSends: []}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-"_printOn_",
+"_lookupProperty_",
 smalltalk.method({
-selector: "printOn:",
-fn: function (aStream) {
+selector: "lookupProperty:",
+fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(aStream)._nextPutAll_(_st(_st(self)._jsObject())._toString());
-return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.JSObjectProxy)});},
-messageSends: ["nextPutAll:", "toString", "jsObject"]}),
+return aString in self._jsObject() ? aString : nil;
+return self}, function($ctx1) {$ctx1.fill(self,"lookupProperty:",{aString:aString},smalltalk.JSObjectProxy)})},
+messageSends: []}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(
-"_selectorToForwardMessage_",
+"_printOn_",
 smalltalk.method({
-selector: "selectorToForwardMessage:",
-fn: function (aMessage){
+selector: "printOn:",
+fn: function (aStream) {
 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: []}),
+_st(aStream)._nextPutAll_(_st(_st(self)._jsObject())._toString());
+return self}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},smalltalk.JSObjectProxy)});},
+messageSends: ["nextPutAll:", "toString", "jsObject"]}),
 smalltalk.JSObjectProxy);
 
 smalltalk.addMethod(

+ 43 - 31
js/Kernel-Objects.js

@@ -2309,21 +2309,21 @@ selector: "doesNotUnderstand:",
 category: 'proxy',
 fn: function (aMessage){
 var self=this;
-var jsSelector;
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
-jsSelector=_st(self)._selectorToForwardMessage_(aMessage);
-$2=jsSelector;
+$2=_st(self)._lookupProperty_(_st(_st(aMessage)._selector())._asJavaScriptSelector());
 if(($receiver = $2) == nil || $receiver == undefined){
 $1=smalltalk.Object.fn.prototype._doesNotUnderstand_.apply(_st(self), [aMessage]);
 } else {
-$1=_st(self)._forwardMessage_jsSelector_(aMessage,jsSelector);
+var jsSelector;
+jsSelector=$receiver;
+$1=_st(self)._forwardMessage_withArguments_(jsSelector,_st(aMessage)._arguments());
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage,jsSelector:jsSelector},smalltalk.JSObjectProxy)})},
+}, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage},smalltalk.JSObjectProxy)})},
 args: ["aMessage"],
-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:"],
+source: "doesNotUnderstand: aMessage\x0a\x09^(self lookupProperty: aMessage selector asJavaScriptSelector)\x0a\x09\x09ifNotNil: [ :jsSelector | self forwardMessage: jsSelector withArguments: aMessage arguments ]\x0a\x09\x09ifNil: [ super doesNotUnderstand: aMessage ]",
+messageSends: ["ifNotNil:ifNil:", "forwardMessage:withArguments:", "arguments", "doesNotUnderstand:", "lookupProperty:", "asJavaScriptSelector", "selector"],
 referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
@@ -2366,6 +2366,25 @@ referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_forwardMessage_withArguments_",
+smalltalk.method({
+selector: "forwardMessage:withArguments:",
+category: 'proxy',
+fn: function (aString,anArray){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+
+		return smalltalk.send(self._jsObject(), aString, anArray);
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:withArguments:",{aString:aString,anArray:anArray},smalltalk.JSObjectProxy)})},
+args: ["aString", "anArray"],
+source: "forwardMessage: aString withArguments: anArray\x0a\x09<\x0a\x09\x09return smalltalk.send(self._jsObject(), aString, anArray);\x0a\x09>",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_inspectOn_",
 smalltalk.method({
@@ -2447,6 +2466,23 @@ referencedClasses: []
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+"_lookupProperty_",
+smalltalk.method({
+selector: "lookupProperty:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return aString in self._jsObject() ? aString : nil;
+return self}, function($ctx1) {$ctx1.fill(self,"lookupProperty:",{aString:aString},smalltalk.JSObjectProxy)})},
+args: ["aString"],
+source: "lookupProperty: aString\x0a\x09\x22Looks up a property in JS object.\x0a\x09Return the property if it is present, or nil if it is not present.\x22\x0a\x09<return aString in self._jsObject() ? aString : nil>",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
 smalltalk.addMethod(
 "_printOn_",
 smalltalk.method({
@@ -2464,30 +2500,6 @@ 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({

+ 14 - 15
st/Kernel-Objects.st

@@ -716,6 +716,12 @@ jsObject: aJSObject
 	jsObject := aJSObject
 !
 
+lookupProperty: aString
+	"Looks up a property in JS object.
+	Return the property if it is present, or nil if it is not present."
+	<return aString in self._jsObject() ? aString : nil>
+!
+
 value
 	"if attribute 'value' exists on the JS object return it,
 	otherwise return the result of Object>>value."
@@ -753,10 +759,8 @@ addObjectVariablesTo: aDictionary
 !
 
 doesNotUnderstand: aMessage
-	| jsSelector |
-	jsSelector := self selectorToForwardMessage: aMessage.
-	^ jsSelector
-		ifNotNil: [ self forwardMessage: aMessage jsSelector: jsSelector ]
+	^(self lookupProperty: aMessage selector asJavaScriptSelector)
+		ifNotNil: [ :jsSelector | self forwardMessage: jsSelector withArguments: aMessage arguments ]
 		ifNil: [ super doesNotUnderstand: aMessage ]
 !
 
@@ -772,6 +776,12 @@ forwardMessage: aMessage jsSelector: aString
 	>
 !
 
+forwardMessage: aString withArguments: anArray
+	<
+		return smalltalk.send(self._jsObject(), aString, anArray);
+	>
+!
+
 inspectOn: anInspector
 	| variables |
 	variables := Dictionary new.
@@ -792,17 +802,6 @@ 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'!