@@ -194,7 +194,8 @@ import {
194194 writeF64 ,
195195 uniqueMap ,
196196 isPowerOf2 ,
197- v128_zero
197+ v128_zero ,
198+ readI32
198199} from "./util" ;
199200
200201/** Compiler options. */
@@ -1844,26 +1845,23 @@ export class Compiler extends DiagnosticEmitter {
18441845 var memoryOffset = i64_align ( this . memoryOffset , alignment ) ;
18451846 var segment = new MemorySegment ( buffer , memoryOffset ) ;
18461847 this . memorySegments . push ( segment ) ;
1847- this . memoryOffset = i64_add ( memoryOffset , i64_new ( buffer . length , 0 ) ) ;
1848+ this . memoryOffset = i64_add ( memoryOffset , i64_new ( buffer . length ) ) ;
18481849 return segment ;
18491850 }
18501851
18511852 /** Adds a static memory segment representing a runtime object. */
18521853 addRuntimeMemorySegment ( buffer : Uint8Array ) : MemorySegment {
1853- // Runtime objects imply a full BLOCK and OBJECT header, see rt/common.ts
1854- // ((memoryOffset + sizeof_usize + AL_MASK) & ~AL_MASK) - sizeof_usize
1855- var usizeSize = this . options . usizeType . byteSize ;
1856- var memoryOffset = i64_sub ( i64_align ( i64_add ( this . memoryOffset , i64_new ( usizeSize ) ) , 16 ) , i64_new ( usizeSize ) ) ;
1854+ var memoryOffset = this . program . computeBlockStart64 ( this . memoryOffset ) ;
18571855 var segment = new MemorySegment ( buffer , memoryOffset ) ;
18581856 this . memorySegments . push ( segment ) ;
1859- this . memoryOffset = i64_add ( memoryOffset , i64_new ( buffer . length , 0 ) ) ;
1857+ this . memoryOffset = i64_add ( memoryOffset , i64_new ( buffer . length ) ) ;
18601858 return segment ;
18611859 }
18621860
18631861 /** Ensures that a string exists in static memory and returns a pointer to it. Deduplicates. */
18641862 ensureStaticString ( stringValue : string ) : ExpressionRef {
18651863 var program = this . program ;
1866- var rtHeaderSize = program . runtimeHeaderSize ;
1864+ var totalOverhead = program . totalOverhead ;
18671865 var stringInstance = assert ( program . stringInstance ) ;
18681866 var stringSegment : MemorySegment ;
18691867 var segments = this . stringSegments ;
@@ -1873,12 +1871,12 @@ export class Compiler extends DiagnosticEmitter {
18731871 let len = stringValue . length ;
18741872 let buf = stringInstance . createBuffer ( len << 1 ) ;
18751873 for ( let i = 0 ; i < len ; ++ i ) {
1876- writeI16 ( stringValue . charCodeAt ( i ) , buf , rtHeaderSize + ( i << 1 ) ) ;
1874+ writeI16 ( stringValue . charCodeAt ( i ) , buf , totalOverhead + ( i << 1 ) ) ;
18771875 }
18781876 stringSegment = this . addRuntimeMemorySegment ( buf ) ;
18791877 segments . set ( stringValue , stringSegment ) ;
18801878 }
1881- var ptr = i64_add ( stringSegment . offset , i64_new ( rtHeaderSize ) ) ;
1879+ var ptr = i64_add ( stringSegment . offset , i64_new ( totalOverhead ) ) ;
18821880 this . currentType = stringInstance . type ;
18831881 if ( this . options . isWasm64 ) {
18841882 return this . module . i64 ( i64_low ( ptr ) , i64_high ( ptr ) ) ;
@@ -1971,19 +1969,18 @@ export class Compiler extends DiagnosticEmitter {
19711969 var arrayBufferInstance = program . arrayBufferInstance ;
19721970 var buf = arrayBufferInstance . createBuffer ( values . length * elementType . byteSize ) ;
19731971 this . program . OBJECTInstance . writeField ( "rtId" , id , buf , 0 ) ; // use specified rtId
1974- assert ( this . writeStaticBuffer ( buf , program . runtimeHeaderSize , elementType , values ) == buf . length ) ;
1972+ this . writeStaticBuffer ( buf , program . totalOverhead , elementType , values ) ;
19751973 return this . addRuntimeMemorySegment ( buf ) ;
19761974 }
19771975
19781976 /** Adds an array header to static memory and returns the created segment. */
19791977 private addStaticArrayHeader ( elementType : Type , bufferSegment : MemorySegment ) : MemorySegment {
19801978 var program = this . program ;
1981- var runtimeHeaderSize = program . runtimeHeaderSize ;
19821979 var arrayPrototype = assert ( program . arrayPrototype ) ;
19831980 var arrayInstance = assert ( this . resolver . resolveClass ( arrayPrototype , [ elementType ] ) ) ;
1984- var bufferLength = bufferSegment . buffer . length - runtimeHeaderSize ;
1981+ var bufferLength = readI32 ( bufferSegment . buffer , program . OBJECTInstance . offsetof ( "rtSize" ) ) ;
19851982 var arrayLength = i32 ( bufferLength / elementType . byteSize ) ;
1986- var bufferAddress = i64_add ( bufferSegment . offset , i64_new ( runtimeHeaderSize ) ) ;
1983+ var bufferAddress = i64_add ( bufferSegment . offset , i64_new ( program . totalOverhead ) ) ;
19871984
19881985 var buf = arrayInstance . createBuffer ( ) ;
19891986 assert ( arrayInstance . writeField ( "buffer" , bufferAddress , buf ) ) ;
@@ -2016,7 +2013,7 @@ export class Compiler extends DiagnosticEmitter {
20162013 assert ( rtInstance . writeField ( "_env" , 0 , buf ) ) ;
20172014 instance . memorySegment = memorySegment = this . addRuntimeMemorySegment ( buf ) ;
20182015 }
2019- return i64_add ( memorySegment . offset , i64_new ( program . runtimeHeaderSize ) ) ;
2016+ return i64_add ( memorySegment . offset , i64_new ( program . totalOverhead ) ) ;
20202017 }
20212018
20222019 // === Statements ===============================================================================
@@ -8699,15 +8696,15 @@ export class Compiler extends DiagnosticEmitter {
86998696 flow . freeTempLocal ( tempThis ) ;
87008697 flow . freeTempLocal ( tempDataStart ) ;
87018698
8702- let runtimeHeaderSize = program . runtimeHeaderSize ;
8699+ let totalOverhead = program . totalOverhead ;
87038700 let bufferSegment = this . addStaticBuffer ( elementType , values ) ;
8704- let bufferAddress = i64_add ( bufferSegment . offset , i64_new ( runtimeHeaderSize ) ) ;
8701+ let bufferAddress = i64_add ( bufferSegment . offset , i64_new ( totalOverhead ) ) ;
87058702
87068703 // make both the buffer and array header static if assigned to a global. this can't be done
87078704 // if inside of a function because each invocation must create a new array reference then.
87088705 if ( constraints & Constraints . PREFER_STATIC ) {
87098706 let arraySegment = this . addStaticArrayHeader ( elementType , bufferSegment ) ;
8710- let arrayAddress = i64_add ( arraySegment . offset , i64_new ( runtimeHeaderSize ) ) ;
8707+ let arrayAddress = i64_add ( arraySegment . offset , i64_new ( totalOverhead ) ) ;
87118708 this . currentType = arrayType ;
87128709 return program . options . isWasm64
87138710 ? this . module . i64 ( i64_low ( arrayAddress ) , i64_high ( arrayAddress ) )
@@ -8872,7 +8869,7 @@ export class Compiler extends DiagnosticEmitter {
88728869 flow . freeTempLocal ( tempThis ) ;
88738870
88748871 let bufferSegment = this . addStaticBuffer ( elementType , values , arrayInstance . id ) ;
8875- let bufferAddress = i64_add ( bufferSegment . offset , i64_new ( program . runtimeHeaderSize ) ) ;
8872+ let bufferAddress = i64_add ( bufferSegment . offset , i64_new ( program . totalOverhead ) ) ;
88768873
88778874 // return the static buffer directly if assigned to a global
88788875 if ( constraints & Constraints . PREFER_STATIC ) {
0 commit comments