prism 2.0.0.rc1-x86_64-linux-gnu → 2.0.0-x86_64-linux-gnu
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -2
- data/CODE_OF_CONDUCT.md +1 -1
- data/LICENSE.md +1 -1
- data/docs/serialization.md +20 -6
- data/ext/prism/api_node.c +81 -81
- data/ext/prism/extension.c +54 -69
- data/ext/prism/extension.h +1 -1
- data/include/prism/arena.h +8 -0
- data/include/prism/arena.hpp +42 -0
- data/include/prism/ast.h +11 -1
- data/include/prism/ast.hpp +641 -0
- data/include/prism/buffer.h +8 -0
- data/include/prism/buffer.hpp +55 -0
- data/include/prism/comments.h +17 -0
- data/include/prism/compiler/accel.h +3 -1
- data/include/prism/compiler/branch.h +26 -0
- data/include/prism/compiler/bswap.h +46 -0
- data/include/prism/compiler/cplusplus.hpp +16 -0
- data/include/prism/compiler/endianness.h +34 -0
- data/include/prism/compiler/exceptions.hpp +17 -0
- data/include/prism/compiler/format.h +2 -0
- data/include/prism/compiler/lifetimebound.hpp +25 -0
- data/include/prism/constant_pool.h +25 -0
- data/include/prism/diagnostic.h +18 -0
- data/include/prism/errors_format.h +8 -0
- data/include/prism/internal/buffer.h +3 -0
- data/include/prism/internal/node.h +8 -4
- data/include/prism/internal/parser.h +20 -0
- data/include/prism/internal/stringy.h +1 -6
- data/include/prism/internal/xxh3.h +16 -0
- data/include/prism/json.h +8 -0
- data/include/prism/line_offset_list.h +8 -0
- data/include/prism/magic_comments.h +18 -0
- data/include/prism/node.h +55 -10
- data/include/prism/node.hpp +272 -0
- data/include/prism/node_type.hpp +38 -0
- data/include/prism/options.h +10 -1
- data/include/prism/options.hpp +43 -0
- data/include/prism/parser.h +93 -64
- data/include/prism/parser.hpp +274 -0
- data/include/prism/prettyprint.h +8 -0
- data/include/prism/serialize.h +8 -0
- data/include/prism/source.h +8 -0
- data/include/prism/stream.h +8 -0
- data/include/prism/string_query.h +19 -0
- data/include/prism/stringy.h +16 -27
- data/include/prism/stringy.hpp +31 -0
- data/include/prism/version.h +9 -1
- data/include/prism.h +0 -8
- data/include/prism.hpp +24 -0
- data/lib/prism/3.3/prism.so +0 -0
- data/lib/prism/3.4/prism.so +0 -0
- data/lib/prism/4.0/prism.so +0 -0
- data/lib/prism/ffi.rb +6 -0
- data/lib/prism/node.rb +736 -0
- data/lib/prism/parse_result.rb +23 -8
- data/lib/prism/serialize.rb +2567 -3286
- data/lib/prism/string_query.rb +8 -0
- data/prism.gemspec +21 -4
- data/rbi/generated/prism/node.rbi +2430 -968
- data/rbi/generated/prism/parse_result.rbi +16 -4
- data/rbi/generated/prism/serialize.rbi +8 -4
- data/rbi/generated/prism/string_query.rbi +7 -0
- data/sig/generated/prism/node.rbs +2439 -967
- data/sig/generated/prism/parse_result.rbs +16 -4
- data/sig/generated/prism/serialize.rbs +9 -4
- data/sig/generated/prism/string_query.rbs +7 -0
- data/src/buffer.c +9 -0
- data/src/comments.c +2 -2
- data/src/diagnostic.c +8 -0
- data/src/node.c +216 -368
- data/src/options.c +7 -13
- data/src/parser.c +70 -48
- data/src/prism.c +581 -419
- data/src/regexp.c +0 -1
- data/src/serialize.c +2301 -1950
- data/src/source.c +8 -2
- data/src/string_query.c +14 -0
- data/src/stringy.c +3 -33
- data/src/xxh3.c +292 -0
- metadata +20 -3
data/src/source.c
CHANGED
|
@@ -377,7 +377,13 @@ pm_source_stream_read(pm_source_t *source) {
|
|
|
377
377
|
*/
|
|
378
378
|
#define LINE_FILL 0xff
|
|
379
379
|
|
|
380
|
-
|
|
380
|
+
/*
|
|
381
|
+
* The fgets and feof members share their names with standard library
|
|
382
|
+
* functions, which <stdio.h> may define as function-like macros (newlib on
|
|
383
|
+
* Cygwin does this for feof). Parenthesizing the member access keeps those
|
|
384
|
+
* macros from expanding at the call sites.
|
|
385
|
+
*/
|
|
386
|
+
while (memset(line, LINE_FILL, LINE_SIZE), (source->stream.fgets)(line, LINE_SIZE, source->stream.stream) != NULL) {
|
|
381
387
|
/*
|
|
382
388
|
* Locate the NUL terminator written by fgets (the last NUL in the
|
|
383
389
|
* buffer) to recover the length of the chunk, then drop the terminator.
|
|
@@ -408,7 +414,7 @@ pm_source_stream_read(pm_source_t *source) {
|
|
|
408
414
|
* EOF. A newline-terminated line needs no such check: if it happens to
|
|
409
415
|
* be the last line, the next fgets returns NULL and ends the loop.
|
|
410
416
|
*/
|
|
411
|
-
if (!newline && !source->stream.feof(source->stream.stream)) {
|
|
417
|
+
if (!newline && !(source->stream.feof)(source->stream.stream)) {
|
|
412
418
|
continue;
|
|
413
419
|
}
|
|
414
420
|
|
data/src/string_query.c
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
#include "prism/internal/char.h"
|
|
4
4
|
#include "prism/internal/encoding.h"
|
|
5
|
+
#include "prism/internal/parser.h"
|
|
5
6
|
|
|
6
7
|
#include <assert.h>
|
|
7
8
|
#include <string.h>
|
|
@@ -164,3 +165,16 @@ pm_string_query_method_name(const uint8_t *source, size_t length, const char *en
|
|
|
164
165
|
#undef C2
|
|
165
166
|
#undef C3
|
|
166
167
|
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Check that the slice is a keyword. Keywords are spelled in ASCII, so any
|
|
171
|
+
* ASCII-compatible encoding spells them with the same bytes.
|
|
172
|
+
*/
|
|
173
|
+
pm_string_query_t
|
|
174
|
+
pm_string_query_keyword(const uint8_t *source, size_t length, const char *encoding_name) {
|
|
175
|
+
if (pm_encoding_find((const uint8_t *) encoding_name, (const uint8_t *) (encoding_name + strlen(encoding_name))) == NULL) {
|
|
176
|
+
return PM_STRING_QUERY_ERROR;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return pm_keyword_p(source, source + length) ? PM_STRING_QUERY_TRUE : PM_STRING_QUERY_FALSE;
|
|
180
|
+
}
|
data/src/stringy.c
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
#include "prism/internal/stringy.h"
|
|
2
2
|
|
|
3
|
-
#include "prism/internal/allocator.h"
|
|
4
|
-
|
|
5
3
|
#include <assert.h>
|
|
6
|
-
#include <stdlib.h>
|
|
7
4
|
#include <string.h>
|
|
8
5
|
|
|
9
6
|
/**
|
|
@@ -14,34 +11,17 @@ pm_string_shared_init(pm_string_t *string, const uint8_t *start, const uint8_t *
|
|
|
14
11
|
assert(start <= end);
|
|
15
12
|
|
|
16
13
|
*string = (pm_string_t) {
|
|
17
|
-
.type = PM_STRING_SHARED,
|
|
18
14
|
.source = start,
|
|
19
15
|
.length = (size_t) (end - start)
|
|
20
16
|
};
|
|
21
17
|
}
|
|
22
18
|
|
|
23
19
|
/**
|
|
24
|
-
* Initialize
|
|
25
|
-
*/
|
|
26
|
-
void
|
|
27
|
-
pm_string_owned_init(pm_string_t *string, uint8_t *source, size_t length) {
|
|
28
|
-
*string = (pm_string_t) {
|
|
29
|
-
.type = PM_STRING_OWNED,
|
|
30
|
-
.source = source,
|
|
31
|
-
.length = length
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Initialize a constant string that doesn't own its memory source.
|
|
20
|
+
* Initialize a string that views the given bytes.
|
|
37
21
|
*/
|
|
38
22
|
void
|
|
39
|
-
|
|
40
|
-
*string = (pm_string_t) {
|
|
41
|
-
.type = PM_STRING_CONSTANT,
|
|
42
|
-
.source = (const uint8_t *) source,
|
|
43
|
-
.length = length
|
|
44
|
-
};
|
|
23
|
+
pm_string_init(pm_string_t *string, const uint8_t *source, size_t length) {
|
|
24
|
+
*string = (pm_string_t) { .source = source, .length = length };
|
|
45
25
|
}
|
|
46
26
|
|
|
47
27
|
/**
|
|
@@ -79,13 +59,3 @@ const uint8_t *
|
|
|
79
59
|
pm_string_source(const pm_string_t *string) {
|
|
80
60
|
return string->source;
|
|
81
61
|
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Free the associated memory of the given string.
|
|
85
|
-
*/
|
|
86
|
-
void
|
|
87
|
-
pm_string_cleanup(pm_string_t *string) {
|
|
88
|
-
if (string->type == PM_STRING_OWNED) {
|
|
89
|
-
xfree_sized((void *) string->source, string->length);
|
|
90
|
-
}
|
|
91
|
-
}
|
data/src/xxh3.c
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An implementation of the XXH3 hash function.
|
|
3
|
+
*
|
|
4
|
+
* The reason some of these names do not look quite like the style of the rest
|
|
5
|
+
* of the code in Prism is that this was adapted straight from the XXH3
|
|
6
|
+
* specification here:
|
|
7
|
+
*
|
|
8
|
+
* https://github.com/Cyan4973/xxHash/blob/release/doc/xxhash_spec.md
|
|
9
|
+
*
|
|
10
|
+
* To better understand this code it is recommended to read the XXH3
|
|
11
|
+
* specification linked above, where you should be able to follow along with
|
|
12
|
+
* this implementation more easily. Note this only implements the XXH3_64
|
|
13
|
+
* variant with the default secret and a seed of 0. Additionally it does not
|
|
14
|
+
* include a lot of the various CPU-specific optimizations that exist in the
|
|
15
|
+
* reference implementation.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "prism/internal/xxh3.h"
|
|
19
|
+
|
|
20
|
+
#include "prism/compiler/accel.h"
|
|
21
|
+
#include "prism/compiler/bswap.h"
|
|
22
|
+
#include "prism/compiler/endianness.h"
|
|
23
|
+
|
|
24
|
+
#include <string.h>
|
|
25
|
+
|
|
26
|
+
#if defined(PRISM_HAS_NEON) && defined(PRISM_LITTLE_ENDIAN_COMPTIME)
|
|
27
|
+
#include <arm_neon.h>
|
|
28
|
+
#define XXH3_NEON
|
|
29
|
+
#elif defined(PRISM_HAS_SSE2)
|
|
30
|
+
#include <emmintrin.h>
|
|
31
|
+
#define XXH3_SSE2
|
|
32
|
+
#endif
|
|
33
|
+
|
|
34
|
+
#if defined(__SIZEOF_INT128__)
|
|
35
|
+
static uint64_t
|
|
36
|
+
XXH3_mul128_fold64(uint64_t lhs, uint64_t rhs) {
|
|
37
|
+
__uint128_t x = (__uint128_t) lhs * (__uint128_t) rhs;
|
|
38
|
+
return ((uint64_t) (x & 0xFFFFFFFFFFFFFFFFULL)) ^ ((uint64_t) (x >> 64));
|
|
39
|
+
}
|
|
40
|
+
#else
|
|
41
|
+
#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
|
|
42
|
+
#include <intrin.h>
|
|
43
|
+
#endif
|
|
44
|
+
|
|
45
|
+
static uint64_t
|
|
46
|
+
XXH3_mul128_fold64(uint64_t lhs, uint64_t rhs) {
|
|
47
|
+
uint64_t lo, hi;
|
|
48
|
+
#if defined(_MSC_VER) && defined(_M_X64)
|
|
49
|
+
lo = _umul128(lhs, rhs, &hi);
|
|
50
|
+
#elif defined(_MSC_VER) && defined(_M_ARM64)
|
|
51
|
+
hi = __umulh(lhs, rhs);
|
|
52
|
+
lo = lhs * rhs;
|
|
53
|
+
#else
|
|
54
|
+
uint64_t lo_lo = (lhs & 0xFFFFFFFF) * (rhs & 0xFFFFFFFF);
|
|
55
|
+
uint64_t hi_lo = (lhs >> 32) * (rhs & 0xFFFFFFFF);
|
|
56
|
+
uint64_t lo_hi = (lhs & 0xFFFFFFFF) * (rhs >> 32);
|
|
57
|
+
uint64_t hi_hi = (lhs >> 32) * (rhs >> 32);
|
|
58
|
+
|
|
59
|
+
uint64_t cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi;
|
|
60
|
+
hi = hi_hi + (hi_lo >> 32) + (cross >> 32);
|
|
61
|
+
lo = (cross << 32) | (lo_lo & 0xFFFFFFFF);
|
|
62
|
+
#endif
|
|
63
|
+
return lo ^ hi;
|
|
64
|
+
}
|
|
65
|
+
#endif
|
|
66
|
+
|
|
67
|
+
static uint32_t
|
|
68
|
+
read32(const void* ptr) {
|
|
69
|
+
uint32_t val;
|
|
70
|
+
memcpy(&val, ptr, sizeof(val));
|
|
71
|
+
if (!PRISM_LITTLE_ENDIAN_RUNTIME) {
|
|
72
|
+
val = pm_bswap32(val);
|
|
73
|
+
}
|
|
74
|
+
return val;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static uint64_t
|
|
78
|
+
read64(const void* ptr) {
|
|
79
|
+
uint64_t val;
|
|
80
|
+
memcpy(&val, ptr, sizeof(val));
|
|
81
|
+
if (!PRISM_LITTLE_ENDIAN_RUNTIME) {
|
|
82
|
+
val = pm_bswap64(val);
|
|
83
|
+
}
|
|
84
|
+
return val;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static const uint64_t PRIME32_1 = 0x9E3779B1U;
|
|
88
|
+
static const uint64_t PRIME32_2 = 0x85EBCA77U;
|
|
89
|
+
static const uint64_t PRIME32_3 = 0xC2B2AE3DU;
|
|
90
|
+
static const uint64_t PRIME64_1 = 0x9E3779B185EBCA87ULL;
|
|
91
|
+
static const uint64_t PRIME64_2 = 0xC2B2AE3D27D4EB4FULL;
|
|
92
|
+
static const uint64_t PRIME64_3 = 0x165667B19E3779F9ULL;
|
|
93
|
+
static const uint64_t PRIME64_4 = 0x85EBCA77C2B2AE63ULL;
|
|
94
|
+
static const uint64_t PRIME64_5 = 0x27D4EB2F165667C5ULL;
|
|
95
|
+
static const uint64_t PRIME_MX1 = 0x165667919E3779F9ULL;
|
|
96
|
+
static const uint64_t PRIME_MX2 = 0x9FB21C651E98DF25ULL;
|
|
97
|
+
|
|
98
|
+
static const uint8_t secret[192] = {
|
|
99
|
+
0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c,
|
|
100
|
+
0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f,
|
|
101
|
+
0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21,
|
|
102
|
+
0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c,
|
|
103
|
+
0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3,
|
|
104
|
+
0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8,
|
|
105
|
+
0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d,
|
|
106
|
+
0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64,
|
|
107
|
+
0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb,
|
|
108
|
+
0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e,
|
|
109
|
+
0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce,
|
|
110
|
+
0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
static uint64_t
|
|
114
|
+
avalanche(uint64_t x) {
|
|
115
|
+
x ^= (x >> 37);
|
|
116
|
+
x *= PRIME_MX1;
|
|
117
|
+
x ^= (x >> 32);
|
|
118
|
+
return x;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static uint64_t
|
|
122
|
+
avalanche_XXH64(uint64_t x) {
|
|
123
|
+
x ^= (x >> 33);
|
|
124
|
+
x *= PRIME64_2;
|
|
125
|
+
x ^= (x >> 29);
|
|
126
|
+
x *= PRIME64_3;
|
|
127
|
+
x ^= (x >> 32);
|
|
128
|
+
return x;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static uint64_t
|
|
132
|
+
XXH3_64_empty(void) {
|
|
133
|
+
return avalanche_XXH64(read64(secret + 56) ^ read64(secret + 64));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static uint64_t
|
|
137
|
+
XXH3_64_1to3(const uint8_t *input, size_t length) {
|
|
138
|
+
uint32_t combined = (uint32_t) input[length - 1] | ((uint32_t) length << 8) | ((uint32_t) input[0] << 16) | ((uint32_t) input[length >> 1] << 24);
|
|
139
|
+
return avalanche_XXH64((uint64_t) (read32(secret) ^ read32(secret + 4)) ^ (uint64_t) combined);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static uint64_t
|
|
143
|
+
XXH3_64_4to8(const uint8_t *input, size_t length) {
|
|
144
|
+
#define rot(x_, r_) (((x_) << (r_)) | ((x_) >> (64 - (r_))))
|
|
145
|
+
|
|
146
|
+
uint64_t combined = (uint64_t) read32(input + length - 4) | ((uint64_t) read32(input) << 32);
|
|
147
|
+
uint64_t value = (read64(secret + 8) ^ read64(secret + 16)) ^ combined;
|
|
148
|
+
value ^= rot(value, 49) ^ rot(value, 24);
|
|
149
|
+
value *= PRIME_MX2;
|
|
150
|
+
value ^= ((value >> 35) + length);
|
|
151
|
+
value *= PRIME_MX2;
|
|
152
|
+
value ^= (value >> 28);
|
|
153
|
+
return value;
|
|
154
|
+
|
|
155
|
+
#undef rot
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
static uint64_t
|
|
159
|
+
XXH3_64_9to16(const uint8_t *input, size_t length) {
|
|
160
|
+
uint64_t lo = (read64(secret + 24) ^ read64(secret + 32)) ^ read64(input);
|
|
161
|
+
uint64_t hi = (read64(secret + 40) ^ read64(secret + 48)) ^ read64(input + length - 8);
|
|
162
|
+
return avalanche(length + pm_bswap64(lo) + hi + XXH3_mul128_fold64(lo, hi));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
static uint64_t
|
|
166
|
+
XXH3_64_17to240(const uint8_t *input, size_t length) {
|
|
167
|
+
#define mix(data_, offset_) XXH3_mul128_fold64(read64((data_)) ^ read64(secret + (offset_)), read64((data_) + 8) ^ read64(secret + (offset_) + 8))
|
|
168
|
+
|
|
169
|
+
uint64_t acc = length * PRIME64_1;
|
|
170
|
+
|
|
171
|
+
if (length <= 128) {
|
|
172
|
+
size_t idx = (length - 1) / 32;
|
|
173
|
+
do {
|
|
174
|
+
acc += mix(input + idx * 16, idx * 32) + mix(input + length - idx * 16 - 16, idx * 32 + 16);
|
|
175
|
+
} while (idx--);
|
|
176
|
+
} else {
|
|
177
|
+
for (size_t idx = 0; idx < 8; idx++) {
|
|
178
|
+
acc += mix(input + idx * 16, idx * 16);
|
|
179
|
+
}
|
|
180
|
+
acc = avalanche(acc);
|
|
181
|
+
for (size_t idx = 8; idx < length >> 4; idx++) {
|
|
182
|
+
acc += mix(input + idx * 16, (idx - 8) * 16 + 3);
|
|
183
|
+
}
|
|
184
|
+
acc += mix(input + length - 16, 119);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return avalanche(acc);
|
|
188
|
+
|
|
189
|
+
#undef mix
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
static void
|
|
193
|
+
accumulate(uint64_t acc[8], const uint8_t *stripe, size_t secret_offset) {
|
|
194
|
+
#if defined(XXH3_NEON)
|
|
195
|
+
for (int idx = 0; idx < 8; idx += 2) {
|
|
196
|
+
uint64x2_t data = vreinterpretq_u64_u8(vld1q_u8(stripe + 8 * idx));
|
|
197
|
+
uint64x2_t value = veorq_u64(data, vreinterpretq_u64_u8(vld1q_u8(secret + secret_offset + 8 * idx)));
|
|
198
|
+
uint64x2_t product = vmull_u32(vmovn_u64(value), vshrn_n_u64(value, 32));
|
|
199
|
+
vst1q_u64(acc + idx, vaddq_u64(vld1q_u64(acc + idx), vaddq_u64(vextq_u64(data, data, 1), product)));
|
|
200
|
+
}
|
|
201
|
+
#elif defined(XXH3_SSE2)
|
|
202
|
+
for (int idx = 0; idx < 8; idx += 2) {
|
|
203
|
+
__m128i data = _mm_loadu_si128((const __m128i *) (stripe + 8 * idx));
|
|
204
|
+
__m128i value = _mm_xor_si128(data, _mm_loadu_si128((const __m128i *) (secret + secret_offset + 8 * idx)));
|
|
205
|
+
__m128i product = _mm_mul_epu32(value, _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 3, 0, 1)));
|
|
206
|
+
_mm_storeu_si128((__m128i *) (acc + idx), _mm_add_epi64(_mm_loadu_si128((const __m128i *) (acc + idx)), _mm_add_epi64(_mm_shuffle_epi32(data, _MM_SHUFFLE(1, 0, 3, 2)), product)));
|
|
207
|
+
}
|
|
208
|
+
#else
|
|
209
|
+
for (int idx = 0; idx < 8; idx++) {
|
|
210
|
+
uint64_t data = read64(stripe + 8 * idx);
|
|
211
|
+
uint64_t value = data ^ read64(secret + secret_offset + 8 * idx);
|
|
212
|
+
acc[idx ^ 1] = acc[idx ^ 1] + data;
|
|
213
|
+
acc[idx] += (value & 0xFFFFFFFF) * (value >> 32);
|
|
214
|
+
}
|
|
215
|
+
#endif
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
static uint64_t
|
|
219
|
+
XXH3_64_large(const uint8_t *input, size_t length) {
|
|
220
|
+
const size_t secret_length = sizeof(secret);
|
|
221
|
+
const size_t stripes_per_block = (secret_length - 64) / 8;
|
|
222
|
+
const size_t block_size = 64 * stripes_per_block;
|
|
223
|
+
const size_t block_count = (length - 1) / block_size;
|
|
224
|
+
const size_t last_offset = block_count * block_size;
|
|
225
|
+
|
|
226
|
+
uint64_t acc[8] = {
|
|
227
|
+
PRIME32_3, PRIME64_1, PRIME64_2, PRIME64_3,
|
|
228
|
+
PRIME64_4, PRIME32_2, PRIME64_5, PRIME32_1
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
for (size_t block_idx = 0; block_idx < block_count; block_idx++) {
|
|
232
|
+
const uint8_t *block = input + block_idx * block_size;
|
|
233
|
+
|
|
234
|
+
for (size_t stripe_idx = 0; stripe_idx < stripes_per_block; stripe_idx++) {
|
|
235
|
+
accumulate(acc, block + stripe_idx * 64, stripe_idx * 8);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#if defined(XXH3_NEON)
|
|
239
|
+
const uint32x2_t prime = vdup_n_u32((uint32_t) PRIME32_1);
|
|
240
|
+
for (size_t idx = 0; idx < 8; idx += 2) {
|
|
241
|
+
uint64x2_t value = vld1q_u64(acc + idx);
|
|
242
|
+
value = veorq_u64(value, vshrq_n_u64(value, 47));
|
|
243
|
+
value = veorq_u64(value, vreinterpretq_u64_u8(vld1q_u8(secret + secret_length - 64 + idx * 8)));
|
|
244
|
+
vst1q_u64(acc + idx, vaddq_u64(vmull_u32(vmovn_u64(value), prime), vshlq_n_u64(vmull_u32(vshrn_n_u64(value, 32), prime), 32)));
|
|
245
|
+
}
|
|
246
|
+
#elif defined(XXH3_SSE2)
|
|
247
|
+
const __m128i prime = _mm_set1_epi32((int) (uint32_t) PRIME32_1);
|
|
248
|
+
for (size_t idx = 0; idx < 8; idx += 2) {
|
|
249
|
+
__m128i value = _mm_loadu_si128((const __m128i *) (acc + idx));
|
|
250
|
+
value = _mm_xor_si128(value, _mm_srli_epi64(value, 47));
|
|
251
|
+
value = _mm_xor_si128(value, _mm_loadu_si128((const __m128i *) (secret + secret_length - 64 + idx * 8)));
|
|
252
|
+
_mm_storeu_si128((__m128i *) (acc + idx), _mm_add_epi64(_mm_mul_epu32(value, prime), _mm_slli_epi64(_mm_mul_epu32(_mm_shuffle_epi32(value, _MM_SHUFFLE(0, 3, 0, 1)), prime), 32)));
|
|
253
|
+
}
|
|
254
|
+
#else
|
|
255
|
+
for (size_t idx = 0; idx < 8; idx++) {
|
|
256
|
+
acc[idx] ^= (acc[idx] >> 47);
|
|
257
|
+
acc[idx] ^= read64(secret + secret_length - 64 + idx * 8);
|
|
258
|
+
acc[idx] *= PRIME32_1;
|
|
259
|
+
}
|
|
260
|
+
#endif
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
for (size_t stripe_idx = 0; stripe_idx < (length - last_offset - 1) / 64; stripe_idx++) {
|
|
264
|
+
accumulate(acc, input + last_offset + stripe_idx * 64, stripe_idx * 8);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
accumulate(acc, input + length - 64, secret_length - 71);
|
|
268
|
+
|
|
269
|
+
uint64_t result = (uint64_t) length * PRIME64_1;
|
|
270
|
+
for (size_t idx = 0; idx < 4; idx++) {
|
|
271
|
+
result += XXH3_mul128_fold64(acc[idx * 2] ^ read64(secret + 11 + 16 * idx), acc[idx * 2 + 1] ^ read64(secret + 11 + 16 * idx + 8));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return avalanche(result);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
uint64_t
|
|
278
|
+
pm_xxh3(const uint8_t *input, size_t length) {
|
|
279
|
+
if (length == 0) {
|
|
280
|
+
return XXH3_64_empty();
|
|
281
|
+
} else if (length <= 3) {
|
|
282
|
+
return XXH3_64_1to3(input, length);
|
|
283
|
+
} else if (length <= 8) {
|
|
284
|
+
return XXH3_64_4to8(input, length);
|
|
285
|
+
} else if (length <= 16) {
|
|
286
|
+
return XXH3_64_9to16(input, length);
|
|
287
|
+
} else if (length <= 240) {
|
|
288
|
+
return XXH3_64_17to240(input, length);
|
|
289
|
+
} else {
|
|
290
|
+
return XXH3_64_large(input, length);
|
|
291
|
+
}
|
|
292
|
+
}
|
metadata
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: prism
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.0
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
platform: x86_64-linux-gnu
|
|
6
6
|
authors:
|
|
7
|
-
-
|
|
7
|
+
- Ruby developers
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies: []
|
|
12
12
|
email:
|
|
13
|
-
- ruby@
|
|
13
|
+
- ruby-core@ruby-lang.org
|
|
14
14
|
executables: []
|
|
15
15
|
extensions: []
|
|
16
16
|
extra_rdoc_files: []
|
|
@@ -47,13 +47,22 @@ files:
|
|
|
47
47
|
- ext/prism/extension.c
|
|
48
48
|
- ext/prism/extension.h
|
|
49
49
|
- include/prism.h
|
|
50
|
+
- include/prism.hpp
|
|
50
51
|
- include/prism/arena.h
|
|
52
|
+
- include/prism/arena.hpp
|
|
51
53
|
- include/prism/ast.h
|
|
54
|
+
- include/prism/ast.hpp
|
|
52
55
|
- include/prism/buffer.h
|
|
56
|
+
- include/prism/buffer.hpp
|
|
53
57
|
- include/prism/comments.h
|
|
54
58
|
- include/prism/compiler/accel.h
|
|
55
59
|
- include/prism/compiler/align.h
|
|
56
60
|
- include/prism/compiler/assume.h
|
|
61
|
+
- include/prism/compiler/branch.h
|
|
62
|
+
- include/prism/compiler/bswap.h
|
|
63
|
+
- include/prism/compiler/cplusplus.hpp
|
|
64
|
+
- include/prism/compiler/endianness.h
|
|
65
|
+
- include/prism/compiler/exceptions.hpp
|
|
57
66
|
- include/prism/compiler/exported.h
|
|
58
67
|
- include/prism/compiler/fallthrough.h
|
|
59
68
|
- include/prism/compiler/filesystem.h
|
|
@@ -61,6 +70,7 @@ files:
|
|
|
61
70
|
- include/prism/compiler/force_inline.h
|
|
62
71
|
- include/prism/compiler/format.h
|
|
63
72
|
- include/prism/compiler/inline.h
|
|
73
|
+
- include/prism/compiler/lifetimebound.hpp
|
|
64
74
|
- include/prism/compiler/nodiscard.h
|
|
65
75
|
- include/prism/compiler/nonnull.h
|
|
66
76
|
- include/prism/compiler/unused.h
|
|
@@ -96,18 +106,24 @@ files:
|
|
|
96
106
|
- include/prism/internal/strncasecmp.h
|
|
97
107
|
- include/prism/internal/strpbrk.h
|
|
98
108
|
- include/prism/internal/tokens.h
|
|
109
|
+
- include/prism/internal/xxh3.h
|
|
99
110
|
- include/prism/json.h
|
|
100
111
|
- include/prism/line_offset_list.h
|
|
101
112
|
- include/prism/magic_comments.h
|
|
102
113
|
- include/prism/node.h
|
|
114
|
+
- include/prism/node.hpp
|
|
115
|
+
- include/prism/node_type.hpp
|
|
103
116
|
- include/prism/options.h
|
|
117
|
+
- include/prism/options.hpp
|
|
104
118
|
- include/prism/parser.h
|
|
119
|
+
- include/prism/parser.hpp
|
|
105
120
|
- include/prism/prettyprint.h
|
|
106
121
|
- include/prism/serialize.h
|
|
107
122
|
- include/prism/source.h
|
|
108
123
|
- include/prism/stream.h
|
|
109
124
|
- include/prism/string_query.h
|
|
110
125
|
- include/prism/stringy.h
|
|
126
|
+
- include/prism/stringy.hpp
|
|
111
127
|
- include/prism/version.h
|
|
112
128
|
- lib/prism.rb
|
|
113
129
|
- lib/prism/3.3/prism.so
|
|
@@ -229,6 +245,7 @@ files:
|
|
|
229
245
|
- src/strncasecmp.c
|
|
230
246
|
- src/strpbrk.c
|
|
231
247
|
- src/tokens.c
|
|
248
|
+
- src/xxh3.c
|
|
232
249
|
homepage: https://github.com/ruby/prism
|
|
233
250
|
licenses:
|
|
234
251
|
- MIT
|