v.gen.c: generate the closure helper for the choosen target platform, not the current one (#11134)

pull/11142/head
Enzo 2021-08-11 13:09:40 +02:00 committed by GitHub
parent 2c856c20c1
commit 9d4d0a9894
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 9 deletions

View File

@ -384,7 +384,7 @@ pub fn gen(files []&ast.File, table &ast.Table, pref &pref.Preferences) string {
if g.anon_fn_definitions.len > 0 { if g.anon_fn_definitions.len > 0 {
if g.nr_closures > 0 { if g.nr_closures > 0 {
b.writeln('\n// V closure helpers') b.writeln('\n// V closure helpers')
b.writeln(c_closure_helpers()) b.writeln(c_closure_helpers(g.pref))
} }
for fn_def in g.anon_fn_definitions { for fn_def in g.anon_fn_definitions {
b.writeln(fn_def) b.writeln(fn_def)

View File

@ -1,6 +1,7 @@
module c module c
import strings import strings
import v.pref
// NB: @@@ here serve as placeholders. // NB: @@@ here serve as placeholders.
// They will be replaced with correct strings // They will be replaced with correct strings
@ -54,18 +55,18 @@ static inline void __sort_ptr(uintptr_t a[], bool b[], int l) {
// Heavily based on Chris Wellons's work // Heavily based on Chris Wellons's work
// https://nullprogram.com/blog/2017/01/08/ // https://nullprogram.com/blog/2017/01/08/
fn c_closure_helpers() string { fn c_closure_helpers(pref &pref.Preferences) string {
$if windows { if pref.os == .windows {
verror('closures are not implemented on Windows yet') verror('closures are not implemented on Windows yet')
} }
$if !x64 { if pref.arch != .amd64 {
verror('closures are not implemented on this architecture yet') verror('closures are not implemented on this architecture yet: $pref.arch')
} }
mut builder := strings.new_builder(1024) mut builder := strings.new_builder(2048)
$if !windows { if pref.os != .windows {
builder.writeln('#include <sys/mman.h>') builder.writeln('#include <sys/mman.h>')
} }
$if x64 { if pref.arch == .amd64 {
builder.write_string(' builder.write_string('
static unsigned char __closure_thunk[6][13] = { static unsigned char __closure_thunk[6][13] = {
{ {
@ -101,7 +102,7 @@ static void __closure_set_function(void *closure, void *f) {
p[-1] = f; p[-1] = f;
} }
') ')
$if !windows { if pref.os != .windows {
builder.write_string(' builder.write_string('
static void * __closure_create(void *f, int nargs, void *userdata) { static void * __closure_create(void *f, int nargs, void *userdata) {
long page_size = sysconf(_SC_PAGESIZE); long page_size = sysconf(_SC_PAGESIZE);