| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 | 
							- Smalltalk current createPackage: 'Kernel-Methods' properties: #{}!
 
- Object subclass: #BlockClosure
 
- 	instanceVariableNames: ''
 
- 	package: 'Kernel-Methods'!
 
- !BlockClosure commentStamp!
 
- A BlockClosure is a lexical closure.
 
- The JavaScript representation is a function.
 
- A BlockClosure is evaluated with the `#value*` methods in the 'evaluating' protocol.!
 
- !BlockClosure methodsFor: 'accessing'!
 
- compiledSource
 
- 	<return self.toString()>
 
- !
 
- numArgs
 
- 	<return self.length>
 
- ! !
 
- !BlockClosure methodsFor: 'controlling'!
 
- whileFalse
 
- 	"inlined in the Compiler"
 
- 	self whileFalse: []
 
- !
 
- whileFalse: aBlock
 
- 	"inlined in the Compiler"
 
- 	<while(!!self()) {aBlock()}>
 
- !
 
- whileTrue
 
- 	"inlined in the Compiler"
 
- 	self whileTrue: []
 
- !
 
- whileTrue: aBlock
 
- 	"inlined in the Compiler"
 
- 	<while(self()) {aBlock()}>
 
- ! !
 
- !BlockClosure methodsFor: 'error handling'!
 
- on: anErrorClass do: aBlock
 
- 	^self try: self catch: [:error |
 
- 	    (error isKindOf: anErrorClass) 
 
- 	     ifTrue: [aBlock value: error]
 
- 	     ifFalse: [error signal]]
 
- ! !
 
- !BlockClosure methodsFor: 'evaluating'!
 
- applyTo: anObject arguments: aCollection
 
- 	<return self.apply(anObject, aCollection)>
 
- !
 
- ensure: aBlock
 
- 	| success |
 
- 	success := false.
 
- 	^[self value. success := true. aBlock value]
 
- 		on: Error
 
- 		do: [:ex |
 
- 			success ifFalse: [aBlock value].
 
- 			ex signal]
 
- !
 
- new
 
- 	"Use the receiver as a JS constructor. 
 
- 	*Do not* use this method to instanciate Smalltalk objects!!"
 
- 	<return new self()>
 
- !
 
- newValue: anObject
 
- 	"Use the receiver as a JS constructor. 
 
- 	*Do not* use this method to instanciate Smalltalk objects!!"
 
- 	<return new self(anObject)>
 
- !
 
- newValue:  anObject value: anObject2
 
- 	"Use the receiver as a JS constructor. 
 
- 	*Do not* use this method to instanciate Smalltalk objects!!"
 
- 	<return new self(anObject, anObject2)>
 
- !
 
- newValue:  anObject value: anObject2 value: anObject3
 
- 	"Use the receiver as a JS constructor. 
 
- 	*Do not* use this method to instanciate Smalltalk objects!!"
 
- 	<return new self(anObject, anObject2)>
 
- !
 
- timeToRun
 
- 	"Answer the number of milliseconds taken to execute this block."
 
- 	^ Date millisecondsToRun: self
 
- !
 
- value
 
- 	"inlined in the Compiler"
 
- 	<return self();>
 
- !
 
- value: anArg
 
- 	"inlined in the Compiler"
 
- 	<return self(anArg);>
 
- !
 
- value: firstArg value: secondArg
 
- 	"inlined in the Compiler"
 
- 	<return self(firstArg, secondArg);>
 
- !
 
- value: firstArg value: secondArg value: thirdArg
 
- 	"inlined in the Compiler"
 
- 	<return self(firstArg, secondArg, thirdArg);>
 
- !
 
- valueWithPossibleArguments: aCollection
 
- 	<return self.apply(null, aCollection);>
 
- ! !
 
- !BlockClosure methodsFor: 'timeout/interval'!
 
- valueWithInterval: aNumber
 
- 	<return setInterval(self, aNumber)>
 
- !
 
- valueWithTimeout: aNumber
 
- 	<return setTimeout(self, aNumber)>
 
- ! !
 
- Object subclass: #CompiledMethod
 
- 	instanceVariableNames: ''
 
- 	package: 'Kernel-Methods'!
 
- !CompiledMethod commentStamp!
 
- CompiledMethod hold the source and compiled code of a class method.
 
- You can get a CompiledMethod using `Behavior>>methodAt:`
 
- 	String methodAt: 'lines'
 
- and read the source code
 
- 	(String methodAt: 'lines') source
 
- See referenced classes:
 
- 	(String methodAt: 'lines') referencedClasses
 
- or messages sent from this method:
 
- 	
 
- 	(String methodAt: 'lines')  messageSends!
 
- !CompiledMethod methodsFor: 'accessing'!
 
- arguments
 
- 	<return self.args || []>
 
- !
 
- category
 
- 	^(self basicAt: 'category') ifNil: ['']
 
- !
 
- category: aString
 
- 	| oldCategory |
 
-     oldCategory := self category.
 
- 	self basicAt: 'category' put: aString.
 
-     
 
-     self methodClass ifNotNil: [
 
-     	self methodClass organizer addElement: aString.
 
-     
 
- 		(self methodClass methods 
 
-     		select: [ :each | each category = oldCategory ])
 
-         	ifEmpty: [ self methodClass organizer removeElement: oldCategory ] ]
 
- !
 
- fn
 
- 	^self basicAt: 'fn'
 
- !
 
- fn: aBlock
 
- 	self basicAt: 'fn' put: aBlock
 
- !
 
- messageSends
 
- 	^self basicAt: 'messageSends'
 
- !
 
- methodClass
 
- 	^self basicAt: 'methodClass'
 
- !
 
- protocol
 
- 	^ self category
 
- !
 
- referencedClasses
 
- 	^self basicAt: 'referencedClasses'
 
- !
 
- selector
 
- 	^self basicAt: 'selector'
 
- !
 
- selector: aString
 
- 	self basicAt: 'selector' put: aString
 
- !
 
- source
 
- 	^(self basicAt: 'source') ifNil: ['']
 
- !
 
- source: aString
 
- 	self basicAt: 'source' put: aString
 
- ! !
 
- Object subclass: #Message
 
- 	instanceVariableNames: 'selector arguments'
 
- 	package: 'Kernel-Methods'!
 
- !Message commentStamp!
 
- Generally, the system does not use instances of Message for efficiency reasons.
 
- However, when a message is not understood by its receiver, the interpreter will make up an instance of it in order to capture the information involved in an actual message transmission. 
 
- This instance is sent it as an argument with the message `doesNotUnderstand:` to the receiver.
 
- See boot.js, `messageNotUnderstood`  and its counterpart `Object>>doesNotUnderstand:`!
 
- !Message methodsFor: 'accessing'!
 
- arguments
 
- 	^arguments
 
- !
 
- arguments: anArray
 
- 	arguments := anArray
 
- !
 
- selector
 
- 	^selector
 
- !
 
- selector: aString
 
- 	selector := aString
 
- ! !
 
- !Message methodsFor: 'printing'!
 
- printString
 
- 	^ String streamContents: [:aStream|  
 
-                                   				aStream 
 
-                                   					nextPutAll: super printString;
 
-                                   					nextPutAll: '(';
 
-                                   					nextPutAll: selector;
 
-                                   					nextPutAll: ')' 				]
 
- !
 
- sendTo: anObject
 
- 	^ Smalltalk current send: self selector to: anObject arguments: self arguments
 
- ! !
 
- !Message class methodsFor: 'instance creation'!
 
- selector: aString arguments: anArray
 
- 	^self new
 
- 		selector: aString;
 
- 		arguments: anArray;
 
- 		yourself
 
- ! !
 
- Object subclass: #MethodContext
 
- 	instanceVariableNames: ''
 
- 	package: 'Kernel-Methods'!
 
- !MethodContext commentStamp!
 
- MethodContext holds all the dynamic state associated with the execution of either a method activation resulting from a message send. That is used to build the call stack while debugging.
 
-   
 
- MethodContext instances are JavaScript `SmalltalkMethodContext` objects defined in boot.js 
 
- Current limitation: MethodContext instances are not created on Block evaluation. That means it's actually impossible to debug inside a Block.!
 
- !MethodContext methodsFor: 'accessing'!
 
- asString
 
- 	^self receiver class printString, ' >> ', self selector
 
- !
 
- home
 
- 	<return self.homeContext>
 
- !
 
- pc
 
- 	<return self.pc>
 
- !
 
- printString
 
- 	^super printString, '(', self asString, ')'
 
- !
 
- receiver
 
- 	<return self.receiver>
 
- !
 
- selector
 
- 	<return smalltalk.convertSelector(self.selector)>
 
- !
 
- temps
 
- 	<return self.temps>
 
- ! !
 
 
  |