Skip to content

Commit eb964f0

Browse files
authored
fix: expose dataStart to definitions (#1828)
1 parent 2b1bdf9 commit eb964f0

File tree

4 files changed

+87
-2
lines changed

4 files changed

+87
-2
lines changed

std/assembly/array.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class Array<T> {
3434
// block is 16 bytes anyway so it's fine to have a couple extra fields in there.
3535

3636
private buffer: ArrayBuffer;
37-
private dataStart: usize;
37+
@unsafe readonly dataStart: usize;
3838
private byteLength: i32;
3939

4040
// Also note that Array<T> with non-nullable T must guard against uninitialized null values
@@ -395,7 +395,7 @@ export class Array<T> {
395395
var length = this.length_;
396396
start = start < 0 ? max<i32>(length + start, 0) : min<i32>(start, length);
397397
deleteCount = max<i32>(min<i32>(deleteCount, length - start), 0);
398-
var result = changetype<Array<T>>(__newArray(deleteCount, alignof<T>(), idof<Array<T>>()));
398+
var result = changetype<Array<T>>(__newArray(deleteCount, alignof<T>(), idof<Array<T>>()));
399399
var resultStart = result.dataStart;
400400
var thisStart = this.dataStart;
401401
var thisBase = thisStart + (<usize>start << alignof<T>());

std/assembly/index.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,8 @@ interface ArrayBufferView {
14591459
readonly byteOffset: i32;
14601460
/** The length in bytes from the start of the referenced {@link ArrayBuffer}. */
14611461
readonly byteLength: i32;
1462+
/** Returns raw pointer to data storage including offset (unsafe). */
1463+
readonly dataStart: usize;
14621464
}
14631465

14641466
/* @internal */
@@ -1474,6 +1476,8 @@ declare abstract class TypedArray<T> implements ArrayBufferView {
14741476
readonly byteOffset: i32;
14751477
/** The length in bytes from the start of the referenced {@link ArrayBuffer}. */
14761478
readonly byteLength: i32;
1479+
/** Returns raw pointer to data storage including offset (unsafe). */
1480+
readonly dataStart: usize;
14771481
/** The length (in elements). */
14781482
readonly length: i32;
14791483
/** Returns value using relative indexing. Index may be negative */
@@ -1585,6 +1589,8 @@ declare class Array<T> {
15851589
[key: number]: T;
15861590
/** Current length of the array. */
15871591
length: i32;
1592+
/** Returns raw pointer to data storage (unsafe). */
1593+
readonly dataStart: usize;
15881594
/** Constructs a new array. */
15891595
constructor(length?: i32);
15901596
at(index: i32): T;

tests/compiler/std/array.optimized.wat

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@
590590
(export "memory" (memory $0))
591591
(export "__setArgumentsLength" (func $~setArgumentsLength))
592592
(export "_start" (func $~start))
593+
(export "ArrayU32#get:dataStart" (func $export:~lib/array/Array<u32>#get:dataStart))
593594
(export "ArrayU32#constructor" (func $export:std/array/ArrayU32#constructor@varargs))
594595
(export "ArrayU32#get:length" (func $export:~lib/array/Array<u32>#get:length))
595596
(export "ArrayU32#set:length" (func $export:~lib/array/Array<u32>#set:length))
@@ -616,6 +617,7 @@
616617
(export "ArrayU32#join" (func $export:~lib/array/Array<u32>#join@varargs))
617618
(export "ArrayU32#flat" (func $export:~lib/array/Array<u32>#flat))
618619
(export "ArrayU32#toString" (func $export:~lib/array/Array<u32>#toString))
620+
(export "ArrayU8#get:dataStart" (func $export:~lib/array/Array<u32>#get:dataStart))
619621
(export "ArrayU8#constructor" (func $export:std/array/ArrayU8#constructor@varargs))
620622
(export "ArrayU8#get:length" (func $export:~lib/array/Array<u32>#get:length))
621623
(export "ArrayU8#set:length" (func $export:~lib/array/Array<u8>#set:length))
@@ -642,6 +644,7 @@
642644
(export "ArrayU8#join" (func $export:~lib/array/Array<u8>#join@varargs))
643645
(export "ArrayU8#flat" (func $export:~lib/array/Array<u32>#flat))
644646
(export "ArrayU8#toString" (func $export:~lib/array/Array<u8>#toString))
647+
(export "ArrayStr#get:dataStart" (func $export:~lib/array/Array<u32>#get:dataStart))
645648
(export "ArrayStr#constructor" (func $export:std/array/ArrayStr#constructor@varargs))
646649
(export "ArrayStr#get:length" (func $export:~lib/array/Array<u32>#get:length))
647650
(export "ArrayStr#set:length" (func $export:~lib/array/Array<u32>#set:length))
@@ -22236,6 +22239,22 @@
2223622239
global.set $~lib/memory/__stack_pointer
2223722240
local.get $4
2223822241
)
22242+
(func $export:~lib/array/Array<u32>#get:dataStart (param $0 i32) (result i32)
22243+
global.get $~lib/memory/__stack_pointer
22244+
i32.const 4
22245+
i32.sub
22246+
global.set $~lib/memory/__stack_pointer
22247+
call $~stack_check
22248+
global.get $~lib/memory/__stack_pointer
22249+
local.get $0
22250+
i32.store
22251+
local.get $0
22252+
i32.load offset=4
22253+
global.get $~lib/memory/__stack_pointer
22254+
i32.const 4
22255+
i32.add
22256+
global.set $~lib/memory/__stack_pointer
22257+
)
2223922258
(func $export:std/array/ArrayU32#constructor@varargs (param $0 i32) (param $1 i32) (result i32)
2224022259
global.get $~lib/memory/__stack_pointer
2224122260
i32.const 4

tests/compiler/std/array.untouched.wat

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@
351351
(export "memory" (memory $0))
352352
(export "__setArgumentsLength" (func $~setArgumentsLength))
353353
(export "_start" (func $~start))
354+
(export "ArrayU32#get:dataStart" (func $export:~lib/array/Array<u32>#get:dataStart))
354355
(export "ArrayU32#constructor" (func $export:std/array/ArrayU32#constructor@varargs))
355356
(export "ArrayU32#get:length" (func $export:~lib/array/Array<u32>#get:length))
356357
(export "ArrayU32#set:length" (func $export:~lib/array/Array<u32>#set:length))
@@ -377,6 +378,7 @@
377378
(export "ArrayU32#join" (func $export:~lib/array/Array<u32>#join@varargs))
378379
(export "ArrayU32#flat" (func $export:~lib/array/Array<u32>#flat))
379380
(export "ArrayU32#toString" (func $export:~lib/array/Array<u32>#toString))
381+
(export "ArrayU8#get:dataStart" (func $export:~lib/array/Array<u8>#get:dataStart))
380382
(export "ArrayU8#constructor" (func $export:std/array/ArrayU8#constructor@varargs))
381383
(export "ArrayU8#get:length" (func $export:~lib/array/Array<u8>#get:length))
382384
(export "ArrayU8#set:length" (func $export:~lib/array/Array<u8>#set:length))
@@ -403,6 +405,7 @@
403405
(export "ArrayU8#join" (func $export:~lib/array/Array<u8>#join@varargs))
404406
(export "ArrayU8#flat" (func $export:~lib/array/Array<u8>#flat))
405407
(export "ArrayU8#toString" (func $export:~lib/array/Array<u8>#toString))
408+
(export "ArrayStr#get:dataStart" (func $export:~lib/array/Array<~lib/string/String>#get:dataStart))
406409
(export "ArrayStr#constructor" (func $export:std/array/ArrayStr#constructor@varargs))
407410
(export "ArrayStr#get:length" (func $export:~lib/array/Array<~lib/string/String>#get:length))
408411
(export "ArrayStr#set:length" (func $export:~lib/array/Array<~lib/string/String>#set:length))
@@ -35312,6 +35315,25 @@
3531235315
global.set $~lib/memory/__stack_pointer
3531335316
local.get $2
3531435317
)
35318+
(func $export:~lib/array/Array<u32>#get:dataStart (param $0 i32) (result i32)
35319+
(local $1 i32)
35320+
global.get $~lib/memory/__stack_pointer
35321+
i32.const 4
35322+
i32.sub
35323+
global.set $~lib/memory/__stack_pointer
35324+
call $~stack_check
35325+
global.get $~lib/memory/__stack_pointer
35326+
local.get $0
35327+
i32.store
35328+
local.get $0
35329+
call $~lib/array/Array<u32>#get:dataStart
35330+
local.set $1
35331+
global.get $~lib/memory/__stack_pointer
35332+
i32.const 4
35333+
i32.add
35334+
global.set $~lib/memory/__stack_pointer
35335+
local.get $1
35336+
)
3531535337
(func $export:std/array/ArrayU32#constructor@varargs (param $0 i32) (param $1 i32) (result i32)
3531635338
(local $2 i32)
3531735339
global.get $~lib/memory/__stack_pointer
@@ -35853,6 +35875,25 @@
3585335875
global.set $~lib/memory/__stack_pointer
3585435876
local.get $1
3585535877
)
35878+
(func $export:~lib/array/Array<u8>#get:dataStart (param $0 i32) (result i32)
35879+
(local $1 i32)
35880+
global.get $~lib/memory/__stack_pointer
35881+
i32.const 4
35882+
i32.sub
35883+
global.set $~lib/memory/__stack_pointer
35884+
call $~stack_check
35885+
global.get $~lib/memory/__stack_pointer
35886+
local.get $0
35887+
i32.store
35888+
local.get $0
35889+
call $~lib/array/Array<u8>#get:dataStart
35890+
local.set $1
35891+
global.get $~lib/memory/__stack_pointer
35892+
i32.const 4
35893+
i32.add
35894+
global.set $~lib/memory/__stack_pointer
35895+
local.get $1
35896+
)
3585635897
(func $export:std/array/ArrayU8#constructor@varargs (param $0 i32) (param $1 i32) (result i32)
3585735898
(local $2 i32)
3585835899
global.get $~lib/memory/__stack_pointer
@@ -36394,6 +36435,25 @@
3639436435
global.set $~lib/memory/__stack_pointer
3639536436
local.get $1
3639636437
)
36438+
(func $export:~lib/array/Array<~lib/string/String>#get:dataStart (param $0 i32) (result i32)
36439+
(local $1 i32)
36440+
global.get $~lib/memory/__stack_pointer
36441+
i32.const 4
36442+
i32.sub
36443+
global.set $~lib/memory/__stack_pointer
36444+
call $~stack_check
36445+
global.get $~lib/memory/__stack_pointer
36446+
local.get $0
36447+
i32.store
36448+
local.get $0
36449+
call $~lib/array/Array<~lib/string/String>#get:dataStart
36450+
local.set $1
36451+
global.get $~lib/memory/__stack_pointer
36452+
i32.const 4
36453+
i32.add
36454+
global.set $~lib/memory/__stack_pointer
36455+
local.get $1
36456+
)
3639736457
(func $export:std/array/ArrayStr#constructor@varargs (param $0 i32) (param $1 i32) (result i32)
3639836458
(local $2 i32)
3639936459
global.get $~lib/memory/__stack_pointer

0 commit comments

Comments
 (0)