@@ -102,11 +102,8 @@ export class SwiftRuntime {
102
102
const argv = exports . swjs_prepare_host_function_call ( argc )
103
103
for ( let index = 0 ; index < args . length ; index ++ ) {
104
104
const argument = args [ index ]
105
- const value = encodeValue ( argument )
106
- const base = argv + 12 * index
107
- writeUint32 ( base , value . kind )
108
- writeUint32 ( base + 4 , value . payload1 )
109
- writeUint32 ( base + 8 , value . payload2 )
105
+ const base = argv + 16 * index
106
+ writeValue ( argument , base , base + 4 , base + 12 )
110
107
}
111
108
let output : any ;
112
109
const callback_func_ref = this . heap . allocHeap ( function ( result : any ) {
@@ -142,6 +139,11 @@ export class SwiftRuntime {
142
139
+ ( uint8Memory [ ptr + 3 ] << 24 )
143
140
}
144
141
142
+ const readFloat64 = ( ptr : pointer ) => {
143
+ const dataView = new DataView ( memory ( ) . buffer ) ;
144
+ return dataView . getFloat64 ( ptr , true ) ;
145
+ }
146
+
145
147
const writeUint32 = ( ptr : pointer , value : number ) => {
146
148
const uint8Memory = new Uint8Array ( memory ( ) . buffer ) ;
147
149
uint8Memory [ ptr + 0 ] = ( value & 0x000000ff ) >> 0
@@ -150,25 +152,30 @@ export class SwiftRuntime {
150
152
uint8Memory [ ptr + 3 ] = ( value & 0xff000000 ) >> 24
151
153
}
152
154
155
+ const writeFloat64 = ( ptr : pointer , value : number ) => {
156
+ const dataView = new DataView ( memory ( ) . buffer ) ;
157
+ dataView . setFloat64 ( ptr , value , true ) ;
158
+ }
159
+
153
160
const decodeValue = (
154
161
kind : JavaScriptValueKind ,
155
- payload1 : number , payload2 : number
162
+ payload1_ptr : pointer , payload2_ptr : pointer
156
163
) => {
157
164
switch ( kind ) {
158
165
case JavaScriptValueKind . Boolean : {
159
- switch ( payload1 ) {
166
+ switch ( readUInt32 ( payload1_ptr ) ) {
160
167
case 0 : return false
161
168
case 1 : return true
162
169
}
163
170
}
164
171
case JavaScriptValueKind . Number : {
165
- return payload1
172
+ return readFloat64 ( payload1_ptr ) ;
166
173
}
167
174
case JavaScriptValueKind . String : {
168
- return readString ( payload1 , payload2 )
175
+ return readString ( readUInt32 ( payload1_ptr ) , readUInt32 ( payload2_ptr ) )
169
176
}
170
177
case JavaScriptValueKind . Object : {
171
- return this . heap . referenceHeap ( payload1 )
178
+ return this . heap . referenceHeap ( readUInt32 ( payload1_ptr ) )
172
179
}
173
180
case JavaScriptValueKind . Null : {
174
181
return null
@@ -177,80 +184,76 @@ export class SwiftRuntime {
177
184
return undefined
178
185
}
179
186
case JavaScriptValueKind . Function : {
180
- return this . heap . referenceHeap ( payload1 )
187
+ return this . heap . referenceHeap ( readUInt32 ( payload1_ptr ) )
181
188
}
182
189
default :
183
190
throw new Error ( `Type kind "${ kind } " is not supported` )
184
191
}
185
192
}
186
193
187
- const encodeValue = ( value : any ) => {
194
+ const writeValue = (
195
+ value : any , kind_ptr : pointer ,
196
+ payload1_ptr : pointer , payload2_ptr : pointer
197
+ ) => {
188
198
if ( value === null ) {
189
- return {
190
- kind : JavaScriptValueKind . Null ,
191
- payload1 : 0 ,
192
- payload2 : 0 ,
193
- }
199
+ writeUint32 ( kind_ptr , JavaScriptValueKind . Null ) ;
200
+ writeUint32 ( payload1_ptr , 0 ) ;
201
+ writeUint32 ( payload2_ptr , 0 ) ;
194
202
}
195
203
switch ( typeof value ) {
196
204
case "boolean" : {
197
- return {
198
- kind : JavaScriptValueKind . Boolean ,
199
- payload1 : value ? 1 : 0 ,
200
- payload2 : 0 ,
201
- }
205
+ writeUint32 ( kind_ptr , JavaScriptValueKind . Boolean ) ;
206
+ writeUint32 ( payload1_ptr , value ? 1 : 0 ) ;
207
+ writeUint32 ( payload2_ptr , 0 ) ;
208
+ break ;
202
209
}
203
210
case "number" : {
204
- return {
205
- kind : JavaScriptValueKind . Number ,
206
- payload1 : value ,
207
- payload2 : 0 ,
208
- }
211
+ writeUint32 ( kind_ptr , JavaScriptValueKind . Number ) ;
212
+ writeFloat64 ( payload1_ptr , value ) ;
213
+ writeUint32 ( payload2_ptr , 0 ) ;
214
+ break ;
209
215
}
210
216
case "string" : {
217
+ // FIXME: currently encode twice
211
218
const bytes = textEncoder . encode ( value ) ;
212
- return {
213
- kind : JavaScriptValueKind . String ,
214
- payload1 : this . heap . allocHeap ( value ) ,
215
- payload2 : bytes . length ,
216
- }
219
+ writeUint32 ( kind_ptr , JavaScriptValueKind . String ) ;
220
+ writeUint32 ( payload1_ptr , this . heap . allocHeap ( value ) ) ;
221
+ writeUint32 ( payload2_ptr , bytes . length ) ;
222
+ break ;
217
223
}
218
224
case "undefined" : {
219
- return {
220
- kind : JavaScriptValueKind . Undefined ,
221
- payload1 : 0 ,
222
- payload2 : 0 ,
223
- }
225
+ writeUint32 ( kind_ptr , JavaScriptValueKind . Undefined ) ;
226
+ writeUint32 ( payload1_ptr , 0 ) ;
227
+ writeUint32 ( payload2_ptr , 0 ) ;
228
+ break ;
224
229
}
225
230
case "object" : {
226
- return {
227
- kind : JavaScriptValueKind . Object ,
228
- payload1 : this . heap . allocHeap ( value ) ,
229
- payload2 : 0 ,
230
- }
231
+ writeUint32 ( kind_ptr , JavaScriptValueKind . Object ) ;
232
+ writeUint32 ( payload1_ptr , this . heap . allocHeap ( value ) ) ;
233
+ writeUint32 ( payload2_ptr , 0 ) ;
234
+ break ;
231
235
}
232
236
case "function" : {
233
- return {
234
- kind : JavaScriptValueKind . Function ,
235
- payload1 : this . heap . allocHeap ( value ) ,
236
- payload2 : 0 ,
237
- }
237
+ writeUint32 ( kind_ptr , JavaScriptValueKind . Function ) ;
238
+ writeUint32 ( payload1_ptr , this . heap . allocHeap ( value ) ) ;
239
+ writeUint32 ( payload2_ptr , 0 ) ;
240
+ break ;
238
241
}
239
242
default :
240
243
throw new Error ( `Type "${ typeof value } " is not supported yet` )
241
244
}
242
245
}
243
246
244
247
// Note:
245
- // `decodeValues` assumes that the size of RawJSValue is 12
248
+ // `decodeValues` assumes that the size of RawJSValue is 16
246
249
// and the alignment of it is 4
247
250
const decodeValues = ( ptr : pointer , length : number ) => {
248
251
let result = [ ]
249
252
for ( let index = 0 ; index < length ; index ++ ) {
250
- const base = ptr + 12 * index
253
+ const base = ptr + 16 * index
251
254
const kind = readUInt32 ( base )
252
- const payload1 = readUInt32 ( base + 4 )
253
- const payload2 = readUInt32 ( base + 8 )
255
+ const payload1 = readFloat64 ( base + 4 )
256
+ const payload2 = readUInt32 ( base + 12 )
254
257
result . push ( decodeValue ( kind , payload1 , payload2 ) )
255
258
}
256
259
return result
@@ -272,10 +275,7 @@ export class SwiftRuntime {
272
275
) => {
273
276
const obj = this . heap . referenceHeap ( ref ) ;
274
277
const result = Reflect . get ( obj , readString ( name , length ) ) ;
275
- const { kind, payload1, payload2 } = encodeValue ( result ) ;
276
- writeUint32 ( kind_ptr , kind ) ;
277
- writeUint32 ( payload1_ptr , payload1 ) ;
278
- writeUint32 ( payload2_ptr , payload2 ) ;
278
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
279
279
} ,
280
280
swjs_set_subscript : (
281
281
ref : ref , index : number ,
@@ -292,10 +292,7 @@ export class SwiftRuntime {
292
292
) => {
293
293
const obj = this . heap . referenceHeap ( ref ) ;
294
294
const result = Reflect . get ( obj , index ) ;
295
- const { kind, payload1, payload2 } = encodeValue ( result ) ;
296
- writeUint32 ( kind_ptr , kind ) ;
297
- writeUint32 ( payload1_ptr , payload1 ) ;
298
- writeUint32 ( payload2_ptr , payload2 ) ;
295
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
299
296
} ,
300
297
swjs_load_string : ( ref : ref , buffer : pointer ) => {
301
298
const string = this . heap . referenceHeap ( ref ) ;
@@ -308,10 +305,7 @@ export class SwiftRuntime {
308
305
) => {
309
306
const func = this . heap . referenceHeap ( ref )
310
307
const result = Reflect . apply ( func , undefined , decodeValues ( argv , argc ) )
311
- const { kind, payload1, payload2 } = encodeValue ( result ) ;
312
- writeUint32 ( kind_ptr , kind ) ;
313
- writeUint32 ( payload1_ptr , payload1 ) ;
314
- writeUint32 ( payload2_ptr , payload2 ) ;
308
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
315
309
} ,
316
310
swjs_call_function_with_this : (
317
311
obj_ref : ref , func_ref : ref ,
@@ -322,10 +316,7 @@ export class SwiftRuntime {
322
316
const obj = this . heap . referenceHeap ( obj_ref )
323
317
const func = this . heap . referenceHeap ( func_ref )
324
318
const result = Reflect . apply ( func , obj , decodeValues ( argv , argc ) )
325
- const { kind, payload1, payload2 } = encodeValue ( result ) ;
326
- writeUint32 ( kind_ptr , kind ) ;
327
- writeUint32 ( payload1_ptr , payload1 ) ;
328
- writeUint32 ( payload2_ptr , payload2 ) ;
319
+ writeValue ( result , kind_ptr , payload1_ptr , payload2_ptr ) ;
329
320
} ,
330
321
swjs_create_function : (
331
322
host_func_id : number ,
0 commit comments