@@ -229,108 +229,6 @@ static List<LinkAction> recreateLinkActions(WasmModule module) {
229229
230230 final byte [] bytecode = module .bytecode ();
231231
232- for (int i = 0 ; i < module .dataInstanceCount (); i ++) {
233- final int dataIndex = i ;
234- final int dataOffset = module .dataInstanceOffset (dataIndex );
235- final int encoding = bytecode [dataOffset ];
236- int effectiveOffset = dataOffset + 1 ;
237-
238- final int dataMode = encoding & BytecodeBitEncoding .DATA_SEG_MODE_VALUE ;
239- final int dataLength ;
240- switch (encoding & BytecodeBitEncoding .DATA_SEG_LENGTH_MASK ) {
241- case BytecodeBitEncoding .DATA_SEG_LENGTH_U8 :
242- dataLength = BinaryStreamParser .rawPeekU8 (bytecode , effectiveOffset );
243- effectiveOffset ++;
244- break ;
245- case BytecodeBitEncoding .DATA_SEG_LENGTH_U16 :
246- dataLength = BinaryStreamParser .rawPeekU16 (bytecode , effectiveOffset );
247- effectiveOffset += 2 ;
248- break ;
249- case BytecodeBitEncoding .DATA_SEG_LENGTH_I32 :
250- dataLength = BinaryStreamParser .rawPeekI32 (bytecode , effectiveOffset );
251- effectiveOffset += 4 ;
252- break ;
253- default :
254- throw CompilerDirectives .shouldNotReachHere ();
255- }
256- if (dataMode == SegmentMode .ACTIVE ) {
257- final long value ;
258- switch (encoding & BytecodeBitEncoding .DATA_SEG_VALUE_MASK ) {
259- case BytecodeBitEncoding .DATA_SEG_VALUE_UNDEFINED :
260- value = -1 ;
261- break ;
262- case BytecodeBitEncoding .DATA_SEG_VALUE_U8 :
263- value = BinaryStreamParser .rawPeekU8 (bytecode , effectiveOffset );
264- effectiveOffset ++;
265- break ;
266- case BytecodeBitEncoding .DATA_SEG_VALUE_U16 :
267- value = BinaryStreamParser .rawPeekU16 (bytecode , effectiveOffset );
268- effectiveOffset += 2 ;
269- break ;
270- case BytecodeBitEncoding .DATA_SEG_VALUE_U32 :
271- value = BinaryStreamParser .rawPeekU32 (bytecode , effectiveOffset );
272- effectiveOffset += 4 ;
273- break ;
274- case BytecodeBitEncoding .DATA_SEG_VALUE_I64 :
275- value = BinaryStreamParser .rawPeekI64 (bytecode , effectiveOffset );
276- effectiveOffset += 8 ;
277- break ;
278- default :
279- throw CompilerDirectives .shouldNotReachHere ();
280- }
281- final byte [] dataOffsetBytecode ;
282- final long dataOffsetAddress ;
283- if ((encoding & BytecodeBitEncoding .DATA_SEG_BYTECODE_OR_OFFSET_MASK ) == BytecodeBitEncoding .DATA_SEG_BYTECODE &&
284- ((encoding & BytecodeBitEncoding .DATA_SEG_VALUE_MASK ) != BytecodeBitEncoding .DATA_SEG_VALUE_UNDEFINED )) {
285- int dataOffsetBytecodeLength = (int ) value ;
286- dataOffsetBytecode = Arrays .copyOfRange (bytecode , effectiveOffset , effectiveOffset + dataOffsetBytecodeLength );
287- effectiveOffset += dataOffsetBytecodeLength ;
288- dataOffsetAddress = -1 ;
289- } else {
290- dataOffsetBytecode = null ;
291- dataOffsetAddress = value ;
292- }
293-
294- final int memoryIndex ;
295- if ((encoding & BytecodeBitEncoding .DATA_SEG_HAS_MEMORY_INDEX_ZERO ) != 0 ) {
296- memoryIndex = 0 ;
297- } else {
298- final int memoryIndexEncoding = bytecode [effectiveOffset ];
299- effectiveOffset ++;
300- switch (memoryIndexEncoding & BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_MASK ) {
301- case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_U6 :
302- memoryIndex = memoryIndexEncoding & BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_VALUE ;
303- break ;
304- case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_U8 :
305- memoryIndex = BinaryStreamParser .rawPeekU8 (bytecode , effectiveOffset );
306- effectiveOffset ++;
307- break ;
308- case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_U16 :
309- memoryIndex = BinaryStreamParser .rawPeekU16 (bytecode , effectiveOffset );
310- effectiveOffset += 2 ;
311- break ;
312- case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_I32 :
313- memoryIndex = BinaryStreamParser .rawPeekI32 (bytecode , effectiveOffset );
314- effectiveOffset += 4 ;
315- break ;
316- default :
317- throw CompilerDirectives .shouldNotReachHere ();
318- }
319- }
320-
321- final int dataBytecodeOffset = effectiveOffset ;
322- linkActions .add ((context , store , instance , imports ) -> {
323- store .linker ().resolveDataSegment (store , instance , dataIndex , memoryIndex , dataOffsetAddress , dataOffsetBytecode , dataLength ,
324- dataBytecodeOffset , instance .droppedDataInstanceOffset ());
325- });
326- } else {
327- final int dataBytecodeOffset = effectiveOffset ;
328- linkActions .add ((context , store , instance , imports ) -> {
329- store .linker ().resolvePassiveDataSegment (store , instance , dataIndex , dataBytecodeOffset );
330- });
331- }
332- }
333-
334232 for (int i = 0 ; i < module .elemInstanceCount (); i ++) {
335233 final int elemIndex = i ;
336234 final int elemOffset = module .elemInstanceOffset (elemIndex );
@@ -450,6 +348,108 @@ static List<LinkAction> recreateLinkActions(WasmModule module) {
450348 }
451349 }
452350
351+ for (int i = 0 ; i < module .dataInstanceCount (); i ++) {
352+ final int dataIndex = i ;
353+ final int dataOffset = module .dataInstanceOffset (dataIndex );
354+ final int encoding = bytecode [dataOffset ];
355+ int effectiveOffset = dataOffset + 1 ;
356+
357+ final int dataMode = encoding & BytecodeBitEncoding .DATA_SEG_MODE_VALUE ;
358+ final int dataLength ;
359+ switch (encoding & BytecodeBitEncoding .DATA_SEG_LENGTH_MASK ) {
360+ case BytecodeBitEncoding .DATA_SEG_LENGTH_U8 :
361+ dataLength = BinaryStreamParser .rawPeekU8 (bytecode , effectiveOffset );
362+ effectiveOffset ++;
363+ break ;
364+ case BytecodeBitEncoding .DATA_SEG_LENGTH_U16 :
365+ dataLength = BinaryStreamParser .rawPeekU16 (bytecode , effectiveOffset );
366+ effectiveOffset += 2 ;
367+ break ;
368+ case BytecodeBitEncoding .DATA_SEG_LENGTH_I32 :
369+ dataLength = BinaryStreamParser .rawPeekI32 (bytecode , effectiveOffset );
370+ effectiveOffset += 4 ;
371+ break ;
372+ default :
373+ throw CompilerDirectives .shouldNotReachHere ();
374+ }
375+ if (dataMode == SegmentMode .ACTIVE ) {
376+ final long value ;
377+ switch (encoding & BytecodeBitEncoding .DATA_SEG_VALUE_MASK ) {
378+ case BytecodeBitEncoding .DATA_SEG_VALUE_UNDEFINED :
379+ value = -1 ;
380+ break ;
381+ case BytecodeBitEncoding .DATA_SEG_VALUE_U8 :
382+ value = BinaryStreamParser .rawPeekU8 (bytecode , effectiveOffset );
383+ effectiveOffset ++;
384+ break ;
385+ case BytecodeBitEncoding .DATA_SEG_VALUE_U16 :
386+ value = BinaryStreamParser .rawPeekU16 (bytecode , effectiveOffset );
387+ effectiveOffset += 2 ;
388+ break ;
389+ case BytecodeBitEncoding .DATA_SEG_VALUE_U32 :
390+ value = BinaryStreamParser .rawPeekU32 (bytecode , effectiveOffset );
391+ effectiveOffset += 4 ;
392+ break ;
393+ case BytecodeBitEncoding .DATA_SEG_VALUE_I64 :
394+ value = BinaryStreamParser .rawPeekI64 (bytecode , effectiveOffset );
395+ effectiveOffset += 8 ;
396+ break ;
397+ default :
398+ throw CompilerDirectives .shouldNotReachHere ();
399+ }
400+ final byte [] dataOffsetBytecode ;
401+ final long dataOffsetAddress ;
402+ if ((encoding & BytecodeBitEncoding .DATA_SEG_BYTECODE_OR_OFFSET_MASK ) == BytecodeBitEncoding .DATA_SEG_BYTECODE &&
403+ ((encoding & BytecodeBitEncoding .DATA_SEG_VALUE_MASK ) != BytecodeBitEncoding .DATA_SEG_VALUE_UNDEFINED )) {
404+ int dataOffsetBytecodeLength = (int ) value ;
405+ dataOffsetBytecode = Arrays .copyOfRange (bytecode , effectiveOffset , effectiveOffset + dataOffsetBytecodeLength );
406+ effectiveOffset += dataOffsetBytecodeLength ;
407+ dataOffsetAddress = -1 ;
408+ } else {
409+ dataOffsetBytecode = null ;
410+ dataOffsetAddress = value ;
411+ }
412+
413+ final int memoryIndex ;
414+ if ((encoding & BytecodeBitEncoding .DATA_SEG_HAS_MEMORY_INDEX_ZERO ) != 0 ) {
415+ memoryIndex = 0 ;
416+ } else {
417+ final int memoryIndexEncoding = bytecode [effectiveOffset ];
418+ effectiveOffset ++;
419+ switch (memoryIndexEncoding & BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_MASK ) {
420+ case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_U6 :
421+ memoryIndex = memoryIndexEncoding & BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_VALUE ;
422+ break ;
423+ case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_U8 :
424+ memoryIndex = BinaryStreamParser .rawPeekU8 (bytecode , effectiveOffset );
425+ effectiveOffset ++;
426+ break ;
427+ case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_U16 :
428+ memoryIndex = BinaryStreamParser .rawPeekU16 (bytecode , effectiveOffset );
429+ effectiveOffset += 2 ;
430+ break ;
431+ case BytecodeBitEncoding .DATA_SEG_MEMORY_INDEX_I32 :
432+ memoryIndex = BinaryStreamParser .rawPeekI32 (bytecode , effectiveOffset );
433+ effectiveOffset += 4 ;
434+ break ;
435+ default :
436+ throw CompilerDirectives .shouldNotReachHere ();
437+ }
438+ }
439+
440+ final int dataBytecodeOffset = effectiveOffset ;
441+ linkActions .add ((context , store , instance , imports ) -> {
442+ store .linker ().resolveDataSegment (store , instance , dataIndex , memoryIndex , dataOffsetAddress , dataOffsetBytecode , dataLength ,
443+ dataBytecodeOffset , instance .droppedDataInstanceOffset ());
444+ });
445+ } else {
446+ final int dataBytecodeOffset = effectiveOffset ;
447+ linkActions .add ((context , store , instance , imports ) -> {
448+ store .linker ().resolvePassiveDataSegment (store , instance , dataIndex , dataBytecodeOffset );
449+ });
450+ }
451+ }
452+
453453 return linkActions ;
454454 }
455455
0 commit comments