@@ -194,7 +194,8 @@ import {
194
194
writeF64 ,
195
195
uniqueMap ,
196
196
isPowerOf2 ,
197
- v128_zero
197
+ v128_zero ,
198
+ readI32
198
199
} from "./util" ;
199
200
200
201
/** Compiler options. */
@@ -1844,26 +1845,23 @@ export class Compiler extends DiagnosticEmitter {
1844
1845
var memoryOffset = i64_align ( this . memoryOffset , alignment ) ;
1845
1846
var segment = new MemorySegment ( buffer , memoryOffset ) ;
1846
1847
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 ) ) ;
1848
1849
return segment ;
1849
1850
}
1850
1851
1851
1852
/** Adds a static memory segment representing a runtime object. */
1852
1853
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 ) ;
1857
1855
var segment = new MemorySegment ( buffer , memoryOffset ) ;
1858
1856
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 ) ) ;
1860
1858
return segment ;
1861
1859
}
1862
1860
1863
1861
/** Ensures that a string exists in static memory and returns a pointer to it. Deduplicates. */
1864
1862
ensureStaticString ( stringValue : string ) : ExpressionRef {
1865
1863
var program = this . program ;
1866
- var rtHeaderSize = program . runtimeHeaderSize ;
1864
+ var totalOverhead = program . totalOverhead ;
1867
1865
var stringInstance = assert ( program . stringInstance ) ;
1868
1866
var stringSegment : MemorySegment ;
1869
1867
var segments = this . stringSegments ;
@@ -1873,12 +1871,12 @@ export class Compiler extends DiagnosticEmitter {
1873
1871
let len = stringValue . length ;
1874
1872
let buf = stringInstance . createBuffer ( len << 1 ) ;
1875
1873
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 ) ) ;
1877
1875
}
1878
1876
stringSegment = this . addRuntimeMemorySegment ( buf ) ;
1879
1877
segments . set ( stringValue , stringSegment ) ;
1880
1878
}
1881
- var ptr = i64_add ( stringSegment . offset , i64_new ( rtHeaderSize ) ) ;
1879
+ var ptr = i64_add ( stringSegment . offset , i64_new ( totalOverhead ) ) ;
1882
1880
this . currentType = stringInstance . type ;
1883
1881
if ( this . options . isWasm64 ) {
1884
1882
return this . module . i64 ( i64_low ( ptr ) , i64_high ( ptr ) ) ;
@@ -1971,19 +1969,18 @@ export class Compiler extends DiagnosticEmitter {
1971
1969
var arrayBufferInstance = program . arrayBufferInstance ;
1972
1970
var buf = arrayBufferInstance . createBuffer ( values . length * elementType . byteSize ) ;
1973
1971
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 ) ;
1975
1973
return this . addRuntimeMemorySegment ( buf ) ;
1976
1974
}
1977
1975
1978
1976
/** Adds an array header to static memory and returns the created segment. */
1979
1977
private addStaticArrayHeader ( elementType : Type , bufferSegment : MemorySegment ) : MemorySegment {
1980
1978
var program = this . program ;
1981
- var runtimeHeaderSize = program . runtimeHeaderSize ;
1982
1979
var arrayPrototype = assert ( program . arrayPrototype ) ;
1983
1980
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" ) ) ;
1985
1982
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 ) ) ;
1987
1984
1988
1985
var buf = arrayInstance . createBuffer ( ) ;
1989
1986
assert ( arrayInstance . writeField ( "buffer" , bufferAddress , buf ) ) ;
@@ -2016,7 +2013,7 @@ export class Compiler extends DiagnosticEmitter {
2016
2013
assert ( rtInstance . writeField ( "_env" , 0 , buf ) ) ;
2017
2014
instance . memorySegment = memorySegment = this . addRuntimeMemorySegment ( buf ) ;
2018
2015
}
2019
- return i64_add ( memorySegment . offset , i64_new ( program . runtimeHeaderSize ) ) ;
2016
+ return i64_add ( memorySegment . offset , i64_new ( program . totalOverhead ) ) ;
2020
2017
}
2021
2018
2022
2019
// === Statements ===============================================================================
@@ -8699,15 +8696,15 @@ export class Compiler extends DiagnosticEmitter {
8699
8696
flow . freeTempLocal ( tempThis ) ;
8700
8697
flow . freeTempLocal ( tempDataStart ) ;
8701
8698
8702
- let runtimeHeaderSize = program . runtimeHeaderSize ;
8699
+ let totalOverhead = program . totalOverhead ;
8703
8700
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 ) ) ;
8705
8702
8706
8703
// make both the buffer and array header static if assigned to a global. this can't be done
8707
8704
// if inside of a function because each invocation must create a new array reference then.
8708
8705
if ( constraints & Constraints . PREFER_STATIC ) {
8709
8706
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 ) ) ;
8711
8708
this . currentType = arrayType ;
8712
8709
return program . options . isWasm64
8713
8710
? this . module . i64 ( i64_low ( arrayAddress ) , i64_high ( arrayAddress ) )
@@ -8872,7 +8869,7 @@ export class Compiler extends DiagnosticEmitter {
8872
8869
flow . freeTempLocal ( tempThis ) ;
8873
8870
8874
8871
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 ) ) ;
8876
8873
8877
8874
// return the static buffer directly if assigned to a global
8878
8875
if ( constraints & Constraints . PREFER_STATIC ) {
0 commit comments