@@ -6,9 +6,13 @@ import { E_INDEXOUTOFRANGE, E_INVALIDLENGTH } from "./util/error";
66
77export class DataView {
88
9- private data : ArrayBuffer ;
10- private dataStart : usize ;
11- private dataLength : i32 ;
9+ readonly buffer : ArrayBuffer ;
10+ @unsafe readonly dataStart : usize ;
11+ readonly byteLength : i32 ;
12+
13+ get byteOffset ( ) : i32 {
14+ return < i32 > ( this . dataStart - changetype < usize > ( this . buffer ) ) ;
15+ }
1216
1317 constructor (
1418 buffer : ArrayBuffer ,
@@ -19,28 +23,15 @@ export class DataView {
1923 i32 ( < u32 > byteLength > < u32 > BLOCK_MAXSIZE ) |
2024 i32 ( < u32 > byteOffset + byteLength > < u32 > buffer . byteLength )
2125 ) throw new RangeError ( E_INVALIDLENGTH ) ;
22- this . data = buffer ; // retains
26+ this . buffer = buffer ; // retains
2327 var dataStart = changetype < usize > ( buffer ) + < usize > byteOffset ;
2428 this . dataStart = dataStart ;
25- this . dataLength = byteLength ;
26- }
27-
28- get buffer ( ) : ArrayBuffer {
29- return this . data ;
30- }
31-
32- get byteOffset ( ) : i32 {
33- return < i32 > ( this . dataStart - changetype < usize > ( this . data ) ) ;
34- }
35-
36- get byteLength ( ) : i32 {
37- return this . dataLength ;
29+ this . byteLength = byteLength ;
3830 }
3931
4032 getFloat32 ( byteOffset : i32 , littleEndian : boolean = false ) : f32 {
4133 if (
42- i32 ( byteOffset < 0 ) |
43- i32 ( byteOffset + 4 > this . dataLength )
34+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
4435 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
4536 return littleEndian
4637 ? load < f32 > ( this . dataStart + < usize > byteOffset )
@@ -53,8 +44,7 @@ export class DataView {
5344
5445 getFloat64 ( byteOffset : i32 , littleEndian : boolean = false ) : f64 {
5546 if (
56- i32 ( byteOffset < 0 ) |
57- i32 ( byteOffset + 8 > this . dataLength )
47+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
5848 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
5949 return littleEndian
6050 ? load < f64 > ( this . dataStart + < usize > byteOffset )
@@ -66,107 +56,97 @@ export class DataView {
6656 }
6757
6858 getInt8 ( byteOffset : i32 ) : i8 {
69- if ( < u32 > byteOffset >= < u32 > this . dataLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
59+ if ( < u32 > byteOffset >= < u32 > this . byteLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
7060 return load < i8 > ( this . dataStart + < usize > byteOffset ) ;
7161 }
7262
7363 getInt16 ( byteOffset : i32 , littleEndian : boolean = false ) : i16 {
7464 if (
75- i32 ( byteOffset < 0 ) |
76- i32 ( byteOffset + 2 > this . dataLength )
65+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
7766 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
7867 var result : i16 = load < i16 > ( this . dataStart + < usize > byteOffset ) ;
7968 return littleEndian ? result : bswap < i16 > ( result ) ;
8069 }
8170
8271 getInt32 ( byteOffset : i32 , littleEndian : boolean = false ) : i32 {
8372 if (
84- i32 ( byteOffset < 0 ) |
85- i32 ( byteOffset + 4 > this . dataLength )
73+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
8674 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
8775 var result : i32 = load < i32 > ( this . dataStart + < usize > byteOffset ) ;
8876 return littleEndian ? result : bswap < i32 > ( result ) ;
8977 }
9078
9179 getUint8 ( byteOffset : i32 ) : u8 {
92- if ( < u32 > byteOffset >= < u32 > this . dataLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
80+ if ( < u32 > byteOffset >= < u32 > this . byteLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
9381 return load < u8 > ( this . dataStart + < usize > byteOffset ) ;
9482 }
9583
9684 getUint16 ( byteOffset : i32 , littleEndian : boolean = false ) : u16 {
9785 if (
98- i32 ( byteOffset < 0 ) |
99- i32 ( byteOffset + 2 > this . dataLength )
86+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
10087 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
10188 var result : u16 = load < u16 > ( this . dataStart + < usize > byteOffset ) ;
10289 return littleEndian ? result : bswap < u16 > ( result ) ;
10390 }
10491
10592 getUint32 ( byteOffset : i32 , littleEndian : boolean = false ) : u32 {
10693 if (
107- i32 ( byteOffset < 0 ) |
108- i32 ( byteOffset + 4 > this . dataLength )
94+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
10995 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
11096 var result : u32 = load < u32 > ( this . dataStart + < usize > byteOffset ) ;
11197 return littleEndian ? result : bswap < u32 > ( result ) ;
11298 }
11399
114100 setFloat32 ( byteOffset : i32 , value : f32 , littleEndian : boolean = false ) : void {
115101 if (
116- i32 ( byteOffset < 0 ) |
117- i32 ( byteOffset + 4 > this . dataLength )
102+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
118103 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
119104 if ( littleEndian ) store < f32 > ( this . dataStart + < usize > byteOffset , value ) ;
120105 else store < u32 > ( this . dataStart + < usize > byteOffset , bswap < u32 > ( reinterpret < u32 > ( value ) ) ) ;
121106 }
122107
123108 setFloat64 ( byteOffset : i32 , value : f64 , littleEndian : boolean = false ) : void {
124109 if (
125- i32 ( byteOffset < 0 ) |
126- i32 ( byteOffset + 8 > this . dataLength )
110+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
127111 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
128112 if ( littleEndian ) store < f64 > ( this . dataStart + < usize > byteOffset , value ) ;
129113 else store < u64 > ( this . dataStart + < usize > byteOffset , bswap < u64 > ( reinterpret < u64 > ( value ) ) ) ;
130114 }
131115
132116 setInt8 ( byteOffset : i32 , value : i8 ) : void {
133- if ( < u32 > byteOffset >= < u32 > this . dataLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
117+ if ( < u32 > byteOffset >= < u32 > this . byteLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
134118 store < i8 > ( this . dataStart + < usize > byteOffset , value ) ;
135119 }
136120
137121 setInt16 ( byteOffset : i32 , value : i16 , littleEndian : boolean = false ) : void {
138122 if (
139- i32 ( byteOffset < 0 ) |
140- i32 ( byteOffset + 2 > this . dataLength )
123+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
141124 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
142125 store < i16 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < i16 > ( value ) ) ;
143126 }
144127
145128 setInt32 ( byteOffset : i32 , value : i32 , littleEndian : boolean = false ) : void {
146129 if (
147- i32 ( byteOffset < 0 ) |
148- i32 ( byteOffset + 4 > this . dataLength )
130+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
149131 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
150132 store < i32 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < i32 > ( value ) ) ;
151133 }
152134
153135 setUint8 ( byteOffset : i32 , value : u8 ) : void {
154- if ( < u32 > byteOffset >= < u32 > this . dataLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
136+ if ( < u32 > byteOffset >= < u32 > this . byteLength ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
155137 store < u8 > ( this . dataStart + < usize > byteOffset , value ) ;
156138 }
157139
158140 setUint16 ( byteOffset : i32 , value : u16 , littleEndian : boolean = false ) : void {
159141 if (
160- i32 ( byteOffset < 0 ) |
161- i32 ( byteOffset + 2 > this . dataLength )
142+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
162143 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
163144 store < u16 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < u16 > ( value ) ) ;
164145 }
165146
166147 setUint32 ( byteOffset : i32 , value : u32 , littleEndian : boolean = false ) : void {
167148 if (
168- i32 ( byteOffset < 0 ) |
169- i32 ( byteOffset + 4 > this . dataLength )
149+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
170150 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
171151 store < u32 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < u32 > ( value ) ) ;
172152 }
@@ -175,34 +155,30 @@ export class DataView {
175155
176156 getInt64 ( byteOffset : i32 , littleEndian : boolean = false ) : i64 {
177157 if (
178- i32 ( byteOffset < 0 ) |
179- i32 ( byteOffset + 8 > this . dataLength )
158+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
180159 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
181160 var result : i64 = load < i64 > ( this . dataStart + < usize > byteOffset ) ;
182161 return littleEndian ? result : bswap < i64 > ( result ) ;
183162 }
184163
185164 getUint64 ( byteOffset : i32 , littleEndian : boolean = false ) : u64 {
186165 if (
187- i32 ( byteOffset < 0 ) |
188- i32 ( byteOffset + 8 > this . dataLength )
166+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
189167 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
190168 var result = load < u64 > ( this . dataStart + < usize > byteOffset ) ;
191169 return littleEndian ? result : bswap < u64 > ( result ) ;
192170 }
193171
194172 setInt64 ( byteOffset : i32 , value : i64 , littleEndian : boolean = false ) : void {
195173 if (
196- i32 ( byteOffset < 0 ) |
197- i32 ( byteOffset + 8 > this . dataLength )
174+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
198175 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
199176 store < i64 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < i64 > ( value ) ) ;
200177 }
201178
202179 setUint64 ( byteOffset : i32 , value : u64 , littleEndian : boolean = false ) : void {
203180 if (
204- i32 ( byteOffset < 0 ) |
205- i32 ( byteOffset + 8 > this . dataLength )
181+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
206182 ) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
207183 store < u64 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < u64 > ( value ) ) ;
208184 }
0 commit comments