[Vm-dev] Re: About Freetype plugin and BYTES_PER_WORD
David T. Lewis
lewis at mail.msen.com
Tue Sep 6 04:18:36 UTC 2011
On Thu, Sep 01, 2011 at 10:32:54AM -0400, David T. Lewis wrote:
> On Thu, Sep 01, 2011 at 04:00:41PM +0200, Igor Stasenko wrote:
> >
> > I think using
> > ^self
> > cCode: 'BYTES_PER_WORD'
> > inSmalltalk: [self subclassResponsibility "InterpreterSimulator"]
> >
> > instead of
> >
> >
> > ^BytesPerWord
> >
> > is a mistake.
>
> It's not a mistake. See the trunk VMMaker, this is part of the
> fundamental mechanism by which common sources can be generated for
> 32/64 bit target platforms.
>
> >
> > Because i just look at uses of BytesPerWord pool var in sources,
> > and there are 482 references to it.
> > And in generated code it produces just 'BytesPerWord' for it, but not
> > 'BYTES_PER_WORD'
>
> The oscog branch does not contain the support for generating common
> sources for 32/64 bit platforms. Possibly some minimal support
> could be added to cover the BytesPerWord issue.
Oops, I meant to say "32/64 bit object memory", not "32/64 bit platform".
>
> I am away until Monday and I can't offer any better suggestion
> right now, but I'll look at it when I return.
I believe that the attached changes will do the right thing when
loaded into oscog.
Explanation: In VMMaker trunk, bytesPerWord and baseHeaderSize
are handled in the C translation dictionary, which translates
them to BYTES_PER_WORD and BASE_HEADER_SIZE. In oscog, these
translations can be changed to generate BytesPerWord and
BaseHeaderSize, which produces the intended source code for
oscog in the case of a plugin that uses the "self bytesPerWord"
idiom.
Note that the oscog branch could be updated with the changes
for 32/64 bit object memory common code generation, but this
is quite a but of work and has no immediate benefit for Cog,
so I am not inclined to worry about it right now.
FreetypePlugin should not implement #bytesPerWord. I think
it's better to handle it in the code generator.
Dave
-------------- next part --------------
'From Squeak4.1 of 20 April 2011 [latest update: #8874] on 5 September 2011 at 11:56:08 pm'!
"Change Set: BytesPerWordForPlugins-dtl
Date: 5 September 2011
Author: David T. Lewis
Support plugins (e.g FreetypePlugin) that use #bytesPerWord or #baseHeaderSize.
Class variables BytesPerWord and BaseHeaderSize (and others) do not exist in trunk VMMaker. These are now controlled at compile time rather than at C code generation time to support support a single generated code base for 32/64 bit object memory VMs."!
!CCodeGenerator methodsFor: 'C translation' stamp: 'dtl 9/5/2011 23:17'!
generateBaseHeaderSize: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
aStream nextPutAll: 'BaseHeaderSize'
! !
!CCodeGenerator methodsFor: 'C translation' stamp: 'dtl 9/5/2011 23:17'!
generateBytesPerWord: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
aStream nextPutAll: 'BytesPerWord'
! !
!CCodeGenerator methodsFor: 'C translation' stamp: 'dtl 9/5/2011 23:16'!
initializeCTranslationDictionary
"Initialize the dictionary mapping message names to actions for C code generation."
| pairs |
translationDict := Dictionary new: 200.
pairs := #(
#& #generateAnd:on:indent:
#| #generateOr:on:indent:
#and: #generateSequentialAnd:on:indent:
#or: #generateSequentialOr:on:indent:
#not #generateNot:on:indent:
#+ #generatePlus:on:indent:
#- #generateMinus:on:indent:
#negated #generateNegated:on:indent:
#* #generateTimes:on:indent:
#/ #generateDivide:on:indent:
#// #generateDivide:on:indent:
#\\ #generateModulo:on:indent:
#<< #generateShiftLeft:on:indent:
#>> #generateShiftRight:on:indent:
#min: #generateMin:on:indent:
#max: #generateMax:on:indent:
#between:and: #generateBetweenAnd:on:indent:
#bitAnd: #generateBitAnd:on:indent:
#bitOr: #generateBitOr:on:indent:
#bitXor: #generateBitXor:on:indent:
#bitShift: #generateBitShift:on:indent:
#signedBitShift: #generateSignedBitShift:on:indent:
#bitInvert32 #generateBitInvert32:on:indent:
#bitClear: #generateBitClear:on:indent:
#< #generateLessThan:on:indent:
#<= #generateLessThanOrEqual:on:indent:
#= #generateEqual:on:indent:
#> #generateGreaterThan:on:indent:
#>= #generateGreaterThanOrEqual:on:indent:
#~= #generateNotEqual:on:indent:
#== #generateEqual:on:indent:
#~~ #generateNotEqual:on:indent:
#isNil #generateIsNil:on:indent:
#notNil #generateNotNil:on:indent:
#whileTrue: #generateWhileTrue:on:indent:
#whileFalse: #generateWhileFalse:on:indent:
#whileTrue #generateDoWhileTrue:on:indent:
#whileFalse #generateDoWhileFalse:on:indent:
#to:do: #generateToDo:on:indent:
#to:by:do: #generateToByDo:on:indent:
#repeat #generateRepeat:on:indent:
#ifTrue: #generateIfTrue:on:indent:
#ifFalse: #generateIfFalse:on:indent:
#ifTrue:ifFalse: #generateIfTrueIfFalse:on:indent:
#ifFalse:ifTrue: #generateIfFalseIfTrue:on:indent:
#ifNotNil: #generateIfNotNil:on:indent:
#ifNil: #generateIfNil:on:indent:
#ifNotNil:ifNil: #generateIfNotNilIfNil:on:indent:
#ifNil:ifNotNil: #generateIfNilIfNotNil:on:indent:
#at: #generateAt:on:indent:
#at:put: #generateAtPut:on:indent:
#basicAt: #generateAt:on:indent:
#basicAt:put: #generateAtPut:on:indent:
#integerValueOf: #generateIntegerValueOf:on:indent:
#integerObjectOf: #generateIntegerObjectOf:on:indent:
#isIntegerObject: #generateIsIntegerObject:on:indent:
#cCode: #generateInlineCCode:on:indent:
#cCode:inSmalltalk: #generateInlineCCode:on:indent:
#cPreprocessorDirective: #generateInlineCPreprocessorDirective:on:indent:
#cppIf:ifTrue:ifFalse: #generateInlineCppIfElse:on:indent:
#cppIf:ifTrue: #generateInlineCppIfElse:on:indent:
#cCoerce:to: #generateCCoercion:on:indent:
#cCoerceSimple:to: #generateCCoercion:on:indent:
#addressOf: #generateAddressOf:on:indent:
#signedIntFromLong #generateSignedIntFromLong:on:indent:
#signedIntToLong #generateSignedIntToLong:on:indent:
#signedIntFromShort #generateSignedIntFromShort:on:indent:
#signedIntToShort #generateSignedIntToShort:on:indent:
#preIncrement #generatePreIncrement:on:indent:
#preDecrement #generatePreDecrement:on:indent:
#inline: #generateInlineDirective:on:indent:
#asFloat #generateAsFloat:on:indent:
#asInteger #generateAsInteger:on:indent:
#asUnsignedInteger #generateAsUnsignedInteger:on:indent:
#asSymbol #generateAsSymbol:on:indent:
#anyMask: #generateBitAnd:on:indent:
#raisedTo: #generateRaisedTo:on:indent:
#touch: #generateTouch:on:indent:
#bytesPerWord #generateBytesPerWord:on:indent:
#baseHeaderSize #generateBaseHeaderSize:on:indent:
#sharedCodeNamed:inCase: #generateSharedCodeDirective:on:indent:
#perform: #generatePerform:on:indent:
#perform:with: #generatePerform:on:indent:
#perform:with:with: #generatePerform:on:indent:
#perform:with:with:with: #generatePerform:on:indent:
#perform:with:with:with:with: #generatePerform:on:indent:
#perform:with:with:with:with:with: #generatePerform:on:indent:
#value #generateValue:on:indent:
#value: #generateValue:on:indent:
#value:value: #generateValue:on:indent:
#shouldNotImplement #generateSmalltalkMetaError:on:indent:
#shouldBeImplemented #generateSmalltalkMetaError:on:indent:
).
1 to: pairs size by: 2 do: [:i |
translationDict at: (pairs at: i) put: (pairs at: i + 1)].
pairs := #(
#ifTrue: #generateIfTrueAsArgument:on:indent:
#ifFalse: #generateIfFalseAsArgument:on:indent:
#ifTrue:ifFalse: #generateIfTrueIfFalseAsArgument:on:indent:
#ifFalse:ifTrue: #generateIfFalseIfTrueAsArgument:on:indent:
#ifNotNil: #generateIfNotNilAsArgument:on:indent:
#ifNil: #generateIfNilAsArgument:on:indent:
#ifNotNil:ifNil: #generateIfNotNilIfNilAsArgument:on:indent:
#ifNil:ifNotNil: #generateIfNilIfNotNilAsArgument:on:indent:
#cCode: #generateInlineCCodeAsArgument:on:indent:
#cCode:inSmalltalk: #generateInlineCCodeAsArgument:on:indent:
#cppIf:ifTrue:ifFalse: #generateInlineCppIfElseAsArgument:on:indent:
#cppIf:ifTrue: #generateInlineCppIfElseAsArgument:on:indent:
).
asArgumentTranslationDict := Dictionary new: 8.
1 to: pairs size by: 2 do: [:i |
asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
! !
More information about the Vm-dev
mailing list