-
Notifications
You must be signed in to change notification settings - Fork 68
/
VMMaker.extension.st
139 lines (104 loc) · 4.16 KB
/
VMMaker.extension.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Extension { #name : #VMMaker }
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> buildCodeGenerator: aClass inlined: doInlining [
"Answer a new C code generator for aClass"
| cg |
ObjectMemory initialize; initializeConstants.
cg := aClass buildCodeGenerator.
cg prepareMethodsInlined: doInlining doAssertions: true.
^ cg
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> cCodeGenerator: aClass inCache: cache inlined: doInlining [
"Answer a C code generator, or a string explaining why a code generator is not available"
| cg |
cg := cache
at: aClass name asSymbol
ifAbsentPut: [self buildCodeGenerator: aClass inlined: doInlining].
^ cg
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> cacheFor: generatorType [
^ self codeGeneratorCache at: generatorType ifAbsentPut: [Dictionary new]
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> clearCache: cache entriesFor: aClass [
"Clear the of code generators for aClass and its dependent subclasses"
aClass withAllSubclasses
do: [:cls | cache
removeKey: cls name asSymbol
ifAbsent: []]
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> clearCacheEntriesFor: aClass [
"Clear all code generator caches for aClass and its dependent subclasses"
self codeGeneratorCache
do: [:cache | self clearCache: cache entriesFor: aClass]
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> clearCodeGeneratorCache [
"Code generators used by browsers to display translated C code"
"VMMaker clearCodeGeneratorCache"
CodeGeneratorCache := nil
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> codeGenerator: generatorType forClass: aClass [
| cache |
generatorType = #cCode
ifTrue: [cache := self cacheFor: generatorType.
^ self cCodeGenerator: aClass inCache: cache inlined: false].
generatorType = #inlinedCCode
ifTrue: [cache := self cacheFor: generatorType.
^ self cCodeGenerator: aClass inCache: cache inlined: true].
self error: generatorType asString, ' not recognized'.
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> codeGeneratorCache [
"Code generators used by browsers to display translated C code"
^ CodeGeneratorCache ifNil: [CodeGeneratorCache := Dictionary new]
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> event: anEvent [
"Hook for SystemChangeNotifier. If a translatable class changes, clear all
of its code generators from caches to force retranslation."
| cls itemClass |
(itemClass := anEvent itemClass) ifNotNil:
[cls := itemClass isMeta
ifTrue: [itemClass soleInstance]
ifFalse: [itemClass].
self clearCacheEntriesFor: cls]
]
{ #category : #'*SlangBrowser-initialisation' }
VMMaker classSide >> initializeBrowserSupport [
self clearCodeGeneratorCache.
self registerNotification.
(CodeHolder respondsTo: #addEditContentsOption:)
ifTrue: [CodeHolder addEditContentsOption: #translateToC -> #selectedTranslateToC.
CodeHolder addEditContentsOption: #translateInlinedC -> #selectedTranslateInlinedC.
CodeHolder removeContentsSymbol: #translateToC.
CodeHolder removeContentsSymbol: #translateInlinedC.
CodeHolder addContentsSymbolQuint:
{#translateToC
. #toggleShowingTranslateToC
. #showingTranslateToCString
. 'C code'
. 'translate to C source code, no method inlining' translated}
afterEntry: #byteCodes.
CodeHolder addContentsSymbolQuint:
{#translateInlinedC
. #toggleShowingTranslateInlinedC
. #showingTranslateInlinedCString
. 'inlined C'
. 'translate to C source code with method inlining' translated}
afterEntry: #translateToC]
ifFalse: [self notify: 'package SlangBrowser requires browser support, not yet loaded']
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> registerNotification [
SystemChangeNotifier uniqueInstance notify: self ofAllSystemChangesUsing: #event:
]
{ #category : #'*SlangBrowser-browser support' }
VMMaker classSide >> unregisterNotification [
"self unregisterNotification"
SystemChangeNotifier uniqueInstance noMoreNotificationsFor: self
]