primitive compilation covertToZeroBasedArrayReferences "Replace the index expressions in at: and at:put: messages with ( - 1), since C uses zero-based array indexing." "Note: Up through release 1.31, generated primitives used the convention that array variables pointed to the first element. That meant that Smalltalk one-based index expressions had to have one subtracted to yield a zero-based index. Later, we decided to adjust the base address by -1 once in the primitive prolog rather on every array access. This resulted in a five percent performance increase for the bitmap compress/decompress primitives. This method is retained as documentation and in case we choose to revert the the previous scheme." | oldIndexExpr newIndexExpr | parseTree nodesDo: [ :n | (n isSend and: [(n selector = #at:) or: [ n selector = #at:put: ]]) ifTrue: [ oldIndexExpr := n args first. oldIndexExpr isConstant ifTrue: [ "index expression is a constant: decrement the constant now" newIndexExpr := TConstantNode new setValue: (n args first value - 1). ] ifFalse: [ "index expression is complex: build an expression to decrement result at runtime" newIndexExpr := TSendNode new setSelector: #- receiver: oldIndexExpr arguments: (Array with: (TConstantNode new setValue: 1)). ]. n args at: 1 put: newIndexExpr. ]. ].