Core code source usage of ::= and other cleanups.
[cslatevm.git] / src / llvm / mobius / bootstrap.slate
blob8ca2abc24f033392458a16d5c03ddacfc20b6889
1 Image ensureNamespace: #Bootstrap.
3 "fixme: this is overwritten everytime you make a new generator"
4 Image Bootstrap define: #BytesPerWord -> 4.
5 "The size of a word in bytes on the target platform."
6 "TODO: Make this an attribute of an accessible target description."
8 Image Bootstrap define: #Chunk &parents: {Cloneable} &slots: {#oop}.
10 _@(Image Bootstrap Chunk traits) wordSize [overrideThis].
12 Image Bootstrap define: #SlotEntry &parents: {Cloneable} &slots: {#name. #offset}.
14 se@(Image Bootstrap SlotEntry traits) newNamed: name offset: offset
15 [se clone `>> [name: name. offset: offset. ]].
17 Image Bootstrap define: #RoleEntry &parents: {Cloneable} &slots:
18   {#name. #rolePositions -> 0. #methodDefinition}.
20 re@(Image Bootstrap RoleEntry traits) newNamed: name rolePositions: positions methodDefinition: method
21 [re clone `>>
22    [name: name. rolePositions: positions. methodDefinition: method. ]].
24 Image Bootstrap define: #MethodDefinition &parents: {Cloneable} &slots:
25   {#dispatchPositions -> 0. #method. #slotAccessor}.
27 md@(Image Bootstrap MethodDefinition traits) newDispatchPositions: positions method: method
28 [md clone `>> [dispatchPositions: positions. method: method. ]].
30 Image Bootstrap define: #Map &parents: {Cloneable} &slots:
31   {#flags -> 0. #representative -> Nil.
32    #delegates -> {}.
33    #slotCount -> 0.
34    #slotTable -> {}.
35    #roleTable -> {}}.
37 map@(Image Bootstrap Map traits) addSlotNamed: name at: offset
39   map slotTable infect: #clone `er.
40   map slotTable: (map slotTable copyWith: (map surroundings SlotEntry newNamed: name offset: offset)).
41   map
44 map@(Image Bootstrap Map traits) addRoleNamed: name at: position dispatching: def
46   map roleTable
47     doWithIndex:
48       [| :role :index |
49        role methodDefinition == def
50          ifTrue:
51            [map roleTable: map roleTable copy.
52             map roleTable
53               at: index
54               put:
55                 (map surroundings RoleEntry
56                     newNamed: name
57                     rolePositions: (role rolePositions bitOr: (1 bitShift: position))
58                     methodDefinition: def).
59             ^ False]].
60   map roleTable:
61     (map roleTable
62       copyWith:
63         (map surroundings RoleEntry
64           newNamed: name
65           rolePositions: (1 bitShift: position)
66           methodDefinition: def)).
67   True
70 Image Bootstrap define: #Object &parents: {Image Bootstrap Chunk} &slots:
71   {#idHash. #bmap -> Image Bootstrap Map. #slotValues -> {}}.
73 _@(Image Bootstrap Object traits) headerWords
74 [4].
76 obj@(Image Bootstrap Object traits) wordSizeSansPayload
77 [obj headerWords + obj slotValues size].
79 obj@(Image Bootstrap Object traits) wordSize
80 [obj wordSizeSansPayload].
82 obj@(Image Bootstrap Object traits) makeSlotNamed: name valued: value
83 [| index |
84   index: obj bmap slotCount.
85   obj bmap: obj bmap clone `>>
86     [slotCount: index + 1.
87      addSlotNamed: name at: obj headerWords + index * obj surroundings BytesPerWord. ].
88   obj slotValues: (obj slotValues copyWith: value).
89   obj
92 obj@(Image Bootstrap Object traits) addDelegateValued: value
94   obj bmap: obj bmap clone `>>
95     [delegates: (obj bmap delegates copyWith: value). ].
96   obj
99 obj@(Image Bootstrap Object traits) addRoleNamed: name at: position dispatching: def
101   obj bmap addRoleNamed: name at: position dispatching: def
104 obj@(Image Bootstrap Object traits) setSlot: name to: val
106   obj bmap slotTable
107     do: [| :slot | slot name = name ifTrue:
108       [^ (obj slotValues at: slot offset / obj surroundings BytesPerWord - obj headerWords put: val)]].
109   Nil
112 obj@(Image Bootstrap Object traits) getSlot: name
114   obj bmap slotTable
115     do: [| :slot | slot name = name ifTrue:
116       [^ (obj slotValues at: slot offset / obj surroundings BytesPerWord - obj headerWords)]].
117   Nil
120 method@(Image Bootstrap Object traits) addMethodNamed: name on: roles
121 [| def |
122   def: (method surroundings MethodDefinition newDispatchPositions: 0 method: method).
123   roles doWithIndex:
124     [| :role :index |
125       role ifNotNil:
126         [def dispatchPositions:
127           (def dispatchPositions bitOr: (1 bitShift: index)).
128          role addRoleNamed: name at: index dispatching: def]].
129 "  inform: ('Adding method ' ; name printString ; ' roles: ' ; roles printString ; ' pos: ' ; def dispatchPositions printString)."
130   def
133 Image Bootstrap define: #Array &parents: {Image Bootstrap Object}.
135 Image Bootstrap define: #OopArray &parents: {Image Bootstrap Array}
136   &slots: {#elements -> {}}.
138 arr@(Image Bootstrap OopArray traits) wordSize
139 [arr wordSizeSansPayload + arr elements size].
141 Image Bootstrap define: #ByteArray &parents: {Image Bootstrap Array}
142   &slots: {#elements -> ByteArray new}.
144 arr@(Image Bootstrap ByteArray traits) byteSize
146   arr wordSizeSansPayload * arr surroundings BytesPerWord + arr elements size
149 arr@(Image Bootstrap ByteArray traits) wordSize
151   arr wordSizeSansPayload + (arr elements size + arr surroundings BytesPerWord - 1 // arr surroundings BytesPerWord)
155 Image Bootstrap define: #CompiledMethod &parents: {Image Bootstrap Object}.
157 (Image Bootstrap define: #Generator &parents: {Cloneable} &slots:
158   {#translations -> IdentityDictionary new.
159    #chunks -> ExtensibleArray new.
160    #characters -> (Array newSizeOf: ASCIIString Character CharacterSet).
161    #symbols -> Dictionary new.
162    #littleEndian -> True.
163    #bytesPerWord -> Image Bootstrap BytesPerWord.
164    #nextHash -> 0.
165    #imageSize -> 0.
166    #llvmModule -> Nil
167         })
168    `>> [addSlot: #objects valued: Namespace clone. ].
170 gen@(Image Bootstrap Generator traits) new &littleEndian: littleEndian &bitSize: bitSize
171 [ | newGen |
172   littleEndian `defaultsTo: True.
173   bitSize `defaultsTo: 64.
174   Image Bootstrap define: #BytesPerWord -> (bitSize // 8).
175   newGen:
176     (gen cloneSettingSlots:
177     #{#objects. #translations. #chunks. #characters. #symbols. #bytesPerWord. #littleEndian}
178       to: {gen objects clone.
179            gen translations new.
180            gen chunks new.
181            gen characters copy.
182            gen symbols new.
183            bitSize // 8.
184            littleEndian ifNil: [gen littleEndian]}).
185   newGen llvmModule: (LLVM SlateModule new).
187   newGen insertDelegate: newGen objects.
188   newGen
191 gen@(Image Bootstrap Generator traits) generateImageBooting: method withPrims: prims
192 "Generates the primary image objects such that the supplied CompiledMethod
193 will be interpreted immediately upon loading the image."
195   inform: 'Generating kernel'.
196   gen generateKernel.
197   inform: 'Generating utilities'.
198   gen generateUtilities.
199   inform: 'Generating kernel accessors'.
200   gen generateKernelAccessors.
201   inform: 'Generating interpreter'.
202   gen generateInterpreterBooting: method.
203   inform: 'Generating lobby'.
204   gen generateLobby.
205   inform: 'Generating prims'.
206   prims do: [| :assoc | gen generatePrimitive: assoc value at: assoc key].
207   inform: 'Generating maps'.
208   gen generateMaps.
209   inform: 'Generating linkage'.
210   gen generateLinkage.
211   inform: 'Save LLVM Module'.
212   gen llvmModule verify.
213   gen llvmModule dump.
214   gen llvmModule save.
218 gen@(Image Bootstrap Generator traits) bytesAt: i in: arr put: val numBytes: bytes
220   0 below: bytes do:
221     [|:index| arr elements at: i + index
222                            put: (val byteShift: (gen littleEndian ifTrue: [0 - index]
223                                                                   ifFalse: [0 - bytes + index])) intoByte]
228 gen@(Image Bootstrap Generator traits) shortAt: i in: arr put: val
230   gen bytesAt: i in: arr put: val numBytes: gen bytesPerWord // 2
233 gen@(Image Bootstrap Generator traits) longAt: i in: arr put: val
235   gen bytesAt: i in: arr put: val numBytes: gen bytesPerWord
238 gen@(Image Bootstrap Generator traits) generateSlotTableFor: map
239 [| obj capacity selector hash |
240   capacity: (map slotTable size * 5 // 4) leastGreaterPowerOfTwo.
241   obj: (gen cloneOf: gen ArrayProto sized: 2 * capacity).
242   map slotTable do:
243     [| :se |
244       selector: (gen generateLiteral: se name).
245       hash: (selector idHash bitAnd: capacity - 1) * 2.
246       [(obj elements at: hash) isNil]
247         whileFalse:
248           [hash: (hash + 2) \\ (capacity * 2)].
249       obj elements at: hash put: selector.
250       obj elements at: hash + 1 put: se offset
251     ].
252   obj
255 gen@(Image Bootstrap Generator traits) generateRoleTableFor: map
256 [| obj capacity selector hash insert |
257   capacity: (map roleTable size * 5 // 4) leastGreaterPowerOfTwo.
258   obj: (gen cloneOf: gen ArrayProto sized: 4 * capacity).
259   map roleTable do:
260     [| :re |
261       selector: (gen generateLiteral: re name).
262       hash: (selector idHash bitAnd: capacity - 1) * 4.
263       [(obj elements at: hash) isNil
264         \/ [(obj elements at: hash) == selector]]
265         whileFalse:
266           [hash: (hash + 4) \\ (capacity * 4)].
267       insert: hash.
268       [(obj elements at: insert) isNil]
269         whileFalse:
270           [insert: (insert + 4) \\ (capacity * 4)].
271       obj elements at: insert put: selector.
272       obj elements at: insert + 1 put: re rolePositions.
273       obj elements at: insert + 2 put: (gen generateMethodDef: re methodDefinition).
274       insert == hash
275         ifFalse:
276           [[(obj elements at: hash + 3) isNil]
277               whileFalse: [hash: (obj elements at: hash + 3) * 4].
278            obj elements at: hash + 3 put: insert // 4]].
279   obj
282 gen@(Image Bootstrap Generator traits) generateMethodDef: def
284   gen translations at: def
285     ifAbsentPut:
286       [| obj sym |
287         sym: (def method getSlot: #selector).
288         sym setSlot: #cacheMask to: ((sym getSlot: #cacheMask) bitOr: def dispatchPositions).
289         obj: (gen cloneOf: gen MethodDefinitionProto).
290         obj setSlot: #method to: def method.
291         obj setSlot: #slotAccessor to: (gen generateLiteral: def slotAccessor).
292         gen longAt: 1 * gen bytesPerWord in: obj put: def dispatchPositions.
293         obj]
296 gen@(Image Bootstrap Generator traits) generateMap: map
298   gen translations at: map
299     ifAbsentPut:
300       [(gen cloneOf: gen MapProto) `>>
301          [setSlot: #flags to: map flags.
302           setSlot: #representative to: (map representative ifNil: [gen NilObject]).
303           setSlot: #delegates to: (gen cloneOf: gen ArrayProto elements: map delegates).
304           setSlot: #slotCount to: map slotCount.
305           setSlot: #slotTable to: (gen generateSlotTableFor: map).
306           setSlot: #roleTable to: (gen generateRoleTableFor: map). ]]
309 gen@(Image Bootstrap Generator traits) generateMaps
311   gen objects slotNames
312     do: [| :slotName |
313       (Namespace hasSlotNamed: slotName)
314         ifFalse:
315           [| obj |
316             inform: ' Adding map for ' ; slotName printString.
317             obj: (gen objects atSlotNamed: slotName).
318             gen generateMap: obj bmap]]
321 obj@(Image Bootstrap Object traits) nextOop
322 "Answer the pointer to just beyond this object."
323 [obj oop + (obj wordSize * obj surroundings BytesPerWord)].
325 gen@(Image Bootstrap Generator traits) assignOops
326 "Assign oops to all of the chunks, accumulating the final oop which is used
327 to set the image size."
329   gen imageSize: (gen chunks inject: 0 into:
330     [| :oop :chunk | chunk oop: oop. chunk nextOop])
333 "fixme: use the new #next:putInteger:&littleEndian in stream.slate"
334 gen@(Image Bootstrap Generator traits) emitInteger: val on: stream byteSize: byteSize
335 "Takes an integer and outputs the binary data value in the correct byte-order
336 onto the stream."
338   byteSize <= 0 ifTrue: [^ stream].
339   stream ;
340     ((0 below: byteSize)
341        collect: [|:bytenum| gen littleEndian ifTrue: [(val >> (bytenum * 8)) intoByte]
342                                              ifFalse: [(val >> (byteSize - 1 - bytenum * 8)) intoByte]])
346 gen@(Image Bootstrap Generator traits) emitLong: val on: stream
347 "Takes an integer and outputs the binary data value in the correct byte-order
348 onto the stream."
350   gen emitInteger: val on: stream byteSize: gen bytesPerWord
353 gen@(Image Bootstrap Generator traits) emitOopOf: chunk on: stream
354 [gen emitLong: chunk oop on: stream].
356 gen@(Image Bootstrap Generator traits) emitOopOf: _@Nil on: stream
357 [gen emitOopOf: gen NilObject on: stream].
359 gen@(Image Bootstrap Generator traits) emitOopOf: i@(SmallInteger traits) on: stream
360 [gen emitLong: (i << 1 bitOr: 1) on: stream].
362 gen@(Image Bootstrap Generator traits) emitObjectHashed: hash sized: size payload: payload format: format on: stream
364   "fix: check big endian"
365   "header"
366   (gen littleEndian not) ifTrue: [ gen emitInteger: 0 on: stream byteSize: gen bytesPerWord - 4].
367   stream nextPutAll:
368     (gen littleEndian
369       ifTrue:
370         [{2r1 bitOr: (hash bitAnd: 16r7F) << 1.
371           (hash >> 7) intoByte.
372           (hash >> 15) intoByte.
373           format << 6}]
374       ifFalse:
375         [{2r10000000 bitOr: (hash >> 16 bitAnd: 16r7F).
376           (hash >> 8) intoByte.
377           hash intoByte.
378           format}]).
379   (gen littleEndian) ifTrue: [ gen emitInteger: 0 on: stream byteSize: gen bytesPerWord - 4].
381   "size in words of slot data"
382   gen emitLong: size on: stream.
383   "size in bytes of payload (oop array or byte array)"
384   gen emitLong: payload on: stream.  
388   stream
391 gen@(Image Bootstrap Generator traits) emit: obj@(Image Bootstrap Object traits) on: stream
393   gen emitObjectHashed: obj idHash sized: obj wordSize payload: 0 format: 2r00 on: stream.
394   gen emitLong: (gen translations at: obj bmap) oop on: stream.
395   obj slotValues
396     do: [| :slotVal | gen emitOopOf: slotVal on: stream].
397   obj
400 gen@(Image Bootstrap Generator traits) emit: obj@(Image Bootstrap OopArray traits) on: stream
402   gen emitObjectHashed: obj idHash
403     sized: obj wordSizeSansPayload
404     payload: obj elements size * gen bytesPerWord
405     format: 2r01
406     on: stream.
407   gen emitLong: (gen translations at: obj bmap) oop on: stream.
408   (obj slotValues ;; obj elements)
409     do: [| :slotVal | gen emitOopOf: slotVal on: stream].
410   obj
413 gen@(Image Bootstrap Generator traits) emit: obj@(Image Bootstrap ByteArray traits) on: stream
415   gen emitObjectHashed: obj idHash
416     sized: obj wordSizeSansPayload
417     payload: obj elements size
418     format: 2r10
419     on: stream.
420   gen emitLong: (gen translations at: obj bmap) oop on: stream.
421   obj slotValues do: [| :slotVal | gen emitOopOf: slotVal on: stream].
422   stream nextPutAll: obj elements.
423   stream next: (gen bytesPerWord - obj elements size) \\ gen bytesPerWord put: 0.
424   obj
427 gen@(Image Bootstrap Generator traits) emitHeaderOn: stream
429   gen emitLong: 16rABCDEF43 on: stream.
430   gen emitLong: gen imageSize on: stream.
431   gen emitLong: gen nextHash on: stream.
432   gen emitLong: (gen GlobalsObject getSlot: #specialOops) oop on: stream.
433 "i shortened dispatch id to one word"
434   gen emitLong: 0 on: stream.
438 gen@(Image Bootstrap Generator traits) emitOn: stream
439 "Emits a bootstrap image on the stream after it has been generated."
441   inform: 'Assigning oops'.
442   gen assignOops.
443   inform: 'Emitting image'.
444   gen emitHeaderOn: stream.
445   gen chunks do: [| :chunk | gen emit: chunk on: stream]
448 gen@(Image Bootstrap Generator traits) addObjectNamed: name valued: obj
450   inform: ' Adding object ' ; name.
451   gen objects define: name -> obj.
452   obj
455 gen@(Image Bootstrap Generator traits) newIdentityHash
456 [| hash |
457   hash: gen nextHash.
458   gen nextHash: gen nextHash + 1.
459   hash
462 gen@(Image Bootstrap Generator traits) new: layout fromMap: map
463 [| obj |
464   obj: layout clone `>> [idHash: gen newIdentityHash. bmap: map. ].
465   obj slotValues: (obj slotValues newSize: map slotCount).
466   map representative: obj.
467   gen chunks addLast: obj.
468   obj
471 gen@(Image Bootstrap Generator traits) newMap
473   gen surroundings Map clone
476 gen@(Image Bootstrap Generator traits) newObject
478   gen new: gen surroundings Object
481 gen@(Image Bootstrap Generator traits) new: layout
483   gen new: layout fromMap: gen newMap
486 gen@(Image Bootstrap Generator traits) cloneOf: proto@(Image Bootstrap Object traits)
488   gen chunks addLast: proto clone `>>
489     [idHash: gen newIdentityHash. slotValues: proto slotValues copy. ]
492 gen@(Image Bootstrap Generator traits) cloneOf: arr@(Image Bootstrap Array traits)
493 [resend `>> [elements: arr elements copy. ]].
495 gen@(Image Bootstrap Generator traits) cloneOf: proto sized: size
496 [(gen cloneOf: proto) `>> [elements: (proto elements newSize: size). ]].
498 gen@(Image Bootstrap Generator traits) cloneOf: proto elements: elements
499 [(gen cloneOf: proto) `>> [elements: (elements as: proto elements). ]].
501 gen@(Image Bootstrap Generator traits) addAccessorFor: slotName on: obj [
502         | accessor selector compiler llvmName block |
503         accessor: (gen cloneOf: gen CompiledMethodProto).
504         selector: (obj accessorNameFor: slotName).
505         accessor setSlot: #method to: accessor.
506         accessor setSlot: #selector to: (gen generateLiteral: selector).
507         accessor setSlot: #inputVariables to: 1.
508         accessor setSlot: #localVariables to: 1.
509         accessor setSlot: #registerCount to: 3.
510         accessor setSlot: #literals to: (gen cloneOf: gen ArrayProto elements: {gen generateLiteral: slotName}).
511         accessor setSlot: #selectors to: (gen cloneOf: gen ArrayProto elements: {gen generateLiteral: #atSlotNamed:}).
512         
513         llvmName: (slotName asLLVMNameOn: {obj}).
514         compiler: (LLVM Compiler new &module: gen llvmModule).
515         block: (Syntax Parser newOn: '[ | :var | var atSlotNamed: ' ; slotName printString ; ' ]') next.
516         compiler generate: block &topLevel: True &llvmName: llvmName.
517         accessor setSlot: #backendName to: (gen generateLiteral: llvmName ).
518            
519         (accessor addMethodNamed: selector on: {obj}) slotAccessor: slotName.
520         accessor
523 gen@(Image Bootstrap Generator traits) addMutatorFor: slotName on: obj [
524         | mutator selector compiler llvmName block |
525         mutator: (gen cloneOf: gen CompiledMethodProto).
526         selector: (obj mutatorNameFor: slotName).
527         mutator setSlot: #method to: mutator.
528         mutator setSlot: #selector to: (gen generateLiteral: selector).
529         mutator setSlot: #inputVariables to: 2.
530         mutator setSlot: #localVariables to: 1.
531         mutator setSlot: #registerCount to: 4.
532         mutator setSlot: #literals to: (gen cloneOf: gen ArrayProto elements: {gen generateLiteral: slotName}).
533         mutator setSlot: #selectors to: (gen cloneOf: gen ArrayProto elements: {gen generateLiteral: #atSlotNamed:put:}).
534         
535         llvmName: (slotName asLLVMNameOn: {obj}).
536         compiler: (LLVM Compiler new &module: gen llvmModule).
537         block: (Syntax Parser newOn: '[ | :var :value | var atSlotNamed: ' ; slotName printString ; ' put: value ]') next.
538         compiler generate: block &topLevel: True &llvmName: llvmName.
539         mutator setSlot: #backendName to: (gen generateLiteral: llvmName ).
541         (mutator addMethodNamed: selector on: {obj. Nil}) slotAccessor: slotName.
542         mutator
545 gen@(Image Bootstrap Generator traits) addAccessorsFor: slotName on: obj
547   gen addAccessorFor: slotName on: obj.
548   gen addMutatorFor: slotName on: obj
551 gen@(Image Bootstrap Generator traits) generateKernelAccessors
553   gen objects slotNames
554     do: [| :slotName |
555       (Namespace hasSlotNamed: slotName)
556         ifFalse:
557           [| obj |
558             obj: (gen objects atSlotNamed: slotName).
559             obj bmap slotTable
560               do: [| :slot |
561                 gen addAccessorsFor: slot name on: obj]]]
564 gen@(Image Bootstrap Generator traits) generatePrototype: name &suffix: suffix &layout: layout &parents: parents &slots: slotSpecs &elements: elements
565 [| traits window result |
566   suffix `defaultsTo: 'Proto'.
567   slotSpecs `defaultsTo: {}.
568   traits: (gen addObjectNamed: (name ; 'Traits') intern valued: gen newObject)
569     `>> [addDelegateValued: Nil. ].
570   window: (gen addObjectNamed: (name ; 'Window') intern valued: gen newObject)
571     `>> [bmap flags: 1. addDelegateValued: Nil. ].
572   parents
573     ifNotNil:
574       [parents reverseDoWithIndex:
575         [| :parent :index |
576           window addDelegateValued: parent]].
577   window addDelegateValued: traits.
578   result: (gen addObjectNamed: (name ; suffix) intern
579                valued: (layout ifNil: [gen newObject] ifNotNil: [gen new: layout]))
580     `>> [addDelegateValued: window. ].
581   elements ifNotNil:
582     [(result hasSlotNamed: #elements) ifTrue: [result elements: elements]].
583   slotSpecs do:
584     [| :spec | result makeSlotNamed: spec key valued: spec value].
585   result
588 gen@(Image Bootstrap Generator traits) generateInstance: name of: window
589 [(gen addObjectNamed: name valued: gen newObject) `>>
590   [addDelegateValued: window.]
593 gen@(Image Bootstrap Generator traits) generateKernel
595   gen generatePrototype: 'Root'.
596   gen generatePrototype: 'Oddball' &parents: {gen RootTraits}.
597   gen generatePrototype: 'Derivable' &parents: {gen RootTraits}.
598   gen generatePrototype: 'Cloneable' &parents: {gen DerivableTraits. gen RootTraits}.
600   gen generateInstance: #NilObject of: gen OddballWindow.
601   gen generateInstance: #NoRoleObject of: gen OddballWindow.
603   gen generatePrototype: 'Boolean' &parents: {gen OddballTraits. gen RootTraits}.
604   gen generateInstance: #TrueObject of: gen BooleanWindow.
605   gen generateInstance: #FalseObject of: gen BooleanWindow.
607   gen generatePrototype: 'Array' &layout: gen surroundings OopArray
608     &parents: {gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
609     &elements: Array new.
610   gen generatePrototype: 'ByteArray' &layout: gen surroundings ByteArray
611     &parents: {gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
612     &elements: ByteArray new.
614   gen generatePrototype: 'SmallInteger' &parents: {gen NilObject. gen NilObject. gen NilObject. gen NilObject. gen OddballTraits. gen RootTraits}.
615   (gen generatePrototype: 'Float' &layout: gen surroundings ByteArray
616     &parents: {gen NilObject. gen NilObject. gen NilObject. gen NilObject. gen ByteArrayTraits. gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}) `>>
617     [elements: (ByteArray newSize: gen bytesPerWord)].
619   gen generatePrototype: 'ASCIIString' &layout: gen surroundings ByteArray
620     &parents: {gen NilObject. gen ByteArrayTraits. gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}.
622   gen generatePrototype: 'Symbol' &layout: gen surroundings ByteArray
623     &parents: {gen ASCIIStringTraits. gen NilObject. gen ByteArrayTraits. gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
624     &slots: {#cacheMask -> 0}.
626   gen symbols at: #'' put: gen SymbolProto.
628   gen generatePrototype: 'ASCIICharacter'
629     &parents: {gen NilObject. gen OddballTraits. gen RootTraits} &slots: {#code -> 0}.
630   gen characters at: 0 put: gen ASCIICharacterProto.
631   1 below: gen characters size
632     do: [| :index c |
633       c: (gen cloneOf: gen ASCIICharacterProto).
634       c setSlot: #code to: index.
635       gen characters at: index put: c].
636   gen ASCIIStringTraits makeSlotNamed: #Character valued: gen ASCIICharacterProto.
638   gen generatePrototype: 'Namespace'
639     &parents: {gen CloneableTraits. gen DerivableTraits. gen RootTraits}.
640   gen generateInstance: #BootstrapObject of: gen NamespaceWindow.
642   gen generatePrototype: 'Method' &parents: {gen CloneableTraits. gen DerivableTraits. gen RootTraits}.
644   gen generatePrototype: 'PrimitiveMethod'
645     &parents: {gen MethodTraits. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
646     &slots: {#index -> 0. #selector -> gen NilObject. #inputVariables -> 0}.
648   gen generatePrototype: 'CompiledMethod'
649     &parents: {gen MethodTraits. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
650     &slots: {#method -> gen NilObject. #selector -> gen NilObject.
651         #inputVariables -> 0. #localVariables -> 0.
652         #restVariable -> gen FalseObject.
653         #optionalKeywords -> gen ArrayProto.
654         #heapAllocate -> gen FalseObject.
655         #environment -> gen BootstrapObject.
656         #literals -> gen ArrayProto.
657         #selectors -> gen ArrayProto.
658         #code -> gen ArrayProto.
659         #sourceTree -> gen NilObject.
660         #debugMap -> gen ArrayProto.
661         #isInlined -> gen FalseObject.
662         #oldCode -> gen NilObject.
663         #callCount -> 0.
664         #calleeCount -> gen NilObject.
665         #registerCount -> 0.
666         #cachedInCallers -> gen NilObject.
667         #cachedInCallersCount -> 0.
668         #reserved4 -> gen NilObject.
669         #backendName -> gen NilObject.
670         #reserved6 -> 0}.
672   gen generatePrototype: 'Closure' &layout: gen surroundings OopArray
673     &parents: {gen MethodTraits. gen ArrayTraits. gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
674     &slots: {#method -> gen NilObject}.
676   gen generatePrototype: 'MethodDefinition' &layout: gen surroundings ByteArray
677     &parents: {gen CloneableTraits. gen DerivableTraits. gen RootTraits}
678     &slots: {#method -> gen CompiledMethodProto. #slotAccessor -> gen NilObject}
679     &elements: (ByteArray newSize: 4 * gen bytesPerWord).
681   gen generatePrototype: 'Map' &layout: gen surroundings ByteArray
682     &parents: {gen CloneableTraits. gen DerivableTraits. gen RootTraits}
683     &slots: {#flags -> 0. #representative -> gen NilObject.
684      #delegates -> gen ArrayProto. #slotCount -> 0.
685      #slotTable -> gen ArrayProto. #roleTable -> gen ArrayProto}
686     &elements: (ByteArray newSize: 3 * gen bytesPerWord).
688   gen generatePrototype: 'LexicalContext' &layout: gen surroundings OopArray
689     &parents: {gen ArrayTraits. gen NilObject. gen NilObject. gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}
690     &slots: {#framePointer -> 0}.
692   gen generatePrototype: 'Interpreter' &layout: gen surroundings ByteArray
693     &parents: {gen CloneableTraits. gen DerivableTraits. gen RootTraits}
694     &slots: {#stack -> gen ArrayProto.
695      #method -> gen NilObject.
696      #closure -> gen NilObject.
697      #lexicalContext -> gen NilObject.
698      #ensureHandlers -> 0}
699     &elements: (ByteArray newSize: 5 * gen bytesPerWord).
701   (gen addObjectNamed: #EnsureMarkerObject valued: (gen cloneOf: gen CompiledMethodProto)) `>>
702     [| :marker |
703       setSlot: #method to: marker.
704       setSlot: #code to:
705         (gen cloneOf: gen ArrayProto
706           elements: {VM SSACode resume})].
709 gen@(Image Bootstrap Generator traits) generateInterpreterBooting: method
710 [| stackObj stackSize methodObj codeSize compiler |  
711   compiler: (LLVM Compiler new &module: gen llvmModule).
712   
713   _@compiler branchTableHash: key
714   [| literal |
715     literal: (gen generateLiteral: key).
716     (literal isSameAs: SmallInteger)
717       ifTrue: [literal]
718       ifFalse: [literal idHash]
719   ].
720   inform: 'The LLVM Compiler is compiling the syntax tree with bootstrap code and libraries.'.
721   
722   method: (compiler generate: method &topLevel: True &llvmName: 'bootMethod') `>> [heapAllocate: False. ].
724   methodObj: (gen generateLiteral: method).
726   stackSize: 16. "if you change this, change vm.c which has it hard-coded in the beginning of interpret()"
728   stackObj: (gen cloneOf: gen ArrayProto sized: stackSize) `>>
729     [elements at: 0 put: 0. "-6: prev sp"
730      elements at: 1 put: -1. "-5: resultStackPointer"
731      elements at: 2 put: 0. "-4: code pointer"
732      elements at: 3 put: methodObj. "-3: closure"
733      elements at: 4 put: 0. "-2: lexical context"
734      elements at: 5 put: 0. "-1: prev fp"
735      elements at: 6 put: 0. ].
737   codeSize: method code size.
739   gen addObjectNamed: #InterpreterObject valued: (gen cloneOf: gen InterpreterProto).
740   gen InterpreterObject setSlot: #stack to: stackObj.
741   gen InterpreterObject setSlot: #method to: methodObj.
742   gen InterpreterObject setSlot: #closure to: methodObj.
743   gen longAt: 0 * gen bytesPerWord in: gen InterpreterObject put: 6. " frame pointer (framesize=6)"
744   "long at 1 is code pointer -- I guess this gets filled later or is zero"
745   gen longAt: 2 * gen bytesPerWord in: gen InterpreterObject put: codeSize.
746   gen longAt: 3 * gen bytesPerWord in: gen InterpreterObject put: 6. "stack pointer (framesize=6)"
747   gen longAt: 4 * gen bytesPerWord in: gen InterpreterObject put: stackSize
750 gen@(Image Bootstrap Generator traits) generateUtilities
752   gen generateInstance: #ConsoleObject of: gen OddballWindow.
754   gen generatePrototype: 'File' &parents: {gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}.
755   gen generatePrototype: 'Directory' &parents: {gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}.
756   gen generatePrototype: 'ExternalLibrary' &parents: {gen NilObject. gen CloneableTraits. gen DerivableTraits. gen RootTraits}.
759 gen@(Image Bootstrap Generator traits) generateLobby
761   gen addObjectNamed: #PrototypesObject valued: (gen cloneOf: gen NamespaceProto).
762   gen BootstrapObject addDelegateValued: gen PrototypesObject.
763  "timmy: no named delegate slots but name needed for accessor"
764   gen BootstrapObject makeSlotNamed: #prototypes valued: gen PrototypesObject.
765   gen addAccessorFor: #prototypes on: gen BootstrapObject.
766   "Install slots/accessors in the 'prototypes' namespace,
767    set up traits traits, and set up printName. Make sure all bootstrapped protos
768    are listed here, otherwise these important steps are left out for them."
769   {
770     #Root -> gen RootProto.
771     #Oddball -> gen OddballProto.
772     #Cloneable -> gen CloneableProto.
773     #Derivable -> gen DerivableProto.
774     #Namespace -> gen NamespaceProto.
775     #Boolean -> gen BooleanProto.
776     #Array -> gen ArrayProto.
777     #ByteArray -> gen ByteArrayProto.
778     #ASCIIString -> gen ASCIIStringProto.
779     #ASCIICharacter -> gen ASCIICharacterProto.
780     #Symbol -> gen SymbolProto.
781     #SmallInteger -> gen SmallIntegerProto.
782     #SingleFloat -> gen FloatProto.
783     #Map -> gen MapProto.
784     #LexicalContext -> gen LexicalContextProto.
785     #MethodDefinition -> gen MethodDefinitionProto.
786     #Method -> gen MethodProto.
787     #PrimitiveMethod -> gen PrimitiveMethodProto.
788     #CompiledMethod -> gen CompiledMethodProto.
789     #Closure -> gen ClosureProto.
790     #Interpreter -> gen InterpreterProto.
791     #File -> gen FileProto.
792     #Directory -> gen DirectoryProto.
793     #ExternalLibrary -> gen ExternalLibraryProto.
794   } do: [| :assoc window traits |
795     gen PrototypesObject makeSlotNamed: assoc key valued: assoc value.
796     gen addAccessorFor: assoc key on: gen PrototypesObject.
797     window: (assoc value bmap delegates first).
798     window bmap delegates at: 0 put: gen CloneableWindow.
799     traits: window bmap delegates last"(window getSlot: #traits)".
800     traits bmap delegates at: 0 put: gen CloneableWindow.
801     traits makeSlotNamed: #printName valued: (gen generateLiteral: assoc key name ; ' traits').
802     gen addAccessorFor: #printName on: traits.
803     window makeSlotNamed: #printName valued: (gen generateLiteral: assoc key name).
804     gen addAccessorFor: #printName on: window].
806   gen addObjectNamed: #GlobalsObject valued: (gen cloneOf: gen NamespaceProto).
807   gen BootstrapObject addDelegateValued: gen GlobalsObject.
808   gen BootstrapObject makeSlotNamed: #globals valued: gen GlobalsObject.
809   gen addAccessorFor: #globals on: gen BootstrapObject.
810   {
811     #Console -> gen ConsoleObject.
812     #NoRole -> gen NoRoleObject.
813     #Nil -> gen NilObject.
814     #True -> gen TrueObject.
815     #False -> gen FalseObject.
816     #lobby -> gen BootstrapObject.
817     #bootstrapCharacters -> (gen cloneOf: gen ArrayProto elements: gen characters).
818     #bootstrapSymbols -> gen ArrayProto.
819     #bootstrapInterpreter -> gen InterpreterObject.
820     #ensureMarker -> gen EnsureMarkerObject.
821     #specialOops -> gen ArrayProto.
822     #features -> gen ArrayProto.
823   } do: [| :assoc |
824     gen GlobalsObject makeSlotNamed: assoc key valued: assoc value.
825     gen addAccessorFor: assoc key on: gen GlobalsObject].
826     gen addMutatorFor: #bootstrapSymbols on: gen GlobalsObject.
827     gen addMutatorFor: #features on: gen GlobalsObject
830 gen@(Image Bootstrap Generator traits) generateLinkage
831 "TODO: The order in this method must be the same as in memory.slate, enforce it"
833   gen GlobalsObject setSlot: #specialOops to:
834     (gen cloneOf: gen ArrayProto
835       elements:
836         {gen BootstrapObject.
837          gen NoRoleObject. gen NilObject. gen TrueObject. gen FalseObject.
838          gen ArrayProto.
839          gen ByteArrayProto.
840          gen ASCIIStringProto.
841          gen MapProto. gen MethodDefinitionProto.
842          gen SmallIntegerProto. gen FloatProto.
843          gen ClosureWindow. gen CompiledMethodWindow. gen PrimitiveMethodWindow.
844          gen ClosureProto. gen LexicalContextProto. gen InterpreterObject.
845          gen EnsureMarkerObject.
846          gen generateLiteral: #notFoundOn:.
847          gen generateLiteral: #notFoundOn:after:.
848          gen generateLiteral: #wrongInputsTo:.
849          gen generateLiteral: #mayNotReturnTo:.
850          gen generateLiteral: #slotNotFoundNamed:.
851          gen generateLiteral: #keyNotFoundOn:.
852          gen generateLiteral: #immutable.
853          gen generateLiteral: #bitShiftOverflow:.
854          gen generateLiteral: #addOverflow:.
855          gen generateLiteral: #subtractOverflow:.
856          gen generateLiteral: #multiplyOverflow:.
857          gen generateLiteral: #divideByZero.
858          gen generateLiteral: #notABoolean.
859          gen generateLiteral: #applyTo:.
860          gen generateLiteral: #&optionals:.
861          gen generateLiteral: #badTypeError}).
862   gen GlobalsObject setSlot: #bootstrapSymbols to: (gen cloneOf: gen ArrayProto elements: gen symbols valueSet).
865 gen@(Image Bootstrap Generator traits) generatePrimitive: prim at: index
866 "Given a MethodDefinition representing a Pidgin primitive definition,
867 this defines a PrimitiveMethod stub that will invoke the given primitive
868 index. Must be called after generateImageBooting:."
870   (gen cloneOf: gen PrimitiveMethodProto) `>>
871    [setSlot: #selector to: (gen generateLiteral: prim selector).
872     setSlot: #inputVariables to: prim roles size.
873     setSlot: #index to: index.
874     addMethodNamed: prim selector
875       on: (prim roles collect:
876         [| :role |
877          (role isSameAs: Syntax UnaryMessage)
878            ifTrue:
879              [inform: ' Adding primitive ' ; index printString ; ' to ' ; role selector printString.
880               gen objects atSlotNamed: role selector]]) ]
883 gen@(Image Bootstrap Generator traits) generateLiteral: literal
885   literal == NoRole
886     ifTrue: [gen NoRoleObject]
887     ifFalse: [error: 'Unsupported literal.']
890 gen@(Image Bootstrap Generator traits) generateLiteral: i@(SmallInteger traits)
891 [i].
893 gen@(Image Bootstrap Generator traits) generateLiteral: _@(BigInteger traits)
895   error: 'The bootstrap generator does not support big integers.'
898 gen@(Image Bootstrap Generator traits) generateLiteral: _@True
899 [gen TrueObject].
901 gen@(Image Bootstrap Generator traits) generateLiteral: _@False
902 [gen FalseObject].
904 gen@(Image Bootstrap Generator traits) generateLiteral: _@Nil
905 [gen NilObject].
907 gen@(Image Bootstrap Generator traits) generateLiteral: _@lobby
908 [gen BootstrapObject].
910 gen@(Image Bootstrap Generator traits) generateLiteral: s@(ASCIIString traits)
912   s isEmpty
913     ifTrue: [gen ASCIIStringProto]
914     ifFalse: [gen cloneOf: gen ASCIIStringProto elements: (s collect: #code`er into: (ByteArray newSizeOf: s))]
917 gen@(Image Bootstrap Generator traits) generateLiteral: s@(Symbol traits)
919   gen symbols
920     at: s
921     ifAbsentPut:
922       [gen cloneOf: gen SymbolProto elements: (s name collect: #code`er into: (ByteArray newSizeOf: s name))]
925 gen@(Image Bootstrap Generator traits) generateLiteral: f@(SingleFloat traits)
926 [| obj |
927   obj: (gen cloneOf: gen FloatProto elements: (ByteArray newWithAll: f)).
928   gen littleEndian = -1.0 isLittleEndian
929     ifFalse: [obj elements: obj elements reversed].
930   obj
933 gen@(Image Bootstrap Generator traits) generateLiteral: a@(ByteArray traits)
935   a isEmpty
936     ifTrue: [gen ByteArrayProto]
937     ifFalse: [gen cloneOf: gen ByteArrayProto elements: a]
940 gen@(Image Bootstrap Generator traits) generateLiteral: a@(Array traits)
942   a isEmpty
943     ifTrue: [gen ArrayProto]
944     ifFalse: [gen cloneOf: gen ArrayProto elements: (a collect: [| :each | gen generateLiteral: each])]
947 gen@(Image Bootstrap Generator traits) generateLiteral: c@(ASCIIString Character traits)
949   gen characters at: c code
952 gen@(Image Bootstrap Generator traits) generateLiteral: block@(CompiledMethod traits)
953 [| obj |
954   obj: (gen cloneOf: gen CompiledMethodProto) `>>
955    [setSlot: #inputVariables to: block inputVariables.
956     setSlot: #localVariables to: block localVariables.
957     setSlot: #restVariable to: (gen generateLiteral: block restVariable).
958     setSlot: #heapAllocate to: (gen generateLiteral: block heapAllocate).
959     setSlot: #literals to: (gen generateLiteral: block literals).
960     setSlot: #registerCount to: (gen generateLiteral: block registerCount).
961     setSlot: #selectors to: (gen generateLiteral: block selectors).
962     setSlot: #backendName to: (gen generateLiteral: block reserved5).
963     setSlot: #code to: (gen generateLiteral: block code). ].
964   obj setSlot: #method to: obj.
965   block optionalKeywords isEmpty
966     ifFalse:
967       [obj setSlot: #optionalKeywords to: (gen generateLiteral: block optionalKeywords)].
968   obj