From 3b22c8b9ce5e769676f563e131df5e6c2e463b7f Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 14 Oct 2026 17:33:45 -0300 Subject: [PATCH 1/3] Unbreak Release builds under GCC 14 and MSVC 19.44 Signed-off-by: Juan Cruz Viotti --- src/core/jsonschema/known_resolver.cmake | 169 +++++++++++++++-------- src/lang/numeric/big_coefficient.h | 16 +-- 2 files changed, 116 insertions(+), 69 deletions(-) diff --git a/src/core/jsonschema/known_resolver.cmake b/src/core/jsonschema/known_resolver.cmake index 7ffe0dd31..60d24d2f5 100644 --- a/src/core/jsonschema/known_resolver.cmake +++ b/src/core/jsonschema/known_resolver.cmake @@ -3,102 +3,149 @@ if(NOT PROJECT_SOURCE_DIR) message(FATAL_ERROR "Missing PROJECT_SOURCE_DIR") endif() +# MSVC caps a single string literal at 16380 bytes, and the schemas embedded +# below are free to be larger than that. Anything over the cap is handed to the +# compiler as adjacent literals instead, which it joins back into the one string +# the template asked for. The splice closes and reopens the raw literal spelled +# in the template, so the two have to agree on the delimiter +function(read_schema path variable) + # Short of what the compiler allows, because a template is free to wrap the + # schema in a literal of its own and the chunks carry that weight too + set(maximum_length 15000) + set(splice ")EOF\"\n R\"EOF(") + + file(READ "${path}" content) + string(LENGTH "${content}" total) + if(total LESS_EQUAL maximum_length) + set("${variable}" "${content}" PARENT_SCOPE) + return() + endif() + + set(result "") + set(offset 0) + while(TRUE) + math(EXPR remaining "${total} - ${offset}") + if(remaining LESS_EQUAL maximum_length) + string(SUBSTRING "${content}" ${offset} ${remaining} chunk) + string(APPEND result "${chunk}") + break() + endif() + + string(SUBSTRING "${content}" ${offset} ${maximum_length} chunk) + + # Splitting on a line ending keeps every chunk a run of whole lines, so the + # generated source stays readable and no character is ever cut in half + string(FIND "${chunk}" "\n" boundary REVERSE) + if(boundary GREATER 0) + math(EXPR size "${boundary} + 1") + string(SUBSTRING "${chunk}" 0 ${size} chunk) + else() + set(size ${maximum_length}) + endif() + + string(APPEND result "${chunk}${splice}") + math(EXPR offset "${offset} + ${size}") + endwhile() + + set("${variable}" "${result}" PARENT_SCOPE) +endfunction() + # JSON Schema 2020-12 set(JSON_SCHEMA_2020_12_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-2020-12") -file(READ "${JSON_SCHEMA_2020_12_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2020_12) -file(READ "${JSON_SCHEMA_2020_12_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2020_12) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2020_12_APPLICATOR) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2020_12_CONTENT) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2020_12_CORE) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/format-annotation.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ANNOTATION) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/format-assertion.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ASSERTION) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2020_12_HYPER_SCHEMA) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2020_12_META_DATA) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/unevaluated.json" METASCHEMA_JSONSCHEMA_2020_12_UNEVALUATED) -file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2020_12_VALIDATION) -file(READ "${JSON_SCHEMA_2020_12_DIR}/links.json" METASCHEMA_LINKS_2020_12) -file(READ "${JSON_SCHEMA_2020_12_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2020_12_OUTPUT) +read_schema("${JSON_SCHEMA_2020_12_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2020_12) +read_schema("${JSON_SCHEMA_2020_12_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2020_12) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2020_12_APPLICATOR) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2020_12_CONTENT) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2020_12_CORE) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/format-annotation.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ANNOTATION) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/format-assertion.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ASSERTION) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2020_12_HYPER_SCHEMA) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2020_12_META_DATA) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/unevaluated.json" METASCHEMA_JSONSCHEMA_2020_12_UNEVALUATED) +read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2020_12_VALIDATION) +read_schema("${JSON_SCHEMA_2020_12_DIR}/links.json" METASCHEMA_LINKS_2020_12) +read_schema("${JSON_SCHEMA_2020_12_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2020_12_OUTPUT) # JSON Schema 2019-09 set(JSON_SCHEMA_2019_09_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-2019-09") -file(READ "${JSON_SCHEMA_2019_09_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2019_09) -file(READ "${JSON_SCHEMA_2019_09_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2019_09_APPLICATOR) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2019_09_CONTENT) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2019_09_CORE) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/format.json" METASCHEMA_JSONSCHEMA_2019_09_FORMAT) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2019_09_HYPER_SCHEMA) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2019_09_META_DATA) -file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2019_09_VALIDATION) -file(READ "${JSON_SCHEMA_2019_09_DIR}/links.json" METASCHEMA_LINKS_2019_09) -file(READ "${JSON_SCHEMA_2019_09_DIR}/output/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09_OUTPUT) -file(READ "${JSON_SCHEMA_2019_09_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2019_09_OUTPUT) +read_schema("${JSON_SCHEMA_2019_09_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2019_09) +read_schema("${JSON_SCHEMA_2019_09_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2019_09_APPLICATOR) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2019_09_CONTENT) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2019_09_CORE) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/format.json" METASCHEMA_JSONSCHEMA_2019_09_FORMAT) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2019_09_HYPER_SCHEMA) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2019_09_META_DATA) +read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2019_09_VALIDATION) +read_schema("${JSON_SCHEMA_2019_09_DIR}/links.json" METASCHEMA_LINKS_2019_09) +read_schema("${JSON_SCHEMA_2019_09_DIR}/output/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09_OUTPUT) +read_schema("${JSON_SCHEMA_2019_09_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2019_09_OUTPUT) # JSON Schema Draft7 set(JSON_SCHEMA_DRAFT7_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft7") -file(READ "${JSON_SCHEMA_DRAFT7_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT7) -file(READ "${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT7) -file(READ "${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema-output.json" METASCHEMA_HYPERSCHEMA_DRAFT7_OUTPUT) -file(READ "${JSON_SCHEMA_DRAFT7_DIR}/links.json" METASCHEMA_LINKS_DRAFT7) +read_schema("${JSON_SCHEMA_DRAFT7_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT7) +read_schema("${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT7) +read_schema("${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema-output.json" METASCHEMA_HYPERSCHEMA_DRAFT7_OUTPUT) +read_schema("${JSON_SCHEMA_DRAFT7_DIR}/links.json" METASCHEMA_LINKS_DRAFT7) # JSON Schema Draft6 set(JSON_SCHEMA_DRAFT6_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft6") -file(READ "${JSON_SCHEMA_DRAFT6_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT6) -file(READ "${JSON_SCHEMA_DRAFT6_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT6) -file(READ "${JSON_SCHEMA_DRAFT6_DIR}/links.json" METASCHEMA_LINKS_DRAFT6) +read_schema("${JSON_SCHEMA_DRAFT6_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT6) +read_schema("${JSON_SCHEMA_DRAFT6_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT6) +read_schema("${JSON_SCHEMA_DRAFT6_DIR}/links.json" METASCHEMA_LINKS_DRAFT6) # JSON Schema Draft4 set(JSON_SCHEMA_DRAFT4_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft4") -file(READ "${JSON_SCHEMA_DRAFT4_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT4) -file(READ "${JSON_SCHEMA_DRAFT4_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT4) -file(READ "${JSON_SCHEMA_DRAFT4_DIR}/links.json" METASCHEMA_LINKS_DRAFT4) +read_schema("${JSON_SCHEMA_DRAFT4_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT4) +read_schema("${JSON_SCHEMA_DRAFT4_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT4) +read_schema("${JSON_SCHEMA_DRAFT4_DIR}/links.json" METASCHEMA_LINKS_DRAFT4) # JSON Schema Draft3 set(JSON_SCHEMA_DRAFT3_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft3") -file(READ "${JSON_SCHEMA_DRAFT3_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT3) -file(READ "${JSON_SCHEMA_DRAFT3_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT3) -file(READ "${JSON_SCHEMA_DRAFT3_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT3) -file(READ "${JSON_SCHEMA_DRAFT3_DIR}/links.json" METASCHEMA_LINKS_DRAFT3) +read_schema("${JSON_SCHEMA_DRAFT3_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT3) +read_schema("${JSON_SCHEMA_DRAFT3_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT3) +read_schema("${JSON_SCHEMA_DRAFT3_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT3) +read_schema("${JSON_SCHEMA_DRAFT3_DIR}/links.json" METASCHEMA_LINKS_DRAFT3) # JSON Schema Draft2 set(JSON_SCHEMA_DRAFT2_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft2") -file(READ "${JSON_SCHEMA_DRAFT2_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT2) -file(READ "${JSON_SCHEMA_DRAFT2_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT2) -file(READ "${JSON_SCHEMA_DRAFT2_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT2) -file(READ "${JSON_SCHEMA_DRAFT2_DIR}/links.json" METASCHEMA_LINKS_DRAFT2) +read_schema("${JSON_SCHEMA_DRAFT2_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT2) +read_schema("${JSON_SCHEMA_DRAFT2_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT2) +read_schema("${JSON_SCHEMA_DRAFT2_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT2) +read_schema("${JSON_SCHEMA_DRAFT2_DIR}/links.json" METASCHEMA_LINKS_DRAFT2) # JSON Schema Draft1 set(JSON_SCHEMA_DRAFT1_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft1") -file(READ "${JSON_SCHEMA_DRAFT1_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT1) -file(READ "${JSON_SCHEMA_DRAFT1_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT1) -file(READ "${JSON_SCHEMA_DRAFT1_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT1) -file(READ "${JSON_SCHEMA_DRAFT1_DIR}/links.json" METASCHEMA_LINKS_DRAFT1) +read_schema("${JSON_SCHEMA_DRAFT1_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT1) +read_schema("${JSON_SCHEMA_DRAFT1_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT1) +read_schema("${JSON_SCHEMA_DRAFT1_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT1) +read_schema("${JSON_SCHEMA_DRAFT1_DIR}/links.json" METASCHEMA_LINKS_DRAFT1) # JSON Schema Draft0 set(JSON_SCHEMA_DRAFT0_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft0") -file(READ "${JSON_SCHEMA_DRAFT0_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT0) -file(READ "${JSON_SCHEMA_DRAFT0_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT0) -file(READ "${JSON_SCHEMA_DRAFT0_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT0) -file(READ "${JSON_SCHEMA_DRAFT0_DIR}/links.json" METASCHEMA_LINKS_DRAFT0) +read_schema("${JSON_SCHEMA_DRAFT0_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT0) +read_schema("${JSON_SCHEMA_DRAFT0_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT0) +read_schema("${JSON_SCHEMA_DRAFT0_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT0) +read_schema("${JSON_SCHEMA_DRAFT0_DIR}/links.json" METASCHEMA_LINKS_DRAFT0) # OpenAPI v3.2 set(OPENAPI_3_2_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.2") -file(READ "${OPENAPI_3_2_DIR}/meta/2025-09-17" OPENAPI_OAS_3_2_META_2025_09_17) -file(READ "${OPENAPI_3_2_DIR}/dialect/2025-09-17" OPENAPI_OAS_3_2_DIALECT_2025_09_17) +read_schema("${OPENAPI_3_2_DIR}/meta/2025-09-17" OPENAPI_OAS_3_2_META_2025_09_17) +read_schema("${OPENAPI_3_2_DIR}/dialect/2025-09-17" OPENAPI_OAS_3_2_DIALECT_2025_09_17) # OpenAPI v3.1 set(OPENAPI_3_1_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.1") -file(READ "${OPENAPI_3_1_DIR}/meta/base" OPENAPI_OAS_3_1_META_BASE) -file(READ "${OPENAPI_3_1_DIR}/dialect/base" OPENAPI_OAS_3_1_DIALECT_BASE) -file(READ "${OPENAPI_3_1_DIR}/meta/2024-11-10" OPENAPI_OAS_3_1_META_2024_11_10) -file(READ "${OPENAPI_3_1_DIR}/dialect/2024-11-10" OPENAPI_OAS_3_1_DIALECT_2024_11_10) -file(READ "${OPENAPI_3_1_DIR}/meta/2024-10-25" OPENAPI_OAS_3_1_META_2024_10_25) -file(READ "${OPENAPI_3_1_DIR}/dialect/2024-10-25" OPENAPI_OAS_3_1_DIALECT_2024_10_25) +read_schema("${OPENAPI_3_1_DIR}/meta/base" OPENAPI_OAS_3_1_META_BASE) +read_schema("${OPENAPI_3_1_DIR}/dialect/base" OPENAPI_OAS_3_1_DIALECT_BASE) +read_schema("${OPENAPI_3_1_DIR}/meta/2024-11-10" OPENAPI_OAS_3_1_META_2024_11_10) +read_schema("${OPENAPI_3_1_DIR}/dialect/2024-11-10" OPENAPI_OAS_3_1_DIALECT_2024_11_10) +read_schema("${OPENAPI_3_1_DIR}/meta/2024-10-25" OPENAPI_OAS_3_1_META_2024_10_25) +read_schema("${OPENAPI_3_1_DIR}/dialect/2024-10-25" OPENAPI_OAS_3_1_DIALECT_2024_10_25) # OpenAPI v3.0 set(OPENAPI_3_0_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.0") -file(READ "${OPENAPI_3_0_DIR}/schema/2024-10-18" OPENAPI_OAS_3_0_SCHEMA_2024_10_18) -file(READ "${OPENAPI_3_0_DIR}/schema/2021-09-28" OPENAPI_OAS_3_0_SCHEMA_2021_09_28) +read_schema("${OPENAPI_3_0_DIR}/schema/2024-10-18" OPENAPI_OAS_3_0_SCHEMA_2024_10_18) +read_schema("${OPENAPI_3_0_DIR}/schema/2021-09-28" OPENAPI_OAS_3_0_SCHEMA_2021_09_28) if(NOT KNOWN_RESOLVER_INPUT) message(FATAL_ERROR "Missing KNOWN_RESOLVER_INPUT") diff --git a/src/lang/numeric/big_coefficient.h b/src/lang/numeric/big_coefficient.h index 1817e44b6..bd748541f 100644 --- a/src/lang/numeric/big_coefficient.h +++ b/src/lang/numeric/big_coefficient.h @@ -110,7 +110,10 @@ constexpr std::int64_t COMPACT_MAX = class BigCoefficient { static constexpr std::uint32_t INLINE_CAPACITY = 4; - std::array inline_words_; + // Every limb of the store stays written, and the ones at or past the length + // stay zero, which is what lets a value of fewer limbs than the store holds + // be read a limb at a time without reaching for one that was never written + std::array inline_words_{}; [[nodiscard]] auto is_inline() const -> bool { return this->capacity <= INLINE_CAPACITY; @@ -129,7 +132,6 @@ class BigCoefficient { if (requested_capacity <= INLINE_CAPACITY) { this->words = this->inline_words_.data(); this->capacity = INLINE_CAPACITY; - this->inline_words_.fill(0); } else { this->words = new std::uint64_t[requested_capacity](); this->capacity = requested_capacity; @@ -145,15 +147,14 @@ class BigCoefficient { BigCoefficient(BigCoefficient &&other) noexcept : length{other.length}, capacity{other.capacity} { if (other.is_inline()) { - std::copy(other.inline_words_.data(), - other.inline_words_.data() + other.length, - this->inline_words_.data()); + this->inline_words_ = other.inline_words_; this->words = this->inline_words_.data(); } else { this->words = other.words; other.words = other.inline_words_.data(); } + other.inline_words_.fill(0); other.length = 0; other.capacity = INLINE_CAPACITY; } @@ -167,15 +168,14 @@ class BigCoefficient { this->length = other.length; this->capacity = other.capacity; if (other.is_inline()) { - std::copy(other.inline_words_.data(), - other.inline_words_.data() + other.length, - this->inline_words_.data()); + this->inline_words_ = other.inline_words_; this->words = this->inline_words_.data(); } else { this->words = other.words; other.words = other.inline_words_.data(); } + other.inline_words_.fill(0); other.length = 0; other.capacity = INLINE_CAPACITY; } From 6e0089189a932e7d13ae7f98789b93c8fdf04d4e Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 14 Oct 2026 17:56:54 -0300 Subject: [PATCH 2/3] nicer Signed-off-by: Juan Cruz Viotti --- src/core/jsonschema/known_resolver.cmake | 198 +++++++++++------------ src/core/jsonschema/known_resolver.in.cc | 11 +- 2 files changed, 103 insertions(+), 106 deletions(-) diff --git a/src/core/jsonschema/known_resolver.cmake b/src/core/jsonschema/known_resolver.cmake index 60d24d2f5..2eeff0b0b 100644 --- a/src/core/jsonschema/known_resolver.cmake +++ b/src/core/jsonschema/known_resolver.cmake @@ -3,149 +3,145 @@ if(NOT PROJECT_SOURCE_DIR) message(FATAL_ERROR "Missing PROJECT_SOURCE_DIR") endif() -# MSVC caps a single string literal at 16380 bytes, and the schemas embedded -# below are free to be larger than that. Anything over the cap is handed to the -# compiler as adjacent literals instead, which it joins back into the one string -# the template asked for. The splice closes and reopens the raw literal spelled -# in the template, so the two have to agree on the delimiter -function(read_schema path variable) - # Short of what the compiler allows, because a template is free to wrap the - # schema in a literal of its own and the chunks carry that weight too - set(maximum_length 15000) - set(splice ")EOF\"\n R\"EOF(") +# The OpenAPI v3.0 Schema Object is only published as a definition of the +# document schema, so a dialect for it has to carry that document. Only the +# definitions the Schema Object reaches are of any use to such a dialect, and +# leaving the rest behind keeps the result within the length that the strictest +# compiler allows a single string literal to be +function(read_schema_object_definitions path variable) + set(reachable Schema Reference Discriminator ExternalDocumentation XML) file(READ "${path}" content) - string(LENGTH "${content}" total) - if(total LESS_EQUAL maximum_length) - set("${variable}" "${content}" PARENT_SCOPE) - return() - endif() - - set(result "") - set(offset 0) - while(TRUE) - math(EXPR remaining "${total} - ${offset}") - if(remaining LESS_EQUAL maximum_length) - string(SUBSTRING "${content}" ${offset} ${remaining} chunk) - string(APPEND result "${chunk}") - break() - endif() - - string(SUBSTRING "${content}" ${offset} ${maximum_length} chunk) - # Splitting on a line ending keeps every chunk a run of whole lines, so the - # generated source stays readable and no character is ever cut in half - string(FIND "${chunk}" "\n" boundary REVERSE) - if(boundary GREATER 0) - math(EXPR size "${boundary} + 1") - string(SUBSTRING "${chunk}" 0 ${size} chunk) - else() - set(size ${maximum_length}) + string(JSON total LENGTH "${content}" definitions) + math(EXPR last "${total} - 1") + set(unreachable "") + foreach(index RANGE ${last}) + string(JSON name MEMBER "${content}" definitions ${index}) + if(NOT "${name}" IN_LIST reachable) + list(APPEND unreachable "${name}") endif() + endforeach() + foreach(name IN LISTS unreachable) + string(JSON content REMOVE "${content}" definitions "${name}") + endforeach() + + # The document-level constraints go as a whole, as the definitions they reach + # for are exactly the ones left behind + foreach(member IN ITEMS type required properties patternProperties + additionalProperties) + string(JSON content REMOVE "${content}" "${member}") + endforeach() + + # What is kept has to stand on its own, as a reference to a definition that + # was left behind would resolve nowhere + string(REGEX MATCHALL "#/definitions/[A-Za-z]+" references "${content}") + foreach(reference IN LISTS references) + string(REPLACE "#/definitions/" "" name "${reference}") + if(NOT "${name}" IN_LIST reachable) + message(FATAL_ERROR "Unreachable OpenAPI v3.0 definition: ${name}") + endif() + endforeach() - string(APPEND result "${chunk}${splice}") - math(EXPR offset "${offset} + ${size}") - endwhile() - - set("${variable}" "${result}" PARENT_SCOPE) + set("${variable}" "${content}" PARENT_SCOPE) endfunction() # JSON Schema 2020-12 set(JSON_SCHEMA_2020_12_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-2020-12") -read_schema("${JSON_SCHEMA_2020_12_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2020_12) -read_schema("${JSON_SCHEMA_2020_12_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2020_12) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2020_12_APPLICATOR) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2020_12_CONTENT) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2020_12_CORE) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/format-annotation.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ANNOTATION) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/format-assertion.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ASSERTION) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2020_12_HYPER_SCHEMA) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2020_12_META_DATA) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/unevaluated.json" METASCHEMA_JSONSCHEMA_2020_12_UNEVALUATED) -read_schema("${JSON_SCHEMA_2020_12_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2020_12_VALIDATION) -read_schema("${JSON_SCHEMA_2020_12_DIR}/links.json" METASCHEMA_LINKS_2020_12) -read_schema("${JSON_SCHEMA_2020_12_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2020_12_OUTPUT) +file(READ "${JSON_SCHEMA_2020_12_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2020_12) +file(READ "${JSON_SCHEMA_2020_12_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2020_12) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2020_12_APPLICATOR) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2020_12_CONTENT) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2020_12_CORE) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/format-annotation.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ANNOTATION) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/format-assertion.json" METASCHEMA_JSONSCHEMA_2020_12_FORMAT_ASSERTION) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2020_12_HYPER_SCHEMA) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2020_12_META_DATA) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/unevaluated.json" METASCHEMA_JSONSCHEMA_2020_12_UNEVALUATED) +file(READ "${JSON_SCHEMA_2020_12_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2020_12_VALIDATION) +file(READ "${JSON_SCHEMA_2020_12_DIR}/links.json" METASCHEMA_LINKS_2020_12) +file(READ "${JSON_SCHEMA_2020_12_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2020_12_OUTPUT) # JSON Schema 2019-09 set(JSON_SCHEMA_2019_09_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-2019-09") -read_schema("${JSON_SCHEMA_2019_09_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2019_09) -read_schema("${JSON_SCHEMA_2019_09_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2019_09_APPLICATOR) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2019_09_CONTENT) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2019_09_CORE) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/format.json" METASCHEMA_JSONSCHEMA_2019_09_FORMAT) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2019_09_HYPER_SCHEMA) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2019_09_META_DATA) -read_schema("${JSON_SCHEMA_2019_09_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2019_09_VALIDATION) -read_schema("${JSON_SCHEMA_2019_09_DIR}/links.json" METASCHEMA_LINKS_2019_09) -read_schema("${JSON_SCHEMA_2019_09_DIR}/output/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09_OUTPUT) -read_schema("${JSON_SCHEMA_2019_09_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2019_09_OUTPUT) +file(READ "${JSON_SCHEMA_2019_09_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2019_09) +file(READ "${JSON_SCHEMA_2019_09_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/applicator.json" METASCHEMA_JSONSCHEMA_2019_09_APPLICATOR) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/content.json" METASCHEMA_JSONSCHEMA_2019_09_CONTENT) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/core.json" METASCHEMA_JSONSCHEMA_2019_09_CORE) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/format.json" METASCHEMA_JSONSCHEMA_2019_09_FORMAT) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/hyper-schema.json" METASCHEMA_JSONSCHEMA_2019_09_HYPER_SCHEMA) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/meta-data.json" METASCHEMA_JSONSCHEMA_2019_09_META_DATA) +file(READ "${JSON_SCHEMA_2019_09_DIR}/meta/validation.json" METASCHEMA_JSONSCHEMA_2019_09_VALIDATION) +file(READ "${JSON_SCHEMA_2019_09_DIR}/links.json" METASCHEMA_LINKS_2019_09) +file(READ "${JSON_SCHEMA_2019_09_DIR}/output/hyper-schema.json" METASCHEMA_HYPERSCHEMA_2019_09_OUTPUT) +file(READ "${JSON_SCHEMA_2019_09_DIR}/output/schema.json" METASCHEMA_JSONSCHEMA_2019_09_OUTPUT) # JSON Schema Draft7 set(JSON_SCHEMA_DRAFT7_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft7") -read_schema("${JSON_SCHEMA_DRAFT7_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT7) -read_schema("${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT7) -read_schema("${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema-output.json" METASCHEMA_HYPERSCHEMA_DRAFT7_OUTPUT) -read_schema("${JSON_SCHEMA_DRAFT7_DIR}/links.json" METASCHEMA_LINKS_DRAFT7) +file(READ "${JSON_SCHEMA_DRAFT7_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT7) +file(READ "${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT7) +file(READ "${JSON_SCHEMA_DRAFT7_DIR}/hyper-schema-output.json" METASCHEMA_HYPERSCHEMA_DRAFT7_OUTPUT) +file(READ "${JSON_SCHEMA_DRAFT7_DIR}/links.json" METASCHEMA_LINKS_DRAFT7) # JSON Schema Draft6 set(JSON_SCHEMA_DRAFT6_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft6") -read_schema("${JSON_SCHEMA_DRAFT6_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT6) -read_schema("${JSON_SCHEMA_DRAFT6_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT6) -read_schema("${JSON_SCHEMA_DRAFT6_DIR}/links.json" METASCHEMA_LINKS_DRAFT6) +file(READ "${JSON_SCHEMA_DRAFT6_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT6) +file(READ "${JSON_SCHEMA_DRAFT6_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT6) +file(READ "${JSON_SCHEMA_DRAFT6_DIR}/links.json" METASCHEMA_LINKS_DRAFT6) # JSON Schema Draft4 set(JSON_SCHEMA_DRAFT4_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft4") -read_schema("${JSON_SCHEMA_DRAFT4_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT4) -read_schema("${JSON_SCHEMA_DRAFT4_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT4) -read_schema("${JSON_SCHEMA_DRAFT4_DIR}/links.json" METASCHEMA_LINKS_DRAFT4) +file(READ "${JSON_SCHEMA_DRAFT4_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT4) +file(READ "${JSON_SCHEMA_DRAFT4_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT4) +file(READ "${JSON_SCHEMA_DRAFT4_DIR}/links.json" METASCHEMA_LINKS_DRAFT4) # JSON Schema Draft3 set(JSON_SCHEMA_DRAFT3_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft3") -read_schema("${JSON_SCHEMA_DRAFT3_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT3) -read_schema("${JSON_SCHEMA_DRAFT3_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT3) -read_schema("${JSON_SCHEMA_DRAFT3_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT3) -read_schema("${JSON_SCHEMA_DRAFT3_DIR}/links.json" METASCHEMA_LINKS_DRAFT3) +file(READ "${JSON_SCHEMA_DRAFT3_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT3) +file(READ "${JSON_SCHEMA_DRAFT3_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT3) +file(READ "${JSON_SCHEMA_DRAFT3_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT3) +file(READ "${JSON_SCHEMA_DRAFT3_DIR}/links.json" METASCHEMA_LINKS_DRAFT3) # JSON Schema Draft2 set(JSON_SCHEMA_DRAFT2_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft2") -read_schema("${JSON_SCHEMA_DRAFT2_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT2) -read_schema("${JSON_SCHEMA_DRAFT2_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT2) -read_schema("${JSON_SCHEMA_DRAFT2_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT2) -read_schema("${JSON_SCHEMA_DRAFT2_DIR}/links.json" METASCHEMA_LINKS_DRAFT2) +file(READ "${JSON_SCHEMA_DRAFT2_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT2) +file(READ "${JSON_SCHEMA_DRAFT2_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT2) +file(READ "${JSON_SCHEMA_DRAFT2_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT2) +file(READ "${JSON_SCHEMA_DRAFT2_DIR}/links.json" METASCHEMA_LINKS_DRAFT2) # JSON Schema Draft1 set(JSON_SCHEMA_DRAFT1_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft1") -read_schema("${JSON_SCHEMA_DRAFT1_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT1) -read_schema("${JSON_SCHEMA_DRAFT1_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT1) -read_schema("${JSON_SCHEMA_DRAFT1_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT1) -read_schema("${JSON_SCHEMA_DRAFT1_DIR}/links.json" METASCHEMA_LINKS_DRAFT1) +file(READ "${JSON_SCHEMA_DRAFT1_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT1) +file(READ "${JSON_SCHEMA_DRAFT1_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT1) +file(READ "${JSON_SCHEMA_DRAFT1_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT1) +file(READ "${JSON_SCHEMA_DRAFT1_DIR}/links.json" METASCHEMA_LINKS_DRAFT1) # JSON Schema Draft0 set(JSON_SCHEMA_DRAFT0_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-draft0") -read_schema("${JSON_SCHEMA_DRAFT0_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT0) -read_schema("${JSON_SCHEMA_DRAFT0_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT0) -read_schema("${JSON_SCHEMA_DRAFT0_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT0) -read_schema("${JSON_SCHEMA_DRAFT0_DIR}/links.json" METASCHEMA_LINKS_DRAFT0) +file(READ "${JSON_SCHEMA_DRAFT0_DIR}/schema.json" METASCHEMA_JSONSCHEMA_DRAFT0) +file(READ "${JSON_SCHEMA_DRAFT0_DIR}/hyper-schema.json" METASCHEMA_HYPERSCHEMA_DRAFT0) +file(READ "${JSON_SCHEMA_DRAFT0_DIR}/json-ref.json" METASCHEMA_JSON_REF_DRAFT0) +file(READ "${JSON_SCHEMA_DRAFT0_DIR}/links.json" METASCHEMA_LINKS_DRAFT0) # OpenAPI v3.2 set(OPENAPI_3_2_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.2") -read_schema("${OPENAPI_3_2_DIR}/meta/2025-09-17" OPENAPI_OAS_3_2_META_2025_09_17) -read_schema("${OPENAPI_3_2_DIR}/dialect/2025-09-17" OPENAPI_OAS_3_2_DIALECT_2025_09_17) +file(READ "${OPENAPI_3_2_DIR}/meta/2025-09-17" OPENAPI_OAS_3_2_META_2025_09_17) +file(READ "${OPENAPI_3_2_DIR}/dialect/2025-09-17" OPENAPI_OAS_3_2_DIALECT_2025_09_17) # OpenAPI v3.1 set(OPENAPI_3_1_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.1") -read_schema("${OPENAPI_3_1_DIR}/meta/base" OPENAPI_OAS_3_1_META_BASE) -read_schema("${OPENAPI_3_1_DIR}/dialect/base" OPENAPI_OAS_3_1_DIALECT_BASE) -read_schema("${OPENAPI_3_1_DIR}/meta/2024-11-10" OPENAPI_OAS_3_1_META_2024_11_10) -read_schema("${OPENAPI_3_1_DIR}/dialect/2024-11-10" OPENAPI_OAS_3_1_DIALECT_2024_11_10) -read_schema("${OPENAPI_3_1_DIR}/meta/2024-10-25" OPENAPI_OAS_3_1_META_2024_10_25) -read_schema("${OPENAPI_3_1_DIR}/dialect/2024-10-25" OPENAPI_OAS_3_1_DIALECT_2024_10_25) +file(READ "${OPENAPI_3_1_DIR}/meta/base" OPENAPI_OAS_3_1_META_BASE) +file(READ "${OPENAPI_3_1_DIR}/dialect/base" OPENAPI_OAS_3_1_DIALECT_BASE) +file(READ "${OPENAPI_3_1_DIR}/meta/2024-11-10" OPENAPI_OAS_3_1_META_2024_11_10) +file(READ "${OPENAPI_3_1_DIR}/dialect/2024-11-10" OPENAPI_OAS_3_1_DIALECT_2024_11_10) +file(READ "${OPENAPI_3_1_DIR}/meta/2024-10-25" OPENAPI_OAS_3_1_META_2024_10_25) +file(READ "${OPENAPI_3_1_DIR}/dialect/2024-10-25" OPENAPI_OAS_3_1_DIALECT_2024_10_25) # OpenAPI v3.0 set(OPENAPI_3_0_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.0") -read_schema("${OPENAPI_3_0_DIR}/schema/2024-10-18" OPENAPI_OAS_3_0_SCHEMA_2024_10_18) -read_schema("${OPENAPI_3_0_DIR}/schema/2021-09-28" OPENAPI_OAS_3_0_SCHEMA_2021_09_28) +read_schema_object_definitions("${OPENAPI_3_0_DIR}/schema/2024-10-18" OPENAPI_OAS_3_0_SCHEMA_2024_10_18) +read_schema_object_definitions("${OPENAPI_3_0_DIR}/schema/2021-09-28" OPENAPI_OAS_3_0_SCHEMA_2021_09_28) if(NOT KNOWN_RESOLVER_INPUT) message(FATAL_ERROR "Missing KNOWN_RESOLVER_INPUT") diff --git a/src/core/jsonschema/known_resolver.in.cc b/src/core/jsonschema/known_resolver.in.cc index f490756bc..ed66bd6e1 100644 --- a/src/core/jsonschema/known_resolver.in.cc +++ b/src/core/jsonschema/known_resolver.in.cc @@ -767,11 +767,12 @@ auto sourcemeta::core::schema_resolver(const std::string_view identifier) return SCHEMA; } // The published document schema describes the Schema Object as one of its - // definitions rather than on its own, and nothing else of it is of use - // here, so it is carried within the dialect instead of being exposed. The - // identifier it declares has to stay for the references it makes to - // itself to keep resolving against its own scope. Note a schema of this - // dialect is either a Schema Object or a Reference Object + // definitions rather than on its own, so the part of that document which + // the Schema Object reaches is carried within the dialect instead of being + // exposed, and the rest of it is left behind. The identifier it declares + // has to stay for the references it makes to itself to keep resolving + // against its own scope. Note a schema of this dialect is either a Schema + // Object or a Reference Object case KnownSchema::OAS_3_0_DIALECT_2024_10_18: { static const auto SCHEMA{sourcemeta::core::parse_json(R"EOF({ "id": "tag:spec.openapis.org,2024-10-18:oas/3.0/dialect", From 5ea82e119b76af88dab74eebf3c269cabe276359 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 14 Oct 2026 19:27:33 -0300 Subject: [PATCH 3/3] Fix Signed-off-by: Juan Cruz Viotti --- src/core/jsonschema/known_resolver.cmake | 61 +++++++----------------- src/core/jsonschema/known_resolver.in.cc | 35 ++++++++++---- src/lang/numeric/big_coefficient.h | 3 ++ 3 files changed, 46 insertions(+), 53 deletions(-) diff --git a/src/core/jsonschema/known_resolver.cmake b/src/core/jsonschema/known_resolver.cmake index 2eeff0b0b..5f0a06904 100644 --- a/src/core/jsonschema/known_resolver.cmake +++ b/src/core/jsonschema/known_resolver.cmake @@ -3,49 +3,6 @@ if(NOT PROJECT_SOURCE_DIR) message(FATAL_ERROR "Missing PROJECT_SOURCE_DIR") endif() -# The OpenAPI v3.0 Schema Object is only published as a definition of the -# document schema, so a dialect for it has to carry that document. Only the -# definitions the Schema Object reaches are of any use to such a dialect, and -# leaving the rest behind keeps the result within the length that the strictest -# compiler allows a single string literal to be -function(read_schema_object_definitions path variable) - set(reachable Schema Reference Discriminator ExternalDocumentation XML) - - file(READ "${path}" content) - - string(JSON total LENGTH "${content}" definitions) - math(EXPR last "${total} - 1") - set(unreachable "") - foreach(index RANGE ${last}) - string(JSON name MEMBER "${content}" definitions ${index}) - if(NOT "${name}" IN_LIST reachable) - list(APPEND unreachable "${name}") - endif() - endforeach() - foreach(name IN LISTS unreachable) - string(JSON content REMOVE "${content}" definitions "${name}") - endforeach() - - # The document-level constraints go as a whole, as the definitions they reach - # for are exactly the ones left behind - foreach(member IN ITEMS type required properties patternProperties - additionalProperties) - string(JSON content REMOVE "${content}" "${member}") - endforeach() - - # What is kept has to stand on its own, as a reference to a definition that - # was left behind would resolve nowhere - string(REGEX MATCHALL "#/definitions/[A-Za-z]+" references "${content}") - foreach(reference IN LISTS references) - string(REPLACE "#/definitions/" "" name "${reference}") - if(NOT "${name}" IN_LIST reachable) - message(FATAL_ERROR "Unreachable OpenAPI v3.0 definition: ${name}") - endif() - endforeach() - - set("${variable}" "${content}" PARENT_SCOPE) -endfunction() - # JSON Schema 2020-12 set(JSON_SCHEMA_2020_12_DIR "${PROJECT_SOURCE_DIR}/vendor/jsonschema-2020-12") file(READ "${JSON_SCHEMA_2020_12_DIR}/schema.json" METASCHEMA_JSONSCHEMA_2020_12) @@ -139,9 +96,23 @@ file(READ "${OPENAPI_3_1_DIR}/meta/2024-10-25" OPENAPI_OAS_3_1_META_2024_10_25) file(READ "${OPENAPI_3_1_DIR}/dialect/2024-10-25" OPENAPI_OAS_3_1_DIALECT_2024_10_25) # OpenAPI v3.0 +# The Schema Object is only published as a definition of the document schema, +# so a dialect for it has to carry that definition along with the ones it +# reaches. Taking those alone leaves behind a document schema that is longer +# than what the strictest compiler allows a single string literal to be set(OPENAPI_3_0_DIR "${PROJECT_SOURCE_DIR}/vendor/openapi/oas/3.0") -read_schema_object_definitions("${OPENAPI_3_0_DIR}/schema/2024-10-18" OPENAPI_OAS_3_0_SCHEMA_2024_10_18) -read_schema_object_definitions("${OPENAPI_3_0_DIR}/schema/2021-09-28" OPENAPI_OAS_3_0_SCHEMA_2021_09_28) +file(READ "${OPENAPI_3_0_DIR}/schema/2024-10-18" OPENAPI_OAS_3_0_DOCUMENT) +string(JSON OPENAPI_OAS_3_0_SCHEMA_2024_10_18 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions Schema) +string(JSON OPENAPI_OAS_3_0_REFERENCE_2024_10_18 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions Reference) +string(JSON OPENAPI_OAS_3_0_DISCRIMINATOR_2024_10_18 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions Discriminator) +string(JSON OPENAPI_OAS_3_0_EXTERNAL_DOCUMENTATION_2024_10_18 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions ExternalDocumentation) +string(JSON OPENAPI_OAS_3_0_XML_2024_10_18 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions XML) +file(READ "${OPENAPI_3_0_DIR}/schema/2021-09-28" OPENAPI_OAS_3_0_DOCUMENT) +string(JSON OPENAPI_OAS_3_0_SCHEMA_2021_09_28 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions Schema) +string(JSON OPENAPI_OAS_3_0_REFERENCE_2021_09_28 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions Reference) +string(JSON OPENAPI_OAS_3_0_DISCRIMINATOR_2021_09_28 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions Discriminator) +string(JSON OPENAPI_OAS_3_0_EXTERNAL_DOCUMENTATION_2021_09_28 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions ExternalDocumentation) +string(JSON OPENAPI_OAS_3_0_XML_2021_09_28 GET "${OPENAPI_OAS_3_0_DOCUMENT}" definitions XML) if(NOT KNOWN_RESOLVER_INPUT) message(FATAL_ERROR "Missing KNOWN_RESOLVER_INPUT") diff --git a/src/core/jsonschema/known_resolver.in.cc b/src/core/jsonschema/known_resolver.in.cc index ed66bd6e1..cd5b48456 100644 --- a/src/core/jsonschema/known_resolver.in.cc +++ b/src/core/jsonschema/known_resolver.in.cc @@ -767,12 +767,11 @@ auto sourcemeta::core::schema_resolver(const std::string_view identifier) return SCHEMA; } // The published document schema describes the Schema Object as one of its - // definitions rather than on its own, so the part of that document which - // the Schema Object reaches is carried within the dialect instead of being - // exposed, and the rest of it is left behind. The identifier it declares - // has to stay for the references it makes to itself to keep resolving - // against its own scope. Note a schema of this dialect is either a Schema - // Object or a Reference Object + // definitions rather than on its own, so the dialect carries that + // definition and the ones it reaches instead of the document being + // exposed. They stay under the identifier the document declares, as that + // is the scope the references between them resolve against. Note a schema + // of this dialect is either a Schema Object or a Reference Object case KnownSchema::OAS_3_0_DIALECT_2024_10_18: { static const auto SCHEMA{sourcemeta::core::parse_json(R"EOF({ "id": "tag:spec.openapis.org,2024-10-18:oas/3.0/dialect", @@ -783,7 +782,17 @@ auto sourcemeta::core::schema_resolver(const std::string_view identifier) { "$ref": "#/definitions/openapi/definitions/Reference" } ], "definitions": { - "openapi": @OPENAPI_OAS_3_0_SCHEMA_2024_10_18@ + "openapi": { + "id": "https://spec.openapis.org/oas/3.0/schema/2024-10-18", + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": { + "Schema": @OPENAPI_OAS_3_0_SCHEMA_2024_10_18@, + "Reference": @OPENAPI_OAS_3_0_REFERENCE_2024_10_18@, + "Discriminator": @OPENAPI_OAS_3_0_DISCRIMINATOR_2024_10_18@, + "ExternalDocumentation": @OPENAPI_OAS_3_0_EXTERNAL_DOCUMENTATION_2024_10_18@, + "XML": @OPENAPI_OAS_3_0_XML_2024_10_18@ + } + } } })EOF")}; return SCHEMA; @@ -798,7 +807,17 @@ auto sourcemeta::core::schema_resolver(const std::string_view identifier) { "$ref": "#/definitions/openapi/definitions/Reference" } ], "definitions": { - "openapi": @OPENAPI_OAS_3_0_SCHEMA_2021_09_28@ + "openapi": { + "id": "https://spec.openapis.org/oas/3.0/schema/2021-09-28", + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": { + "Schema": @OPENAPI_OAS_3_0_SCHEMA_2021_09_28@, + "Reference": @OPENAPI_OAS_3_0_REFERENCE_2021_09_28@, + "Discriminator": @OPENAPI_OAS_3_0_DISCRIMINATOR_2021_09_28@, + "ExternalDocumentation": @OPENAPI_OAS_3_0_EXTERNAL_DOCUMENTATION_2021_09_28@, + "XML": @OPENAPI_OAS_3_0_XML_2021_09_28@ + } + } } })EOF")}; return SCHEMA; diff --git a/src/lang/numeric/big_coefficient.h b/src/lang/numeric/big_coefficient.h index bd748541f..76263d35e 100644 --- a/src/lang/numeric/big_coefficient.h +++ b/src/lang/numeric/big_coefficient.h @@ -260,6 +260,9 @@ class BigCoefficient { std::copy(this->words + zero_words, this->words + this->length, this->words); this->length -= zero_words; + // What the shift leaves behind is no longer part of the value + std::fill(this->words + this->length, + this->words + this->length + zero_words, 0ULL); total_stripped += static_cast(zero_words) * BASE_DIGITS; }