[Vm-dev] VM Maker: VMMaker.oscog-eem.330.mcz

Eliot Miranda eliot.miranda at gmail.com
Thu Sep 12 21:20:52 UTC 2013


Oops.  Thanks, Nicolas!


On Sun, Sep 8, 2013 at 2:03 PM, Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com> wrote:

>
> In VMPluginCodeGenerator>>emitCTypesOn: shouldn't it be
>     (pluginClass shouldGenerateTypedefFor: structClass)
> rather than
>     (vmClass shouldGenerateTypedefFor: structClass) ?
>
> I can't generate IA32ABIPlugin because vmClass isNil, nor
> ThreadedIA32FFIPlugin since that change
>
> Nicolas
>
>
> 2013/8/21 <commits at source.squeak.org>
>
>>
>> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
>> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.330.mcz
>>
>> ==================== Summary ====================
>>
>> Name: VMMaker.oscog-eem.330
>> Author: eem
>> Time: 21 August 2013, 2:20:31.076 pm
>> UUID: 836f976a-35fa-404c-aa5a-c4af1c58852f
>> Ancestors: VMMaker.oscog-eem.329
>>
>> Refactor ancilliaryClasses and ancilliaryStructClasses to pass in
>> options to allow selecting different classes as required.
>> i.e. collapse ancilliaryClasses and ancilliaryStructClasses onto
>> ancilliaryClasses: optionsDictionary.  This also requires changing
>> requiredMethodNames and exportAPISelectors to take options too.
>> (this is prior to adding a NewspeakCogMethod class for maintaining
>> a list of anonymous methods).
>>
>> Simplify CoInterpreter class>>exportAPISelectors: by marking a few
>> methods as <api>.
>>
>> Eliminate CogStackPage, collapsing it onto InterpreterStackPage
>> (it only has a class side).
>>
>> Use temporaryCountOfMethodHader: instead of tempCountOf: in
>> SimpleStackBasedCogit>>compileFrameBuild (header is in hand).
>>
>> Reimplement CCodeGenerator>>structClassesForTranslationClasses:
>> to keep the sort stable (ChangeSet superclassOrder: is a stable sort
>> but structClassesForTranslationClasses: used a set).
>>
>> =============== Diff against VMMaker.oscog-eem.329 ===============
>>
>> Item was removed:
>> - ----- Method: BitBltSimulation class>>requiredMethodNames (in category
>> 'translation') -----
>> - requiredMethodNames
>> -       ^self opTable asSet!
>>
>> Item was added:
>> + ----- Method: BitBltSimulation class>>requiredMethodNames: (in category
>> 'translation') -----
>> + requiredMethodNames: options
>> +       ^self opTable asSet!
>>
>> Item was changed:
>>   ----- Method: CCodeGenerator>>addClass: (in category 'public') -----
>>   addClass: aClass
>>         "Add the variables and methods of the given class to the code
>> base."
>>
>>         aClass prepareToBeAddedToCodeGenerator: self.
>>         self checkClassForNameConflicts: aClass.
>>         self addClassVarsFor: aClass.
>>         "ikp..."
>>         self addPoolVarsFor: aClass.
>>         (aClass inheritsFrom: VMStructType) ifFalse:
>>                 [variables addAll: aClass instVarNames].
>> +       self retainMethods: (aClass requiredMethodNames: self options).
>> -       self retainMethods: aClass requiredMethodNames.
>>
>>         'Adding Class ' , aClass name , '...'
>>                 displayProgressAt: Sensor cursorPoint
>>                 from: 0
>>                 to: aClass selectors size
>>                 during:
>>                         [:bar |
>>                          aClass selectors doWithIndex:
>>                                 [:sel :i | | source |
>>                                 bar value: i.
>>                                 self addMethodFor: aClass selector: sel]].
>>         aClass declareCVarsIn: self!
>>
>> Item was changed:
>>   ----- Method: CCodeGenerator>>addStructClass: (in category 'public')
>> -----
>>   addStructClass: aClass
>>         "Add the non-accessor methods of the given struct class to the
>> code base."
>>
>>         aClass prepareToBeAddedToCodeGenerator: self.
>>         self addClassVarsFor: aClass.
>>         self addPoolVarsFor: aClass.
>> +       self retainMethods: (aClass requiredMethodNames: self options).
>> -       self retainMethods: aClass requiredMethodNames.
>>
>>         'Adding Class ' , aClass name , '...'
>>                 displayProgressAt: Sensor cursorPoint
>>                 from: 0
>>                 to: aClass selectors size
>>                 during:
>>                         [:bar |
>>                          aClass selectors doWithIndex:
>>                                 [:sel :i | | source |
>>                                 bar value: i.
>>                                 self addStructMethodFor: aClass selector:
>> sel]].
>>         aClass declareCVarsIn: self!
>>
>> Item was changed:
>>   ----- Method: CCodeGenerator>>checkClassForNameConflicts: (in category
>> 'error notification') -----
>>   checkClassForNameConflicts: aClass
>>         "Verify that the given class does not have constant, variable, or
>> method names that conflict with
>>          those of previously added classes. Raise an error if a conflict
>> is found, otherwise just return."
>>
>>         "check for constant name collisions in class pools"
>>         aClass classPool associationsDo:
>>                 [:assoc |
>>                 (constants includesKey: assoc key asString) ifTrue:
>>                         [self error: 'Constant ', assoc key, ' was
>> defined in a previously added class']].
>>
>>         "and in shared pools"
>>         (aClass sharedPools reject: [:pool| pools includes: pool]) do:
>>                 [:pool |
>>                 pool bindingsDo:
>>                         [:assoc |
>>                         (constants includesKey: assoc key asString)
>> ifTrue:
>>                                 [self error: 'Constant ', assoc key, '
>> was defined in a previously added class']]].
>>
>>         "check for instance variable name collisions"
>>         (aClass inheritsFrom: VMStructType) ifFalse:
>>                 [aClass instVarNames do:
>>                         [:varName |
>>                         (variables includes: varName) ifTrue:
>>                                 [self error: 'Instance variable ',
>> varName, ' was defined in a previously added class']]].
>>
>>         "check for method name collisions"
>>         aClass selectors do:
>>                 [:sel |
>>                 ((methods includesKey: sel)
>> +               and: [(aClass isStructClass and: [(aClass isAccessor: sel)
>> +                               and: [(methods at: sel)
>> isStructAccessor]]) not
>> +               and: [((aClass compiledMethodAt: sel) pragmaAt:
>> #doNotGenerate) isNil]]) ifTrue:
>> -               and: [((aClass compiledMethodAt: sel) pragmaAt:
>> #doNotGenerate) isNil]) ifTrue:
>>                         [self error: 'Method ', sel, ' was defined in a
>> previously added class.']]!
>>
>> Item was changed:
>>   ----- Method: CCodeGenerator>>emitCAPIExportHeaderOn: (in category 'C
>> code generator') -----
>>   emitCAPIExportHeaderOn: aStream
>>         "Store prototype declarations for all non-inlined methods on the
>> given stream."
>>         | api methodList |
>> +       api := (vmClass translationClass exportAPISelectors: self
>> options).
>> -       api := vmClass translationClass exportAPISelectors.
>>         methodList := api select: [:s| (methods includesKey: s) or:
>> [(vmClass whichClassIncludesSelector: s) notNil]]
>>                                           thenCollect:
>>                                                 [:s|
>>                                                 methods
>>                                                         at: s
>>                                                         ifAbsent: [self
>> compileToTMethodSelector: s
>>
>>          in: (vmClass whichClassIncludesSelector: s)]].
>>         methodList := self sortMethods: methodList.
>>         methodList do:
>>                 [:m|
>>                 m static ifTrue:
>>                         [logger ensureCr; show: m selector, ' excluded
>> from export API because it is static'; cr]].
>>         self emitCFunctionPrototypes: methodList on: aStream.
>>         self emitGlobalCVariablesOn: aStream.
>>         self emitCMacros: methodList on: aStream!
>>
>> Item was changed:
>>   ----- Method: CCodeGenerator>>emitCTypesOn: (in category 'C code
>> generator') -----
>>   emitCTypesOn: aStream
>>         "Store local type declarations on the given stream."
>>         vmClass ifNotNil:
>> +               [(self structClassesForTranslationClasses: { vmClass })
>> do:
>> -               [vmClass ancilliaryStructClasses do:
>>                         [:structClass|
>>                         (structClass isAbstract not
>>                          and: [vmClass shouldGenerateTypedefFor:
>> structClass]) ifTrue:
>>                                 [structClass printTypedefOn: aStream.
>>                                  aStream cr; cr]]]!
>>
>> Item was changed:
>>   ----- Method: CCodeGenerator>>structClassesForTranslationClasses: (in
>> category 'utilities') -----
>>   structClassesForTranslationClasses: classes
>> +       "Answer in superclass order (any superclass precedes any subclass)
>> +        the ancilliaryClasses that are struct classes for all the given
>> classes."
>> -       "Answer in superclass order (any superclass precedes any
>> subclass) the ancilliaryStructClasses for all the given classes."
>>         | structClasses |
>> +       structClasses := OrderedCollection new.
>> -
>> -       structClasses := Set new.
>>         classes do:
>>                 [:aTranslationClass|
>> +               ([aTranslationClass ancilliaryClasses: self options]
>> -               structClasses addAll:
>> -                       ([aTranslationClass ancilliaryStructClasses]
>>                                 on: MessageNotUnderstood
>>                                 do: [:ex|
>> +                                       ex message selector ==
>> #ancilliaryClasses:
>> -                                       ex message selector ==
>> #ancilliaryStructClasses
>>                                                 ifTrue: [#()]
>> +                                               ifFalse: [ex pass]]) do:
>> +                       [:class|
>> +                       (class isStructClass
>> +                        and: [(structClasses includes: class) not])
>> ifTrue:
>> +                               [structClasses addLast: class]]].
>> +       ^ChangeSet superclassOrder: structClasses!
>> -                                               ifFalse: [ex pass]])].
>> -       ^ChangeSet superclassOrder: structClasses asArray!
>>
>> Item was removed:
>> - ----- Method: CoInterpreter class>>ancilliaryClasses (in category
>> 'translation') -----
>> - ancilliaryClasses
>> -       "Answer any extra classes to be included in the translation."
>> -       ^super ancilliaryClasses
>> -               copyReplaceAll: { InterpreterStackPages }
>> -               with: { CoInterpreterStackPages }!
>>
>> Item was added:
>> + ----- Method: CoInterpreter class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: options
>> +       "Answer any extra classes to be included in the translation."
>> +       ^((super ancilliaryClasses: options) copyWithout:
>> InterpreterStackPages),
>> +          {    CoInterpreterStackPages.
>> +               CogBlockMethod.
>> +               CogMethod }!
>>
>> Item was removed:
>> - ----- Method: CoInterpreter class>>ancilliaryStructClasses (in category
>> 'translation') -----
>> - ancilliaryStructClasses
>> -       ^{ CogStackPage.
>> -               CogBlockMethod.
>> -               CogMethod }!
>>
>> Item was removed:
>> - ----- Method: CoInterpreter class>>exportAPISelectors (in category
>> 'translation') -----
>> - exportAPISelectors
>> -       "Yes this is a mess.  When all exportAPI methods are marked with
>> the <api> pragma
>> -        this can go away."
>> -       | omExports |
>> -       omExports := (self objectMemoryClass withAllSuperclasses
>> copyUpTo: VMClass)
>> -                                       inject: Set new into: [:api :c|
>> api addAll: c exportAPISelectors; yourself].
>> -       ^((self withAllSuperclasses copyUpTo: VMClass),
>> -               self ancilliaryClasses
>> -                       inject: omExports
>> -                       into: [:set :class| set addAll: (self
>> exportAPISelectorsFor: class); yourself])
>> -               addAll: #(      classHeader:
>> -                                       compactClassIndexOf:
>> -                                       fetchByte:ofObject:
>> -                                       functionPointerFor:inClass:
>> -                                       isNonIntegerObject:
>> -                                       lastPointerOf:
>> -                                       literal:ofMethod:
>> -                                       popStack
>> -
>> primitiveClosureValueNoContextSwitch
>> -                                       specialSelector:
>> -                                       stackTop
>> -                                       tempCountOf:);
>> -               yourself!
>>
>> Item was added:
>> + ----- Method: CoInterpreter class>>exportAPISelectors: (in category
>> 'translation') -----
>> + exportAPISelectors: options
>> +       "Yes this is a mess.  When all exportAPI methods are marked with
>> the <api> pragma
>> +        this can go away."
>> +       | omExports |
>> +       omExports := (self objectMemoryClass withAllSuperclasses
>> copyUpTo: VMClass)
>> +                                       inject: Set new into: [:api :c|
>> api addAll: (c exportAPISelectors: options); yourself].
>> +       ^(self withAllSuperclasses copyUpTo: VMClass), (self
>> ancilliaryClasses: options)
>> +               inject: omExports
>> +               into: [:set :class| set addAll: (self
>> exportAPISelectorsFor: class); yourself]!
>>
>> Item was changed:
>>   ----- Method: CoInterpreter class>>shouldGenerateTypedefFor: (in
>> category 'translation') -----
>>   shouldGenerateTypedefFor: aStructClass
>>         "Hack to work-around multiple definitions.  Sometimes a type has
>> been defined in an include."
>> +       ^({ CogBlockMethod. CogMethod. SistaCogMethod. VMCallbackContext
>> } includes: aStructClass) not!
>> -       ^({ CogBlockMethod. CogMethod. SistaCogMethod } includes:
>> aStructClass) not!
>>
>> Item was changed:
>>   ----- Method: CoInterpreter>>computeStackZoneSize (in category
>> 'initialization') -----
>>   computeStackZoneSize
>> +       ^numStackPages * ((self sizeof: InterpreterStackPage) + self
>> stackPageByteSize)
>> -       ^numStackPages * ((self sizeof: CogStackPage) + self
>> stackPageByteSize)
>>          + stackPages extraStackBytes!
>>
>> Item was removed:
>> - ----- Method: CoInterpreterMT class>>ancilliaryClasses (in category
>> 'translation') -----
>> - ancilliaryClasses
>> -       ^super ancilliaryClasses, { CogThreadManager }!
>>
>> Item was added:
>> + ----- Method: CoInterpreterMT class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: options
>> +       ^(super ancilliaryClasses: options), { CogThreadManager.
>> CogVMThread }!
>>
>> Item was removed:
>> - ----- Method: CoInterpreterMT class>>ancilliaryStructClasses (in
>> category 'translation') -----
>> - ancilliaryStructClasses
>> -       ^super ancilliaryStructClasses, { CogVMThread }!
>>
>> Item was changed:
>>   ----- Method:
>> CoInterpreterStackPages>>initializeStack:numSlots:pageSize: (in category
>> 'initialization') -----
>>   initializeStack: theStackPages numSlots: stackSlots pageSize:
>> slotsPerPage
>>         "Initialize the stack pages.  In the C VM theStackPages will be
>> alloca'ed memory to hold the
>>          stack pages on the C stack.  In the simulator they are housed in
>> the memory between the
>>          cogMethodZone and the heap."
>>
>>         <var: #theStackPages type: #'char *'>
>>         <returnTypeC: #void>
>>         | numPages page structStackPageSize pageStructBase count |
>>         <var: #page type: #'StackPage *'>
>>         <var: #pageStructBase type: #'char *'>
>>         self cCode: []
>>                 inSmalltalk:
>>                         [self assert: objectMemory startOfMemory -
>> coInterpreter cogCodeSize - coInterpreter methodCacheSize - coInterpreter
>> primTraceLogSize - coInterpreter rumpCStackSize
>>                                         = (stackSlots * BytesPerWord)].
>> +       structStackPageSize := coInterpreter sizeof: InterpreterStackPage.
>> -       structStackPageSize := coInterpreter sizeof: CogStackPage.
>>         bytesPerPage := slotsPerPage * BytesPerWord.
>>         numPages := coInterpreter numStkPages.
>>
>>         "Because stack pages grow down baseAddress is at the top of a
>> stack page and so to avoid
>>          subtracting BytesPerWord from baseAddress and lastAddress in the
>> init loop below we simply
>>          push the stackPage array up one word to avoid the overlap.  This
>> word is extraStackBytes."
>>         pageStructBase := theStackPages + (numPages * bytesPerPage) +
>> BytesPerWord.
>>         pages := self cCode: [self cCoerceSimple: pageStructBase to:
>> #'StackPage *']
>>                                   inSmalltalk:
>>                                         [pageMap := Dictionary new.
>>                                          ((0 to: numPages - 1) collect:
>>                                                 [:i|
>> +                                                InterpreterStackPage
>> surrogateClass new
>> -                                                CogStackPage
>> surrogateClass new
>>                                                         address:
>> pageStructBase + (i * structStackPageSize)
>>                                                         simulator:
>> coInterpreter
>>                                                         zoneBase:
>> coInterpreter stackZoneBase
>>                                                         zoneLimit:
>> objectMemory startOfMemory])
>>                                                 do: [:pageSurrogate|
>>                                                         pageMap at:
>> pageSurrogate address put: pageSurrogate];
>>                                                 yourself].
>>         "make sure there's enough headroom"
>>         self assert: coInterpreter stackPageByteSize - coInterpreter
>> stackLimitBytes - coInterpreter stackLimitOffset
>>                                 >= coInterpreter stackPageHeadroom.
>>         0 to: numPages - 1 do:
>>                 [:index|
>>                  page := self stackPageAt: index.
>>                  page
>>                         lastAddress: theStackPages + (index *
>> bytesPerPage);
>>                         baseAddress: page lastAddress + bytesPerPage;
>>                         stackLimit: page baseAddress - coInterpreter
>> stackLimitBytes;
>>                         realStackLimit: page stackLimit;
>>                         baseFP: 0;
>>                         nextPage: (self stackPageAt: (index = (numPages -
>> 1) ifTrue: [0] ifFalse: [index + 1]));
>>                         prevPage: (self stackPageAt: (index = 0 ifTrue:
>> [numPages - 1] ifFalse: [index - 1]))].
>>
>>         "Now compute stackBasePlus1 so that the pageIndexFor: call maps
>> all addresses from
>>          aPage baseAddress to aBase limitAddress + 1 to the same index
>> (stacks grow down)"
>>         stackBasePlus1 := (self cCoerceSimple: theStackPages to: #'char
>> *') + 1.
>>         self cCode: []
>>                 inSmalltalk:
>>                         [minStackAddress := theStackPages.
>>                          maxStackAddress := theStackPages + (numPages *
>> bytesPerPage) + BytesPerWord - 1].
>>
>>         "The overflow limit is the amount of stack to retain when moving
>> frames from an overflowing
>>          stack to reduce thrashing.  See
>> stackOverflowOrEvent:mayContextSwitch:"
>>         page := self stackPageAt: 0.
>>         overflowLimit := page baseAddress - page realStackLimit * 3 // 5.
>>         0 to: numPages - 1 do:
>>                 [:index|
>>                  page := self stackPageAt: index.
>>                  self assert: (self pageIndexFor: page baseAddress) ==
>> index.
>>                  self assert: (self pageIndexFor: page baseAddress -
>> (slotsPerPage - 1 * BytesPerWord)) == index.
>>                  self assert: (self stackPageFor: page baseAddress) ==
>> page.
>>                  self assert: (self stackPageFor: page stackLimit) ==
>> page.
>>                  self cCode: []
>>                         inSmalltalk:
>>                                 [| memIndex |
>>                                  memIndex := index * slotsPerPage + 1.
>> "this is memIndex in the block above"
>>                                  self assert: (self memIndexFor: (self
>> oopForPointer: page baseAddress))
>>                                                         == (memIndex +
>> slotsPerPage - 1).
>>                                  index < (numPages - 1) ifTrue:
>>                                         [self assert: (self stackPageFor:
>> page baseAddress + BytesPerWord) == (self stackPageAt: index + 1)]].
>>                 self assert: (page trace: -1) ~= 0 "for assert checking
>> of the page tracing flags. -1 == invalid state"].
>>
>>         mostRecentlyUsedPage := self stackPageAt: 0.
>>         page := mostRecentlyUsedPage.
>>         count := 0.
>>         [| theIndex |
>>          count := count + 1.
>>          theIndex := self pageIndexFor: page baseAddress.
>>          self assert: (self stackPageAt: theIndex) == page.
>>          self assert: (self pageIndexFor: page baseAddress) == theIndex.
>>          self assert: (self pageIndexFor: page stackLimit) == theIndex.
>>          self assert: (self pageIndexFor: page lastAddress + 1) ==
>> theIndex.
>>          (page := page nextPage) ~= mostRecentlyUsedPage] whileTrue.
>>         self assert: count == numPages.
>>         self assert: self pageListIsWellFormed!
>>
>> Item was removed:
>> - ----- Method: CogAbstractInstruction class>>requiredMethodNames (in
>> category 'translation') -----
>> - requiredMethodNames
>> -       ^self selectors reject:
>> -               [:s|
>> -               (self isAccessor: s)
>> -               or: [((self compiledMethodAt: s) pragmaAt:
>> #doNotGenerate) notNil]]!
>>
>> Item was added:
>> + ----- Method: CogAbstractInstruction class>>requiredMethodNames: (in
>> category 'translation') -----
>> + requiredMethodNames: options
>> +       ^self selectors reject:
>> +               [:s|
>> +               (self isAccessor: s)
>> +               or: [((self compiledMethodAt: s) pragmaAt:
>> #doNotGenerate) notNil]]!
>>
>> Item was removed:
>> - InterpreterStackPage subclass: #CogStackPage
>> -       instanceVariableNames: ''
>> -       classVariableNames: ''
>> -       poolDictionaries: ''
>> -       category: 'VMMaker-JIT'!
>>
>> Item was removed:
>> - ----- Method: CogStackPage class>>alignedByteSize (in category
>> 'translation') -----
>> - alignedByteSize
>> -       ^self surrogateClass alignedByteSize!
>>
>> Item was removed:
>> - ----- Method: CogStackPage class>>alignedByteSizeOf:forClient: (in
>> category 'translation') -----
>> - alignedByteSizeOf: anObject forClient: aVMClass
>> -       ^self surrogateClass alignedByteSize!
>>
>> Item was removed:
>> - ----- Method: CogStackPage class>>surrogateClass (in category
>> 'simulation only') -----
>> - surrogateClass
>> -       ^BytesPerWord = 4
>> -               ifTrue: [CogStackPageSurrogate32]
>> -               ifFalse: [CogStackPageSurrogate64]!
>>
>> Item was removed:
>> - ----- Method: Cogit class>>ancilliaryClasses (in category
>> 'translation') -----
>> - ancilliaryClasses
>> -       ^super ancilliaryClasses,
>> -         { CogMethodZone }!
>>
>> Item was added:
>> + ----- Method: Cogit class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: options
>> +       ProcessorClass ifNil: [thisContext methodClass theNonMetaClass
>> initialize].
>> +       ^{      CogMethodZone.
>> +               CogAbstractInstruction.
>> +               ProcessorClass basicNew abstractInstructionCompilerClass.
>> +               CogBlockStart.
>> +               CogBytecodeDescriptor.
>> +               CogBytecodeFixup.
>> +               CogInstructionAnnotation.
>> +               CogPrimitiveDescriptor.
>> +               CogBlockMethod.
>> +               CogMethod
>> +         }!
>>
>> Item was removed:
>> - ----- Method: Cogit class>>ancilliaryStructClasses (in category
>> 'translation') -----
>> - ancilliaryStructClasses
>> -       ProcessorClass ifNil: [thisContext methodClass theNonMetaClass
>> initialize].
>> -       ^{      CogAbstractInstruction.
>> -               ProcessorClass basicNew abstractInstructionCompilerClass.
>> -               CogBlockStart.
>> -               CogBytecodeDescriptor.
>> -               CogBytecodeFixup.
>> -               CogInstructionAnnotation.
>> -               CogPrimitiveDescriptor.
>> -               CogBlockMethod.
>> -               CogMethod       }!
>>
>> Item was removed:
>> - ----- Method: Cogit class>>exportAPISelectors (in category
>> 'translation') -----
>> - exportAPISelectors
>> -       ^((self withAllSuperclasses copyUpThrough: Cogit), self
>> ancilliaryClasses collect:
>> -               [:c| self exportAPISelectorsFor: c]) fold: [:a :b| a, b]!
>>
>> Item was added:
>> + ----- Method: Cogit class>>exportAPISelectors: (in category
>> 'translation') -----
>> + exportAPISelectors: options
>> +       ^((self withAllSuperclasses copyUpThrough: Cogit), (self
>> ancilliaryClasses: options) collect:
>> +               [:c| self exportAPISelectorsFor: c]) fold: [:a :b| a, b]!
>>
>> Item was changed:
>>   ----- Method: Cogit class>>preGenerationHook: (in category
>> 'translation') -----
>>   preGenerationHook: aCCodeGenerator
>>         "Perform any last-minute changes to the code generator immediately
>>          before it performs code analysis and generation.  In this case,
>> make
>>          all non-exported methods private."
>>         | exportAPISelectors |
>> +       exportAPISelectors := self exportAPISelectors: aCCodeGenerator
>> options.
>> -       exportAPISelectors := self exportAPISelectors.
>>         aCCodeGenerator selectorsAndMethodsDo:
>>                 [:s :m|
>>                 (exportAPISelectors includes: s)
>>                         ifTrue: [m static: false]
>>                         ifFalse:
>>                                 [m export ifFalse:
>>                                         [m static: true]]]!
>>
>> Item was removed:
>> - ----- Method: Cogit class>>requiredMethodNames (in category
>> 'translation') -----
>> - requiredMethodNames
>> -       "self requiredMethodNames"
>> -       ^self exportAPISelectors
>> -               addAll: self tableFunctions;
>> -               yourself!
>>
>> Item was added:
>> + ----- Method: Cogit class>>requiredMethodNames: (in category
>> 'translation') -----
>> + requiredMethodNames: options
>> +       "self requiredMethodNames"
>> +       ^(self exportAPISelectors: options)
>> +               addAll: self tableFunctions;
>> +               yourself!
>>
>> Item was added:
>> + ----- Method: IA32ABIPlugin class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: options
>> +       ^{ VMCallbackContext. VMCallbackReturnValue }!
>>
>> Item was removed:
>> - ----- Method: IA32ABIPlugin class>>ancilliaryStructClasses (in category
>> 'translation') -----
>> - ancilliaryStructClasses
>> -       ^{ VMCallbackContext. VMCallbackReturnValue }!
>>
>> Item was changed:
>>   ----- Method: Interpreter class>>preGenerationHook: (in category
>> 'translation') -----
>>   preGenerationHook: aCCodeGenerator
>>         "Perform any last-minute changes to the code generator immediately
>>          before it performs code analysis and generation.  In this case,
>> make
>>          all non-exported methods private."
>>         | requiredMethodNames |
>> +       requiredMethodNames := self requiredMethodNames: aCCodeGenerator
>> options.
>> -       requiredMethodNames := self requiredMethodNames.
>>         aCCodeGenerator selectorsAndMethodsDo:
>>                 [:s :m|
>>                 (m export or: [requiredMethodNames includes: s]) ifTrue:
>>                         [m static: false]]!
>>
>> Item was removed:
>> - ----- Method: Interpreter class>>requiredMethodNames (in category
>> 'translation') -----
>> - requiredMethodNames
>> -       "return the list of method names that should be retained for
>> export or other support reasons"
>> -       | requiredList |
>> -       requiredList := Set new: 400.
>> -       "A number of methods required by VM support code, jitter,
>> specific platforms etc"
>> -       requiredList addAll: #(fullDisplayUpdate interpret printCallStack
>> printAllStacks printOop: readImageFromFile:HeapSize:StartingAt: success:
>> readableFormat: getCurrentBytecode characterForAscii:
>> findClassOfMethod:forReceiver: findSelectorOfMethod:forReceiver:
>> loadInitialContext nullCompilerHook primitiveFlushExternalPrimitives
>> setCompilerInitialized: getFullScreenFlag getInterruptCheckCounter
>> getInterruptKeycode getInterruptPending getNextWakeupTick
>> getSavedWindowSize setFullScreenFlag: setInterruptCheckCounter:
>> setInterruptKeycode: setInterruptPending: setNextWakeupTick:
>> setSavedWindowSize: forceInterruptCheck getThisSessionID).
>> -
>> -       "Nice to actually have all the primitives available"
>> -       requiredList addAll: self primitiveTable.
>> -
>> -       "InterpreterProxy is the internal analogue of sqVirtualMachine.c,
>> so make sure to keep all those"
>> -       InterpreterProxy organization categories do: [:cat |
>> -               ((cat ~= 'initialize') and: [cat ~= 'private']) ifTrue: [
>> -                       requiredList addAll: (InterpreterProxy
>> organization listAtCategoryNamed: cat)]].
>> -
>> -       ^requiredList!
>>
>> Item was added:
>> + ----- Method: Interpreter class>>requiredMethodNames: (in category
>> 'translation') -----
>> + requiredMethodNames: options
>> +       "return the list of method names that should be retained for
>> export or other support reasons"
>> +       | requiredList |
>> +       requiredList := Set new: 400.
>> +       "A number of methods required by VM support code, jitter,
>> specific platforms etc"
>> +       requiredList addAll: #(fullDisplayUpdate interpret printCallStack
>> printAllStacks printOop: readImageFromFile:HeapSize:StartingAt: success:
>> readableFormat: getCurrentBytecode characterForAscii:
>> findClassOfMethod:forReceiver: findSelectorOfMethod:forReceiver:
>> loadInitialContext nullCompilerHook primitiveFlushExternalPrimitives
>> setCompilerInitialized: getFullScreenFlag getInterruptCheckCounter
>> getInterruptKeycode getInterruptPending getNextWakeupTick
>> getSavedWindowSize setFullScreenFlag: setInterruptCheckCounter:
>> setInterruptKeycode: setInterruptPending: setNextWakeupTick:
>> setSavedWindowSize: forceInterruptCheck getThisSessionID).
>> +
>> +       "Nice to actually have all the primitives available"
>> +       requiredList addAll: self primitiveTable.
>> +
>> +       "InterpreterProxy is the internal analogue of sqVirtualMachine.c,
>> so make sure to keep all those"
>> +       InterpreterProxy organization categories do: [:cat |
>> +               ((cat ~= 'initialize') and: [cat ~= 'private']) ifTrue: [
>> +                       requiredList addAll: (InterpreterProxy
>> organization listAtCategoryNamed: cat)]].
>> +
>> +       ^requiredList!
>>
>> Item was changed:
>>   ----- Method:
>> InterpreterPrimitives>>primitiveClosureValueNoContextSwitch (in category
>> 'control primitives') -----
>>   primitiveClosureValueNoContextSwitch
>>         "An exact clone of primitiveClosureValue except that this version
>> will not
>>          check for interrupts on stack overflow.  It may invoke the
>> garbage collector
>>          but will not switch processes.  See
>> checkForInterruptsMayContextSwitch:"
>> +       <api>
>>         | blockClosure numArgs closureMethod outerContext |
>>         blockClosure := self stackValue: argumentCount.
>>         numArgs := self argumentCountOfClosure: blockClosure.
>>         argumentCount = numArgs ifFalse:
>>                 [^self primitiveFail].
>>
>>         "Somewhat paranoiac checks we need while debugging that we may be
>> able to discard
>>          in a robust system."
>>         outerContext := objectMemory fetchPointer:
>> ClosureOuterContextIndex ofObject: blockClosure.
>>         (objectMemory isContext: outerContext) ifFalse:
>>                 [^self primitiveFail].
>>         closureMethod := objectMemory fetchPointer: MethodIndex ofObject:
>> outerContext.
>>         "Check if the closure's method is actually a CompiledMethod."
>>         (objectMemory isOopCompiledMethod: closureMethod) ifFalse:
>>                 [^self primitiveFail].
>>
>>         "Note we use activateNewMethod, not executeNewMethod, to avoid
>>          quickCheckForInterrupts.  Don't check until we have a full
>> activation."
>>         self activateNewClosureMethod: blockClosure numArgs: numArgs
>> mayContextSwitch: false!
>>
>> Item was changed:
>> + ----- Method: InterpreterStackPage class>>alignedByteSize (in category
>> 'translation') -----
>> - ----- Method: InterpreterStackPage class>>alignedByteSize (in category
>> 'accessing') -----
>>   alignedByteSize
>> +       ^self surrogateClass alignedByteSize!
>> -       "Simulation only.  In the simulation stack pages are purely
>> Smalltalk objects
>> -        and don't exist in memory."
>> -       ^0!
>>
>> Item was changed:
>>   ----- Method: InterpreterStackPage class>>alignedByteSizeOf:forClient:
>> (in category 'translation') -----
>>   alignedByteSizeOf: anObject forClient: aVMClass
>> +       ^self surrogateClass alignedByteSize!
>> -       ^self alignedByteSize!
>>
>> Item was added:
>> + ----- Method: InterpreterStackPage class>>surrogateClass (in category
>> 'simulation only') -----
>> + surrogateClass
>> +       ^BytesPerWord = 4
>> +               ifTrue: [CogStackPageSurrogate32]
>> +               ifFalse: [CogStackPageSurrogate64]!
>>
>> Item was changed:
>>   ----- Method: NewObjectMemory>>lastPointerOf: (in category 'object
>> enumeration') -----
>>   lastPointerOf: oop
>>         "Return the byte offset of the last pointer field of the given
>> object.
>>          Can be used even when the type bits are not correct.
>>          Works with CompiledMethods, as well as ordinary objects."
>> +       <api>
>> -       | fmt header contextSize numLiterals |
>>         <inline: true>
>>         <asmLabel: false>
>> +       | fmt header contextSize numLiterals |
>>         header := self baseHeader: oop.
>>         fmt := self formatOfHeader: header.
>>         fmt <= 4 ifTrue:
>>                 [(fmt = 3
>>                   and: [self isContextHeader: header]) ifTrue:
>>                         ["contexts end at the stack pointer"
>>                         contextSize := coInterpreter fetchStackPointerOf:
>> oop.
>>                         ^CtxtTempFrameStart + contextSize * BytesPerOop].
>>                 ^(self sizeBitsOfSafe: oop) - BaseHeaderSize  "all
>> pointers"].
>>         fmt < 12 ifTrue: [^0]. "no pointers"
>>
>>         "CompiledMethod: contains both pointers and bytes"
>>         numLiterals := coInterpreter literalCountOf: oop.
>>         ^numLiterals + LiteralStart * BytesPerOop!
>>
>> Item was added:
>> + ----- Method: NewspeakInterpreter class>>ancilliaryClasses: (in
>> category 'translation') -----
>> + ancilliaryClasses: options
>> +       ^{ VMCallbackContext }!
>>
>> Item was removed:
>> - ----- Method: NewspeakInterpreter class>>ancilliaryStructClasses (in
>> category 'translation') -----
>> - ancilliaryStructClasses
>> -       ^{ VMCallbackContext }!
>>
>> Item was changed:
>>   ----- Method: NewspeakInterpreter class>>preGenerationHook: (in
>> category 'translation') -----
>>   preGenerationHook: aCCodeGenerator
>>         "Perform any last-minute changes to the code generator immediately
>>          before it performs code analysis and generation.  In this case,
>> make
>>          all non-exported methods private."
>>         | publicMethodNames |
>> +       publicMethodNames := (self requiredMethodNames: aCCodeGenerator
>> options)
>> -       publicMethodNames := self requiredMethodNames
>>
>> copyWithoutAll: (self primitiveTable
>>
>>                                       copyWithout: #primitiveFail).
>>         aCCodeGenerator selectorsAndMethodsDo:
>>                 [:s :m|
>>                 (m export or: [publicMethodNames includes: s]) ifTrue:
>>                         [m static: false]]!
>>
>> Item was removed:
>> - ----- Method: NewspeakInterpreter class>>requiredMethodNames (in
>> category 'translation') -----
>> - requiredMethodNames
>> -       "return the list of method names that should be retained for
>> export or other support reasons"
>> -       | requiredList |
>> -       requiredList := self exportAPISelectors..
>> -       "A number of methods required by VM support code, jitter,
>> specific platforms etc"
>> -       requiredList addAll: #(fullDisplayUpdate interpret printCallStack
>> printAllStacks printOop: readImageFromFile:HeapSize:StartingAt: success:
>> readableFormat: getCurrentBytecode characterForAscii:
>> findClassOfMethod:forReceiver: findSelectorOfMethod:forReceiver:
>> loadInitialContext primitiveFlushExternalPrimitives getFullScreenFlag
>> getInterruptCheckCounter getInterruptKeycode getInterruptPending
>> getNextWakeupTick getSavedWindowSize setFullScreenFlag:
>> setInterruptCheckCounter: setInterruptKeycode: setInterruptPending:
>> setNextWakeupTick: setSavedWindowSize: forceInterruptCheck getThisSessionID
>> getDeferDisplayUpdates validInstructionPointer:inMethod:).
>> -
>> -       "Nice to actually have all the primitives available"
>> -       requiredList addAll: self primitiveTable.
>> -
>> -       "InterpreterProxy is the internal analogue of sqVirtualMachine.c,
>> so make sure to keep all those"
>> -       InterpreterProxy organization categories do: [:cat |
>> -               ((cat ~= 'initialize') and: [cat ~= 'private']) ifTrue: [
>> -                       requiredList addAll: (InterpreterProxy
>> organization listAtCategoryNamed: cat)]].
>> -
>> -       ^requiredList!
>>
>> Item was added:
>> + ----- Method: NewspeakInterpreter class>>requiredMethodNames: (in
>> category 'translation') -----
>> + requiredMethodNames: options
>> +       "return the list of method names that should be retained for
>> export or other support reasons"
>> +       | requiredList |
>> +       requiredList := self exportAPISelectors: options.
>> +       "A number of methods required by VM support code, jitter,
>> specific platforms etc"
>> +       requiredList addAll: #(fullDisplayUpdate interpret printCallStack
>> printAllStacks printOop: readImageFromFile:HeapSize:StartingAt: success:
>> readableFormat: getCurrentBytecode characterForAscii:
>> findClassOfMethod:forReceiver: findSelectorOfMethod:forReceiver:
>> loadInitialContext primitiveFlushExternalPrimitives getFullScreenFlag
>> getInterruptCheckCounter getInterruptKeycode getInterruptPending
>> getNextWakeupTick getSavedWindowSize setFullScreenFlag:
>> setInterruptCheckCounter: setInterruptKeycode: setInterruptPending:
>> setNextWakeupTick: setSavedWindowSize: forceInterruptCheck getThisSessionID
>> getDeferDisplayUpdates validInstructionPointer:inMethod:).
>> +
>> +       "Nice to actually have all the primitives available"
>> +       requiredList addAll: self primitiveTable.
>> +
>> +       "InterpreterProxy is the internal analogue of sqVirtualMachine.c,
>> so make sure to keep all those"
>> +       InterpreterProxy organization categories do: [:cat |
>> +               ((cat ~= 'initialize') and: [cat ~= 'private']) ifTrue: [
>> +                       requiredList addAll: (InterpreterProxy
>> organization listAtCategoryNamed: cat)]].
>> +
>> +       ^requiredList!
>>
>> Item was added:
>> + ----- Method: NewsqueakIA32ABIPlugin class>>ancilliaryClasses: (in
>> category 'translation') -----
>> + ancilliaryClasses: options
>> +       ^{ VMCallbackContext. VMCallbackReturnValue }!
>>
>> Item was removed:
>> - ----- Method: NewsqueakIA32ABIPlugin class>>ancilliaryStructClasses (in
>> category 'translation') -----
>> - ancilliaryStructClasses
>> -       ^{ VMCallbackContext. VMCallbackReturnValue }!
>>
>> Item was removed:
>> - ----- Method: ObjectMemory class>>requiredMethodNames (in category
>> 'translation') -----
>> - requiredMethodNames
>> -       "return the list of method names that should be retained for
>> export or other support reasons"
>> -       ^self exportAPISelectors!
>>
>> Item was added:
>> + ----- Method: ObjectMemory class>>requiredMethodNames: (in category
>> 'translation') -----
>> + requiredMethodNames: options
>> +       "return the list of method names that should be retained for
>> export or other support reasons"
>> +       ^self exportAPISelectors: options!
>>
>> Item was changed:
>>   ----- Method: ObjectMemory>>classHeader: (in category 'header access')
>> -----
>>   classHeader: oop
>> +       <api>
>> +       ^self longAt: oop - BaseHeaderSize!
>> -
>> -       ^ self longAt: oop - BaseHeaderSize!
>>
>> Item was changed:
>>   ----- Method: ObjectMemory>>compactClassIndexOf: (in category 'header
>> access') -----
>>   compactClassIndexOf: oop
>> +       <api>
>>         <inline: true>
>>         ^((self baseHeader: oop) >> 12) bitAnd: 16r1F!
>>
>> Item was changed:
>>   ----- Method: ObjectMemory>>fetchByte:ofObject: (in category
>> 'interpreter access') -----
>>   fetchByte: byteIndex ofObject: oop
>> +       <api>
>> +       ^self byteAt: oop + BaseHeaderSize + byteIndex!
>> -
>> -       ^ self byteAt: oop + BaseHeaderSize + byteIndex!
>>
>> Item was changed:
>>   ----- Method: ObjectMemory>>isNonIntegerObject: (in category
>> 'interpreter access') -----
>>   isNonIntegerObject: objectPointer
>> +       <api>
>> +       ^(objectPointer bitAnd: 1) = 0!
>> -
>> -       ^ (objectPointer bitAnd: 1) = 0!
>>
>> Item was changed:
>>   ----- Method: ObjectMemory>>lastPointerOf: (in category 'object
>> enumeration') -----
>>   lastPointerOf: oop
>>         "Return the byte offset of the last pointer field of the given
>> object.
>>         Works with CompiledMethods, as well as ordinary objects.
>>         Can be used even when the type bits are not correct."
>> +       <api>
>> -       | fmt sz methodHeader header contextSize |
>>         <inline: true>
>>         <asmLabel: false>
>> +       | fmt sz methodHeader header contextSize |
>>         header := self baseHeader: oop.
>>         fmt := self formatOfHeader: header.
>>         fmt <= 4 ifTrue: [(fmt = 3 and: [self isContextHeader: header])
>>                                         ifTrue: ["contexts end at the
>> stack pointer"
>>                                                 contextSize := self
>> fetchStackPointerOf: oop.
>>                                                 ^ CtxtTempFrameStart +
>> contextSize * BytesPerWord].
>>                                 sz := self sizeBitsOfSafe: oop.
>>                                 ^ sz - BaseHeaderSize  "all pointers"].
>>         fmt < 12 ifTrue: [^ 0]. "no pointers"
>>
>>         "CompiledMethod: contains both pointers and bytes:"
>>         methodHeader := self longAt: oop + BaseHeaderSize.
>>         ^ (methodHeader >> 10 bitAnd: 255) + LiteralStart * BytesPerWord!
>>
>> Item was removed:
>> - ----- Method: SimpleStackBasedCogit class>>ancilliaryClasses (in
>> category 'translation') -----
>> - ancilliaryClasses
>> -       ^super ancilliaryClasses, { CogObjectRepresentationForSqueakV3 }!
>>
>> Item was added:
>> + ----- Method: SimpleStackBasedCogit class>>ancilliaryClasses: (in
>> category 'translation') -----
>> + ancilliaryClasses: options
>> +       "hard-wired for now"
>> +       ^(super ancilliaryClasses: options), {
>> CogObjectRepresentationForSqueakV3 }!
>>
>> Item was changed:
>>   ----- Method: SimpleStackBasedCogit>>compileFrameBuild (in category
>> 'compile abstract instructions') -----
>>   compileFrameBuild
>>         "Build a frame for a CogMethod activation.  See CoInterpreter
>> class>>initializeFrameIndices.
>>                         receiver (in ReceiverResultReg)
>>                         arg0
>>                         ...
>>                         argN
>>                         caller's saved ip/this stackPage (for a base
>> frame)
>>         fp->    saved fp
>>                         method
>>                         context (uninitialized?)
>>                         receiver
>>                         first temp
>>                         ...
>>         sp->    Nth temp
>>         If there is a primitive and an error code the Nth temp is the
>> error code.
>>         Ensure SendNumArgsReg is set early on (incidentally to nilObj)
>> because
>>         it is the flag determining whether context switch is allowed on
>> stack-overflow."
>>         | methodHeader jumpSkip |
>>         <inline: false>
>>         <var: #jumpSkip type: #'AbstractInstruction *'>
>>         needsFrame ifFalse: [^0].
>>         methodHeader := coInterpreter headerOf: methodObj.
>>         backEnd hasLinkRegister ifTrue: [self PushR: LinkReg].
>>         self PushR: FPReg.
>>         self MoveR: SPReg R: FPReg.
>>         methodLabel addDependent: (self annotateAbsolutePCRef:
>>                 (self PushCw: methodLabel asInteger)). "method"
>>         self annotate: (self MoveCw: objectMemory nilObject R:
>> SendNumArgsReg)
>>                 objRef: objectMemory nilObject.
>>         self PushR: SendNumArgsReg. "context"
>>         self PushR: ReceiverResultReg.
>> +       methodOrBlockNumArgs + 1 to: (coInterpreter
>> temporaryCountOfMethodHeader: methodHeader) do:
>> -       methodOrBlockNumArgs + 1 to: (coInterpreter tempCountOf:
>> methodObj) do:
>>                 [:i|
>>                 self PushR: SendNumArgsReg].
>>         (primitiveIndex > 0
>>          and: [(coInterpreter longStoreBytecodeForHeader: methodHeader)
>>                         = (objectMemory
>>                                 fetchByte: initialPC + (coInterpreter
>> sizeOfCallPrimitiveBytecode: methodHeader)
>>                                 ofObject: methodObj)]) ifTrue:
>>                 [self compileGetErrorCode.
>>                  initialPC := initialPC
>>                                    + (coInterpreter
>> sizeOfCallPrimitiveBytecode: methodHeader)
>>                                    + (coInterpreter
>> sizeOfLongStoreTempBytecode: methodHeader)].
>>         self MoveAw: coInterpreter stackLimitAddress R: TempReg.
>>         self CmpR: TempReg R: SPReg. "N.B. FLAGS := SPReg - TempReg"
>>         "If we can't context switch for this method, use a slightly
>>          slower overflow check that clears SendNumArgsReg."
>>         (coInterpreter canContextSwitchIfActivating: methodObj header:
>> methodHeader)
>>                 ifTrue:
>>                         [self JumpBelow: stackOverflowCall.
>>                          stackCheckLabel := self Label]
>>                 ifFalse:
>>                         [jumpSkip := self JumpAboveOrEqual: 0.
>>                          self MoveCq: 0 R: SendNumArgsReg.
>>                          self Jump: stackOverflowCall.
>>                          jumpSkip jmpTarget: (stackCheckLabel := self
>> Label)].
>>         self annotateBytecode: stackCheckLabel!
>>
>> Item was added:
>> + ----- Method: SistaStackToRegisterMappingCogit
>> class>>ancilliaryClasses: (in category 'translation') -----
>> + ancilliaryClasses: options
>> +       ^(super ancilliaryClasses: options) copyWith: SistaCogMethod!
>>
>> Item was removed:
>> - ----- Method: SistaStackToRegisterMappingCogit
>> class>>ancilliaryStructClasses (in category 'translation') -----
>> - ancilliaryStructClasses
>> -       "self ancilliaryStructClasses"
>> -       ^super ancilliaryStructClasses copyWith: SistaCogMethod!
>>
>> Item was removed:
>> - ----- Method: StackInterpreter class>>ancilliaryClasses (in category
>> 'translation') -----
>> - ancilliaryClasses
>> -       "Answer any extra classes to be included in the translation."
>> -       ^{ self objectMemoryClass. InterpreterStackPages }!
>>
>> Item was added:
>> + ----- Method: StackInterpreter class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: options
>> +       "Answer any extra classes to be included in the translation."
>> +       ^{      self objectMemoryClass.
>> +               VMCallbackContext.
>> +               InterpreterStackPages.
>> +               InterpreterStackPage }!
>>
>> Item was removed:
>> - ----- Method: StackInterpreter class>>ancilliaryStructClasses (in
>> category 'translation') -----
>> - ancilliaryStructClasses
>> -       ^{ InterpreterStackPage. VMCallbackContext }!
>>
>> Item was removed:
>> - ----- Method: StackInterpreter class>>exportAPISelectors (in category
>> 'translation') -----
>> - exportAPISelectors
>> -       | omExports |
>> -       omExports := (self objectMemoryClass withAllSuperclasses
>> copyUpTo: VMClass)
>> -                                       inject: Set new
>> -                                       into: [:api :c| api addAll: c
>> exportAPISelectors; yourself].
>> -       ^(self withAllSuperclasses copyUpTo: VMClass), self
>> ancilliaryClasses
>> -               inject: omExports
>> -               into: [:set :class| set addAll: (self
>> exportAPISelectorsFor: class); yourself]!
>>
>> Item was added:
>> + ----- Method: StackInterpreter class>>exportAPISelectors: (in category
>> 'translation') -----
>> + exportAPISelectors: options
>> +       | omExports |
>> +       omExports := (self objectMemoryClass withAllSuperclasses
>> copyUpTo: VMClass)
>> +                                       inject: Set new
>> +                                       into: [:api :c| api addAll: (c
>> exportAPISelectors: options); yourself].
>> +       ^(self withAllSuperclasses copyUpTo: VMClass), (self
>> ancilliaryClasses: options)
>> +               inject: omExports
>> +               into: [:set :class| set addAll: (self
>> exportAPISelectorsFor: class); yourself]!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter class>>preGenerationHook: (in category
>> 'translation') -----
>>   preGenerationHook: aCCodeGenerator
>>         "Perform any last-minute changes to the code generator immediately
>>          before it performs code analysis and generation.  In this case,
>> make
>>          all non-exported methods private."
>>         | publicMethodNames |
>> +       publicMethodNames := (self requiredMethodNames: aCCodeGenerator
>> options)
>> -       publicMethodNames := self requiredMethodNames
>>
>> copyWithoutAll: (self primitiveTable
>>
>>                                       copyWithout: #primitiveFail).
>>         aCCodeGenerator selectorsAndMethodsDo:
>>                 [:s :m|
>>                 (m export or: [publicMethodNames includes: s]) ifTrue:
>>                         [m static: false]]!
>>
>> Item was removed:
>> - ----- Method: StackInterpreter class>>requiredMethodNames (in category
>> 'translation') -----
>> - requiredMethodNames
>> -       "return the list of method names that should be retained for
>> export or other support reasons"
>> -       | requiredList |
>> -       requiredList := self exportAPISelectors.
>> -       requiredList addAll: NewObjectMemory requiredMethodNames.
>> -       "A number of methods required by VM support code, jitter,
>> specific platforms etc"
>> -       requiredList addAll: #(
>> -               assertValidExecutionPointe:r:s:
>> -               characterForAscii: checkedLongAt:
>> -               delayExpired
>> -               findClassOfMethod:forReceiver: findSelectorOfMethod:
>> -                       forceInterruptCheck
>> forceInterruptCheckFromHeartbeat fullDisplayUpdate
>> -               getCurrentBytecode getFullScreenFlag getInterruptKeycode
>> getInterruptPending
>> -                       getSavedWindowSize getThisSessionID
>> -               highBit:
>> -               interpret
>> -               loadInitialContext
>> -               oopFromChunk:
>> -               primitiveFail primitiveFailFor:
>> primitiveFlushExternalPrimitives printAllStacks printCallStack printContext:
>> -                       printExternalHeadFrame printFramesInPage:
>> printFrame: printHeadFrame printMemory printOop:
>> -                               printStackPages printStackPageList
>> printStackPagesInUse printStackPageListInUse
>> -               readableFormat: readImageFromFile:HeapSize:StartingAt:
>> -               setFullScreenFlag: setInterruptKeycode:
>> setInterruptPending: setInterruptCheckChain:
>> -                       setSavedWindowSize: success:
>> -               validInstructionPointer:inMethod:framePointer:).
>> -
>> -       "Nice to actually have all the primitives available"
>> -       requiredList addAll: (self primitiveTable select: [:each| each
>> isSymbol]).
>> -
>> -       "InterpreterProxy is the internal analogue of sqVirtualMachine.c,
>> so make sure to keep all those"
>> -       InterpreterProxy organization categories do:
>> -               [:cat |
>> -               ((cat ~= 'initialize') and: [cat ~= 'private']) ifTrue:
>> -                       [requiredList addAll: (InterpreterProxy
>> organization listAtCategoryNamed: cat)]].
>> -
>> -       ^requiredList!
>>
>> Item was added:
>> + ----- Method: StackInterpreter class>>requiredMethodNames: (in category
>> 'translation') -----
>> + requiredMethodNames: options
>> +       "return the list of method names that should be retained for
>> export or other support reasons"
>> +       | requiredList |
>> +       requiredList := self exportAPISelectors: options.
>> +       requiredList addAll: (NewObjectMemory requiredMethodNames:
>> options).
>> +       "A number of methods required by VM support code, jitter,
>> specific platforms etc"
>> +       requiredList addAll: #(
>> +               assertValidExecutionPointe:r:s:
>> +               characterForAscii:
>> +               findClassOfMethod:forReceiver: findSelectorOfMethod:
>> +                       forceInterruptCheck
>> forceInterruptCheckFromHeartbeat fullDisplayUpdate
>> +               getCurrentBytecode getFullScreenFlag getInterruptKeycode
>> getInterruptPending
>> +                       getSavedWindowSize getThisSessionID
>> +               interpret
>> +               loadInitialContext
>> +               oopFromChunk:
>> +               primitiveFail primitiveFailFor:
>> primitiveFlushExternalPrimitives printAllStacks printCallStack printContext:
>> +                       printExternalHeadFrame printFramesInPage:
>> printFrame: printHeadFrame printMemory printOop:
>> +                               printStackPages printStackPageList
>> printStackPagesInUse printStackPageListInUse
>> +               readableFormat: readImageFromFile:HeapSize:StartingAt:
>> +               setFullScreenFlag: setInterruptKeycode:
>> setInterruptPending: setInterruptCheckChain:
>> +                       setSavedWindowSize: success:
>> +               validInstructionPointer:inMethod:framePointer:).
>> +
>> +       "Nice to actually have all the primitives available"
>> +       requiredList addAll: (self primitiveTable select: [:each| each
>> isSymbol]).
>> +
>> +       "InterpreterProxy is the internal analogue of sqVirtualMachine.c,
>> so make sure to keep all those"
>> +       InterpreterProxy organization categories do:
>> +               [:cat |
>> +               ((cat ~= 'initialize') and: [cat ~= 'private']) ifTrue:
>> +                       [requiredList addAll: (InterpreterProxy
>> organization listAtCategoryNamed: cat)]].
>> +
>> +       ^requiredList!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>computeStackZoneSize (in category
>> 'initialization') -----
>>   computeStackZoneSize
>>         "In C the StackPage structs live next to the actual stack pages
>> in the alloca'ed stack
>>          zone.  In simulation these live in some dictionary and don't
>> exist in the memory."
>> +       ^numStackPages * ((self cCode: [self sizeof:
>> InterpreterStackPage] inSmalltalk: [0])
>> -       ^numStackPages * ((self cCode: 'sizeof(StackPage)' inSmalltalk:
>> [0])
>>                                                 + self stackPageByteSize)
>>          + stackPages extraStackBytes!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>functionPointerFor:inClass: (in
>> category 'method lookup cache') -----
>>   functionPointerFor: primIdx inClass: theClass
>>         "Find an actual function pointer for this primitiveIndex.  This
>> is an
>>         opportunity to specialise the prim for the relevant class (format
>> for
>>         example).  Default for now is simply the entry in the base
>> primitiveTable."
>> +       <api>
>> -
>>         <returnTypeC: 'void (*functionPointerForinClass(sqInt
>> primIdx,sqInt theClass))(void)'>
>>         ^primIdx > MaxPrimitiveIndex ifTrue: [0] ifFalse: [primitiveTable
>> at: primIdx]!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>literal:ofMethod: (in category
>> 'compiled methods') -----
>>   literal: offset ofMethod: methodPointer
>> +       <api>
>> +       ^objectMemory fetchPointer: offset + LiteralStart ofObject:
>> methodPointer
>> -
>> -       ^ objectMemory fetchPointer: offset + LiteralStart ofObject:
>> methodPointer
>>   !
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>popStack (in category 'internal
>> interpreter access') -----
>>   popStack
>>         "In the StackInterpreter stacks grow down."
>> +       <api>
>>         | top |
>>         <inline: true>
>>         top := stackPages longAt: stackPointer.
>>         stackPointer := stackPointer + BytesPerWord.
>>         ^top!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>specialSelector: (in category 'message
>> sending') -----
>>   specialSelector: index
>> +       <api>
>> +       ^objectMemory fetchPointer: (index * 2) ofObject: (objectMemory
>> splObj: SpecialSelectors)!
>> -
>> -       ^ objectMemory fetchPointer: (index * 2) ofObject: (objectMemory
>> splObj: SpecialSelectors)!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>stackTop (in category 'internal
>> interpreter access') -----
>>   stackTop
>> +       <api>
>>         ^stackPages longAt: stackPointer!
>>
>> Item was changed:
>>   ----- Method: StackInterpreter>>tempCountOf: (in category 'compiled
>> methods') -----
>>   tempCountOf: methodPointer
>> +       <api>
>>         ^self temporaryCountOfMethodHeader: (self headerOf:
>> methodPointer)!
>>
>> Item was added:
>> + ----- Method: StackToRegisterMappingCogit class>>ancilliaryClasses: (in
>> category 'translation') -----
>> + ancilliaryClasses: options
>> +       ^((super ancilliaryClasses: options) copyWithout:
>> CogBytecodeFixup),
>> +         { CogSSBytecodeFixup. CogSimStackEntry. CogSSOptStatus }!
>>
>> Item was removed:
>> - ----- Method: StackToRegisterMappingCogit
>> class>>ancilliaryStructClasses (in category 'translation') -----
>> - ancilliaryStructClasses
>> -       "self ancilliaryStructClasses"
>> -       ^(super ancilliaryStructClasses copyWithout: CogBytecodeFixup),
>> -         { CogSSBytecodeFixup. CogSimStackEntry. CogSSOptStatus }!
>>
>> Item was removed:
>> - ----- Method: StackToRegisterMappingCogit class>>requiredMethodNames
>> (in category 'translation') -----
>> - requiredMethodNames
>> -       "self requiredMethodNames"
>> -       ^super requiredMethodNames
>> -               add: self isPushNilFunction;
>> -               add: self pushNilSizeFunction;
>> -               yourself!
>>
>> Item was added:
>> + ----- Method: StackToRegisterMappingCogit class>>requiredMethodNames:
>> (in category 'translation') -----
>> + requiredMethodNames: options
>> +       ^(super requiredMethodNames: options)
>> +               add: self isPushNilFunction;
>> +               add: self pushNilSizeFunction;
>> +               yourself!
>>
>> Item was added:
>> + ----- Method: ThreadedFFIPlugin class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: options
>> +       ^{ self calloutStateClass }!
>>
>> Item was removed:
>> - ----- Method: ThreadedFFIPlugin class>>ancilliaryStructClasses (in
>> category 'translation') -----
>> - ancilliaryStructClasses
>> -       ^{ self calloutStateClass }!
>>
>> Item was removed:
>> - ----- Method: VMClass class>>ancilliaryClasses (in category
>> 'translation') -----
>> - ancilliaryClasses
>> -       "Answer any extra classes to be included in the translation."
>> -       ^#()!
>>
>> Item was added:
>> + ----- Method: VMClass class>>ancilliaryClasses: (in category
>> 'translation') -----
>> + ancilliaryClasses: optionsDictionary
>> +       "Answer any extra classes to be included in the translation."
>> +       ^{}!
>>
>> Item was removed:
>> - ----- Method: VMClass class>>ancilliaryStructClasses (in category
>> 'translation') -----
>> - ancilliaryStructClasses
>> -       ^#()!
>>
>> Item was removed:
>> - ----- Method: VMClass class>>exportAPISelectors (in category
>> 'translation') -----
>> - exportAPISelectors
>> -       ^self exportAPISelectorsFor: self!
>>
>> Item was added:
>> + ----- Method: VMClass class>>exportAPISelectors: (in category
>> 'translation') -----
>> + exportAPISelectors: options
>> +       ^self exportAPISelectorsFor: self!
>>
>> Item was removed:
>> - ----- Method: VMClass class>>requiredMethodNames (in category
>> 'translation') -----
>> - requiredMethodNames
>> -       "Answer a list of method names that should be retained for export
>> or other
>> -        support reasons.  These are typically entry-points that unless
>> explicitly noted
>> -        will be deleted by the code generator since it will assume these
>> are not used."
>> -       ^#()!
>>
>> Item was added:
>> + ----- Method: VMClass class>>requiredMethodNames: (in category
>> 'translation') -----
>> + requiredMethodNames: options
>> +       "Answer a list of method names that should be retained for export
>> or other
>> +        support reasons.  These are typically entry-points that unless
>> explicitly noted
>> +        will be deleted by the code generator since it will assume these
>> are not used."
>> +       ^#()!
>>
>> Item was changed:
>>   ----- Method: VMMaker>>buildCodeGeneratorForCogit: (in category
>> 'generate sources') -----
>>   buildCodeGeneratorForCogit: getAPIMethods
>>         "Answer the code generator for translating the cogit."
>>
>>         | cg cogitClass cogitClasses apicg |
>>         cg := self createCogitCodeGenerator.
>>
>>         cg vmClass: (cogitClass := self cogitClass).
>>         { cogitClass. self interpreterClass } do:
>>                 [:cgc|
>>                 (cgc respondsTo: #initializeWithOptions:)
>>                         ifTrue: [cgc initializeWithOptions:
>> optionsDictionary]
>>                         ifFalse: [cgc initialize]].
>>
>>         cogitClasses := OrderedCollection new.
>>         [cogitClasses addFirst: cogitClass.
>>          cogitClass ~~ Cogit
>>          and: [cogitClass inheritsFrom: Cogit]] whileTrue:
>>                 [cogitClass := cogitClass superclass].
>>         cogitClasses addFirst: VMClass.
>> +       cogitClasses addAllLast: ((self cogitClass ancilliaryClasses:
>> optionsDictionary) reject: [:class| class isStructClass]).
>> -       cogitClasses addAllLast: self cogitClass ancilliaryClasses.
>>         cogitClasses do: [:cgc| cg addClass: cgc].
>>         (cg structClassesForTranslationClasses: cogitClasses) do:
>>                 [:structClass| cg addStructClass: structClass].
>>
>>         getAPIMethods ifTrue:
>>                 [apicg := self buildCodeGeneratorForInterpreter: false.
>>                  cg apiMethods: apicg selectAPIMethods].
>>
>>         ^cg!
>>
>> Item was changed:
>>   ----- Method: VMMaker>>buildCodeGeneratorForInterpreter: (in category
>> 'generate sources') -----
>>   buildCodeGeneratorForInterpreter: getAPIMethods
>>         "Answer the code generator for translating the interpreter."
>>
>> +       | cg interpreterClass interpreterClasses apicg |
>> -       | cg interpreterClass interpreterClasses structClasses apicg |
>>         interpreterClasses := OrderedCollection new.
>>
>>         (cg := self createCodeGenerator) vmClass: (interpreterClass :=
>> self interpreterClass).
>>
>>         [interpreterClass ~~ VMClass] whileTrue:
>>                 [interpreterClasses addFirst: interpreterClass.
>>                  interpreterClass := interpreterClass superclass].
>>
>>         cg vmClass objectMemoryClass ifNotNil:
>>                 [:objectMemoryClass|
>>                 interpreterClass := objectMemoryClass.
>>                 [interpreterClass ~~ VMClass] whileTrue:
>>                         [interpreterClasses addFirst: interpreterClass.
>>                          interpreterClass := interpreterClass
>> superclass]].
>>
>>         interpreterClasses addFirst: VMClass.
>> +       interpreterClasses addAllLast: (((self interpreterClass
>> ancilliaryClasses: optionsDictionary) reject: [:class| class
>> isStructClass]) copyWithout: cg vmClass objectMemoryClass).
>> +       (cg structClassesForTranslationClasses: interpreterClasses) do:
>> -       interpreterClasses addAllLast: (self interpreterClass
>> ancilliaryClasses copyWithout: cg vmClass objectMemoryClass).
>> -       structClasses := Set new.
>> -       interpreterClasses do: [:class| structClasses addAll: class
>> ancilliaryStructClasses].
>> -       (ChangeSet superclassOrder: structClasses asArray) do:
>>                 [:structClass|
>>                 structClass initialize.
>>                 cg addStructClass: structClass].
>>
>>         interpreterClasses do:
>>                 [:ic|
>>                 (ic respondsTo: #initializeWithOptions:)
>>                         ifTrue: [ic initializeWithOptions:
>> optionsDictionary]
>>                         ifFalse: [ic initialize]].
>>
>>         interpreterClasses do: [:ic| cg addClass: ic].
>>
>>         (getAPIMethods
>>         and: [self interpreterClass needsCogit]) ifTrue:
>>                 [apicg := self buildCodeGeneratorForCogit: false.
>>                  cg apiMethods: apicg selectAPIMethods].
>>
>>         ^cg!
>>
>> Item was changed:
>>   ----- Method: VMMaker>>needsToRegenerateCogitFile (in category
>> 'generate sources') -----
>>   needsToRegenerateCogitFile
>> +       "Check the timestamp for the relevant classes and then the
>> timestamp for the main source file (e.g. interp.c)
>> +        file if it already exists. Answer if the file needs
>> regenerating."
>> - "check the timestamp for the relevant classes and then the timestamp
>> for the interp.c file if it already exists. Return true if the file needs
>> regenerating, false if not"
>>
>> +       | cogitClass cogitClasses tStamp |
>> +       cogitClasses := (cogitClass := self cogitClass)
>> withAllSuperclasses copyUpThrough: Cogit.
>> +       cogitClasses addAllLast: (cogitClass ancilliaryClasses: self
>> options).
>> -       | cogitClass cogitClasses tStamp fstat |
>> -       cogitClass := self cogitClass.
>> -       cogitClasses := cogitClass withAllSuperclasses copyUpThrough:
>> Cogit.
>> -       cogitClasses addAllLast: cogitClass ancilliaryClasses.
>>         tStamp := cogitClasses inject: 0 into: [:tS :cl| tS max: cl
>> timeStamp].
>> -       cogitClasses do:
>> -               [:c|
>> -               tStamp := c ancilliaryStructClasses inject: tStamp into:
>> [:tS :cl| tS max: cl timeStamp]].
>>
>>         "don't translate if the file is newer than my timeStamp"
>> +       (self coreVMDirectory entryAt: cogitClass sourceFileName
>> ifAbsent: [nil]) ifNotNil:
>> +               [:fstat|
>> +               tStamp < fstat modificationTime ifTrue:
>> +                       [^self confirm: 'The ', cogitClass printString, '
>> classes have not been modified since\ the source file was last
>> generated.\Do you still want to regenerate it?' withCRs]].
>> -       fstat := self coreVMDirectory entryAt: cogitClass sourceFileName
>> ifAbsent:[nil].
>> -       fstat ifNotNil:[tStamp < fstat modificationTime ifTrue:
>> -               [^self confirm: 'The ', cogitClass printString, ' classes
>> have not been modified since\ the source file was last generated.\Do you
>> still want to regenerate it?' withCRs]].
>>         ^true
>>   !
>>
>> Item was changed:
>>   ----- Method: VMMaker>>needsToRegenerateInterpreterFile (in category
>> 'initialize') -----
>>   needsToRegenerateInterpreterFile
>> +       "Check the timestamp for the relevant classes and then the
>> timestamp for the main
>> +        source file (e.g. interp.c) if it already exists.  Answer if the
>> file needs regenerating."
>> - "check the timestamp for the relevant classes and then the timestamp
>> for the interp.c file if it already exists. Return true if the file needs
>> regenerating, false if not"
>>
>> +       | classes tStamp |
>> -       | classes tStamp fstat |
>>         classes := self interpreterClass withAllSuperclasses copyUpTo:
>> VMClass.
>>         self interpreterClass objectMemoryClass ifNotNil:
>>                 [:objectMemoryClass|
>>                 classes addAllLast: (objectMemoryClass
>>  withAllSuperclasses copyUpTo: VMClass)].
>>         classes copy do:
>> +               [:class| classes addAllLast: (class ancilliaryClasses:
>> self options)].
>> -               [:class| classes addAllLast: class ancilliaryClasses].
>> -       classes copy do:
>> -               [:class| classes addAllLast: class
>> ancilliaryStructClasses].
>>         tStamp := classes inject: 0 into: [:tS :cl| tS max: cl timeStamp].
>>
>>         "don't translate if the file is newer than my timeStamp"
>> +       (self coreVMDirectory entryAt: self interpreterFilename ifAbsent:
>> [nil]) ifNotNil:
>> +               [:fstat|
>> +               tStamp < fstat modificationTime ifTrue:
>> +                       [^self confirm: 'The interpreter classes have not
>> been modified since\ the interpreter file was last generated.\Do you still
>> want to regenerate their source file?' withCRs]].
>> -       fstat := self coreVMDirectory entryAt: self interpreterFilename
>> ifAbsent:[nil].
>> -       fstat ifNotNil:[tStamp < fstat modificationTime ifTrue:
>> -               [^self confirm: 'The interpreter classes have not been
>> modified since\ the interpreter file was last generated.\Do you still want
>> to regenerate their source file?' withCRs]].
>>         ^true
>>   !
>>
>> Item was changed:
>>   ----- Method: VMPluginCodeGenerator>>emitCTypesOn: (in category 'C code
>> generator') -----
>> + emitCTypesOn: aStream
>> - emitCTypesOn: aStream
>>         "Store local type declarations on the given stream."
>> +       (self structClassesForTranslationClasses: { pluginClass }) do:
>> +               [:structClass|
>> +               (structClass isAbstract not
>> +                and: [vmClass shouldGenerateTypedefFor: structClass])
>> ifTrue:
>> +                       [structClass printTypedefOn: aStream.
>> +                        aStream cr; cr]]!
>> -       ([pluginClass ancilliaryStructClasses]
>> -               on: MessageNotUnderstood
>> -               do: [:ex| ex message selector == #ancilliaryStructClasses
>> ifTrue: [^self].
>> -                               ex pass]) do:
>> -                       [:structClass|
>> -                       (pluginClass shouldGenerateTypedefFor:
>> structClass) ifTrue:
>> -                               [structClass printTypedefOn: aStream.
>> -                                aStream cr; cr]]!
>>
>>
>
>


-- 
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20130912/467f0f4d/attachment-0001.htm


More information about the Vm-dev mailing list