aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/node/buffer.zig
blob: 412c617226aa0019f073a8819d09fec1ed849b02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
const std = @import("std");
const bun = @import("../../global.zig");
const strings = bun.strings;
const string = bun.string;
const AsyncIO = @import("io");
const JSC = @import("../../jsc.zig");
const PathString = JSC.PathString;
const Environment = bun.Environment;
const C = bun.C;
const Syscall = @import("./syscall.zig");
const os = std.os;

const JSGlobalObject = JSC.JSGlobalObject;
const ArgumentsSlice = JSC.Node.ArgumentsSlice;

pub const BufferVectorized = struct {
    extern fn memset_pattern16(b: *anyopaque, pattern16: *const anyopaque, len: usize) void;

    pub fn fill(
        globalObject: *JSGlobalObject,
        this: *JSC.ArrayBuffer,
        str: *JSC.ZigString,
        start: u32,
        end: u32,
        encoding: JSC.Node.Encoding,
    ) callconv(.C) void {
        const allocator = JSC.VirtualMachine.vm.allocator;
        var stack_fallback = std.heap.stackFallback(512, allocator);
        var stack_fallback_allocator = stack_fallback.get();
        var input_string = str.toSlice(stack_fallback_allocator);
        if (input_string.len == 0) return;

        defer input_string.deinit();

        var buf = this.slice()[start..end];

        var slice = input_string.slice();
        switch (encoding) {
            JSC.Node.Encoding.utf8,
            JSC.Node.Encoding.ascii,
            JSC.Node.Encoding.latin1,
            JSC.Node.Encoding.buffer,
            => {
                switch (slice.len) {
                    0 => unreachable,
                    1 => {
                        @memset(buf.ptr, slice[0], 1);
                        return;
                    },
                    2...16 => {
                        if (comptime Environment.isMac) {
                            var pattern: [16]u8 = undefined;
                            var remain: []u8 = pattern[0..];

                            while (remain.len > 0) {
                                for (slice[0..]) |a| {
                                    remain[0] = a;
                                    remain = remain[1..];
                                }
                            }

                            memset_pattern16(buf.ptr, &pattern, buf.len);
                            return;
                        }
                    },
                    else => {},
                }

                var in_there = @minimum(slice.len, buf.len);
                @memcpy(buf.ptr, slice.ptr, in_there);
                if (in_there < slice.len) {
                    return;
                }

                // var ptr = buf.ptr + @as(usize, start) + slice.len;

                // const fill_length = @as(usize, end) - @as(usize, start);

                // // while (in_there < fill_length - in_there) {
                // //     std.mem.copy(ptr)
                // //     ptr += in_there;
                // //     in_there *= 2;
                // // }
            },
            else => {},
        }
    }
};

comptime {
    if (!JSC.is_bindgen) {
        @export(BufferVectorized, .{ .name = "Bun__Buffer__fill" });
    }
}