From add9b12f185a5d20712bdd4e10b9d5d8ae97368d Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Wed, 3 Mar 2021 20:58:10 -0800 Subject: [PATCH] Fixed quadratic memory usage in upb_array_append(). We were erroneously calling realloc() instead of resize(), forcing the entire array to be reallocated for every array append. --- tests/bindings/lua/test_upb.lua | 10 ++++++++++ upb/reflection.c | 3 +-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/bindings/lua/test_upb.lua b/tests/bindings/lua/test_upb.lua index 2529aa8fc1..f27e83968d 100644 --- a/tests/bindings/lua/test_upb.lua +++ b/tests/bindings/lua/test_upb.lua @@ -321,6 +321,16 @@ function test_msg_array() assert_error_match("array expected", function() msg.repeated_int32 = print end) end +function test_array_append() + local arr = upb.Array(upb.TYPE_INT32) + for i=1,200000 do + arr[i] = i + end + for i=1,200000 do + assert_equal(i, arr[i]) + end +end + function test_msg_submsg() --msg = test_messages_proto3.TestAllTypesProto3() msg = test_messages_proto3['TestAllTypesProto3']() diff --git a/upb/reflection.c b/upb/reflection.c index e086fb091c..08249043e5 100644 --- a/upb/reflection.c +++ b/upb/reflection.c @@ -300,10 +300,9 @@ void upb_array_set(upb_array *arr, size_t i, upb_msgval val) { } bool upb_array_append(upb_array *arr, upb_msgval val, upb_arena *arena) { - if (!_upb_array_realloc(arr, arr->len + 1, arena)) { + if (!upb_array_resize(arr, arr->len + 1, arena)) { return false; } - arr->len++; upb_array_set(arr, arr->len - 1, val); return true; }