@@ -102,11 +102,8 @@ export class SwiftRuntime {
102102 const argv = exports . swjs_prepare_host_function_call ( argc )
103103 for ( let index = 0 ; index < args . length ; index ++ ) {
104104 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 )
110107 }
111108 let output : any ;
112109 const callback_func_ref = this . heap . allocHeap ( function ( result : any ) {
@@ -142,6 +139,11 @@ export class SwiftRuntime {
142139 + ( uint8Memory [ ptr + 3 ] << 24 )
143140 }
144141
142+ const readFloat64 = ( ptr : pointer ) => {
143+ const dataView = new DataView ( memory ( ) . buffer ) ;
144+ return dataView . getFloat64 ( ptr , true ) ;
145+ }
146+
145147 const writeUint32 = ( ptr : pointer , value : number ) => {
146148 const uint8Memory = new Uint8Array ( memory ( ) . buffer ) ;
147149 uint8Memory [ ptr + 0 ] = ( value & 0x000000ff ) >> 0
@@ -150,25 +152,30 @@ export class SwiftRuntime {
150152 uint8Memory [ ptr + 3 ] = ( value & 0xff000000 ) >> 24
151153 }
152154
155+ const writeFloat64 = ( ptr : pointer , value : number ) => {
156+ const dataView = new DataView ( memory ( ) . buffer ) ;
157+ dataView . setFloat64 ( ptr , value , true ) ;
158+ }
159+
153160 const decodeValue = (
154161 kind : JavaScriptValueKind ,
155- payload1 : number , payload2 : number
162+ payload1_ptr : pointer , payload2_ptr : pointer
156163 ) => {
157164 switch ( kind ) {
158165 case JavaScriptValueKind . Boolean : {
159- switch ( payload1 ) {
166+ switch ( readUInt32 ( payload1_ptr ) ) {
160167 case 0 : return false
161168 case 1 : return true
162169 }
163170 }
164171 case JavaScriptValueKind . Number : {
165- return payload1
172+ return readFloat64 ( payload1_ptr ) ;
166173 }
167174 case JavaScriptValueKind . String : {
168- return readString ( payload1 , payload2 )
175+ return readString ( readUInt32 ( payload1_ptr ) , readUInt32 ( payload2_ptr ) )
169176 }
170177 case JavaScriptValueKind . Object : {
171- return this . heap . referenceHeap ( payload1 )
178+ return this . heap . referenceHeap ( readUInt32 ( payload1_ptr ) )
172179 }
173180 case JavaScriptValueKind . Null : {
174181 return null
@@ -177,80 +184,76 @@ export class SwiftRuntime {
177184 return undefined
178185 }
179186 case JavaScriptValueKind . Function : {
180- return this . heap . referenceHeap ( payload1 )
187+ return this . heap . referenceHeap ( readUInt32 ( payload1_ptr ) )
181188 }
182189 default :
183190 throw new Error ( `Type kind "${ kind } " is not supported` )
184191 }
185192 }
186193
187- const encodeValue = ( value : any ) => {
194+ const writeValue = (
195+ value : any , kind_ptr : pointer ,
196+ payload1_ptr : pointer , payload2_ptr : pointer
197+ ) => {
188198 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 ) ;
194202 }
195203 switch ( typeof value ) {
196204 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 ;
202209 }
203210 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 ;
209215 }
210216 case "string" : {
217+ // FIXME: currently encode twice
211218 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 ;
217223 }
218224 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 ;
224229 }
225230 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 ;
231235 }
232236 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 ;
238241 }
239242 default :
240243 throw new Error ( `Type "${ typeof value } " is not supported yet` )
241244 }
242245 }
243246
244247 // Note:
245- // `decodeValues` assumes that the size of RawJSValue is 12
248+ // `decodeValues` assumes that the size of RawJSValue is 16
246249 // and the alignment of it is 4
247250 const decodeValues = ( ptr : pointer , length : number ) => {
248251 let result = [ ]
249252 for ( let index = 0 ; index < length ; index ++ ) {
250- const base = ptr + 12 * index
253+ const base = ptr + 16 * index
251254 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 )
254257 result . push ( decodeValue ( kind , payload1 , payload2 ) )
255258 }
256259 return result
@@ -272,10 +275,7 @@ export class SwiftRuntime {
272275 ) => {
273276 const obj = this . heap . referenceHeap ( ref ) ;
274277 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 ) ;
279279 } ,
280280 swjs_set_subscript : (
281281 ref : ref , index : number ,
@@ -292,10 +292,7 @@ export class SwiftRuntime {
292292 ) => {
293293 const obj = this . heap . referenceHeap ( ref ) ;
294294 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 ) ;
299296 } ,
300297 swjs_load_string : ( ref : ref , buffer : pointer ) => {
301298 const string = this . heap . referenceHeap ( ref ) ;
@@ -308,10 +305,7 @@ export class SwiftRuntime {
308305 ) => {
309306 const func = this . heap . referenceHeap ( ref )
310307 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 ) ;
315309 } ,
316310 swjs_call_function_with_this : (
317311 obj_ref : ref , func_ref : ref ,
@@ -322,10 +316,7 @@ export class SwiftRuntime {
322316 const obj = this . heap . referenceHeap ( obj_ref )
323317 const func = this . heap . referenceHeap ( func_ref )
324318 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 ) ;
329320 } ,
330321 swjs_create_function : (
331322 host_func_id : number ,
0 commit comments