Jelajahi Sumber

boot.js: DNU handling paths cleared and some shortcuts taken

Herbert Vojčík 10 tahun lalu
induk
melakukan
07bbbe02a7
3 mengubah file dengan 31 tambahan dan 29 penghapusan
  1. 2 2
      src/Kernel-Infrastructure.js
  2. 1 1
      src/Kernel-Infrastructure.st
  3. 28 26
      support/boot.js

+ 2 - 2
src/Kernel-Infrastructure.js

@@ -1111,11 +1111,11 @@ fn: function (aString,anArray){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 
-		return smalltalk.send(self._jsObject(), aString, anArray);
+		return smalltalk.accessJavaScript(self._jsObject(), aString, anArray);
 	;
 return self}, function($ctx1) {$ctx1.fill(self,"forwardMessage:withArguments:",{aString:aString,anArray:anArray},globals.JSObjectProxy)})},
 args: ["aString", "anArray"],
-source: "forwardMessage: aString withArguments: anArray\x0a\x09<\x0a\x09\x09return smalltalk.send(self._jsObject(), aString, anArray);\x0a\x09>",
+source: "forwardMessage: aString withArguments: anArray\x0a\x09<\x0a\x09\x09return smalltalk.accessJavaScript(self._jsObject(), aString, anArray);\x0a\x09>",
 messageSends: [],
 referencedClasses: []
 }),

+ 1 - 1
src/Kernel-Infrastructure.st

@@ -424,7 +424,7 @@ doesNotUnderstand: aMessage
 
 forwardMessage: aString withArguments: anArray
 	<
-		return smalltalk.send(self._jsObject(), aString, anArray);
+		return smalltalk.accessJavaScript(self._jsObject(), aString, anArray);
 	>
 !
 

+ 28 - 26
support/boot.js

@@ -1000,19 +1000,7 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 			}
 		};
 
-		/* Handles #dnu: *and* JavaScript method calls.
-		 if the receiver has no klass, we consider it a JS object (outside of the
-		 Amber system). Else assume that the receiver understands #doesNotUnderstand: */
-
-		function messageNotUnderstood(receiver, selector, args) {
-			/* Handles JS method calls. */
-			if(receiver.klass === undefined || receiver.allowJavaScriptCalls) {
-				return callJavaScriptMethod(receiver, selector, args);
-			}
-
-			/* Handles not understood messages. Also see the Amber counter-part
-			 Object>>doesNotUnderstand: */
-
+		function invokeDnuMethod(receiver, selector, args) {
 			return receiver._doesNotUnderstand_(
 				globals.Message._new()
 					._selector_(st.convertSelector(selector))
@@ -1020,6 +1008,18 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 			);
 		}
 
+		/* Handles #dnu: *and* JavaScript method calls.
+		 if the receiver has no klass, we consider it a JS object (outside of the
+		 Amber system). Else assume that the receiver understands #doesNotUnderstand: */
+		function messageNotUnderstood(receiver, selector, args) {
+			return receiver.klass === undefined || receiver.allowJavaScriptCalls ?
+				/* Handles JS method calls. */
+				callJavaScriptMethod(receiver, selector, args) :
+				/* Handles not understood messages. Also see the Amber counter-part
+				 Object>>doesNotUnderstand: */
+				invokeDnuMethod(receiver, selector, args);
+		}
+
 		/* Call a method of a JS object, or answer a property if it exists.
 		 Else try wrapping a JSObjectProxy around the receiver.
 
@@ -1032,24 +1032,26 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 
 		 Example:
 		 "self do: aBlock with: anObject" -> "self.do(aBlock, anObject)" */
-
 		function callJavaScriptMethod(receiver, selector, args) {
 			var jsSelector = selector._asJavaScriptSelector();
-			if (jsSelector in receiver) {
-				var jsProperty = receiver[jsSelector];
-				if (typeof jsProperty === "function" && !/^[A-Z]/.test(jsSelector)) {
-					return jsProperty.apply(receiver, args);
-				} else if (args.length > 0) {
-					receiver[jsSelector] = args[0];
-					return nil;
-				} else {
-					return jsProperty;
-				}
-			}
+			return jsSelector in receiver ?
+				accessJavaScript(receiver, jsSelector, args) :
+				invokeDnuMethod(globals.JSObjectProxy._on_(receiver), selector, args);
+		}
 
-			return st.send(globals.JSObjectProxy._on_(receiver), selector, args);
+		function accessJavaScript(receiver, jsSelector, args) {
+			var jsProperty = receiver[jsSelector];
+			if (typeof jsProperty === "function" && !/^[A-Z]/.test(jsSelector)) {
+				return jsProperty.apply(receiver, args);
+			} else if (args.length > 0) {
+				receiver[jsSelector] = args[0];
+				return nil;
+			} else {
+				return jsProperty;
+			}
 		}
 
+		st.accessJavaScript = accessJavaScript;
 		this.messageNotUnderstood = messageNotUnderstood;
 	}