From d0e50396e3e57e86db0eedd0ab061b231fb5946b Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Sun, 22 Dec 2019 20:40:24 -0500 Subject: [PATCH] more small tweaks to the layout optimization PR (#34177) - fix GC/finalizer properties of CFunction definition - fix jl_arrayunset implementation for hasptr - fix missing GC metadata update step inside gc_mark_scan_array8 --- base/c.jl | 2 +- src/array.c | 2 +- src/gc.c | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/base/c.jl b/base/c.jl index 0fd54f7f51e9c..3654ca8b111e4 100644 --- a/base/c.jl +++ b/base/c.jl @@ -26,7 +26,7 @@ and will be converted automatically at the call site to the appropriate type. See [`@cfunction`](@ref). """ -struct CFunction <: Ref{Cvoid} +mutable struct CFunction <: Ref{Cvoid} ptr::Ptr{Cvoid} f::Any _1::Ptr{Cvoid} diff --git a/src/array.c b/src/array.c index 5b0b9ef929f14..ffdf2857bf479 100644 --- a/src/array.c +++ b/src/array.c @@ -619,7 +619,7 @@ JL_DLLEXPORT void jl_arrayunset(jl_array_t *a, size_t i) else if (a->flags.hasptr) { size_t elsize = a->elsize; jl_assume(elsize >= sizeof(void*) && elsize % sizeof(void*) == 0); - memset(&((jl_value_t**)a->data)[i], 0, elsize); + memset((char*)a->data + elsize * i, 0, elsize); } } diff --git a/src/gc.c b/src/gc.c index 1063bda49de14..d376b2a86b81c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1794,6 +1794,7 @@ STATIC_INLINE int gc_mark_scan_array8(jl_ptls_t ptls, jl_gc_mark_sp_t *sp, if (elem_begin < elem_end) { // Haven't done with this one yet. Update the content and push it back ary8->elem.begin = elem_begin; + ary8->begin = begin; gc_repush_markdata(sp, gc_mark_array8_t); } else { @@ -1812,7 +1813,7 @@ STATIC_INLINE int gc_mark_scan_array8(jl_ptls_t ptls, jl_gc_mark_sp_t *sp, } return 1; } - ary8->elem.begin = elem_begin = ary8->rebegin; + elem_begin = ary8->rebegin; } gc_mark_push_remset(ptls, ary8->elem.parent, ary8->elem.nptr); return 0;