Hi,
I have been trying to implement a bytecode to create the closure environment needed for the NewCompiler. My first implementation looks like this:
createEnvironment
| closSize | self fetchNextBytecode. closSize := currentBytecode. self fetchNextBytecode. "The following may cause GC!" self success: (self sufficientSpaceToInstantiate: (self splObj: ClosureEnvObject) indexableSize: closSize). successFlag ifTrue: [ self storePointer: 4 ofObject: activeContext withValue:(self instantiateClass: (self splObj: ClosureEnvObject) indexableSize: closSize)]
This bytecode was suppose to replace the following bytecodes:
113 <20> pushConstant: ClosureEnvironment 114 <76> pushConstant: 4 115 <CD> send: new: 116 <89> pushThisContext: 117 <21> pushConstant: 5 118 <F2> send: privStoreIn:instVar: 119 <87> pop
into :
37 <7E 04> new closure: 4
But it keeps not working when a GC occurs (either in the markAnTrace phase or in the sweep phase).
Then I change my implementation to:
createEnvironment
| closSize | self fetchNextBytecode. closSize := currentBytecode. self fetchNextBytecode. self push: (self splObj: ClosureEnvObject). self push: (self integerObjectOf: closSize). self primitiveNewWithArg. . successFlag ifTrue: [ self storePointer: 4 ofObject: activeContext withValue: self popStack]
And it works I can explain why. Could you?
Mth
vm-dev@lists.squeakfoundation.org