ClementBera uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1919.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1919 Author: cb Time: 17 August 2016, 4:10:53.445475 pm UUID: 00a8dd2a-bc8d-4552-b400-be781c8aabec Ancestors: VMMaker.oscog-cb.1918
fixed bug in scanner related to twoPath methods
=============== Diff against VMMaker.oscog-cb.1918 ===============
Item was changed: ----- Method: StackToRegisterMappingCogit>>compileFrameBuild (in category 'compile abstract instructions') ----- compileFrameBuild "Build a frame for a CogMethod activation. See CoInterpreter class>>initializeFrameIndices. Override to push the register receiver and register arguments, if any." self cppIf: IMMUTABILITY ifTrue: [useTwoPaths ifTrue: [self compileTwoPathFrameBuild. ^self]]. needsFrame ifFalse: [useTwoPaths ifTrue: [self compileTwoPathFramelessInit]. self initSimStackForFramelessMethod: initialPC. ^self]. + self deny: useTwoPaths. self genPushRegisterArgs. super compileFrameBuild. self initSimStackForFramefulMethod: initialPC!
Item was changed: ----- Method: StackToRegisterMappingCogit>>scanMethod (in category 'compile abstract instructions') ----- scanMethod "Scan the method (and all embedded blocks) to determine - what the last bytecode is; extra bytes at the end of a method are used to encode things like source pointers or temp names - if the method needs a frame or not - what are the targets of any backward branches. - how many blocks it creates Answer the block count or on error a negative error code" | latestContinuation nExts descriptor pc numBlocks distance targetPC framelessStackDelta seenInstVarStore | <var: #descriptor type: #'BytecodeDescriptor *'> needsFrame := useTwoPaths := seenInstVarStore := false. self maybeInitNumFixups. self maybeInitNumCounters. prevBCDescriptor := nil. NewspeakVM ifTrue: [numIRCs := 0]. (primitiveIndex > 0 and: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]) ifTrue: [^0]. pc := latestContinuation := initialPC. numBlocks := framelessStackDelta := nExts := extA := extB := 0. [pc <= endPC] whileTrue: [byte0 := (objectMemory fetchByte: pc ofObject: methodObj) + bytecodeSetOffset. descriptor := self generatorAt: byte0. descriptor isExtension ifTrue: [descriptor opcode = Nop ifTrue: "unknown bytecode tag; see Cogit class>>#generatorTableFrom:" [^EncounteredUnknownBytecode]. self loadSubsequentBytesForDescriptor: descriptor at: pc. self perform: descriptor generator]. (descriptor isReturn and: [pc >= latestContinuation]) ifTrue: [endPC := pc].
needsFrame ifFalse: [(descriptor needsFrameFunction isNil or: [self perform: descriptor needsFrameFunction with: framelessStackDelta]) ifTrue: ["With immutability we win simply by avoiding a frame build if the receiver is young and not immutable." self cppIf: IMMUTABILITY ifTrue: [descriptor is1ByteInstVarStore ifTrue: [useTwoPaths := true] ifFalse: [needsFrame := true. useTwoPaths := false]] + ifFalse: [needsFrame := true. useTwoPaths := false]] - ifFalse: [needsFrame := true]] ifFalse: [framelessStackDelta := framelessStackDelta + descriptor stackDelta. "Without immutability we win if there are two or more stores and the receiver is new." self cppIf: IMMUTABILITY ifTrue: [] ifFalse: [descriptor is1ByteInstVarStore ifTrue: [seenInstVarStore ifTrue: [useTwoPaths := true] ifFalse: [seenInstVarStore := true]]]]].
descriptor isBranch ifTrue: [distance := self spanFor: descriptor at: pc exts: nExts in: methodObj. targetPC := pc + descriptor numBytes + distance. (self isBackwardBranch: descriptor at: pc exts: nExts in: methodObj) ifTrue: [self initializeFixupAt: targetPC - initialPC] ifFalse: [latestContinuation := latestContinuation max: targetPC. self maybeCountFixup. self maybeCountCounter]]. descriptor isBlockCreation ifTrue: [numBlocks := numBlocks + 1. distance := self spanFor: descriptor at: pc exts: nExts in: methodObj. targetPC := pc + descriptor numBytes + distance. latestContinuation := latestContinuation max: targetPC. self maybeCountFixup].
NewspeakVM ifTrue: [descriptor hasIRC ifTrue: [numIRCs := numIRCs + 1]]. pc := pc + descriptor numBytes. descriptor isExtension ifTrue: [nExts := nExts + 1] ifFalse: [nExts := extA := extB := 0]. prevBCDescriptor := descriptor]. ^numBlocks!
vm-dev@lists.squeakfoundation.org