Spaces:
Running
Running
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 requiresConcreteImplementation ifTrue: [abstractDeclarations add: selector]. | |
method isAbstract ifTrue: [^nil]. | |
(method pragmaAt: #doNotGenerate) ifNotNil: [^nil]. | |
"process optional methods by interpreting the argument to the option: pragma as either | |
a Cogit class name or a class variable name or a variable name in VMBasicConstants." | |
(method pragmaAt: #option:) ifNotNil: | |
[:pragma| | key | | |
key := pragma argumentAt: 1. | |
"((Cogit withAllSubclasses anySatisfy: [:c| c name = key]) | |
and: [VMClass getVMMaker cogitClassName ~= key]) ifTrue: | |
[^nil]." | |
(aClass bindingOf: key) ifNotNil: | |
[:binding| | |
binding value ifFalse: [^nil]]. | |
(VMBasicConstants bindingOf: key) ifNotNil: | |
[:binding| | |
binding value ifFalse: [^nil]]]. | |
tmethod := self compileToJSMethodSelector: selector in: aClass. | |
tmethod hasDoNotGenerateStatement ifTrue: [^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]. | |
(method propertyValueAt: #cmacro:) ifNotNil: | |
[:macro| | |
self addMacro: macro for: selector]. | |
^tmethod |