mod helpers; mod macros; use criterion_polyglot::{BenchSpec as Spec, CriterionPolyglotExt}; cases! { simple { python => Spec::from("pass"), ruby => Spec::from(""), c => Spec::from(""), zig => Spec::from(""), go => Spec::from("") }, init { python => Spec::from("defined_in_init") .with_global_init(r#" try: defined_in_init # exit with error if already defined exit(1) except NameError: # continue with no error if not defined defined_in_init = True "#), ruby => Spec::from(r#" raise NameError.new(msg = "`defined_in_init` not in scope for 'timed' code", name = :defined_in_init) \ unless defined? defined_in_init "#) .with_global_init(r#" raise NameError.new(msg = "init ran more than once", name = :defined_in_init) if defined? defined_in_init defined_in_init = true "#), c => Spec::from(r#" if (defined_in_init != 1) exit(1); "#) .with_imports(r#" #include "#) .with_declarations(r#" int defined_in_init = 0; "#) .with_global_init(r#" defined_in_init += 1; "#), zig => Spec::from(r#" if (defined_in_init != 1) { exit(1); } "#) .with_global_init(r#" var defined_in_init: u32 = 0; defined_in_init += 1; "#) .with_imports(r#"const exit = @import("std").os.exit;"#), go => Spec::from(r#" if defined_in_init != 1 { os.Exit(1) } "#) .with_global_init(r#" defined_in_init := 0 defined_in_init += 1 "#) .with_imports(r#" import "os" "#) }, setup { python => Spec::from(r#" if current != prev + 1: raise RuntimeError("setup code didn't run") "#) .with_sample_init(r#" global prev prev = 0 if prev is None else prev + 1 current = prev + 1 "#) .with_global_init(r#"prev = None"#), ruby => Spec::from(r#" if current != prev + 1 abort("setup code didn't run") end "#) .with_sample_init(r#" if prev == nil prev = 0 else prev += 1 end current = prev + 1 "#) .with_global_init(r#"prev = nil"#), c => Spec::from(r#"if (current != *prev + 1) { exit(1); }"#) .with_sample_init(r#" if (prev == NULL) { prev = malloc(sizeof(int)); *prev = 0; } else { *prev = *prev + 1; } current = *prev + 1; "#) .with_declarations(r#"int* prev = NULL; int current = 0;"#), zig => Spec::from(r#" if (current != prev.? + 1) { exit(1); } "#) .with_sample_init(r#" prev = (prev orelse 0) + 1; current = prev.? + 1; "#) .with_global_init(r#"var prev: ?usize = null; var current: usize = 0;"#) .with_imports(r#"const exit = @import("std").os.exit;"#), go => Spec::from(r#" if (current != *prev + 1) { os.Exit(1) } "#) .with_sample_init(r#" if prev == nil { prev = new(int) } else { *prev += 1 } current = *prev + 1 "#) .with_global_init(r#" var prev *int current := 0 "#) .with_imports(r#" import "os" "#) } }