Skip to content

Commit 4117fd9

Browse files
medvednikovclaude
andcommitted
Fix TCC Windows crash: replace FnDecl compound literals with memdup
The large compound literal for `&ast.FnDecl{...*node, generic_names: ...}` generated ~1KB of stack-allocated struct initialization with 50+ field assignments including bitfields, which TCC on Windows x64 miscompiles causing a runtime crash (invalid memory access at checker/fn.v call_expr). Replace with memdup + direct field write to avoid the problematic compound literal. Also fix cube.js.v formatting for MSVC CI. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7b8aa4d commit 4117fd9

2 files changed

Lines changed: 10 additions & 7 deletions

File tree

examples/js_dom_cube/cube.js.v

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,8 @@ fn animate(mut state State, time f64) {
336336
state.gl.uniformMatrix4fv(state.mmatrix, JS.Boolean(false), state.mo_matrix.to_number_array())
337337

338338
state.gl.bindBuffer(dom.gl_element_array_buffer(), state.index_buffer)
339-
state.gl.drawElements(dom.gl_triangles(), JS.Number(indices.len), dom.gl_unsigned_short(), JS.Number(0))
339+
state.gl.drawElements(dom.gl_triangles(), JS.Number(indices.len), dom.gl_unsigned_short(),
340+
JS.Number(0))
340341

341342
dom.window().requestAnimationFrame(fn [mut state] (time JS.Number) {
342343
animate(mut state, f64(time))

vlib/v/checker/fn.v

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -745,9 +745,10 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
745745
if c.table.cur_concrete_types.len > 0
746746
&& effective_generic_names.len == c.table.cur_concrete_types.len
747747
&& node.generic_names != effective_generic_names {
748-
effective_cur_fn = &ast.FnDecl{
749-
...*node
750-
generic_names: effective_generic_names.clone()
748+
unsafe {
749+
effective_cur_fn = &ast.FnDecl(memdup(node, sizeof(ast.FnDecl)))
750+
mut p := &[]string(&effective_cur_fn.generic_names)
751+
*p = effective_generic_names.clone()
751752
}
752753
}
753754
c.table.cur_fn = effective_cur_fn
@@ -3446,9 +3447,10 @@ fn (mut c Checker) post_process_generic_fns() ! {
34463447
}
34473448
}
34483449
if effective_generic_names.len == concrete_types.len {
3449-
concrete_fn = &ast.FnDecl{
3450-
...*concrete_fn
3451-
generic_names: effective_generic_names
3450+
unsafe {
3451+
concrete_fn = &ast.FnDecl(memdup(concrete_fn, sizeof(ast.FnDecl)))
3452+
mut p := &[]string(&concrete_fn.generic_names)
3453+
*p = effective_generic_names
34523454
}
34533455
}
34543456
}

0 commit comments

Comments
 (0)