@@ -6,9 +6,13 @@ import { E_INDEXOUTOFRANGE, E_INVALIDLENGTH } from "./util/error";
6
6
7
7
export class DataView {
8
8
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
+ }
12
16
13
17
constructor (
14
18
buffer : ArrayBuffer ,
@@ -19,28 +23,15 @@ export class DataView {
19
23
i32 ( < u32 > byteLength > < u32 > BLOCK_MAXSIZE ) |
20
24
i32 ( < u32 > byteOffset + byteLength > < u32 > buffer . byteLength )
21
25
) throw new RangeError ( E_INVALIDLENGTH ) ;
22
- this . data = buffer ; // retains
26
+ this . buffer = buffer ; // retains
23
27
var dataStart = changetype < usize > ( buffer ) + < usize > byteOffset ;
24
28
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 ;
38
30
}
39
31
40
32
getFloat32 ( byteOffset : i32 , littleEndian : boolean = false ) : f32 {
41
33
if (
42
- i32 ( byteOffset < 0 ) |
43
- i32 ( byteOffset + 4 > this . dataLength )
34
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
44
35
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
45
36
return littleEndian
46
37
? load < f32 > ( this . dataStart + < usize > byteOffset )
@@ -53,8 +44,7 @@ export class DataView {
53
44
54
45
getFloat64 ( byteOffset : i32 , littleEndian : boolean = false ) : f64 {
55
46
if (
56
- i32 ( byteOffset < 0 ) |
57
- i32 ( byteOffset + 8 > this . dataLength )
47
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
58
48
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
59
49
return littleEndian
60
50
? load < f64 > ( this . dataStart + < usize > byteOffset )
@@ -66,107 +56,97 @@ export class DataView {
66
56
}
67
57
68
58
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 ) ;
70
60
return load < i8 > ( this . dataStart + < usize > byteOffset ) ;
71
61
}
72
62
73
63
getInt16 ( byteOffset : i32 , littleEndian : boolean = false ) : i16 {
74
64
if (
75
- i32 ( byteOffset < 0 ) |
76
- i32 ( byteOffset + 2 > this . dataLength )
65
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
77
66
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
78
67
var result : i16 = load < i16 > ( this . dataStart + < usize > byteOffset ) ;
79
68
return littleEndian ? result : bswap < i16 > ( result ) ;
80
69
}
81
70
82
71
getInt32 ( byteOffset : i32 , littleEndian : boolean = false ) : i32 {
83
72
if (
84
- i32 ( byteOffset < 0 ) |
85
- i32 ( byteOffset + 4 > this . dataLength )
73
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
86
74
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
87
75
var result : i32 = load < i32 > ( this . dataStart + < usize > byteOffset ) ;
88
76
return littleEndian ? result : bswap < i32 > ( result ) ;
89
77
}
90
78
91
79
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 ) ;
93
81
return load < u8 > ( this . dataStart + < usize > byteOffset ) ;
94
82
}
95
83
96
84
getUint16 ( byteOffset : i32 , littleEndian : boolean = false ) : u16 {
97
85
if (
98
- i32 ( byteOffset < 0 ) |
99
- i32 ( byteOffset + 2 > this . dataLength )
86
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
100
87
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
101
88
var result : u16 = load < u16 > ( this . dataStart + < usize > byteOffset ) ;
102
89
return littleEndian ? result : bswap < u16 > ( result ) ;
103
90
}
104
91
105
92
getUint32 ( byteOffset : i32 , littleEndian : boolean = false ) : u32 {
106
93
if (
107
- i32 ( byteOffset < 0 ) |
108
- i32 ( byteOffset + 4 > this . dataLength )
94
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
109
95
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
110
96
var result : u32 = load < u32 > ( this . dataStart + < usize > byteOffset ) ;
111
97
return littleEndian ? result : bswap < u32 > ( result ) ;
112
98
}
113
99
114
100
setFloat32 ( byteOffset : i32 , value : f32 , littleEndian : boolean = false ) : void {
115
101
if (
116
- i32 ( byteOffset < 0 ) |
117
- i32 ( byteOffset + 4 > this . dataLength )
102
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
118
103
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
119
104
if ( littleEndian ) store < f32 > ( this . dataStart + < usize > byteOffset , value ) ;
120
105
else store < u32 > ( this . dataStart + < usize > byteOffset , bswap < u32 > ( reinterpret < u32 > ( value ) ) ) ;
121
106
}
122
107
123
108
setFloat64 ( byteOffset : i32 , value : f64 , littleEndian : boolean = false ) : void {
124
109
if (
125
- i32 ( byteOffset < 0 ) |
126
- i32 ( byteOffset + 8 > this . dataLength )
110
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
127
111
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
128
112
if ( littleEndian ) store < f64 > ( this . dataStart + < usize > byteOffset , value ) ;
129
113
else store < u64 > ( this . dataStart + < usize > byteOffset , bswap < u64 > ( reinterpret < u64 > ( value ) ) ) ;
130
114
}
131
115
132
116
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 ) ;
134
118
store < i8 > ( this . dataStart + < usize > byteOffset , value ) ;
135
119
}
136
120
137
121
setInt16 ( byteOffset : i32 , value : i16 , littleEndian : boolean = false ) : void {
138
122
if (
139
- i32 ( byteOffset < 0 ) |
140
- i32 ( byteOffset + 2 > this . dataLength )
123
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
141
124
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
142
125
store < i16 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < i16 > ( value ) ) ;
143
126
}
144
127
145
128
setInt32 ( byteOffset : i32 , value : i32 , littleEndian : boolean = false ) : void {
146
129
if (
147
- i32 ( byteOffset < 0 ) |
148
- i32 ( byteOffset + 4 > this . dataLength )
130
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
149
131
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
150
132
store < i32 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < i32 > ( value ) ) ;
151
133
}
152
134
153
135
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 ) ;
155
137
store < u8 > ( this . dataStart + < usize > byteOffset , value ) ;
156
138
}
157
139
158
140
setUint16 ( byteOffset : i32 , value : u16 , littleEndian : boolean = false ) : void {
159
141
if (
160
- i32 ( byteOffset < 0 ) |
161
- i32 ( byteOffset + 2 > this . dataLength )
142
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 2 > this . byteLength )
162
143
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
163
144
store < u16 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < u16 > ( value ) ) ;
164
145
}
165
146
166
147
setUint32 ( byteOffset : i32 , value : u32 , littleEndian : boolean = false ) : void {
167
148
if (
168
- i32 ( byteOffset < 0 ) |
169
- i32 ( byteOffset + 4 > this . dataLength )
149
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 4 > this . byteLength )
170
150
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
171
151
store < u32 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < u32 > ( value ) ) ;
172
152
}
@@ -175,34 +155,30 @@ export class DataView {
175
155
176
156
getInt64 ( byteOffset : i32 , littleEndian : boolean = false ) : i64 {
177
157
if (
178
- i32 ( byteOffset < 0 ) |
179
- i32 ( byteOffset + 8 > this . dataLength )
158
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
180
159
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
181
160
var result : i64 = load < i64 > ( this . dataStart + < usize > byteOffset ) ;
182
161
return littleEndian ? result : bswap < i64 > ( result ) ;
183
162
}
184
163
185
164
getUint64 ( byteOffset : i32 , littleEndian : boolean = false ) : u64 {
186
165
if (
187
- i32 ( byteOffset < 0 ) |
188
- i32 ( byteOffset + 8 > this . dataLength )
166
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
189
167
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
190
168
var result = load < u64 > ( this . dataStart + < usize > byteOffset ) ;
191
169
return littleEndian ? result : bswap < u64 > ( result ) ;
192
170
}
193
171
194
172
setInt64 ( byteOffset : i32 , value : i64 , littleEndian : boolean = false ) : void {
195
173
if (
196
- i32 ( byteOffset < 0 ) |
197
- i32 ( byteOffset + 8 > this . dataLength )
174
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
198
175
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
199
176
store < i64 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < i64 > ( value ) ) ;
200
177
}
201
178
202
179
setUint64 ( byteOffset : i32 , value : u64 , littleEndian : boolean = false ) : void {
203
180
if (
204
- i32 ( byteOffset < 0 ) |
205
- i32 ( byteOffset + 8 > this . dataLength )
181
+ ( byteOffset >>> 31 ) | i32 ( byteOffset + 8 > this . byteLength )
206
182
) throw new RangeError ( E_INDEXOUTOFRANGE ) ;
207
183
store < u64 > ( this . dataStart + < usize > byteOffset , littleEndian ? value : bswap < u64 > ( value ) ) ;
208
184
}
0 commit comments