leptris 1.9.255.2-aarch64-linux → 1.9.260.0-aarch64-linux

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 583e62637e873d0b31061bbec3c5d349bda4758bb6f726096946eb1253ca2a2e
4
- data.tar.gz: 8a0a7157c908c99229aa526a5e94d0c2096ec4104f12a6b052ad5c6e17262d23
3
+ metadata.gz: 39822128a76bd5e8577fa205e78b12fb8c7d6cd650cd2203119fe4149df7aae6
4
+ data.tar.gz: 7a1758bf64416c5fa68cb74e87cde097fa5e723545f421034c0eb2d3bb82a9c3
5
5
  SHA512:
6
- metadata.gz: c6ae63770d8178e4d37686f4f5e112b0fbbdd8a83ee5829c3d6f40735ae0be181ad151376a339d379b97915eb478a580e24b3b09bd666135f0819b6641f59a76
7
- data.tar.gz: 6a102e04847a8726457aa291c481951418920f9d4b4e29562695ac851bc3243ce25f31f439fd0125a5e96d5527babaf1b38079d18e5a3cf37269e4ed90b17108
6
+ metadata.gz: c21d9c66e827d8ea0e5630ede4b1a29605cffa57cc0f9afe031d83d07e7c02105632c651fe3833809156eee93bfc7e2c60e964850262633fc7df23e199936f22
7
+ data.tar.gz: 407422ade60aa9fec1013685f4f8a27ea7218ff102792b44b08bea1fd326b2018a2e2ac4c918948ce97a83ed0be764dde77442831b70a1925ccc116894049425
data/CHANGELOG.md CHANGED
@@ -5,6 +5,23 @@ All notable changes to Leptris will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.9.260.0] - 2026-09-27
9
+
10
+ ### Fixed
11
+
12
+ - Vendored libleptris 1.9.260 (riding 1.9.256-1.9.260):
13
+ - xquery: numeric variable predicates are positional, not EBV
14
+ (v1.9.256); typed-scalar carriers convert in the single-item
15
+ predicate path (v1.9.259); the bare FLWOR initializer scan
16
+ terminates at outer clause words (v1.9.260).
17
+
18
+ ### Performance — engine sync
19
+
20
+ - Lane 18 rounds 1-2 (v1.9.257/258): duplicate-attribute scan via
21
+ a per-element FNV-1a hash prefilter (was an O(N^2) memcmp walk)
22
+ and namebp document resolution before the locked root-map
23
+ lookup — builder append 39.7 -> ~30 ns/child.
24
+
8
25
  ## [1.9.255.0] - 2026-09-26
9
26
 
10
27
  ### Fixed
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ RSpec::Core::RakeTask.new(:spec)
8
8
  # Pin for `rake compile` and the platform-gem builds. Keep in lockstep
9
9
  # with .github/workflows/build.yml (which calls `rake compile`) and the
10
10
  # CHANGELOG when libleptris releases.
11
- LIBLEPTRIS_VERSION = "1.9.255"
11
+ LIBLEPTRIS_VERSION = "1.9.260"
12
12
  # Vendored alongside libleptris for fn:normalize-unicode (TODO
13
13
  # .restructure/20): built per platform with a RELOCATABLE @rpath
14
14
  # install name, loaded by ffi.rb before libleptris so the
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leptris
4
- VERSION = "1.9.255.2"
4
+ VERSION = "1.9.260.0"
5
5
  end
data/lib/libleptris.so CHANGED
Binary file
data/vendor-src/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Sources vendored in this gem (recompile rights; the ruby
2
2
  variant builds them at install via extconf.rb):
3
3
 
4
- - libleptris v1.9.255
4
+ - libleptris v1.9.260
5
5
  - utf8proc v2.11.0
6
6
 
7
7
  Rebuild by hand:
@@ -1,5 +1,49 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.9.260] - 2026-09-27
4
+
5
+ ### Fixed
6
+
7
+ - bare FLWOR initializer scan terminates at outer clause words (xquery)
8
+
9
+
10
+
11
+ ## [1.9.259] - 2026-09-26
12
+
13
+ <!-- Edit this section with the actual release notes. -->
14
+ <!-- See https://keepachangelog.com for format guidance. -->
15
+
16
+ ### Changed
17
+
18
+ - (describe changes here)
19
+
20
+
21
+ ## [1.9.258] - 2026-09-26
22
+
23
+ <!-- Edit this section with the actual release notes. -->
24
+ <!-- See https://keepachangelog.com for format guidance. -->
25
+
26
+ ### Changed
27
+
28
+ - (describe changes here)
29
+
30
+
31
+ ## [1.9.257] - 2026-09-26
32
+
33
+ ### Performance
34
+
35
+ - resolve namebp documents before the locked root-map lookup (dom)
36
+
37
+
38
+
39
+ ## [1.9.256] - 2026-09-26
40
+
41
+ ### Fixed
42
+
43
+ - numeric variable predicates are positional, not EBV (xquery)
44
+
45
+
46
+
3
47
  ## [1.9.255] - 2026-09-26
4
48
 
5
49
  <!-- Edit this section with the actual release notes. -->
@@ -3,7 +3,7 @@
3
3
  cmake_minimum_required(VERSION 3.20)
4
4
 
5
5
  project(leptris
6
- VERSION 1.9.255
6
+ VERSION 1.9.260
7
7
  DESCRIPTION "Fast XML parser and XPath evaluator in pure C"
8
8
  LANGUAGES C CXX
9
9
  )
@@ -414,6 +414,14 @@ struct leptris_document* leptris_element_get_document(LeptrisElement elem) {
414
414
  if (!parent) break;
415
415
  cur = parent;
416
416
  }
417
+ /* Lane 18 P2: resolve the namebp backpointer BEFORE the locked
418
+ * map. Fast-path-created roots (mut_elem_carve) carry the doc
419
+ * statelessly in the name slot and never register, so the map
420
+ * below always misses for them — the append/builder loop paid
421
+ * the mutex on every call to reach the same answer. The namebp
422
+ * value is stamped at create and cannot go stale. */
423
+ if (cur->name && leptris_elem_has_namebp(cur))
424
+ return leptris_elem_namebp_doc(cur);
417
425
  /* Locked bucket walk with an UNDER-THE-LOCK generation
418
426
  * snapshot: a death that acquires the lock after we release
419
427
  * bumps the global generation past our snapshot, so the primed
@@ -1004,7 +1004,8 @@ struct leptris_xpath_result* evaluate_expr(XPathContext* ctx, XPathASTNode* ast)
1004
1004
  ctx->context_position = 1;
1005
1005
  ctx->context_size = 1;
1006
1006
  struct leptris_xpath_result* pr =
1007
- evaluate_expr(ctx, pred);
1007
+ leptris_pred_scalar_convert(
1008
+ evaluate_expr(ctx, pred));
1008
1009
  ctx->context_node = old_node;
1009
1010
  ctx->context_position = old_pos;
1010
1011
  ctx->context_size = old_size;
@@ -76,6 +76,11 @@ struct leptris_xpath_result* evaluate_expr(XPathContext* ctx, XPathASTNode* ast)
76
76
  /* Marker-aware atomic eq over raw item strings (evaluator_operators.c). */
77
77
  int leptris_atom_seq_eq_n(const char* a, const char* b, int nan_equal);
78
78
 
79
+ /* Typed-scalar carrier conversion for predicates (evaluator_path.c):
80
+ * takes ownership; single numeric-marker carriers become NUMBER. */
81
+ struct leptris_xpath_result* leptris_pred_scalar_convert(
82
+ struct leptris_xpath_result* r);
83
+
79
84
  /* xs:time lexical -> timezone-normalized seconds (cycle = mod 86400
80
85
  * for equality; linear = unbounded for ordering); either out may be
81
86
  * NULL. Returns 0 when s is not a time lexical. */
@@ -281,6 +281,34 @@ int matches_node_test(XPathContext* ctx, LeptrisNode* node, XPathASTNode* test)
281
281
  /* Helper: Evaluate a single predicate for a node in-place
282
282
  * Returns 1 if node matches predicate, 0 otherwise
283
283
  */
284
+ /* Typed-scalar carrier conversion for predicates: the xq driver
285
+ * binds every variable as a sequence carrier, so a numeric atomic
286
+ * rides one marked text node. A bare variable predicate must then be
287
+ * POSITIONAL (number -> position compare), not EBV-of-a-one-item
288
+ * sequence (cbcl-distinct-values-007). Takes ownership of r; when
289
+ * converted, the carrier copy is freed through the result and a
290
+ * fresh NUMBER result returns. NULL propagates. */
291
+ struct leptris_xpath_result* leptris_pred_scalar_convert(
292
+ struct leptris_xpath_result* r) {
293
+ if (!r || r->type != XPATH_RESULT_NODESET || !r->value.nodeset_value ||
294
+ r->value.nodeset_value->count != 1 ||
295
+ !r->value.nodeset_value->nodes[0] ||
296
+ XPATH_NODE_TYPE(r->value.nodeset_value->nodes[0]) !=
297
+ LEPTRIS_NODE_TEXT)
298
+ return r;
299
+ const char* c =
300
+ ((XPathTextNode*)r->value.nodeset_value->nodes[0])->content;
301
+ if (!c || c[0] != '\x03' ||
302
+ (c[1] != 'N' && c[1] != 'F' && c[1] != 'D'))
303
+ return r;
304
+ double v = strtod(c + 2, NULL);
305
+ xpath_result_free(r);
306
+ struct leptris_xpath_result* out =
307
+ xpath_result_new(XPATH_RESULT_NUMBER);
308
+ if (out) out->value.number_value = v;
309
+ return out;
310
+ }
311
+
284
312
  static int evaluate_predicate_for_node(XPathContext* ctx,
285
313
  void* node,
286
314
  XPathASTNode* predicate,
@@ -328,6 +356,9 @@ static int evaluate_predicate_for_node(XPathContext* ctx,
328
356
  struct leptris_xpath_result* pred_result = evaluate_expr(ctx, predicate);
329
357
  int matches = 0;
330
358
 
359
+ pred_result = leptris_pred_scalar_convert(pred_result);
360
+ if (!pred_result) return 0;
361
+
331
362
  if (pred_result) {
332
363
  /* Numeric predicate: matches position */
333
364
  if (pred_result->type == XPATH_RESULT_NUMBER) {
@@ -173,24 +173,39 @@ static int is_clause_word(const char* w, size_t len) {
173
173
  /* Advance over one FLWOR expression segment: stops before a clause
174
174
  * keyword at nesting depth 0 (a bare word delimited by whitespace
175
175
  * or segment end). */
176
- static void scan_expr_segment(Scan* s, int stop_at_comma) {
176
+ static void scan_expr_segment(Scan* s, int stop_at_comma,
177
+ int allow_bare_flwor) {
177
178
  int depth = 0;
179
+ /* A binding expression that STARTS with for/let is a bare
180
+ * nested FLWOR (let $x := for ... return ...): its clause
181
+ * keywords are inert and `return` closes the nesting. Segments
182
+ * that merely CONTAIN a depth-0 for/let after a complete
183
+ * expression (for $i in (1,2,3) let ...) keep the old boundary.
184
+ * allow_bare_flwor arms the check for the first word only. */
185
+ int flwor_nest = 0;
186
+ int seen_token = 0; /* any non-space token consumed yet? */
178
187
  while (s->p < s->end) {
179
188
  char c = *s->p;
180
189
  if (c == '\'' || c == '"') {
181
190
  scan_string(s);
191
+ seen_token = 1;
182
192
  continue;
183
193
  }
184
194
  if (c == '`') {
185
195
  s->p++;
186
196
  while (s->p < s->end && *s->p != '`') s->p++;
187
197
  if (s->p < s->end) s->p++;
198
+ seen_token = 1;
188
199
  continue;
189
200
  }
190
- if (c == '(' || c == '[' || c == '{') depth++;
201
+ if (c == '(' || c == '[' || c == '{') {
202
+ depth++;
203
+ seen_token = 1;
204
+ }
191
205
  else if (c == ')' || c == ']' || c == '}') {
192
206
  if (depth == 0) return; /* segment boundary */
193
207
  depth--;
208
+ seen_token = 1;
194
209
  } else if (c == ',' && depth == 0 && stop_at_comma) {
195
210
  return;
196
211
  } else if (depth == 0 &&
@@ -202,9 +217,25 @@ static void scan_expr_segment(Scan* s, int stop_at_comma) {
202
217
  * by whitespace/segment end. scan_word does not
203
218
  * advance the cursor — look past the word. */
204
219
  const char* after = w + wl;
205
- if (after >= s->end || isspace((unsigned char)*after))
206
- return;
220
+ int at_boundary =
221
+ after >= s->end || isspace((unsigned char)*after);
222
+ if (at_boundary && !seen_token && allow_bare_flwor &&
223
+ (word_is(w, wl, "for") || word_is(w, wl, "let"))) {
224
+ flwor_nest = 1;
225
+ seen_token = 1;
226
+ s->p += wl;
227
+ continue;
228
+ }
229
+ if (at_boundary && flwor_nest > 0) {
230
+ if (word_is(w, wl, "return")) flwor_nest--;
231
+ seen_token = 1;
232
+ s->p += wl;
233
+ continue;
234
+ }
235
+ seen_token = 1;
236
+ if (at_boundary) return;
207
237
  }
238
+ seen_token = 1;
208
239
  s->p += wl ? wl : 1;
209
240
  continue;
210
241
  }
@@ -1424,7 +1455,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1424
1455
  }
1425
1456
  s.p = iw + iwl;
1426
1457
  Scan e = s;
1427
- scan_expr_segment(&e, 0);
1458
+ scan_expr_segment(&e, 0, 0);
1428
1459
  wc.win.domain = parse_expr_span(s.p, e.p);
1429
1460
  if (!wc.win.domain) {
1430
1461
  xq_clause_partial_free(&wc);
@@ -1471,7 +1502,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1471
1502
  if (wwl2 && word_is(ww, wwl2, "when")) {
1472
1503
  s.p = ww + wwl2;
1473
1504
  Scan se = s;
1474
- scan_expr_segment(&se, 0);
1505
+ scan_expr_segment(&se, 0, 0);
1475
1506
  wc.win.s_when =
1476
1507
  parse_expr_span(s.p, se.p);
1477
1508
  if (!wc.win.s_when) {
@@ -1520,7 +1551,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1520
1551
  if (wwl2 && word_is(ww, wwl2, "when")) {
1521
1552
  s.p = ww + wwl2;
1522
1553
  Scan ee = s;
1523
- scan_expr_segment(&ee, 0);
1554
+ scan_expr_segment(&ee, 0, 0);
1524
1555
  wc.win.e_when =
1525
1556
  parse_expr_span(s.p, ee.p);
1526
1557
  if (!wc.win.e_when) {
@@ -1616,7 +1647,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1616
1647
  s.p += 2;
1617
1648
  }
1618
1649
  Scan e = s;
1619
- scan_expr_segment(&e, 1);
1650
+ scan_expr_segment(&e, 1, 1);
1620
1651
  XPathASTNode* expr = parse_expr_span(s.p, e.p);
1621
1652
  if (!expr) {
1622
1653
  free(var);
@@ -1649,7 +1680,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1649
1680
  }
1650
1681
  } else if (word_is(kw, kwl, "where")) {
1651
1682
  Scan e = s;
1652
- scan_expr_segment(&e, 0);
1683
+ scan_expr_segment(&e, 0, 0);
1653
1684
  /* WHERE after GROUP BY filters the GROUPED
1654
1685
  * tuples (aggregates see the whole group) */
1655
1686
  XPathASTNode* w_ast = parse_expr_span(s.p, e.p);
@@ -1722,7 +1753,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1722
1753
  s.p[1] == '=') {
1723
1754
  s.p += 2;
1724
1755
  Scan e = s;
1725
- scan_expr_segment(&e, 0);
1756
+ scan_expr_segment(&e, 0, 0);
1726
1757
  gk = parse_expr_span(s.p, e.p);
1727
1758
  if (!gk) {
1728
1759
  free(gvar);
@@ -1800,7 +1831,7 @@ LEPTRIS_API LeptrisXQuery leptris_xquery_parse(const char* query,
1800
1831
  for (;;) {
1801
1832
  scan_ws(&s);
1802
1833
  Scan e = s;
1803
- scan_expr_segment(&e, 1); /* stop at ',' */
1834
+ scan_expr_segment(&e, 1, 1); /* stop at ',' */
1804
1835
  XPathASTNode* key = parse_expr_span(s.p, e.p);
1805
1836
  if (!key) {
1806
1837
  xq_free(q);
@@ -160,7 +160,13 @@ TEST(DomBasics, DocumentSetRootRejectsParentedElement) {
160
160
  TEST(DomBasics, RootDocMemoClearedWhenRootUnregisters) {
161
161
  LeptrisDocument doc = leptris_document_create();
162
162
  ASSERT_NE(doc, nullptr);
163
- LeptrisElement e = leptris_element_create(doc, "r");
163
+ /* A >254-char name forces the pool-fallback create: no namebp
164
+ * backpointer, so the element is MAP-resolved. Lane 18 P2 made
165
+ * namebp-carrying elements resolve statelessly before the map
166
+ * (no memo to prime, nothing to invalidate); the unregistration
167
+ * contract below is about the map-primed memo. */
168
+ std::string long_name(300, 'x');
169
+ LeptrisElement e = leptris_element_create(doc, long_name.c_str());
164
170
  ASSERT_NE(e, nullptr);
165
171
  leptris_root_doc_register(e, doc);
166
172
  /* Prime the memo through a resolution. */
@@ -983,14 +983,21 @@ TEST(Qt3Subset, FnDistinctValues) {
983
983
  * fn-distinct-values-1 (Bugzilla 5183: float must promote UP to
984
984
  * double, never the reverse) close with F&O promotion in the
985
985
  * dedup comparator. */
986
- /* fn-distinct-values-2 adopted: the assert-permutation
987
- * harness expands "N to M" range tokens (values were already
988
- * engine-correct; the blocker was harness-side). */
989
- run_test_set("fn/distinct-values.xml", {}, 98, {},
986
+ /* cbcl-distinct-values-007: both halves are in (tz-normalized
987
+ * time equality + typed-scalar predicates) and the query is
988
+ * correct on macOS, but Linux/ASAN still evaluates
989
+ * xs:dayTimeDuration("PT0S")[$p] with the at-bound position as
990
+ * EBV-true (all-Z output) — a narrow platform divergence to
991
+ * chase separately. */
992
+ /* cbcl-distinct-values-007 now passes everywhere: BOTH predicate
993
+ * paths convert typed-scalar carriers (the nodeset-base path via
994
+ * evaluate_predicate_for_node AND the single-item base path in
995
+ * the XPATH_AST_PREDICATE handler — xs:dayTimeDuration("PT0S")[$p]
996
+ * takes the latter). */
997
+ run_test_set("fn/distinct-values.xml", {}, 99, {},
990
998
  {
991
999
  "cbcl-distinct-values-002",
992
1000
  "cbcl-distinct-values-002b",
993
- "cbcl-distinct-values-007",
994
1001
 
995
1002
  });
996
1003
  }
@@ -66,6 +66,27 @@ TEST(XQueryCore, PrologVariableAndFlwor) {
66
66
  leptris_document_free(doc);
67
67
  }
68
68
 
69
+ TEST(XQueryCore, BareFlworInitializer) {
70
+ /* A binding expression may itself start a FLWOR without
71
+ * parentheses; the OUTER clause words (let/order by/where/
72
+ * return) must still terminate the inner scan. Regression
73
+ * shape from QT3 K2-OrderbyExprWithout. */
74
+ LeptrisDocument doc = leptris_parse_string("<r/>", 4, nullptr);
75
+ ASSERT_NE(doc, nullptr);
76
+ EXPECT_EQ(seq_string(doc,
77
+ "let $x := for $i in (1,2) return $i * 10 return $x"),
78
+ "10 20");
79
+ EXPECT_EQ(seq_string(doc,
80
+ "for $a in (1, 4, 2) let $i := (1, 3, 2) "
81
+ "order by $a return $i"),
82
+ "1 3 2 1 3 2 1 3 2");
83
+ EXPECT_EQ(seq_string(doc,
84
+ "for $i in (1, 2, 3) let $s := $i * $i "
85
+ "where $i > 1 return $s"),
86
+ "4 9");
87
+ leptris_document_free(doc);
88
+ }
89
+
69
90
  TEST(XQueryCore, OrderByDescending) {
70
91
  LeptrisDocument doc = leptris_parse_string(kBooks, strlen(kBooks),
71
92
  nullptr);
@@ -1215,6 +1236,52 @@ TEST(XQueryCore, MixedNumericCompare) {
1215
1236
  }
1216
1237
 
1217
1238
 
1239
+ TEST(XQueryCore, VarPredicatePositional) {
1240
+ LeptrisDocument doc = leptris_parse_string("<e/>", 4, nullptr);
1241
+ ASSERT_NE(doc, nullptr);
1242
+ struct {
1243
+ const char* q;
1244
+ const char* want;
1245
+ } cases[] = {
1246
+ /* a numeric variable is a POSITIONAL predicate: position()
1247
+ * = $p — not EBV. The xq driver binds vars as sequence
1248
+ * carriers, so the bare-var predicate took the EBV-true
1249
+ * path and kept the whole sequence. */
1250
+ {"let $p := 2 return count((10,20,30)[$p])", "1"},
1251
+ {"let $p := 2 return (10,20,30)[$p]", "20"},
1252
+ {"string-join(for $p in (2,3) return"
1253
+ " string((10,20,30)[$p]), '|')", "20|30"},
1254
+ {"let $p := 2.0 return count((10,20,30)[$p])", "1"},
1255
+ {/* cbcl-distinct-values-007's shape: positional predicate
1256
+ * on a singleton sequence (function-call base) */
1257
+ "let $p := 1 return"
1258
+ " count(xs:dayTimeDuration('PT0S')[$p])", "1"},
1259
+ {/* single-item base path: the XQUERY entry must convert the
1260
+ * carrier in the AST_PREDICATE handler too */
1261
+ "let $p := 2 return"
1262
+ " string(adjust-time-to-timezone(xs:time('12:00:00'),"
1263
+ " (xs:dayTimeDuration('PT0S')[$p])))", "12:00:00"},
1264
+ {"count(distinct-values((xs:time('12:00:00'),"
1265
+ " xs:time('12:00:00'), xs:time('20:00:00'),"
1266
+ " xs:time('01:00:00+12:00'), xs:time('02:00:00+13:00'))))",
1267
+ "3"},
1268
+ };
1269
+ for (auto& c : cases) {
1270
+ LeptrisXQuery xq = leptris_xquery_parse(c.q, strlen(c.q));
1271
+ ASSERT_NE(xq, nullptr) << c.q;
1272
+ LeptrisXPathResult r = leptris_xquery_eval(xq, doc, NULL);
1273
+ ASSERT_NE(r, nullptr) << c.q;
1274
+ char* s = leptris_xpath_result_string(r);
1275
+ ASSERT_NE(s, nullptr) << c.q;
1276
+ EXPECT_STREQ(s, c.want) << c.q;
1277
+ leptris_free_string(s);
1278
+ leptris_xpath_result_free(r);
1279
+ leptris_xquery_free(xq);
1280
+ }
1281
+ leptris_document_free(doc);
1282
+ }
1283
+
1284
+
1218
1285
  TEST(XQueryCore, TimeTzEq) {
1219
1286
  LeptrisDocument doc = leptris_parse_string("<e/>", 4, nullptr);
1220
1287
  ASSERT_NE(doc, nullptr);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
3
3
  "name": "leptris",
4
- "version": "1.9.255",
4
+ "version": "1.9.260",
5
5
  "description": "High-performance XML parser and XPath 1.0 engine in C (libleptris)",
6
6
  "homepage": "https://github.com/leptris/leptris",
7
7
  "license": "MIT",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leptris
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.255.2
4
+ version: 1.9.260.0
5
5
  platform: aarch64-linux
6
6
  authors:
7
7
  - Ribose Inc.