I will read the rest :) eval: aString ^{'return eval(aString);'} ! visitBlockNode: aNode stream nextPutAll: '(function('. aNode parameters do: [:each | stream nextPutAll: each] separatedBy: [stream nextPutAll: ', ']. stream nextPutAll: '){'. aNode nodes do: [:each | self visit: each]. stream nextPutAll: '})' visitMethodNode: aNode | str currentSelector | currentSelector := aNode selector asSelector. nestedBlocks := 0. earlyReturn := false. stream nextPutAll: 'smalltalk.method({', String cr; nextPutAll: 'selector: "', aNode selector, '",', String cr; nextPutAll: 'source: unescape("', aNode source escaped, '"),', String cr; nextPutAll: 'fn: function('. aNode arguments do: [:each | stream nextPutAll: each] separatedBy: [stream nextPutAll: ', ']. stream nextPutAll: '){', String cr; nextPutAll: 'var self=this;', String cr. str := stream. stream := '' writeStream. aNode nodes do: [:each | self visit: each]. earlyReturn ifTrue: [ str nextPutAll: 'try{']. str nextPutAll: stream contents. stream := str. stream nextPutAll: String cr; nextPutAll: 'return self;'. earlyReturn ifTrue: [ stream nextPutAll: String cr, '} catch(e) {if(e.name === ''stReturn'' && e.selector === ', currentSelector printString, '){return e.fn()} throw(e)}']. stream nextPutAll: '}', String cr; nextPutAll: '})' ok now I understand. Stef