@@ -164,8 +164,27 @@ static int Script_RunCtxAddParam(RAI_ScriptRunCtx* sctx,
164
164
return 1 ;
165
165
}
166
166
167
- int RAI_ScriptRunCtxAddInput (RAI_ScriptRunCtx * sctx , RAI_Tensor * inputTensor ) {
168
- return Script_RunCtxAddParam (sctx , sctx -> inputs , inputTensor );
167
+ int RAI_ScriptRunCtxAddInput (RAI_ScriptRunCtx * sctx , RAI_Tensor * inputTensor , RAI_Error * err ) {
168
+ if (sctx -> variadic != -1 ) {
169
+ RAI_SetError (err , RAI_EBACKENDNOTLOADED , "ERR Already encountered a variable size list of tensors" );
170
+ return 0 ;
171
+ }
172
+ return Script_RunCtxAddParam (sctx , sctx -> inputs , inputTensor );
173
+ }
174
+
175
+ int RAI_ScriptRunCtxAddInputList (RAI_ScriptRunCtx * sctx , RAI_Tensor * * inputTensors , size_t len , RAI_Error * err ) {
176
+ // If this is the first time a list is added, set the variadic, else return an error.
177
+ if (sctx -> variadic == -1 ) {
178
+ sctx -> variadic = array_len (sctx -> inputs );
179
+ }
180
+ else {
181
+ RAI_SetError (err , RAI_EBACKENDNOTLOADED , "ERR Already encountered a variable size list of tensors" );
182
+ return 0 ;
183
+ }
184
+ for (size_t i = 0 ; i < len ; i ++ ){
185
+ Script_RunCtxAddParam (sctx , sctx -> inputs , inputTensors [i ]);
186
+ }
187
+ return 1 ;
169
188
}
170
189
171
190
int RAI_ScriptRunCtxAddOutput (RAI_ScriptRunCtx * sctx ) {
@@ -270,7 +289,8 @@ int RedisAI_Parse_ScriptRun_RedisCommand(RedisModuleCtx *ctx,
270
289
int is_input = 0 ;
271
290
int outputs_flag_count = 0 ;
272
291
size_t argpos = 4 ;
273
-
292
+ // Keep variadic local variable as the calls for RAI_ScriptRunCtxAddInput check if (*sctx)->variadic already assigned.
293
+ size_t variadic = (* sctx )-> variadic ;
274
294
for (; argpos <= argc - 1 ; argpos ++ ) {
275
295
const char * arg_string = RedisModule_StringPtrLen (argv [argpos ], NULL );
276
296
if (!arg_string ){
@@ -287,7 +307,11 @@ int RedisAI_Parse_ScriptRun_RedisCommand(RedisModuleCtx *ctx,
287
307
outputs_flag_count = 1 ;
288
308
} else {
289
309
if (!strcasecmp (arg_string , "$" )) {
290
- (* sctx )-> variadic = argpos - 4 ;
310
+ if (variadic > -1 ) {
311
+ RedisAI_ReplyOrSetError (ctx ,error ,RAI_ESCRIPTRUN , "ERR Already encountered a variable size list of tensors" );
312
+ return -1 ;
313
+ }
314
+ variadic = argpos - 4 ;
291
315
continue ;
292
316
}
293
317
RedisModule_RetainString (ctx , argv [argpos ]);
@@ -309,10 +333,7 @@ int RedisAI_Parse_ScriptRun_RedisCommand(RedisModuleCtx *ctx,
309
333
return -1 ;
310
334
}
311
335
}
312
- if (!RAI_ScriptRunCtxAddInput (* sctx , inputTensor )) {
313
- RedisAI_ReplyOrSetError (ctx , error , RAI_ESCRIPTRUN , "ERR Input key not found" );
314
- return -1 ;
315
- }
336
+ if (!RAI_ScriptRunCtxAddInput (* sctx , inputTensor , error )) return -1 ;
316
337
} else {
317
338
if (!RAI_ScriptRunCtxAddOutput (* sctx )) {
318
339
RedisAI_ReplyOrSetError (ctx , error , RAI_ESCRIPTRUN , "ERR Output key not found" );
@@ -322,6 +343,8 @@ int RedisAI_Parse_ScriptRun_RedisCommand(RedisModuleCtx *ctx,
322
343
}
323
344
}
324
345
}
346
+ // In case variadic position found, set it in the context.
347
+ (* sctx )-> variadic = variadic ;
325
348
return argpos ;
326
349
}
327
350
0 commit comments