refactor(dict): move advanced-CDict copy policy to Rust

Keep the opaque ZSTD_CCtx_params copy operation in C, but make Rust own the public advanced2 null-source validation and copy-before-preparation ordering. The bridge now rejects a missing source before any allocator or workspace callback, with explicit ABI assertions and focused order/null-input tests.

Test Plan: Not run in this atomic commit; the capped serial Rust, native, smoke, and original test-suite verification follows.
This commit is contained in:
2026-07-21 08:15:25 +02:00
parent f44d9726c3
commit 0800f0d4c0
2 changed files with 96 additions and 10 deletions
+18 -4
View File
@@ -2910,6 +2910,8 @@ typedef void (*ZSTD_rust_createCDictAdvancedFreeWorkspace_f)(
void* context, void* workspace);
typedef void (*ZSTD_rust_createCDictAdvancedFree_f)(
void* context, void* cdict);
typedef void (*ZSTD_rust_createCDictAdvancedCopyParams_f)(
void* context, void* destination, const void* source);
typedef struct {
void* callbackContext;
ZSTD_CCtx_params* cctxParams;
@@ -2928,6 +2930,8 @@ typedef struct {
ZSTD_rust_createCDictAdvancedInit_f init;
ZSTD_rust_createCDictAdvancedFreeWorkspace_f freeWorkspace;
ZSTD_rust_createCDictAdvancedFree_f free;
const void* originalCctxParams;
ZSTD_rust_createCDictAdvancedCopyParams_f copyParams;
} ZSTD_rust_createCDictAdvancedState;
void* ZSTD_rust_createCDictAdvanced(
const ZSTD_rust_createCDictAdvancedState* state,
@@ -2967,8 +2971,12 @@ typedef char ZSTD_rust_create_cdict_advanced_state_layout[
== 13 * sizeof(void*) + 2 * sizeof(U32)
&& offsetof(ZSTD_rust_createCDictAdvancedState, free)
== 14 * sizeof(void*) + 2 * sizeof(U32)
&& offsetof(ZSTD_rust_createCDictAdvancedState, originalCctxParams)
== 15 * sizeof(void*) + 2 * sizeof(U32)
&& offsetof(ZSTD_rust_createCDictAdvancedState, copyParams)
== 16 * sizeof(void*) + 2 * sizeof(U32)
&& sizeof(ZSTD_rust_createCDictAdvancedState)
== 15 * sizeof(void*) + 2 * sizeof(U32))
== 17 * sizeof(void*) + 2 * sizeof(U32))
? 1 : -1];
typedef void (*ZSTD_rust_createCDictAdvancedWrapperInitParams_f)(
@@ -7200,6 +7208,13 @@ static int ZSTD_rust_createCDictAdvanced_validateCustomMem(void* context)
return ((!customMem->customAlloc) ^ (!customMem->customFree)) == 0;
}
static void ZSTD_rust_createCDictAdvanced_copyParams(
void* context, void* destination, const void* source)
{
(void)context;
*(ZSTD_CCtx_params*)destination = *(const ZSTD_CCtx_params*)source;
}
static void* ZSTD_rust_createCDictAdvanced_allocate(
void* context, size_t workspaceSize)
{
@@ -7343,9 +7358,6 @@ ZSTD_CDict* ZSTD_createCDict_advanced2(
};
DEBUGLOG(3, "ZSTD_createCDict_advanced2, dictSize=%u, mode=%u", (unsigned)dictSize, (unsigned)dictContentType);
if (originalCctxParams == NULL) return NULL;
cctxParams = *originalCctxParams;
context.customMem = customMem;
state.callbackContext = &context;
state.cctxParams = &cctxParams;
@@ -7364,6 +7376,8 @@ ZSTD_CDict* ZSTD_createCDict_advanced2(
state.init = ZSTD_rust_createCDictAdvanced_init;
state.freeWorkspace = ZSTD_rust_createCDictAdvanced_freeWorkspace;
state.free = ZSTD_rust_createCDictAdvanced_free;
state.originalCctxParams = originalCctxParams;
state.copyParams = ZSTD_rust_createCDictAdvanced_copyParams;
return (ZSTD_CDict*)ZSTD_rust_createCDictAdvanced(
&state, dict, dictSize,
(int)dictLoadMethod, (int)dictContentType);