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

- Context handling in blocks
- thisContext pseudo-variable local set in AIContext

Nicolas Petton 12 роки тому
батько
коміт
2c2f723a7c
3 змінених файлів з 332 додано та 268 видалено
  1. 153 131
      js/Compiler-Interpreter.deploy.js
  2. 160 133
      js/Compiler-Interpreter.js
  3. 19 4
      st/Compiler-Interpreter.st

Різницю між файлами не показано, бо вона завелика
+ 153 - 131
js/Compiler-Interpreter.deploy.js


Різницю між файлами не показано, бо вона завелика
+ 160 - 133
js/Compiler-Interpreter.js


+ 19 - 4
st/Compiler-Interpreter.st

@@ -19,7 +19,9 @@ localAt: aString put: anObject
 !
 
 locals
-	^ locals ifNil: [ locals := Dictionary new ]
+	locals ifNil: [ self initializeLocals ].
+	
+	^ locals
 !
 
 method
@@ -69,6 +71,11 @@ initializeFromMethodContext: aMethodContext
 		self outerContext: (self class fromMethodContext: aMethodContext outerContext) ].
 	aMethodContext locals keysAndValuesDo: [ :key :value |
 		self locals at: key put: value ]
+!
+
+initializeLocals
+	locals := Dictionary new.
+	locals at: 'thisContext' put: self.
 ! !
 
 !AIContext class methodsFor: 'instance creation'!
@@ -254,11 +261,19 @@ interpretAssignmentNode: aNode continue: aBlock
 !
 
 interpretBlockNode: aNode continue: aBlock
-	"TODO: Context should be set"
-	
 	self
 		continue: aBlock
-		value: [ self interpret: aNode nodes first; result ]
+		value: [ 
+			| blockResult |
+			
+			self context: (AIContext new
+				outerContext: self context;
+				yourself).
+			
+			blockResult := self interpret: aNode nodes first; result.
+			
+			self context: self context outerContext.
+			blockResult ]
 !
 
 interpretBlockSequenceNode: aNode continue: aBlock

Деякі файли не було показано, через те що забагато файлів було змінено