-
-
Notifications
You must be signed in to change notification settings - Fork 354
/
WeakSlot.class.st
67 lines (51 loc) · 1.64 KB
/
WeakSlot.class.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
"
A WeakSlot is a slot that references weakly an object.
Internally it is implemented with a weak array of size one. Writing into the slot writes the only field in the array.
weakArray at: 1 put: aValue.
Reading into the Slot reads the only field in the array.
weakArray at: 1 .
This slot inherits from IndexedSlot to guarantee that this slot has a real field inside an object.
"
Class {
#name : #WeakSlot,
#superclass : #IndexedSlot,
#category : #'Slot-Examples-Base'
}
{ #category : #'code generation' }
WeakSlot >> emitStore: aMethodBuilder [
"generate bytecode for 'varname at: 1 put: <stackTop>'"
| temp |
temp := '0slotTempForStackManipulation'.
"Pop the value to store into a temp to push it back in the right order"
aMethodBuilder addTemp: temp.
aMethodBuilder storeTemp: temp.
aMethodBuilder popTop.
"Push the weak array into the stack, then the arguments, then send"
aMethodBuilder pushInstVar: index.
aMethodBuilder pushLiteral: 1.
aMethodBuilder pushTemp: temp.
aMethodBuilder send: #at:put:
]
{ #category : #'code generation' }
WeakSlot >> emitValue: aMethodBuilder [
"Push the weak array at: 1 on the stack"
aMethodBuilder pushInstVar: index.
aMethodBuilder pushLiteral: 1.
aMethodBuilder send: #at:
]
{ #category : #initialization }
WeakSlot >> initialize: anObject [
super write: (WeakArray new: 1) to: anObject
]
{ #category : #'meta-object-protocol' }
WeakSlot >> read: anObject [
^ (super read: anObject) at: 1.
]
{ #category : #'meta-object-protocol' }
WeakSlot >> wantsInitalization [
^ true
]
{ #category : #'meta-object-protocol' }
WeakSlot >> write: aValue to: anObject [
^(super read: anObject) at: 1 put: aValue
]