Skip to content

Commit 4963424

Browse files
committed
Merge branch 'master' of https://github.com/odin-lang/Odin
2 parents 5380cf8 + f48e87d commit 4963424

File tree

29 files changed

+960
-184
lines changed

29 files changed

+960
-184
lines changed

base/intrinsics/intrinsics.odin

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ type_polymorphic_record_parameter_value :: proc($T: typeid, index: int) -> $V --
215215
type_is_specialized_polymorphic_record :: proc($T: typeid) -> bool ---
216216
type_is_unspecialized_polymorphic_record :: proc($T: typeid) -> bool ---
217217

218-
type_is_subtype_of :: proc($T, $U: typeid) -> bool ---
218+
type_is_subtype_of :: proc($T, $U: typeid) -> bool ---
219+
type_is_superset_of :: proc($Super, $Sub: typeid) -> bool ---
219220

220221
type_field_index_of :: proc($T: typeid, $name: string) -> uintptr ---
221222

core/encoding/base64/base64.odin

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,39 @@ ENC_TABLE := [64]byte {
2626

2727
PADDING :: '='
2828

29-
DEC_TABLE := [128]int {
30-
-1, -1, -1, -1, -1, -1, -1, -1,
31-
-1, -1, -1, -1, -1, -1, -1, -1,
32-
-1, -1, -1, -1, -1, -1, -1, -1,
33-
-1, -1, -1, -1, -1, -1, -1, -1,
34-
-1, -1, -1, -1, -1, -1, -1, -1,
35-
-1, -1, -1, 62, -1, -1, -1, 63,
29+
DEC_TABLE := [256]u8 {
30+
0, 0, 0, 0, 0, 0, 0, 0,
31+
0, 0, 0, 0, 0, 0, 0, 0,
32+
0, 0, 0, 0, 0, 0, 0, 0,
33+
0, 0, 0, 0, 0, 0, 0, 0,
34+
0, 0, 0, 0, 0, 0, 0, 0,
35+
0, 0, 0, 62, 0, 0, 0, 63,
3636
52, 53, 54, 55, 56, 57, 58, 59,
37-
60, 61, -1, -1, -1, -1, -1, -1,
38-
-1, 0, 1, 2, 3, 4, 5, 6,
37+
60, 61, 0, 0, 0, 0, 0, 0,
38+
0, 0, 1, 2, 3, 4, 5, 6,
3939
7, 8, 9, 10, 11, 12, 13, 14,
4040
15, 16, 17, 18, 19, 20, 21, 22,
41-
23, 24, 25, -1, -1, -1, -1, -1,
42-
-1, 26, 27, 28, 29, 30, 31, 32,
41+
23, 24, 25, 0, 0, 0, 0, 0,
42+
0, 26, 27, 28, 29, 30, 31, 32,
4343
33, 34, 35, 36, 37, 38, 39, 40,
4444
41, 42, 43, 44, 45, 46, 47, 48,
45-
49, 50, 51, -1, -1, -1, -1, -1,
45+
49, 50, 51, 0, 0, 0, 0, 0,
46+
0, 0, 0, 0, 0, 0, 0, 0,
47+
0, 0, 0, 0, 0, 0, 0, 0,
48+
0, 0, 0, 0, 0, 0, 0, 0,
49+
0, 0, 0, 0, 0, 0, 0, 0,
50+
0, 0, 0, 0, 0, 0, 0, 0,
51+
0, 0, 0, 0, 0, 0, 0, 0,
52+
0, 0, 0, 0, 0, 0, 0, 0,
53+
0, 0, 0, 0, 0, 0, 0, 0,
54+
0, 0, 0, 0, 0, 0, 0, 0,
55+
0, 0, 0, 0, 0, 0, 0, 0,
56+
0, 0, 0, 0, 0, 0, 0, 0,
57+
0, 0, 0, 0, 0, 0, 0, 0,
58+
0, 0, 0, 0, 0, 0, 0, 0,
59+
0, 0, 0, 0, 0, 0, 0, 0,
60+
0, 0, 0, 0, 0, 0, 0, 0,
61+
0, 0, 0, 0, 0, 0, 0, 0,
4662
}
4763

4864
encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> (encoded: string, err: mem.Allocator_Error) #optional_allocator_error {
@@ -120,10 +136,10 @@ decode_into :: proc(w: io.Writer, data: string, DEC_TBL := DEC_TABLE) -> io.Erro
120136
i, j: int
121137
for ; j + 3 <= length; i, j = i + 4, j + 3 {
122138
#no_bounds_check {
123-
c0 = DEC_TBL[data[i]]
124-
c1 = DEC_TBL[data[i + 1]]
125-
c2 = DEC_TBL[data[i + 2]]
126-
c3 = DEC_TBL[data[i + 3]]
139+
c0 = int(DEC_TBL[data[i]])
140+
c1 = int(DEC_TBL[data[i + 1]])
141+
c2 = int(DEC_TBL[data[i + 2]])
142+
c3 = int(DEC_TBL[data[i + 3]])
127143

128144
b0 = (c0 << 2) | (c1 >> 4)
129145
b1 = (c1 << 4) | (c2 >> 2)
@@ -140,9 +156,9 @@ decode_into :: proc(w: io.Writer, data: string, DEC_TBL := DEC_TABLE) -> io.Erro
140156
rest := length - j
141157
if rest > 0 {
142158
#no_bounds_check {
143-
c0 = DEC_TBL[data[i]]
144-
c1 = DEC_TBL[data[i + 1]]
145-
c2 = DEC_TBL[data[i + 2]]
159+
c0 = int(DEC_TBL[data[i]])
160+
c1 = int(DEC_TBL[data[i + 1]])
161+
c2 = int(DEC_TBL[data[i + 2]])
146162

147163
b0 = (c0 << 2) | (c1 >> 4)
148164
b1 = (c1 << 4) | (c2 >> 2)

core/fmt/fmt.odin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,7 @@ _fmt_int :: proc(fi: ^Info, u: u64, base: int, is_signed: bool, bit_size: int, d
10671067
}
10681068
}
10691069

1070-
buf: [256]byte
1070+
buf: [BUF_SIZE]byte
10711071
start := 0
10721072

10731073
if fi.hash && !is_signed {

core/math/math.odin

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,6 @@ gain :: proc "contextless" (t, g: $T) -> T where intrinsics.type_is_float(T) {
457457
return bias(t*2 - 1, 1 - g) * 0.5 + 0.5
458458
}
459459

460-
461460
@(require_results) sign_f16 :: proc "contextless" (x: f16) -> f16 { return f16(int(0 < x) - int(x < 0)) }
462461
@(require_results) sign_f16le :: proc "contextless" (x: f16le) -> f16le { return f16le(int(0 < x) - int(x < 0)) }
463462
@(require_results) sign_f16be :: proc "contextless" (x: f16be) -> f16be { return f16be(int(0 < x) - int(x < 0)) }
@@ -467,10 +466,24 @@ gain :: proc "contextless" (t, g: $T) -> T where intrinsics.type_is_float(T) {
467466
@(require_results) sign_f64 :: proc "contextless" (x: f64) -> f64 { return f64(int(0 < x) - int(x < 0)) }
468467
@(require_results) sign_f64le :: proc "contextless" (x: f64le) -> f64le { return f64le(int(0 < x) - int(x < 0)) }
469468
@(require_results) sign_f64be :: proc "contextless" (x: f64be) -> f64be { return f64be(int(0 < x) - int(x < 0)) }
469+
@(require_results) sign_int :: proc "contextless" (x: int) -> int { return int(0 < x) - int(x < 0) }
470+
@(require_results) sign_i16 :: proc "contextless" (x: i16) -> i16 { return i16(int(0 < x) - int(x < 0)) }
471+
@(require_results) sign_i16le :: proc "contextless" (x: i16le) -> i16le { return i16le(int(0 < x) - int(x < 0)) }
472+
@(require_results) sign_i16be :: proc "contextless" (x: i16be) -> i16be { return i16be(int(0 < x) - int(x < 0)) }
473+
@(require_results) sign_i32 :: proc "contextless" (x: i32) -> i32 { return i32(int(0 < x) - int(x < 0)) }
474+
@(require_results) sign_i32le :: proc "contextless" (x: i32le) -> i32le { return i32le(int(0 < x) - int(x < 0)) }
475+
@(require_results) sign_i32be :: proc "contextless" (x: i32be) -> i32be { return i32be(int(0 < x) - int(x < 0)) }
476+
@(require_results) sign_i64 :: proc "contextless" (x: i64) -> i64 { return i64(int(0 < x) - int(x < 0)) }
477+
@(require_results) sign_i64le :: proc "contextless" (x: i64le) -> i64le { return i64le(int(0 < x) - int(x < 0)) }
478+
@(require_results) sign_i64be :: proc "contextless" (x: i64be) -> i64be { return i64be(int(0 < x) - int(x < 0)) }
470479
sign :: proc{
471480
sign_f16, sign_f16le, sign_f16be,
472481
sign_f32, sign_f32le, sign_f32be,
473482
sign_f64, sign_f64le, sign_f64be,
483+
sign_int,
484+
sign_i16, sign_i16le, sign_i16be,
485+
sign_i32, sign_i32le, sign_i32be,
486+
sign_i64, sign_i64le, sign_i64be,
474487
}
475488

476489
@(require_results) sign_bit_f16 :: proc "contextless" (x: f16) -> bool { return (transmute(u16)x) & (1<<15) != 0 }
@@ -482,10 +495,24 @@ sign :: proc{
482495
@(require_results) sign_bit_f64 :: proc "contextless" (x: f64) -> bool { return (transmute(u64)x) & (1<<63) != 0 }
483496
@(require_results) sign_bit_f64le :: proc "contextless" (x: f64le) -> bool { return #force_inline sign_bit_f64(f64(x)) }
484497
@(require_results) sign_bit_f64be :: proc "contextless" (x: f64be) -> bool { return #force_inline sign_bit_f64(f64(x)) }
498+
@(require_results) sign_bit_int :: proc "contextless" (x: int) -> bool { return uint(x) & (1<<(size_of(int)*8 - 1)) != 0 }
499+
@(require_results) sign_bit_i16 :: proc "contextless" (x: i16) -> bool { return u16(x) & (1<<15) != 0 }
500+
@(require_results) sign_bit_i16le :: proc "contextless" (x: i16le) -> bool { return #force_inline sign_bit_i16(i16(x)) }
501+
@(require_results) sign_bit_i16be :: proc "contextless" (x: i16be) -> bool { return #force_inline sign_bit_i16(i16(x)) }
502+
@(require_results) sign_bit_i32 :: proc "contextless" (x: i32) -> bool { return u32(x) & (1<<31) != 0 }
503+
@(require_results) sign_bit_i32le :: proc "contextless" (x: i32le) -> bool { return #force_inline sign_bit_i32(i32(x)) }
504+
@(require_results) sign_bit_i32be :: proc "contextless" (x: i32be) -> bool { return #force_inline sign_bit_i32(i32(x)) }
505+
@(require_results) sign_bit_i64 :: proc "contextless" (x: i64) -> bool { return u64(x) & (1<<63) != 0 }
506+
@(require_results) sign_bit_i64le :: proc "contextless" (x: i64le) -> bool { return #force_inline sign_bit_i64(i64(x)) }
507+
@(require_results) sign_bit_i64be :: proc "contextless" (x: i64be) -> bool { return #force_inline sign_bit_i64(i64(x)) }
485508
sign_bit :: proc{
486509
sign_bit_f16, sign_bit_f16le, sign_bit_f16be,
487510
sign_bit_f32, sign_bit_f32le, sign_bit_f32be,
488511
sign_bit_f64, sign_bit_f64le, sign_bit_f64be,
512+
sign_bit_int,
513+
sign_bit_i16, sign_bit_i16le, sign_bit_i16be,
514+
sign_bit_i32, sign_bit_i32le, sign_bit_i32be,
515+
sign_bit_i64, sign_bit_i64le, sign_bit_i64be,
489516
}
490517

491518
@(require_results)

core/os/os2/file.odin

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ import "base:runtime"
2222
*/
2323
File :: struct {
2424
impl: rawptr,
25-
stream: io.Stream,
26-
fstat: Fstat_Callback,
25+
stream: File_Stream,
2726
}
2827

2928
/*
@@ -218,7 +217,11 @@ name :: proc(f: ^File) -> string {
218217
*/
219218
close :: proc(f: ^File) -> Error {
220219
if f != nil {
221-
return io.close(f.stream)
220+
if f.stream.procedure == nil {
221+
return .Unsupported
222+
}
223+
_, err := f.stream.procedure(f, .Close, nil, 0, nil, runtime.nil_allocator())
224+
return err
222225
}
223226
return nil
224227
}
@@ -235,7 +238,10 @@ close :: proc(f: ^File) -> Error {
235238
*/
236239
seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Error) {
237240
if f != nil {
238-
return io.seek(f.stream, offset, whence)
241+
if f.stream.procedure == nil {
242+
return 0, .Unsupported
243+
}
244+
return f.stream.procedure(f, .Seek, nil, offset, whence, runtime.nil_allocator())
239245
}
240246
return 0, .Invalid_File
241247
}
@@ -247,7 +253,12 @@ seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Err
247253
*/
248254
read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
249255
if f != nil {
250-
return io.read(f.stream, p)
256+
if f.stream.procedure == nil {
257+
return 0, .Unsupported
258+
}
259+
n64: i64
260+
n64, err = f.stream.procedure(f, .Read, p, 0, nil, runtime.nil_allocator())
261+
return int(n64), err
251262
}
252263
return 0, .Invalid_File
253264
}
@@ -260,7 +271,12 @@ read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
260271
*/
261272
read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
262273
if f != nil {
263-
return io.read_at(f.stream, p, offset)
274+
if f.stream.procedure == nil {
275+
return 0, .Unsupported
276+
}
277+
n64: i64
278+
n64, err = f.stream.procedure(f, .Read_At, p, offset, nil, runtime.nil_allocator())
279+
return int(n64), err
264280
}
265281
return 0, .Invalid_File
266282
}
@@ -272,7 +288,12 @@ read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
272288
*/
273289
write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
274290
if f != nil {
275-
return io.write(f.stream, p)
291+
if f.stream.procedure == nil {
292+
return 0, .Unsupported
293+
}
294+
n64: i64
295+
n64, err = f.stream.procedure(f, .Write, p, 0, nil, runtime.nil_allocator())
296+
return int(n64), err
276297
}
277298
return 0, .Invalid_File
278299
}
@@ -284,7 +305,12 @@ write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
284305
*/
285306
write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
286307
if f != nil {
287-
return io.write_at(f.stream, p, offset)
308+
if f.stream.procedure == nil {
309+
return 0, .Unsupported
310+
}
311+
n64: i64
312+
n64, err = f.stream.procedure(f, .Write_At, p, offset, nil, runtime.nil_allocator())
313+
return int(n64), err
288314
}
289315
return 0, .Invalid_File
290316
}
@@ -294,7 +320,18 @@ write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
294320
*/
295321
file_size :: proc(f: ^File) -> (n: i64, err: Error) {
296322
if f != nil {
297-
return io.size(f.stream)
323+
if f.stream.procedure == nil {
324+
return 0, .Unsupported
325+
}
326+
n, err = f.stream.procedure(f, .Size, nil, 0, nil, runtime.nil_allocator())
327+
if err == .Unsupported {
328+
n = 0
329+
curr := seek(f, 0, .Current) or_return
330+
end := seek(f, 0, .End) or_return
331+
seek(f, curr, .Start) or_return
332+
n = end
333+
}
334+
return
298335
}
299336
return 0, .Invalid_File
300337
}
@@ -304,7 +341,11 @@ file_size :: proc(f: ^File) -> (n: i64, err: Error) {
304341
*/
305342
flush :: proc(f: ^File) -> Error {
306343
if f != nil {
307-
return io.flush(f.stream)
344+
if f.stream.procedure == nil {
345+
return .Unsupported
346+
}
347+
_, err := f.stream.procedure(f, .Flush, nil, 0, nil, runtime.nil_allocator())
348+
return err
308349
}
309350
return nil
310351
}

0 commit comments

Comments
 (0)