Skip to content

Commit be8dc69

Browse files
authored
Merge branch 'master' into hr/create_expr_cache
2 parents 4d7f04c + 1afa368 commit be8dc69

File tree

28 files changed

+191
-84
lines changed

28 files changed

+191
-84
lines changed

Makefile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,9 @@ endif
459459

460460

461461
exe:
462-
# run Inno Setup to compile installer
463-
$(call spawn,$(JULIAHOME)/dist-extras/inno/iscc.exe /DAppVersion=$(JULIA_VERSION) /DSourceDir="$(call cygpath_w,$(BUILDROOT)/julia-$(JULIA_COMMIT))" /DRepoDir="$(call cygpath_w,$(JULIAHOME))" /F"$(JULIA_BINARYDIST_FILENAME)" /O"$(call cygpath_w,$(BUILDROOT))" $(INNO_ARGS) $(call cygpath_w,$(JULIAHOME)/contrib/windows/build-installer.iss))
462+
# run Inno Setup to compile installer.
463+
# Note that we disable MSYS2 path munging, as it interferes with the `/` options:
464+
MSYS2_ARG_CONV_EXCL='*' $(call spawn,$(JULIAHOME)/dist-extras/inno/iscc.exe /DAppVersion=$(JULIA_VERSION) /DSourceDir="$(call cygpath_w,$(BUILDROOT)/julia-$(JULIA_COMMIT))" /DRepoDir="$(call cygpath_w,$(JULIAHOME))" /F"$(JULIA_BINARYDIST_FILENAME)" /O"$(call cygpath_w,$(BUILDROOT))" $(INNO_ARGS) $(call cygpath_w,$(JULIAHOME)/contrib/windows/build-installer.iss))
464465
chmod a+x "$(BUILDROOT)/$(JULIA_BINARYDIST_FILENAME).exe"
465466

466467
app:
@@ -585,7 +586,7 @@ win-extras:
585586
cd $(JULIAHOME)/dist-extras && \
586587
$(JLDOWNLOAD) https://www.jrsoftware.org/download.php/is.exe && \
587588
chmod a+x is.exe && \
588-
$(call spawn, $(JULIAHOME)/dist-extras/is.exe /DIR="$(call cygpath_w,$(JULIAHOME)/dist-extras/inno)" /PORTABLE=1 /CURRENTUSER /VERYSILENT)
589+
MSYS2_ARG_CONV_EXCL='*' $(call spawn, $(JULIAHOME)/dist-extras/is.exe /DIR="$(call cygpath_w,$(JULIAHOME)/dist-extras/inno)" /PORTABLE=1 /CURRENTUSER /VERYSILENT)
589590

590591
# various statistics about the build that may interest the user
591592
ifeq ($(USE_SYSTEM_LLVM), 1)

base/abstractarray.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3473,8 +3473,9 @@ function circshift!(a::AbstractVector, shift::Integer)
34733473
n == 0 && return
34743474
shift = mod(shift, n)
34753475
shift == 0 && return
3476-
reverse!(a, 1, shift)
3477-
reverse!(a, shift+1, length(a))
3476+
l = lastindex(a)
3477+
reverse!(a, firstindex(a), l-shift)
3478+
reverse!(a, l-shift+1, lastindex(a))
34783479
reverse!(a)
34793480
return a
34803481
end

base/compiler/abstractinterpretation.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2240,7 +2240,9 @@ end
22402240

22412241
function abstract_eval_phi(interp::AbstractInterpreter, phi::PhiNode, vtypes::Union{VarTable, Nothing}, sv::Union{InferenceState, IRCode})
22422242
rt = Union{}
2243-
for val in phi.values
2243+
for i in 1:length(phi.values)
2244+
isassigned(phi.values, i) || continue
2245+
val = phi.values[i]
22442246
rt = tmerge(typeinf_lattice(interp), rt, abstract_eval_special_value(interp, val, vtypes, sv))
22452247
end
22462248
return rt

base/compiler/ssair/inlining.jl

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -699,18 +699,6 @@ function batch_inline!(todo::Vector{Pair{Int, Any}}, ir::IRCode, linetable::Vect
699699
compact.active_result_bb -= 1
700700
refinish = true
701701
end
702-
# It is possible for GlobalRefs and Exprs to be in argument position
703-
# at this point in the IR, though in that case they are required
704-
# to be effect-free. However, we must still move them out of argument
705-
# position, since `Argument` is allowed in PhiNodes, but `GlobalRef`
706-
# and `Expr` are not, so a substitution could anger the verifier.
707-
for aidx in 1:length(argexprs)
708-
aexpr = argexprs[aidx]
709-
if isa(aexpr, Expr) || isa(aexpr, GlobalRef)
710-
ninst = effect_free(NewInstruction(aexpr, argextype(aexpr, compact), compact.result[idx][:line]))
711-
argexprs[aidx] = insert_node_here!(compact, ninst)
712-
end
713-
end
714702
if isa(item, InliningTodo)
715703
compact.ssa_rename[old_idx] = ir_inline_item!(compact, idx, argexprs, linetable, item, boundscheck, state.todo_bbs)
716704
elseif isa(item, UnionSplit)

base/compiler/ssair/irinterp.jl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,16 @@ function concrete_eval_invoke(interp::AbstractInterpreter, ir::IRCode, mi_cache,
134134
return nothing
135135
end
136136

137+
function abstract_eval_phi_stmt(interp::AbstractInterpreter, phi::PhiNode, ir::IRCode, id::Int, dt::LazyDomtree)
138+
return abstract_eval_phi(interp, phi, nothing, ir)
139+
end
140+
137141
function reprocess_instruction!(interp::AbstractInterpreter, ir::IRCode, mi::MethodInstance,
138142
mi_cache,
139143
tpdum::TwoPhaseDefUseMap, idx::Int, bb::Union{Int, Nothing},
140144
@nospecialize(inst), @nospecialize(typ),
141-
phi_revisit::BitSet)
145+
phi_revisit::BitSet,
146+
dt::LazyDomtree)
142147
function update_phi!(from::Int, to::Int)
143148
if length(ir.cfg.blocks[to].preds) == 0
144149
return
@@ -181,7 +186,7 @@ function reprocess_instruction!(interp::AbstractInterpreter, ir::IRCode, mi::Met
181186
if isa(inst, Expr) || isa(inst, PhiNode)
182187
if isa(inst, PhiNode) || inst.head === :call || inst.head === :foreigncall || inst.head === :new
183188
if isa(inst, PhiNode)
184-
rt = abstract_eval_phi(interp, inst, nothing, ir)
189+
rt = abstract_eval_phi_stmt(interp, inst, ir, idx, dt)
185190
else
186191
(;rt, effects) = abstract_eval_statement_expr(interp, inst, nothing, ir, mi)
187192
# All other effects already guaranteed effect free by construction
@@ -243,6 +248,7 @@ function _ir_abstract_constant_propagation(interp::AbstractInterpreter, mi_cache
243248
all_rets = Int[]
244249

245250
tpdum = TwoPhaseDefUseMap(length(ir.stmts))
251+
dt = LazyDomtree(ir)
246252

247253
"""
248254
process_terminator!
@@ -303,7 +309,7 @@ function _ir_abstract_constant_propagation(interp::AbstractInterpreter, mi_cache
303309
delete!(ssa_refined, idx)
304310
end
305311
if any_refined && reprocess_instruction!(interp, ir, mi, mi_cache,
306-
tpdum, idx, bb, inst, typ, ssa_refined)
312+
tpdum, idx, bb, inst, typ, ssa_refined, dt)
307313
push!(ssa_refined, idx)
308314
end
309315
if idx == lstmt && process_terminator!(ip, bb, idx)
@@ -370,7 +376,7 @@ function _ir_abstract_constant_propagation(interp::AbstractInterpreter, mi_cache
370376
inst = ir.stmts[idx][:inst]
371377
typ = ir.stmts[idx][:type]
372378
if reprocess_instruction!(interp, ir, mi, mi_cache,
373-
tpdum, idx, nothing, inst, typ, ssa_refined)
379+
tpdum, idx, nothing, inst, typ, ssa_refined, dt)
374380
append!(stmt_ip, tpdum[idx])
375381
end
376382
end

base/compiler/ssair/verify.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
function maybe_show_ir(ir::IRCode)
44
if isdefined(Core, :Main)
5-
Core.Main.Base.display(ir)
5+
invokelatest(Core.Main.Base.display, ir)
66
end
77
end
88

base/compiler/typelimits.jl

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,8 @@ function tmerge(lattice::ConditionalsLattice, @nospecialize(typea), @nospecializ
433433
end
434434
return Bool
435435
end
436+
typea = widenconditional(typea)
437+
typeb = widenconditional(typeb)
436438
return tmerge(widenlattice(lattice), typea, typeb)
437439
end
438440

@@ -471,8 +473,9 @@ end
471473

472474
function tmerge(lattice::PartialsLattice, @nospecialize(typea), @nospecialize(typeb))
473475
# type-lattice for Const and PartialStruct wrappers
474-
if ((isa(typea, PartialStruct) || isa(typea, Const)) &&
475-
(isa(typeb, PartialStruct) || isa(typeb, Const)))
476+
acp = isa(typea, Const) || isa(typea, PartialStruct)
477+
bcp = isa(typeb, Const) || isa(typeb, PartialStruct)
478+
if acp && bcp
476479
aty = widenconst(typea)
477480
bty = widenconst(typeb)
478481
if aty === bty
@@ -521,22 +524,40 @@ function tmerge(lattice::PartialsLattice, @nospecialize(typea), @nospecialize(ty
521524
return anyrefine ? PartialStruct(aty, fields) : aty
522525
end
523526
end
527+
# Don't widen const here - external AbstractInterpreter might insert lattice
528+
# layers between us and `ConstsLattice`.
529+
isa(typea, PartialStruct) && (typea = widenconst(typea))
530+
isa(typeb, PartialStruct) && (typeb = widenconst(typeb))
524531

525532
# type-lattice for PartialOpaque wrapper
526-
if isa(typea, PartialOpaque) && isa(typeb, PartialOpaque) && widenconst(typea) == widenconst(typeb)
527-
if !(typea.source === typeb.source &&
528-
typea.parent === typeb.parent)
529-
return widenconst(typea)
533+
apo = isa(typea, PartialOpaque)
534+
bpo = isa(typeb, PartialOpaque)
535+
if apo && bpo
536+
aty = widenconst(typea)
537+
bty = widenconst(typeb)
538+
if aty == bty
539+
if !(typea.source === typeb.source &&
540+
typea.parent === typeb.parent)
541+
return widenconst(typea)
542+
end
543+
return PartialOpaque(typea.typ, tmerge(typea.env, typeb.env),
544+
typea.parent, typea.source)
530545
end
531-
return PartialOpaque(typea.typ, tmerge(typea.env, typeb.env),
532-
typea.parent, typea.source)
546+
typea = aty
547+
typeb = bty
548+
elseif apo
549+
typea = widenconst(typea)
550+
elseif bpo
551+
typeb = widenconst(typeb)
533552
end
534553

535-
# no special type-inference lattice, join the types
536-
typea, typeb = widenconst(typea), widenconst(typeb)
537-
@assert isa(typea, Type); @assert isa(typeb, Type)
554+
return tmerge(widenlattice(lattice), typea, typeb)
555+
end
538556

539-
return tmerge(JLTypeLattice(), typea, typeb)
557+
function tmerge(lattice::ConstsLattice, @nospecialize(typea), @nospecialize(typeb))
558+
# the equality of the constants can be checked here, but the equivalent check is usually
559+
# done by `tmerge_fast_path` at earlier lattice stage
560+
return tmerge(widenlattice(lattice), widenconst(typea), widenconst(typeb))
540561
end
541562

542563
function tmerge(::JLTypeLattice, @nospecialize(typea::Type), @nospecialize(typeb::Type))

base/logging.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ function handle_message(logger::SimpleLogger, level::LogLevel, message, _module,
671671
remaining > 0 || return
672672
end
673673
buf = IOBuffer()
674-
stream = logger.stream
674+
stream::IO = logger.stream
675675
if !(isopen(stream)::Bool)
676676
stream = stderr
677677
end
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
88144ed473b0ca6154ec55a8977c281c
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1c8c27f6b74c60dedecd6dd58de6b4b400bf3b942104e3ba7319a10a111ebbab0be03f98f072c073f43ca454d187674737dd34c1c9acb92adf3c8b76b3c400ac

deps/checksums/SparseArrays-91814c1e84421a9c43b2776fc9dc96ec25104ac8.tar.gz/md5

Lines changed: 0 additions & 1 deletion
This file was deleted.

deps/checksums/SparseArrays-91814c1e84421a9c43b2776fc9dc96ec25104ac8.tar.gz/sha512

Lines changed: 0 additions & 1 deletion
This file was deleted.

deps/checksums/suitesparse

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
SuiteSparse-5.10.1.tar.gz/md5/68bb912f3cf3d2b01f30ebafef690302
22
SuiteSparse-5.10.1.tar.gz/sha512/8f85c6d63b76cba95707dfa732c51200df7794cb4c2599dbd92100475747b8d02b05089a47096e85c60b89bc852a8e768e0670f24902a82d29494a80ccf2bb5f
3-
SuiteSparse-ed89e0fe3d8908cede058f42f872ba60159af0a6.tar.gz/md5/3019404c83511b5aab962559c2924072
4-
SuiteSparse-ed89e0fe3d8908cede058f42f872ba60159af0a6.tar.gz/sha512/06fa991da05376ee7e55a30f6fa29ab60ed2cec79818e217290e0e256233ee321fb25a764cbe834c3e94755b02d5326c93c8f1b686c53da28023778787e6d57f
3+
SuiteSparse-e8285dd13a6d5b5cf52d8124793fc4d622d07554.tar.gz/md5/46541001073d1c3c85e18d910f8308f3
4+
SuiteSparse-e8285dd13a6d5b5cf52d8124793fc4d622d07554.tar.gz/sha512/f7470a447b934ca9315e216a07b97e363f11bc93186f9aa057b20b2d05092c58ae4f1b733de362de4a0730861c00be4ca5588d0b3ba65f018c1798b9122b9672
55
SuiteSparse.v5.10.1+0.aarch64-apple-darwin.tar.gz/md5/b9392f8e71c0c40d37489e7b2071c5ad
66
SuiteSparse.v5.10.1+0.aarch64-apple-darwin.tar.gz/sha512/109d67cb009e3b2931b94d63cbdaaee29d60dc190b731ebe3737181cd48d913b8a1333043c67be8179c73e4d3ae32ed1361ab4e34312c0f42e4b29f8a7afda3e
77
SuiteSparse.v5.10.1+0.aarch64-linux-gnu.tar.gz/md5/1b2651ede4a74cd57f65505a65093314

src/dump.c

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,7 @@ static void jl_collect_backedges(jl_array_t *edges, jl_array_t *ext_targets)
13661366
jl_value_t *invokeTypes;
13671367
jl_method_instance_t *c;
13681368
size_t i;
1369+
size_t world = jl_get_world_counter();
13691370
void **table = edges_map.table; // edges is caller => callees
13701371
size_t table_size = edges_map.size;
13711372
for (i = 0; i < table_size; i += 2) {
@@ -1408,15 +1409,28 @@ static void jl_collect_backedges(jl_array_t *edges, jl_array_t *ext_targets)
14081409
size_t min_valid = 0;
14091410
size_t max_valid = ~(size_t)0;
14101411
int ambig = 0;
1411-
jl_value_t *matches = jl_matching_methods((jl_tupletype_t*)sig, jl_nothing, -1, 0, jl_atomic_load_acquire(&jl_world_counter), &min_valid, &max_valid, &ambig);
1412-
if (matches == jl_false) {
1413-
valid = 0;
1414-
break;
1415-
}
1416-
size_t k;
1417-
for (k = 0; k < jl_array_len(matches); k++) {
1418-
jl_method_match_t *match = (jl_method_match_t *)jl_array_ptr_ref(matches, k);
1419-
jl_array_ptr_set(matches, k, match->method);
1412+
jl_value_t *matches;
1413+
if (mode == 2 && callee && jl_is_method_instance(callee) && jl_is_type(sig)) {
1414+
// invoke, use subtyping
1415+
jl_methtable_t *mt = jl_method_get_table(((jl_method_instance_t*)callee)->def.method);
1416+
size_t min_world, max_world;
1417+
matches = jl_gf_invoke_lookup_worlds(sig, (jl_value_t*)mt, world, &min_world, &max_world);
1418+
if (matches == jl_nothing) {
1419+
valid = 0;
1420+
break;
1421+
}
1422+
matches = (jl_value_t*)((jl_method_match_t*)matches)->method;
1423+
} else {
1424+
matches = jl_matching_methods((jl_tupletype_t*)sig, jl_nothing, -1, 0, jl_atomic_load_acquire(&jl_world_counter), &min_valid, &max_valid, &ambig);
1425+
if (matches == jl_false) {
1426+
valid = 0;
1427+
break;
1428+
}
1429+
size_t k;
1430+
for (k = 0; k < jl_array_len(matches); k++) {
1431+
jl_method_match_t *match = (jl_method_match_t *)jl_array_ptr_ref(matches, k);
1432+
jl_array_ptr_set(matches, k, match->method);
1433+
}
14201434
}
14211435
jl_array_ptr_1d_push(ext_targets, mode == 1 ? NULL : sig);
14221436
jl_array_ptr_1d_push(ext_targets, callee);
@@ -2542,8 +2556,10 @@ static void jl_verify_edges(jl_array_t *targets, jl_array_t **pvalids)
25422556
jl_array_t *valids = jl_alloc_array_1d(jl_array_uint8_type, l);
25432557
memset(jl_array_data(valids), 1, l);
25442558
jl_value_t *loctag = NULL, *matches = NULL;
2545-
JL_GC_PUSH2(&loctag, &matches);
2559+
jl_methtable_t *mt = NULL;
2560+
JL_GC_PUSH3(&loctag, &matches, &mt);
25462561
*pvalids = valids;
2562+
size_t world = jl_get_world_counter();
25472563
for (i = 0; i < l; i++) {
25482564
jl_value_t *invokesig = jl_array_ptr_ref(targets, i * 3);
25492565
jl_value_t *callee = jl_array_ptr_ref(targets, i * 3 + 1);
@@ -2555,33 +2571,43 @@ static void jl_verify_edges(jl_array_t *targets, jl_array_t **pvalids)
25552571
else {
25562572
sig = callee == NULL ? invokesig : callee;
25572573
}
2558-
jl_array_t *expected = (jl_array_t*)jl_array_ptr_ref(targets, i * 3 + 2);
2559-
assert(jl_is_array(expected));
2574+
jl_value_t *expected = jl_array_ptr_ref(targets, i * 3 + 2);
25602575
int valid = 1;
25612576
size_t min_valid = 0;
25622577
size_t max_valid = ~(size_t)0;
25632578
int ambig = 0;
2564-
// TODO: possibly need to included ambiguities too (for the optimizer correctness)?
2565-
matches = jl_matching_methods((jl_tupletype_t*)sig, jl_nothing, -1, 0, jl_atomic_load_acquire(&jl_world_counter), &min_valid, &max_valid, &ambig);
2566-
if (matches == jl_false || jl_array_len(matches) != jl_array_len(expected)) {
2567-
valid = 0;
2568-
}
2569-
else {
2570-
size_t j, k, l = jl_array_len(expected);
2571-
for (k = 0; k < jl_array_len(matches); k++) {
2572-
jl_method_match_t *match = (jl_method_match_t*)jl_array_ptr_ref(matches, k);
2573-
jl_method_t *m = match->method;
2574-
for (j = 0; j < l; j++) {
2575-
if (m == (jl_method_t*)jl_array_ptr_ref(expected, j))
2579+
int use_invoke = invokesig == NULL || callee == NULL ? 0 : 1;
2580+
if (!use_invoke) {
2581+
// TODO: possibly need to included ambiguities too (for the optimizer correctness)?
2582+
matches = jl_matching_methods((jl_tupletype_t*)sig, jl_nothing, -1, 0, jl_atomic_load_acquire(&jl_world_counter), &min_valid, &max_valid, &ambig);
2583+
if (matches == jl_false || jl_array_len(matches) != jl_array_len(expected)) {
2584+
valid = 0;
2585+
}
2586+
else {
2587+
assert(jl_is_array(expected));
2588+
size_t j, k, l = jl_array_len(expected);
2589+
for (k = 0; k < jl_array_len(matches); k++) {
2590+
jl_method_match_t *match = (jl_method_match_t*)jl_array_ptr_ref(matches, k);
2591+
jl_method_t *m = match->method;
2592+
for (j = 0; j < l; j++) {
2593+
if (m == (jl_method_t*)jl_array_ptr_ref(expected, j))
2594+
break;
2595+
}
2596+
if (j == l) {
2597+
// intersection has a new method or a method was
2598+
// deleted--this is now probably no good, just invalidate
2599+
// everything about it now
2600+
valid = 0;
25762601
break;
2602+
}
25772603
}
2578-
if (j == l) {
2579-
// intersection has a new method or a method was
2580-
// deleted--this is now probably no good, just invalidate
2581-
// everything about it now
2582-
valid = 0;
2583-
break;
2584-
}
2604+
}
2605+
} else {
2606+
mt = jl_method_get_table(((jl_method_instance_t*)callee)->def.method);
2607+
size_t min_world, max_world;
2608+
matches = jl_gf_invoke_lookup_worlds(invokesig, (jl_value_t*)mt, world, &min_world, &max_world);
2609+
if (matches == jl_nothing || expected != (jl_value_t*)((jl_method_match_t*)matches)->method) {
2610+
valid = 0;
25852611
}
25862612
}
25872613
jl_array_uint8_set(valids, i, valid);
@@ -2593,7 +2619,7 @@ static void jl_verify_edges(jl_array_t *targets, jl_array_t **pvalids)
25932619
jl_array_ptr_1d_push(_jl_debug_method_invalidation, loctag);
25942620
loctag = jl_box_uint64(jl_worklist_key(serializer_worklist));
25952621
jl_array_ptr_1d_push(_jl_debug_method_invalidation, loctag);
2596-
if (matches != jl_false) {
2622+
if (!use_invoke && matches != jl_false) {
25972623
// setdiff!(matches, expected)
25982624
size_t j, k, ins = 0;
25992625
for (j = 0; j < jl_array_len(matches); j++) {

src/gc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1738,8 +1738,9 @@ static void NOINLINE gc_mark_stack_resize(jl_gc_mark_cache_t *gc_cache, jl_gc_ma
17381738
jl_gc_mark_data_t *old_data = gc_cache->data_stack;
17391739
void **pc_stack = sp->pc_start;
17401740
size_t stack_size = (char*)sp->pc_end - (char*)pc_stack;
1741+
ptrdiff_t datadiff = (char*)sp->data - (char*)old_data;
17411742
gc_cache->data_stack = (jl_gc_mark_data_t *)realloc_s(old_data, stack_size * 2 * sizeof(jl_gc_mark_data_t));
1742-
sp->data = (jl_gc_mark_data_t *)(((char*)sp->data) + (((char*)gc_cache->data_stack) - ((char*)old_data)));
1743+
sp->data = (jl_gc_mark_data_t *)((char*)gc_cache->data_stack + datadiff);
17431744

17441745
sp->pc_start = gc_cache->pc_stack = (void**)realloc_s(pc_stack, stack_size * 2 * sizeof(void*));
17451746
gc_cache->pc_stack_end = sp->pc_end = sp->pc_start + stack_size * 2;

0 commit comments

Comments
 (0)