From c013b557a2bc72dff8795d89d4529e17946a5f3a Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Thu, 3 Jan 2013 12:51:33 +0000 Subject: Change APPEND opcode to directly modify a variable. Avoids a big O(n^2) loop in constructing arrays. Fixes #61. --- execute.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'execute.c') diff --git a/execute.c b/execute.c index 94f6cd43..fb4a3895 100644 --- a/execute.c +++ b/execute.c @@ -236,9 +236,12 @@ jv jq_next() { case APPEND: { // FIXME paths jv v = stack_pop().value; - jv array = stack_pop().value; - array = jv_array_append(array, v); - stack_push(stackval_root(array)); + uint16_t level = *pc++; + uint16_t vidx = *pc++; + frame_ptr fp = frame_get_level(&frame_stk, frame_current(&frame_stk), level); + jv* var = frame_local_var(fp, vidx); + assert(jv_get_kind(*var) == JV_KIND_ARRAY); + *var = jv_array_append(*var, v); break; } -- cgit v1.2.3