koffi 2.1.4 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{src/koffi/ChangeLog.md → ChangeLog.md} +21 -1
- package/{src/koffi/LICENSE.txt → LICENSE.txt} +0 -0
- package/{src/koffi/README.md → README.md} +0 -0
- package/{src/koffi/doc → doc}/Makefile +1 -1
- package/{src/koffi/doc → doc}/benchmarks.md +0 -0
- package/{src/koffi/doc → doc}/benchmarks.xlsx +0 -0
- package/doc/callbacks.md +175 -0
- package/{src/koffi/doc → doc}/changes.md +2 -3
- package/{src/koffi/doc → doc}/conf.py +29 -6
- package/{src/koffi/doc → doc}/contribute.md +0 -0
- package/{src/koffi/doc → doc}/functions.md +39 -124
- package/{src/koffi/doc → doc}/index.rst +1 -0
- package/{src/koffi/doc → doc}/make.bat +1 -1
- package/{src/koffi/doc → doc}/memory.md +0 -0
- package/{src/koffi/doc → doc}/platforms.md +0 -0
- package/{src/koffi/doc → doc}/poetry.lock +0 -0
- package/{src/koffi/doc → doc}/pyproject.toml +0 -0
- package/{src/koffi/doc → doc}/start.md +0 -0
- package/{src/koffi/doc → doc}/static/bench_linux.png +0 -0
- package/{src/koffi/doc → doc}/static/bench_windows.png +0 -0
- package/{src/koffi/doc → doc}/static/custom.css +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220623.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220623_2.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220627.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220628.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220812.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220623.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220623_2.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220627.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220628.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220812.png +0 -0
- package/{src/koffi/doc → doc}/templates/badges.html +0 -0
- package/{src/koffi/doc → doc}/types.md +36 -9
- package/package.json +2 -2
- package/src/core/libcc/libcc.cc +89 -27
- package/src/core/libcc/libcc.hh +74 -39
- package/src/koffi/build/2.2.0/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_x64.tar.gz +0 -0
- package/src/koffi/qemu/qemu.js +17 -7
- package/src/koffi/src/abi_arm32.cc +25 -23
- package/src/koffi/src/abi_arm64.cc +24 -22
- package/src/koffi/src/abi_riscv64.cc +20 -18
- package/src/koffi/src/abi_x64_sysv.cc +19 -17
- package/src/koffi/src/abi_x64_win.cc +18 -16
- package/src/koffi/src/abi_x86.cc +22 -20
- package/src/koffi/src/call.cc +220 -607
- package/src/koffi/src/call.hh +7 -11
- package/src/koffi/src/ffi.cc +229 -29
- package/src/koffi/src/ffi.hh +6 -2
- package/src/koffi/src/parser.cc +3 -9
- package/src/koffi/src/util.cc +546 -8
- package/src/koffi/src/util.hh +8 -2
- package/src/koffi/test/CMakeLists.txt +3 -3
- package/src/koffi/test/callbacks.js +70 -0
- package/src/koffi/test/misc.c +67 -0
- package/src/koffi/test/raylib.js +2 -2
- package/src/koffi/test/sqlite.js +1 -1
- package/src/koffi/test/sync.js +28 -6
- package/vendor/brotli/c/common/platform.h +2 -0
- package/vendor/sqlite3mc/sqlite3.c +243532 -0
- package/vendor/sqlite3mc/sqlite3.h +12887 -0
- package/src/koffi/build/2.1.4/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_win32_x64.tar.gz +0 -0
|
@@ -28,12 +28,19 @@ const BFG = koffi.struct('BFG', {
|
|
|
28
28
|
})
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
const Vec2 = koffi.struct('Vec2', {
|
|
32
|
+
x: 'double',
|
|
33
|
+
y: 'double'
|
|
34
|
+
});
|
|
35
|
+
|
|
31
36
|
const SimpleCallback = koffi.callback('int SimpleCallback(const char *str)');
|
|
32
37
|
const RecursiveCallback = koffi.callback('RecursiveCallback', 'float', ['int', 'str', 'double']);
|
|
33
38
|
const BigCallback = koffi.callback('BFG BigCallback(BFG bfg)');
|
|
34
39
|
const SuperCallback = koffi.callback('void SuperCallback(int i, int v1, double v2, int v3, int v4, int v5, int v6, float v7, int v8)');
|
|
35
40
|
const ApplyCallback = koffi.callback('int __stdcall ApplyCallback(int a, int b, int c)');
|
|
36
41
|
const IntCallback = koffi.callback('int IntCallback(int x)');
|
|
42
|
+
const VectorCallback = koffi.callback('int VectorCallback(int len, Vec2 *vec)');
|
|
43
|
+
const SortCallback = koffi.callback('int SortCallback(const void *ptr1, const void *ptr2)');
|
|
37
44
|
|
|
38
45
|
const StructCallbacks = koffi.struct('StructCallbacks', {
|
|
39
46
|
first: koffi.pointer(IntCallback),
|
|
@@ -66,6 +73,8 @@ async function test() {
|
|
|
66
73
|
const ApplyStruct = lib.func('int ApplyStruct(int x, StructCallbacks callbacks)');
|
|
67
74
|
const SetCallback = lib.func('void SetCallback(IntCallback *func)');
|
|
68
75
|
const CallCallback = lib.func('int CallCallback(int x)');
|
|
76
|
+
const MakeVectors = lib.func('int MakeVectors(int len, VectorCallback *func)');
|
|
77
|
+
const CallQSort = lib.func('void CallQSort(_Inout_ void *base, size_t nmemb, size_t size, SortCallback *cb)');
|
|
69
78
|
|
|
70
79
|
// Simple test similar to README example
|
|
71
80
|
{
|
|
@@ -160,4 +169,65 @@ async function test() {
|
|
|
160
169
|
assert.equal(koffi.unregister(cb), null);
|
|
161
170
|
assert.throws(() => koffi.unregister(cb));
|
|
162
171
|
}
|
|
172
|
+
|
|
173
|
+
// Register with binding
|
|
174
|
+
{
|
|
175
|
+
class Multiplier {
|
|
176
|
+
constructor(k) { this.k = k; }
|
|
177
|
+
multiply(x) { return this.k * x; }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
let mult = new Multiplier(5);
|
|
181
|
+
let cb = koffi.register(mult, mult.multiply, 'IntCallback *');
|
|
182
|
+
|
|
183
|
+
SetCallback(cb);
|
|
184
|
+
assert.equal(CallCallback(42), 5 * 42);
|
|
185
|
+
|
|
186
|
+
assert.equal(koffi.unregister(cb), null);
|
|
187
|
+
assert.throws(() => koffi.unregister(cb));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Test decoding callback pointers
|
|
191
|
+
{
|
|
192
|
+
assert.equal(koffi.offsetof('Vec2', 'x'), 0);
|
|
193
|
+
assert.equal(koffi.offsetof('Vec2', 'y'), 8);
|
|
194
|
+
|
|
195
|
+
let ret = MakeVectors(5, (len, ptr) => {
|
|
196
|
+
assert.equal(len, 5);
|
|
197
|
+
|
|
198
|
+
for (let i = 0; i < len; i++) {
|
|
199
|
+
let x = koffi.decode(ptr, i * koffi.sizeof('Vec2'), 'double');
|
|
200
|
+
let y = koffi.decode(ptr, i * koffi.sizeof('Vec2') + 8, 'double');
|
|
201
|
+
|
|
202
|
+
assert.equal(x, i);
|
|
203
|
+
assert.equal(y, -i);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
for (let i = 0; i < len; i++) {
|
|
207
|
+
let vec = koffi.decode(ptr, i * koffi.sizeof('Vec2'), 'Vec2');
|
|
208
|
+
assert.deepEqual(vec, { x: i, y: -i });
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
let all = koffi.decode(ptr, koffi.array('double', 10, 'array'), 10);
|
|
212
|
+
assert.deepEqual(all, [0, 0, 1, -1, 2, -2, 3, -3, 4, -4]);
|
|
213
|
+
|
|
214
|
+
return 424242;
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
assert.equal(ret, 424242);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Test koffi.as() and koffi.decode() with qsort
|
|
221
|
+
{
|
|
222
|
+
let array = ['foo', 'bar', '123', 'foobar'];
|
|
223
|
+
|
|
224
|
+
CallQSort(koffi.as(array, 'char **'), array.length, koffi.sizeof('void *'), (ptr1, ptr2) => {
|
|
225
|
+
let str1 = koffi.decode(ptr1, 'char *');
|
|
226
|
+
let str2 = koffi.decode(ptr2, 'char *');
|
|
227
|
+
|
|
228
|
+
return str1.localeCompare(str2);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
assert.deepEqual(array, ['123', 'bar', 'foo', 'foobar']);
|
|
232
|
+
}
|
|
163
233
|
}
|
package/src/koffi/test/misc.c
CHANGED
|
@@ -162,6 +162,14 @@ typedef struct BigText {
|
|
|
162
162
|
char text[262145];
|
|
163
163
|
} BigText;
|
|
164
164
|
|
|
165
|
+
typedef struct Vec2 {
|
|
166
|
+
double x;
|
|
167
|
+
double y;
|
|
168
|
+
} Vec2;
|
|
169
|
+
|
|
170
|
+
typedef int VectorCallback(int len, Vec2 *vec);
|
|
171
|
+
typedef int SortCallback(const void *ptr1, const void *ptr2);
|
|
172
|
+
|
|
165
173
|
EXPORT int8_t GetMinusOne1(void)
|
|
166
174
|
{
|
|
167
175
|
return -1;
|
|
@@ -709,3 +717,62 @@ EXPORT BigText ReverseBigText(BigText buf)
|
|
|
709
717
|
}
|
|
710
718
|
return ret;
|
|
711
719
|
}
|
|
720
|
+
|
|
721
|
+
EXPORT int MakeVectors(int len, VectorCallback *func)
|
|
722
|
+
{
|
|
723
|
+
Vec2 vectors[512];
|
|
724
|
+
|
|
725
|
+
for (int i = 0; i < len; i++) {
|
|
726
|
+
vectors[i].x = (double)i;
|
|
727
|
+
vectors[i].y = (double)-i;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
int ret = func(len, vectors);
|
|
731
|
+
|
|
732
|
+
return ret;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
EXPORT size_t UpperCaseStrAscii(const char *str, char *out)
|
|
736
|
+
{
|
|
737
|
+
size_t len = 0;
|
|
738
|
+
|
|
739
|
+
while (str[len]) {
|
|
740
|
+
char c = str[len];
|
|
741
|
+
|
|
742
|
+
if (c >= 'a' && c <= 'z') {
|
|
743
|
+
out[len] = (char)(c - 32);
|
|
744
|
+
} else {
|
|
745
|
+
out[len] = c;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
len++;
|
|
749
|
+
}
|
|
750
|
+
out[len] = 0;
|
|
751
|
+
|
|
752
|
+
return len;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
EXPORT size_t UpperCaseStrAscii16(const char16_t *str, char16_t *out)
|
|
756
|
+
{
|
|
757
|
+
size_t len = 0;
|
|
758
|
+
|
|
759
|
+
while (str[len]) {
|
|
760
|
+
char16_t c = str[len];
|
|
761
|
+
|
|
762
|
+
if (c >= 'a' && c <= 'z') {
|
|
763
|
+
out[len] = (char16_t)(c - 32);
|
|
764
|
+
} else {
|
|
765
|
+
out[len] = c;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
len++;
|
|
769
|
+
}
|
|
770
|
+
out[len] = 0;
|
|
771
|
+
|
|
772
|
+
return len;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
EXPORT void CallQSort(void *base, size_t nmemb, size_t size, SortCallback *cb)
|
|
776
|
+
{
|
|
777
|
+
qsort(base, nmemb, size, cb);
|
|
778
|
+
}
|
package/src/koffi/test/raylib.js
CHANGED
|
@@ -145,9 +145,9 @@ async function test(display) {
|
|
|
145
145
|
|
|
146
146
|
if (display) {
|
|
147
147
|
BeginDrawing();
|
|
148
|
-
ClearBackground({r: 0, g: 0, b: 0, a: 255});
|
|
148
|
+
ClearBackground({ r: 0, g: 0, b: 0, a: 255 });
|
|
149
149
|
let tex = LoadTextureFromImage(img);
|
|
150
|
-
DrawTexture(tex, 0, 0, {r: 255, g: 255, b: 255, a: 255});
|
|
150
|
+
DrawTexture(tex, 0, 0, { r: 255, g: 255, b: 255, a: 255 });
|
|
151
151
|
EndDrawing();
|
|
152
152
|
|
|
153
153
|
while (!WindowShouldClose())
|
package/src/koffi/test/sqlite.js
CHANGED
|
@@ -36,7 +36,7 @@ async function main() {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
async function test() {
|
|
39
|
-
let lib_filename = __dirname + '/build/
|
|
39
|
+
let lib_filename = __dirname + '/build/sqlite3' + koffi.extension;
|
|
40
40
|
let lib = koffi.load(lib_filename);
|
|
41
41
|
|
|
42
42
|
const sqlite3_open_v2 = lib.func('sqlite3_open_v2', 'int', ['str', koffi.out(koffi.pointer(sqlite3, 2)), 'int', 'str']);
|
package/src/koffi/test/sync.js
CHANGED
|
@@ -173,9 +173,9 @@ async function test() {
|
|
|
173
173
|
const ConcatenateToInt1 = lib.func('ConcatenateToInt1', 'int64_t', Array(12).fill('int8_t'));
|
|
174
174
|
const ConcatenateToInt4 = lib.func('ConcatenateToInt4', 'int64_t', Array(12).fill('int32_t'));
|
|
175
175
|
const ConcatenateToInt8 = lib.func('ConcatenateToInt8', 'int64_t', Array(12).fill('int64_t'));
|
|
176
|
-
const ConcatenateToStr1 = lib.func('ConcatenateToStr1', 'str', [...Array(8).fill('int8_t'), koffi.struct('IJK1', {i: 'int8_t', j: 'int8_t', k: 'int8_t'}), 'int8_t']);
|
|
177
|
-
const ConcatenateToStr4 = lib.func('ConcatenateToStr4', 'str', [...Array(8).fill('int32_t'), koffi.pointer(koffi.struct('IJK4', {i: 'int32_t', j: 'int32_t', k: 'int32_t'})), 'int32_t']);
|
|
178
|
-
const ConcatenateToStr8 = lib.func('ConcatenateToStr8', 'str', [...Array(8).fill('int64_t'), koffi.struct('IJK8', {i: 'int64_t', j: 'int64_t', k: 'int64_t'}), 'int64_t']);
|
|
176
|
+
const ConcatenateToStr1 = lib.func('ConcatenateToStr1', 'str', [...Array(8).fill('int8_t'), koffi.struct('IJK1', { i: 'int8_t', j: 'int8_t', k: 'int8_t' }), 'int8_t']);
|
|
177
|
+
const ConcatenateToStr4 = lib.func('ConcatenateToStr4', 'str', [...Array(8).fill('int32_t'), koffi.pointer(koffi.struct('IJK4', { i: 'int32_t', j: 'int32_t', k: 'int32_t' })), 'int32_t']);
|
|
178
|
+
const ConcatenateToStr8 = lib.func('ConcatenateToStr8', 'str', [...Array(8).fill('int64_t'), koffi.struct('IJK8', { i: 'int64_t', j: 'int64_t', k: 'int64_t' }), 'int64_t']);
|
|
179
179
|
const MakeBFG = lib.func('BFG __stdcall MakeBFG(_Out_ BFG *p, int x, double y, const char *str)');
|
|
180
180
|
const MakePackedBFG = lib.func('AliasBFG __fastcall MakePackedBFG(int x, double y, _Out_ PackedBFG *p, const char *str)');
|
|
181
181
|
const MakePolymorphBFG = lib.func('void MakePolymorphBFG(int type, int x, double y, const char *str, _Out_ void *p)');
|
|
@@ -224,6 +224,8 @@ async function test() {
|
|
|
224
224
|
const ReturnEndianInt8UL = lib.func('uint64_le_t ReturnEndianInt8(uint64_be_t v)');
|
|
225
225
|
const ReturnEndianInt8UB = lib.func('uint64_be_t ReturnEndianInt8(uint64_le_t v)');
|
|
226
226
|
const ReverseBigText = lib.func('BigText ReverseBigText(BigText buf)');
|
|
227
|
+
const UpperCaseStrAscii = lib.func('size_t UpperCaseStrAscii(const char *str, _Out_ char *out)');
|
|
228
|
+
const UpperCaseStrAscii16 = lib.func('size_t UpperCaseStrAscii16(const char16_t *str16, _Out_ char16_t *out)');
|
|
227
229
|
|
|
228
230
|
// Simple signed value returns
|
|
229
231
|
assert.equal(GetMinusOne1(), -1);
|
|
@@ -312,9 +314,9 @@ async function test() {
|
|
|
312
314
|
assert.equal(ConcatenateToInt1(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687);
|
|
313
315
|
assert.equal(ConcatenateToInt4(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687);
|
|
314
316
|
assert.equal(ConcatenateToInt8(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687);
|
|
315
|
-
assert.equal(ConcatenateToStr1(5, 6, 1, 2, 3, 9, 4, 4, {i: 0, j: 6, k: 8}, 7), '561239440687');
|
|
316
|
-
assert.equal(ConcatenateToStr4(5, 6, 1, 2, 3, 9, 4, 4, {i: 0, j: 6, k: 8}, 7), '561239440687');
|
|
317
|
-
assert.equal(ConcatenateToStr8(5, 6, 1, 2, 3, 9, 4, 4, {i: 0, j: 6, k: 8}, 7), '561239440687');
|
|
317
|
+
assert.equal(ConcatenateToStr1(5, 6, 1, 2, 3, 9, 4, 4, { i: 0, j: 6, k: 8 }, 7), '561239440687');
|
|
318
|
+
assert.equal(ConcatenateToStr4(5, 6, 1, 2, 3, 9, 4, 4, { i: 0, j: 6, k: 8 }, 7), '561239440687');
|
|
319
|
+
assert.equal(ConcatenateToStr8(5, 6, 1, 2, 3, 9, 4, 4, { i: 0, j: 6, k: 8 }, 7), '561239440687');
|
|
318
320
|
}
|
|
319
321
|
|
|
320
322
|
// Big struct
|
|
@@ -516,4 +518,24 @@ async function test() {
|
|
|
516
518
|
assert.equal(ret.len, big.len);
|
|
517
519
|
assert.equal(Buffer.from(ret.text).toString(), expected);
|
|
518
520
|
}
|
|
521
|
+
|
|
522
|
+
// Test output string arguments
|
|
523
|
+
{
|
|
524
|
+
let str = ['\0'.repeat(32)];
|
|
525
|
+
|
|
526
|
+
let len = UpperCaseStrAscii('fooBAR_1x3', str);
|
|
527
|
+
|
|
528
|
+
assert.equal(len, 10);
|
|
529
|
+
assert.equal(str[0], 'FOOBAR_1X3');
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Test output string16 arguments
|
|
533
|
+
{
|
|
534
|
+
let str = ['\0'.repeat(32)];
|
|
535
|
+
|
|
536
|
+
let len = UpperCaseStrAscii16('fooBAR_1x3', str);
|
|
537
|
+
|
|
538
|
+
assert.equal(len, 10);
|
|
539
|
+
assert.equal(str[0], 'FOOBAR_1X3');
|
|
540
|
+
}
|
|
519
541
|
}
|
|
@@ -280,6 +280,8 @@ OR:
|
|
|
280
280
|
|
|
281
281
|
#if defined(BROTLI_BUILD_PORTABLE)
|
|
282
282
|
#define BROTLI_ALIGNED_READ (!!1)
|
|
283
|
+
#elif !defined(NDEBUG)
|
|
284
|
+
#define BROTLI_ALIGNED_READ (!!1)
|
|
283
285
|
#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
|
|
284
286
|
defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) || \
|
|
285
287
|
defined(BROTLI_TARGET_RISCV64)
|