diff --git a/LLama/Native/SafeLLamaGrammarHandle.cs b/LLama/Native/SafeLLamaGrammarHandle.cs index f430b7c3..2218995b 100644 --- a/LLama/Native/SafeLLamaGrammarHandle.cs +++ b/LLama/Native/SafeLLamaGrammarHandle.cs @@ -49,29 +49,31 @@ namespace LLama.Native // Borrow an array large enough to hold every single element // and another array large enough to hold a pointer to each rule var allElements = ArrayPool.Shared.Rent(totalElements); - var pointers = ArrayPool.Shared.Rent(rules.Count); + var rulePointers = ArrayPool.Shared.Rent(rules.Count); try { fixed (LLamaGrammarElement* allElementsPtr = allElements) { var elementIndex = 0; - var pointerIndex = 0; + var ruleIndex = 0; foreach (var rule in rules) { + Debug.Assert(elementIndex < allElements.Length); + // Save a pointer to the start of this rule - pointers[pointerIndex++] = (IntPtr)(allElementsPtr + elementIndex); + rulePointers[ruleIndex++] = (IntPtr)(allElementsPtr + elementIndex); // Copy all of the rule elements into the flat array foreach (var element in rule.Elements) - allElementsPtr[elementIndex++] = element; + allElements[elementIndex++] = element; } // Sanity check some things that should be true if the copy worked as planned - Debug.Assert((ulong)pointerIndex == nrules); + Debug.Assert((ulong)ruleIndex == nrules); Debug.Assert(elementIndex == totalElements); // Make the actual call through to llama.cpp - fixed (void* ptr = pointers) + fixed (void* ptr = rulePointers) { return Create((LLamaGrammarElement**)ptr, nrules, start_rule_index); } @@ -80,7 +82,7 @@ namespace LLama.Native finally { ArrayPool.Shared.Return(allElements); - ArrayPool.Shared.Return(pointers); + ArrayPool.Shared.Return(rulePointers); } } }