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
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.
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)).
44 map@(Image Bootstrap Map traits) addRoleNamed: name at: position dispatching: def
49 role methodDefinition == def
51 [map roleTable: map roleTable copy.
55 (map surroundings RoleEntry
57 rolePositions: (role rolePositions bitOr: (1 bitShift: position))
58 methodDefinition: def).
63 (map surroundings RoleEntry
65 rolePositions: (1 bitShift: position)
66 methodDefinition: def)).
70 Image Bootstrap define: #Object &parents: {Image Bootstrap Chunk} &slots:
71 {#idHash. #bmap -> Image Bootstrap Map. #slotValues -> {}}.
73 _@(Image Bootstrap Object traits) headerWords
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
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).
92 obj@(Image Bootstrap Object traits) addDelegateValued: value
94 obj bmap: obj bmap clone `>>
95 [delegates: (obj bmap delegates copyWith: value). ].
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
107 do: [| :slot | slot name = name ifTrue:
108 [^ (obj slotValues at: slot offset / obj surroundings BytesPerWord - obj headerWords put: val)]].
112 obj@(Image Bootstrap Object traits) getSlot: name
115 do: [| :slot | slot name = name ifTrue:
116 [^ (obj slotValues at: slot offset / obj surroundings BytesPerWord - obj headerWords)]].
120 method@(Image Bootstrap Object traits) addMethodNamed: name on: roles
122 def: (method surroundings MethodDefinition newDispatchPositions: 0 method: method).
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)."
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.
168 `>> [addSlot: #objects valued: Namespace clone. ].
170 gen@(Image Bootstrap Generator traits) new &littleEndian: littleEndian &bitSize: bitSize
172 littleEndian `defaultsTo: True.
173 bitSize `defaultsTo: 64.
174 Image Bootstrap define: #BytesPerWord -> (bitSize // 8).
176 (gen cloneSettingSlots:
177 #{#objects. #translations. #chunks. #characters. #symbols. #bytesPerWord. #littleEndian}
178 to: {gen objects clone.
179 gen translations new.
184 littleEndian ifNil: [gen littleEndian]}).
185 newGen llvmModule: (LLVM SlateModule new).
187 newGen insertDelegate: newGen objects.
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'.
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'.
205 inform: 'Generating prims'.
206 prims do: [| :assoc | gen generatePrimitive: assoc value at: assoc key].
207 inform: 'Generating maps'.
209 inform: 'Generating linkage'.
211 inform: 'Save LLVM Module'.
212 gen llvmModule verify.
218 gen@(Image Bootstrap Generator traits) bytesAt: i in: arr put: val numBytes: bytes
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).
244 selector: (gen generateLiteral: se name).
245 hash: (selector idHash bitAnd: capacity - 1) * 2.
246 [(obj elements at: hash) isNil]
248 [hash: (hash + 2) \\ (capacity * 2)].
249 obj elements at: hash put: selector.
250 obj elements at: hash + 1 put: se offset
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).
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]]
266 [hash: (hash + 4) \\ (capacity * 4)].
268 [(obj elements at: insert) isNil]
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).
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]].
282 gen@(Image Bootstrap Generator traits) generateMethodDef: def
284 gen translations at: def
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.
296 gen@(Image Bootstrap Generator traits) generateMap: map
298 gen translations at: map
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
313 (Namespace hasSlotNamed: slotName)
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
338 byteSize <= 0 ifTrue: [^ stream].
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
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"
366 (gen littleEndian not) ifTrue: [ gen emitInteger: 0 on: stream byteSize: gen bytesPerWord - 4].
370 [{2r1 bitOr: (hash bitAnd: 16r7F) << 1.
371 (hash >> 7) intoByte.
372 (hash >> 15) intoByte.
375 [{2r10000000 bitOr: (hash >> 16 bitAnd: 16r7F).
376 (hash >> 8) intoByte.
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.
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.
396 do: [| :slotVal | gen emitOopOf: slotVal on: stream].
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
407 gen emitLong: (gen translations at: obj bmap) oop on: stream.
408 (obj slotValues ;; obj elements)
409 do: [| :slotVal | gen emitOopOf: slotVal on: stream].
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
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.
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'.
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.
455 gen@(Image Bootstrap Generator traits) newIdentityHash
458 gen nextHash: gen nextHash + 1.
462 gen@(Image Bootstrap Generator traits) new: layout fromMap: map
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.
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:}).
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 ).
519 (accessor addMethodNamed: selector on: {obj}) slotAccessor: slotName.
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:}).
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.
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
555 (Namespace hasSlotNamed: slotName)
558 obj: (gen objects atSlotNamed: slotName).
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. ].
574 [parents reverseDoWithIndex:
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. ].
582 [(result hasSlotNamed: #elements) ifTrue: [result elements: elements]].
584 [| :spec | result makeSlotNamed: spec key valued: spec value].
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
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.
664 #calleeCount -> gen NilObject.
666 #cachedInCallers -> gen NilObject.
667 #cachedInCallersCount -> 0.
668 #reserved4 -> gen NilObject.
669 #backendName -> gen NilObject.
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)) `>>
703 setSlot: #method to: marker.
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).
713 _@compiler branchTableHash: key
715 literal: (gen generateLiteral: key).
716 (literal isSameAs: SmallInteger)
718 ifFalse: [literal idHash]
720 inform: 'The LLVM Compiler is compiling the syntax tree with bootstrap code and libraries.'.
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."
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.
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.
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
836 {gen BootstrapObject.
837 gen NoRoleObject. gen NilObject. gen TrueObject. gen FalseObject.
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:
877 (role isSameAs: Syntax UnaryMessage)
879 [inform: ' Adding primitive ' ; index printString ; ' to ' ; role selector printString.
880 gen objects atSlotNamed: role selector]]) ]
883 gen@(Image Bootstrap Generator traits) generateLiteral: literal
886 ifTrue: [gen NoRoleObject]
887 ifFalse: [error: 'Unsupported literal.']
890 gen@(Image Bootstrap Generator traits) generateLiteral: i@(SmallInteger traits)
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
901 gen@(Image Bootstrap Generator traits) generateLiteral: _@False
904 gen@(Image Bootstrap Generator traits) generateLiteral: _@Nil
907 gen@(Image Bootstrap Generator traits) generateLiteral: _@lobby
908 [gen BootstrapObject].
910 gen@(Image Bootstrap Generator traits) generateLiteral: s@(ASCIIString traits)
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)
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)
927 obj: (gen cloneOf: gen FloatProto elements: (ByteArray newWithAll: f)).
928 gen littleEndian = -1.0 isLittleEndian
929 ifFalse: [obj elements: obj elements reversed].
933 gen@(Image Bootstrap Generator traits) generateLiteral: a@(ByteArray traits)
936 ifTrue: [gen ByteArrayProto]
937 ifFalse: [gen cloneOf: gen ByteArrayProto elements: a]
940 gen@(Image Bootstrap Generator traits) generateLiteral: a@(Array traits)
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)
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
967 [obj setSlot: #optionalKeywords to: (gen generateLiteral: block optionalKeywords)].