[Vm-dev] VM Maker: VMMaker.oscog-eem.2439.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Sep 9 17:09:24 UTC 2018
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2439.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2439
Author: eem
Time: 9 September 2018, 10:09:01.654985 am
UUID: f6046fd7-5079-4f12-8e79-bd515107612f
Ancestors: VMMaker.oscog-eem.2438
Slang: more Pharo/Squeak compatibiltiy refactoring.
=============== Diff against VMMaker.oscog-eem.2438 ===============
Item was changed:
----- Method: CCodeGenerator>>addMethodFor:selector: (in category 'utilities') -----
addMethodFor: aClass selector: selector
"Add the given method to the code base and answer its translation
or nil if it shouldn't be translated."
| method tmethod |
method := aClass compiledMethodAt: selector.
(method pragmaAt: #doNotGenerate) ifNotNil:
["only remove a previous method if this one overrides it, i.e. this is a subclass method.
If the existing method is in a different hierarchy this method must be merely a redeirect."
(methods at: selector ifAbsent: []) ifNotNil:
[:tm|
(aClass includesBehavior: tm definingClass) ifTrue:
[self removeMethodForSelector: selector]].
^nil].
method isSubclassResponsibility ifTrue:
[^nil].
(self shouldIncludeMethodFor: aClass selector: selector) ifFalse:
[^nil].
tmethod := self compileToTMethodSelector: selector in: aClass.
"Even though we exclude initialize methods, we must consider their
global variable usage, otherwise globals may be incorrectly localized."
selector == #initialize ifTrue:
[self checkForGlobalUsage: (tmethod allReferencedVariablesUsing: self) in: tmethod.
^nil].
self addMethod: tmethod.
"If the method has a macro then add the macro. But keep the method
for analysis purposes (e.g. its variable accesses)."
(method pragmaAt: #cmacro:) ifNotNil:
[:pragma|
self addMacro: (pragma argumentAt: 1) for: selector.
(inlineList includes: selector) ifTrue:
[inlineList := inlineList copyWithout: selector]].
(method pragmaAt: #cmacro) ifNotNil:
[:pragma| | literal | "Method should be just foo ^const"
self assert: (method numArgs = 0 and: [method numLiterals = 3 or: [method isQuick]]).
literal := method isQuick
+ ifTrue: [method decompile quickMethodReturnLiteral]
- ifTrue: [method decompile block statements last expr key]
ifFalse: [method literalAt: 1].
self addMacro: '() ', (method isReturnField
ifTrue: [literal]
ifFalse: [self cLiteralFor: literal value name: method selector]) for: selector.
(inlineList includes: selector) ifTrue:
[inlineList := inlineList copyWithout: selector]].
^tmethod!
Item was changed:
----- Method: CCodeGenerator>>nonStructClassesForTranslationClasses: (in category 'utilities') -----
nonStructClassesForTranslationClasses: classes
"Answer in superclass order (any superclass precedes any subclass)
the ancilliaryClasses that are not struct classes for all the given classes."
| nonStructClasses |
nonStructClasses := OrderedCollection new.
classes do:
[:aTranslationClass|
([aTranslationClass ancilliaryClasses]
on: MessageNotUnderstood
do: [:ex|
ex message selector == #ancilliaryClasses
ifTrue: [#()]
ifFalse: [ex pass]]) do:
[:class|
(vmClass isNil or: [vmClass isAcceptableAncilliaryClass: class]) ifTrue:
[(class isStructClass
or: [(nonStructClasses includes: class)
or: [classes includes: class]]) ifFalse:
[nonStructClasses addLast: class]]]].
+ ^self superclassOrder: nonStructClasses!
- ^ChangeSet superclassOrder: nonStructClasses!
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."
| theStructClasses |
theStructClasses := OrderedCollection new.
classes do:
[:aTranslationClass|
([aTranslationClass ancilliaryClasses]
on: MessageNotUnderstood
do: [:ex|
ex message selector == #ancilliaryClasses
ifTrue: [#()]
ifFalse: [ex pass]]) do:
[:class|
(class isStructClass
and: [(vmClass isNil or: [vmClass isAcceptableAncilliaryClass: class])
and: [(theStructClasses includes: class) not]]) ifTrue:
[theStructClasses addLast: class]]].
+ ^self superclassOrder: theStructClasses!
- ^ChangeSet superclassOrder: theStructClasses!
Item was added:
+ ----- Method: CCodeGenerator>>superclassOrder: (in category 'utilities') -----
+ superclassOrder: classes
+ ^[ChangeSet superclassOrder: classes] "Squeak"
+ on: MessageNotUnderstood
+ do: [ :ex|
+ ex message selector == #superclassOrder: ifFalse:
+ [ex pass].
+ Class superclassOrder: classes] "Pharo"!
Item was added:
+ ----- Method: MethodNode>>quickMethodReturnLiteral (in category '*VMMaker-C translation') -----
+ quickMethodReturnLiteral
+ ^self block statements last expr key!
More information about the Vm-dev
mailing list