diff --git a/src/Opa.Wasm/OpaPolicy.cs b/src/Opa.Wasm/OpaPolicy.cs index 0a32a40..d8cf73d 100644 --- a/src/Opa.Wasm/OpaPolicy.cs +++ b/src/Opa.Wasm/OpaPolicy.cs @@ -119,9 +119,9 @@ private void Initialize(Module module) string builtins = DumpJson(Policy_Builtins()); Builtins = ParseBuiltinsJson(builtins); - - _dataAddr = LoadJson("{}"); + _baseHeapPtr = Policy_opa_heap_ptr_get(); + _dataAddr = LoadJson("{}"); _dataHeapPtr = _baseHeapPtr; string entrypoints = DumpJson(Policy_Entrypoints()); @@ -303,6 +303,8 @@ private string FastEvaluate(string json, int? entrypoint) { if (!entrypoint.HasValue) entrypoint = 0; // use default entry point + EnsureMemoryCapacity(json); + _envMemory.WriteString(_store, _dataHeapPtr, json); int resultaddr = Policy_opa_eval(entrypoint.Value, _dataAddr, _dataHeapPtr, json.Length, _dataHeapPtr + json.Length); @@ -495,5 +497,16 @@ private int BuiltinResultToAddress(object result) var json = JsonSerializer.Serialize(result); return LoadJson(json); } - } + + private void EnsureMemoryCapacity(string value) + { + var requiredPages = (uint)Math.Ceiling((_dataHeapPtr + value.Length) / (double)Memory.PageSize); + var pagesToAdd = requiredPages - _envMemory.GetSize(_store); + + if (pagesToAdd > 0) + { + _envMemory.Grow(_store, pagesToAdd); + } + } +} }