瀏覽代碼

Escape variable names that are reserved words in Javacript

Nicolas Petton 12 年之前
父節點
當前提交
c9de7b87f9
共有 7 個文件被更改,包括 71 次插入19 次删除
  1. 2 1
      js/Compiler.deploy.js
  2. 9 8
      js/Compiler.js
  3. 11 0
      js/Kernel.deploy.js
  4. 16 0
      js/Kernel.js
  5. 8 0
      js/boot.js
  6. 20 10
      st/Compiler.st
  7. 5 0
      st/Kernel.st

File diff suppressed because it is too large
+ 2 - 1
js/Compiler.deploy.js


File diff suppressed because it is too large
+ 9 - 8
js/Compiler.js


+ 11 - 0
js/Kernel.deploy.js

@@ -743,6 +743,17 @@ return self;}
 }),
 smalltalk.Smalltalk);
 
+smalltalk.addMethod(
+'_reservedWords',
+smalltalk.method({
+selector: 'reservedWords',
+fn: function (){
+var self=this;
+return self.reservedWords;
+return self;}
+}),
+smalltalk.Smalltalk);
+
 
 smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(

+ 16 - 0
js/Kernel.js

@@ -1058,6 +1058,22 @@ referencedClasses: []
 }),
 smalltalk.Smalltalk);
 
+smalltalk.addMethod(
+unescape('_reservedWords'),
+smalltalk.method({
+selector: unescape('reservedWords'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.reservedWords;
+return self;},
+args: [],
+source: unescape('reservedWords%0A%09%22JavaScript%20reserved%20words%22%0A%09%3Creturn%20self.reservedWords%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
 
 smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(

+ 8 - 0
js/boot.js

@@ -55,6 +55,14 @@ function Smalltalk(){
 
     st.thisContext = undefined;
 
+    /* List of all reserved words in JavaScript. They may not be used as variables
+       in Smalltalk. */
+
+    st.reservedWords = ['break', 'case', 'catch', 'class', 'continue', 'debugger', 
+			'default', 'delete', 'do', 'else', 'finally', 'for', 'function', 
+			'if', 'in', 'instanceof', 'new', 'private', 'protected', 
+			'public', 'return', 'static', 'switch', 'this', 'throw',
+			'try', 'typeof', 'var', 'void', 'while', 'with', 'yield'];
     
     /* We hold all Packages in a separate Object */
 

+ 20 - 10
st/Compiler.st

@@ -779,6 +779,12 @@ source: aString
 
 argVariables
 	^argVariables copy
+!
+
+safeVariableNameFor: aString
+	^(Smalltalk current reservedWords includes: aString)
+		ifTrue: [aString, '_']
+		ifFalse: [aString]
 ! !
 
 !Compiler methodsFor: 'compiling'!
@@ -1184,9 +1190,10 @@ visitBlockNode: aNode
 !
 
 visitSequenceNode: aNode
-	aNode temps do: [:each |
-	    tempVariables add: each.
-	    stream nextPutAll: 'var ', each, '=nil;'; lf].
+	aNode temps do: [:each || temp |
+            temp := self safeVariableNameFor: each.
+	    tempVariables add: temp.
+	    stream nextPutAll: 'var ', temp, '=nil;'; lf].
 	aNode nodes do: [:each |
 	    self visit: each.
 	    stream nextPutAll: ';']
@@ -1200,9 +1207,10 @@ visitBlockSequenceNode: aNode
 	    ifTrue: [
 		stream nextPutAll: 'return nil;']
 	    ifFalse: [
-		aNode temps do: [:each |
-		    tempVariables add: each.
-		    stream nextPutAll: 'var ', each, '=nil;'; lf].
+		aNode temps do: [:each | | temp |
+                    temp := self safeVariableNameFor: each.
+		    tempVariables add: temp.
+		    stream nextPutAll: 'var ', temp, '=nil;'; lf].
 		index := 0.
 		aNode nodes do: [:each |
 		    index := index + 1.
@@ -1288,19 +1296,21 @@ visitClassReferenceNode: aNode
 !
 
 visitVariableNode: aNode
+	| varName |
 	(self currentClass allInstanceVariableNames includes: aNode value) 
 		ifTrue: [stream nextPutAll: 'self[''@', aNode value, ''']']
 		ifFalse: [
-			(self knownVariables includes: aNode value) 
+                  	varName := self safeVariableNameFor: aNode value.
+			(self knownVariables includes: varName) 
                   		ifFalse: [
                                   	unknownVariables add: aNode value.
                                   	aNode assigned 
-                                  		ifTrue: [stream nextPutAll: aNode value]
-                                  		ifFalse: [stream nextPutAll: '(typeof ', aNode value, ' == ''undefined'' ? nil : ', aNode value, ')']]
+                                  		ifTrue: [stream nextPutAll: varName]
+                                  		ifFalse: [stream nextPutAll: '(typeof ', varName, ' == ''undefined'' ? nil : ', varName, ')']]
                   		ifTrue: [
                                   	aNode value = 'thisContext'
                                   		ifTrue: [stream nextPutAll: '(smalltalk.getThisContext())']
-                				ifFalse: [stream nextPutAll:aNode value]]]
+                				ifFalse: [stream nextPutAll: varName]]]
 !
 
 visitJSStatementNode: aNode

+ 5 - 0
st/Kernel.st

@@ -289,6 +289,11 @@ parseError: anException parsing: aString
                   lines withIndexDo: [:l :i |
                      s nextPutAll: i asString, ': ', l, String lf]].
 	^ Error new messageText: ('Parse error on line ' , row , ' column ' , col , ' : ' , message , ' Below is code with line numbers and ===> marker inserted:' , String lf, code)
+!
+
+reservedWords
+	"JavaScript reserved words"
+	<return self.reservedWords>
 ! !
 
 !Smalltalk methodsFor: 'classes'!

Some files were not shown because too many files changed in this diff