60
60
61
61
@ SuppressWarnings ("static-method" )
62
62
@ ExportLibrary (InteropLibrary .class )
63
- public abstract class WasmGlobal extends EmbedderDataHolder implements TruffleObject {
63
+ public final class WasmGlobal extends EmbedderDataHolder implements TruffleObject {
64
64
65
65
private final ValueType valueType ;
66
66
private final boolean mutable ;
67
67
68
- protected WasmGlobal (ValueType valueType , boolean mutable ) {
68
+ private long globalValue ;
69
+ private Object globalObjectValue ;
70
+
71
+ private WasmGlobal (ValueType valueType , boolean mutable ) {
69
72
this .valueType = valueType ;
70
73
this .mutable = mutable ;
71
74
}
72
75
73
- public final ValueType getValueType () {
76
+ public WasmGlobal (ValueType valueType , boolean mutable , int value ) {
77
+ this (valueType , mutable , (long ) value );
78
+ }
79
+
80
+ public WasmGlobal (ValueType valueType , boolean mutable , long value ) {
81
+ this (valueType , mutable );
82
+ assert ValueType .isNumberType (getValueType ());
83
+ this .globalValue = value ;
84
+ }
85
+
86
+ public WasmGlobal (ValueType valueType , boolean mutable , Object value ) {
87
+ this (valueType , mutable );
88
+ this .globalValue = switch (valueType ) {
89
+ case i32 -> (int ) value ;
90
+ case i64 -> (long ) value ;
91
+ case f32 -> Float .floatToRawIntBits ((float ) value );
92
+ case f64 -> Double .doubleToRawLongBits ((double ) value );
93
+ default -> 0 ;
94
+ };
95
+ this .globalObjectValue = switch (valueType ) {
96
+ case v128 , anyfunc , externref -> value ;
97
+ default -> null ;
98
+ };
99
+ }
100
+
101
+ public ValueType getValueType () {
74
102
return valueType ;
75
103
}
76
104
77
- public final boolean isMutable () {
105
+ public boolean isMutable () {
78
106
return mutable ;
79
107
}
80
108
81
- public final byte getMutability () {
109
+ public byte getMutability () {
82
110
return mutable ? GlobalModifier .MUTABLE : GlobalModifier .CONSTANT ;
83
111
}
84
112
85
- public abstract int loadAsInt ();
113
+ public int loadAsInt () {
114
+ assert ValueType .isNumberType (getValueType ());
115
+ return (int ) globalValue ;
116
+ }
86
117
87
- public abstract long loadAsLong ();
118
+ public long loadAsLong () {
119
+ assert ValueType .isNumberType (getValueType ());
120
+ return globalValue ;
121
+ }
88
122
89
- public abstract Vector128 loadAsVector128 ();
123
+ public Vector128 loadAsVector128 () {
124
+ assert ValueType .isVectorType (getValueType ());
125
+ assert globalObjectValue != null ;
126
+ return (Vector128 ) globalObjectValue ;
127
+ }
90
128
91
- public abstract Object loadAsReference ();
129
+ public Object loadAsReference () {
130
+ assert ValueType .isReferenceType (getValueType ());
131
+ assert globalObjectValue != null ;
132
+ return globalObjectValue ;
133
+ }
92
134
93
- public abstract void storeInt (int value );
135
+ public void storeInt (int value ) {
136
+ assert ValueType .isNumberType (getValueType ());
137
+ this .globalValue = value ;
138
+ }
94
139
95
- public abstract void storeLong (long value );
140
+ public void storeLong (long value ) {
141
+ assert ValueType .isNumberType (getValueType ());
142
+ this .globalValue = value ;
143
+ }
96
144
97
- public abstract void storeVector128 (Vector128 value );
145
+ public void storeVector128 (Vector128 value ) {
146
+ assert ValueType .isVectorType (getValueType ());
147
+ this .globalObjectValue = value ;
148
+ }
98
149
99
- public abstract void storeReference (Object value );
150
+ public void storeReference (Object value ) {
151
+ assert ValueType .isReferenceType (getValueType ());
152
+ this .globalObjectValue = value ;
153
+ }
100
154
101
155
public static final String VALUE_MEMBER = "value" ;
102
156
103
157
@ ExportMessage
104
- final boolean hasMembers () {
158
+ boolean hasMembers () {
105
159
return true ;
106
160
}
107
161
108
162
@ ExportMessage
109
163
@ TruffleBoundary
110
- final boolean isMemberReadable (String member ) {
164
+ boolean isMemberReadable (String member ) {
111
165
return VALUE_MEMBER .equals (member );
112
166
}
113
167
114
168
@ ExportMessage
115
169
@ TruffleBoundary
116
- final Object readMember (String member ) throws UnknownIdentifierException {
170
+ Object readMember (String member ) throws UnknownIdentifierException {
117
171
if (!isMemberReadable (member )) {
118
172
throw UnknownIdentifierException .create (member );
119
173
}
@@ -130,19 +184,19 @@ final Object readMember(String member) throws UnknownIdentifierException {
130
184
131
185
@ ExportMessage
132
186
@ TruffleBoundary
133
- final boolean isMemberModifiable (String member ) {
187
+ boolean isMemberModifiable (String member ) {
134
188
return VALUE_MEMBER .equals (member ) && isMutable ();
135
189
}
136
190
137
191
@ ExportMessage
138
192
@ TruffleBoundary
139
- final boolean isMemberInsertable (@ SuppressWarnings ("unused" ) String member ) {
193
+ boolean isMemberInsertable (@ SuppressWarnings ("unused" ) String member ) {
140
194
return false ;
141
195
}
142
196
143
197
@ ExportMessage
144
198
@ TruffleBoundary
145
- final void writeMember (String member , Object value ,
199
+ void writeMember (String member , Object value ,
146
200
@ CachedLibrary (limit = "5" ) InteropLibrary valueLibrary ) throws UnknownIdentifierException , UnsupportedMessageException {
147
201
if (!isMemberReadable (member )) {
148
202
throw UnknownIdentifierException .create (member );
@@ -179,7 +233,7 @@ final void writeMember(String member, Object value,
179
233
180
234
@ ExportMessage
181
235
@ TruffleBoundary
182
- final Object getMembers (@ SuppressWarnings ("unused" ) boolean includeInternal ) {
236
+ Object getMembers (@ SuppressWarnings ("unused" ) boolean includeInternal ) {
183
237
return new WasmNamesObject (new String []{VALUE_MEMBER });
184
238
}
185
239
}
0 commit comments