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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user