[Vm-dev] VM Maker: VMMaker.oscog-eem.1518.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Nov 13 22:47:47 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1518.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1518
Author: eem
Time: 13 November 2015, 2:45:55.557 pm
UUID: f6074a8b-be78-48cd-a00b-26606f77d06b
Ancestors: VMMaker.oscog-eem.1517
Include exported api variables (between Cogit and CoInterpreter) for better type checking and fewer warnings.
=============== Diff against VMMaker.oscog-eem.1517 ===============
Item was changed:
Object subclass: #CCodeGenerator
+ instanceVariableNames: 'vmClass structClasses translationDict asArgumentTranslationDict inlineList constants variables variableDeclarations scopeStack methods macros apiMethods apiVariables kernelReturnTypes currentMethod headerFiles globalVariableUsage useSymbolicConstants generateDeadCode requiredSelectors logger suppressAsmLabels asmLabelCounts pools selectorTranslations optionsDictionary breakSrcInlineSelectors breakDestInlineSelectors breakOnInline vmMaker'
- instanceVariableNames: 'vmClass structClasses translationDict asArgumentTranslationDict inlineList constants variables variableDeclarations scopeStack methods macros apiMethods kernelReturnTypes currentMethod headerFiles globalVariableUsage useSymbolicConstants generateDeadCode requiredSelectors logger suppressAsmLabels asmLabelCounts pools selectorTranslations optionsDictionary breakSrcInlineSelectors breakDestInlineSelectors breakOnInline vmMaker'
classVariableNames: 'NoRegParmsInAssertVMs'
poolDictionaries: 'VMBasicConstants'
category: 'VMMaker-Translation to C'!
!CCodeGenerator commentStamp: 'tpr 5/2/2003 14:30' prior: 0!
This class oversees the translation of a subset of Smalltalk to C, allowing the comforts of Smalltalk during development and the efficiency and portability of C for the resulting interpreter.
See VMMaker for more useful info!
Item was removed:
- ----- Method: CCodeGenerator>>apiMethods: (in category 'accessing') -----
- apiMethods: aDictionary
- apiMethods := aDictionary!
Item was added:
+ ----- Method: CCodeGenerator>>includeAPIFrom: (in category 'accessing') -----
+ includeAPIFrom: aCCodeGenerator
+ apiMethods := aCCodeGenerator selectAPIMethods.
+ apiVariables := aCCodeGenerator selectAPIVariables!
Item was added:
+ ----- Method: CCodeGenerator>>selectAPIVariables (in category 'accessing') -----
+ selectAPIVariables
+ ^variableDeclarations reject: [:decl| decl includesSubString: 'static ']!
Item was changed:
----- Method: CCodeGenerator>>typeOfVariable: (in category 'C code generator') -----
typeOfVariable: varName "<String>"
self assert: varName isString.
scopeStack reverseDo:
[:dict|
(dict includesKey: varName) ifTrue:
[^self
extractTypeFor: varName
fromDeclaration: (dict at: varName)]].
^self
extractTypeFor: varName
+ fromDeclaration: (variableDeclarations
+ at: varName
+ ifAbsent:
+ [apiVariables
+ ifNotNil: [apiVariables at: varName ifAbsent: [^nil]]
+ ifNil: [^nil]])!
- fromDeclaration: (variableDeclarations at: varName ifAbsent: [^nil])!
Item was changed:
----- Method: VMMaker>>buildCodeGeneratorForCogit:includeAPIMethods:initializeClasses: (in category 'generate sources') -----
buildCodeGeneratorForCogit: cogitClass includeAPIMethods: getAPIMethods initializeClasses: initializeClasses
"Answer the code generator for translating the cogit."
+ | cg cogitClasses |
- | cg cogitClasses apicg |
cg := self createCogitCodeGenerator.
cg vmClass: cogitClass.
initializeClasses ifTrue:
[{ cogitClass. self interpreterClass. self interpreterClass objectMemoryClass } do:
[:cgc|
(cgc respondsTo: #initializeWithOptions:)
ifTrue: [cgc initializeWithOptions: optionsDictionary]
ifFalse: [cgc initialize]]].
cogitClasses := OrderedCollection withAll: (cogitClass withAllSuperclasses copyUpThrough: VMClass) reverse.
cogitClasses addAllLast: ((cogitClass ancilliaryClasses: optionsDictionary) reject: [:class| class isStructClass]).
cogitClasses do: [:cgc| cg addClass: cgc].
cg addStructClasses: (cg structClassesForTranslationClasses: cogitClasses).
getAPIMethods ifTrue:
+ [cg includeAPIFrom: (self
+ buildCodeGeneratorForInterpreter: self interpreterClass
+ includeAPIMethods: false
+ initializeClasses: false)].
- [apicg := self
- buildCodeGeneratorForInterpreter: self interpreterClass
- includeAPIMethods: false
- initializeClasses: false.
- cg apiMethods: apicg selectAPIMethods].
cg removeConstant: #VMBIGENDIAN. "this should be defined in platforms/??/vm/sqConfig.h"
^cg!
Item was changed:
----- Method: VMMaker>>buildCodeGeneratorForInterpreter:includeAPIMethods:initializeClasses: (in category 'generate sources') -----
buildCodeGeneratorForInterpreter: interpreterClass includeAPIMethods: getAPIMethods initializeClasses: initializeClasses
"Answer the code generator for translating the interpreter."
+ | cg interpreterClasses |
- | cg interpreterClasses apicg |
initializeClasses ifTrue:
[interpreterClass initializeWithOptions: optionsDictionary.
interpreterClass hasCogit ifTrue:
[interpreterClass cogitClass initializeWithOptions: optionsDictionary]].
(cg := self createCodeGenerator) vmClass: interpreterClass.
"Construct interpreterClasses as all classes from interpreterClass &
objectMemoryClass up to VMClass in superclass to subclass order."
interpreterClasses := OrderedCollection new.
{interpreterClass. interpreterClass objectMemoryClass} do:
[:vmClass| | theClass |
theClass := vmClass.
[theClass ~~ VMClass] whileTrue:
[interpreterClasses addFirst: theClass.
theClass := theClass superclass]].
interpreterClasses
addFirst: VMClass;
addAllLast: (cg nonStructClassesForTranslationClasses: interpreterClasses).
initializeClasses ifTrue:
[interpreterClasses do:
[:ic|
(ic respondsTo: #initializeWithOptions:)
ifTrue: [ic initializeWithOptions: optionsDictionary]
ifFalse: [ic initialize]].
(cg structClassesForTranslationClasses: interpreterClasses) do:
[:structClass| structClass initialize]].
cg addStructClasses: (cg structClassesForTranslationClasses: interpreterClasses).
interpreterClasses do: [:ic| cg addClass: ic].
getAPIMethods ifTrue:
[interpreterClass cogitClass ifNotNil:
[:cogitClass|
+ cg includeAPIFrom: (self
+ buildCodeGeneratorForCogit: cogitClass
+ includeAPIMethods: false
+ initializeClasses: false)]].
- apicg := self
- buildCodeGeneratorForCogit: cogitClass
- includeAPIMethods: false
- initializeClasses: false.
- cg apiMethods: apicg selectAPIMethods]].
cg removeConstant: #VMBIGENDIAN. "this should be defined in platforms/??/vm/sqConfig.h"
^cg!
More information about the Vm-dev
mailing list