diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index ed2614a..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -*.bf linguist-vendored -*.b linguist-vendored diff --git a/README.md b/README.md index 54afa99..9649689 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,15 @@ -# brainfuck -Brainfuck interpreters in different languages - -Get the releases! - -Rust: CLI binary, in the release tab -Typescript: [react website](https://nilstrieb.github.io/brainfuck/) - -Finished: -- Rust -- Java -- Interactive TypeScript - -WIP: - -To-Do: -- Idris +# brainfuck +Brainfuck interpreters in different languages + +Finished: +- Rust +- Rust o1 +- Java + +WIP: +- Rust o2 + +To-Do: +- Haskell +- TypeScript +- (JavaScript) diff --git a/bfi-haskell/.gitignore b/bfi-haskell/.gitignore index 59a9409..75de2d0 100644 --- a/bfi-haskell/.gitignore +++ b/bfi-haskell/.gitignore @@ -1,2 +1,2 @@ -.idea +.idea .stack-work \ No newline at end of file diff --git a/bfi-haskell/.idea/.gitignore b/bfi-haskell/.idea/.gitignore index a457b30..e2ab569 100644 --- a/bfi-haskell/.idea/.gitignore +++ b/bfi-haskell/.idea/.gitignore @@ -1,8 +1,8 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/../../../../../../../:\Users\nilsh\IdeaProjects\brainfuck\bfi-haskell\.idea/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../../../../:\Users\nilsh\IdeaProjects\brainfuck\bfi-haskell\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/bfi-haskell/.idea/libraries/base_4_14_1_0.xml b/bfi-haskell/.idea/libraries/base_4_14_1_0.xml index 2aba713..e609dc2 100644 --- a/bfi-haskell/.idea/libraries/base_4_14_1_0.xml +++ b/bfi-haskell/.idea/libraries/base_4_14_1_0.xml @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/bfi-haskell/.idea/libraries/ghc_prim_0_6_1.xml b/bfi-haskell/.idea/libraries/ghc_prim_0_6_1.xml index f82c2cc..aa90834 100644 --- a/bfi-haskell/.idea/libraries/ghc_prim_0_6_1.xml +++ b/bfi-haskell/.idea/libraries/ghc_prim_0_6_1.xml @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/bfi-haskell/.idea/libraries/integer_gmp_1_0_3_0.xml b/bfi-haskell/.idea/libraries/integer_gmp_1_0_3_0.xml index d2d80d9..7407fd2 100644 --- a/bfi-haskell/.idea/libraries/integer_gmp_1_0_3_0.xml +++ b/bfi-haskell/.idea/libraries/integer_gmp_1_0_3_0.xml @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/bfi-haskell/.idea/misc.xml b/bfi-haskell/.idea/misc.xml index b19e573..b67500e 100644 --- a/bfi-haskell/.idea/misc.xml +++ b/bfi-haskell/.idea/misc.xml @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/bfi-haskell/.idea/modules.xml b/bfi-haskell/.idea/modules.xml index fde9029..e201dba 100644 --- a/bfi-haskell/.idea/modules.xml +++ b/bfi-haskell/.idea/modules.xml @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/bfi-haskell/.idea/vcs.xml b/bfi-haskell/.idea/vcs.xml index 2e3f692..6c0b863 100644 --- a/bfi-haskell/.idea/vcs.xml +++ b/bfi-haskell/.idea/vcs.xml @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/bfi-haskell/bfi-haskell.iml b/bfi-haskell/bfi-haskell.iml index bb44fed..cecc131 100644 --- a/bfi-haskell/bfi-haskell.iml +++ b/bfi-haskell/bfi-haskell.iml @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bfi-java/bf.b b/bfi-java/bf.b index 004f459..b695ab4 100644 --- a/bfi-java/bf.b +++ b/bfi-java/bf.b @@ -1,11 +1,11 @@ -++++++++++[>++++++++++<-]>>++++++++++>->>>>>>>>>>>>>>>>-->+++++++[->++ -++++++++<]>[->+>+>+>+<<<<]+++>>+++>>>++++++++[-<++++<++++<++++>>>]++++ -+[-<++++<++++>>]>>-->++++++[->+++++++++++<]>[->+>+>+>+<<<<]+++++>>+>++ -++++>++++++>++++++++[-<++++<++++<++++>>>]++++++[-<+++<+++<+++>>>]>>--> ----+[-<+]-<[+[->+]-<<->>>+>[-]++[-->++]-->+++[---++[--<++]---->>-<+>[+ -+++[----<++++]--[>]++[-->++]--<]>++[--+[-<+]->>[-]+++++[---->++++]-->[ -->+<]>>[.>]++[-->++]]-->+++]---+[-<+]->>-[+>>>+[-<+]->>>++++++++++<<[- ->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]> -+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->+++ -+++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]+[-<+]->>]+[-]<<<.>>>+[ +++++++++++[>++++++++++<-]>>++++++++++>->>>>>>>>>>>>>>>>-->+++++++[->++ +++++++++<]>[->+>+>+>+<<<<]+++>>+++>>>++++++++[-<++++<++++<++++>>>]++++ ++[-<++++<++++>>]>>-->++++++[->+++++++++++<]>[->+>+>+>+<<<<]+++++>>+>++ +++++>++++++>++++++++[-<++++<++++<++++>>>]++++++[-<+++<+++<+++>>>]>>--> +---+[-<+]-<[+[->+]-<<->>>+>[-]++[-->++]-->+++[---++[--<++]---->>-<+>[+ ++++[----<++++]--[>]++[-->++]--<]>++[--+[-<+]->>[-]+++++[---->++++]-->[ +->+<]>>[.>]++[-->++]]-->+++]---+[-<+]->>-[+>>>+[-<+]->>>++++++++++<<[- +>+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]> ++>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->+++ ++++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]+[-<+]->>]+[-]<<<.>>>+[ -<+]-<<] \ No newline at end of file diff --git a/bfi-java/src/Brainfuck.java b/bfi-java/src/Brainfuck.java index 1d82877..dcdc8ff 100644 --- a/bfi-java/src/Brainfuck.java +++ b/bfi-java/src/Brainfuck.java @@ -1,111 +1,111 @@ -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.stream.Collectors; - -public class Brainfuck { - - private static final int MEM_SIZE = 0xFFFF; - - public List minify(String program) { - List chars = List.of('>', '<', '+', '-', '.', ',', '[', ']'); - return program.chars().parallel() - .mapToObj(c -> (char) c) - .filter(chars::contains) - .collect(Collectors.toList()); - } - - - public String interpret(List pgm) { - StringBuilder out = new StringBuilder(); - int pointer = 0; - short[] memory = new short[MEM_SIZE]; - int pc = 0; - - while (pc < pgm.size()) { - switch (pgm.get(pc)) { - case '>' -> { - if (pointer == MEM_SIZE - 1) { - pointer = 0; - } else { - pointer++; - } - } - case '<' -> { - if (pointer == 0) { - pointer = MEM_SIZE - 1; - } else { - pointer--; - } - } - case '+' -> increment(memory, pointer); - case '-' -> decrement(memory, pointer); - case '.' -> { - out.append((char) memory[pointer]); - } - case ',' -> { - } //todo implement i guess - case '[' -> { - if (memory[pointer] == 0) { - int level = 0; - while (pgm.get(pc) != ']' || level > -1) { - pc++; - char instruction = pgm.get(pc); - if (instruction == '[') level++; - else if (instruction == ']') level--; - } - } - } - case ']' -> { //error lies here - if (memory[pointer] != 0) { - int level = 0; - while (pgm.get(pc) != '[' || level > -1) { - pc--; - char instruction = pgm.get(pc); - if (instruction == '[') level--; - else if (instruction == ']') level++; - } - } - } - } - - pc++; - } - - return out.toString(); - } - - private void increment(short[] memory, int pointer) { - if (memory[pointer] == 0xFF) { - memory[pointer] = 0; - } else { - memory[pointer]++; - } - } - - private void decrement(short[] memory, int pointer) { - if (memory[pointer] == 0) { - memory[pointer] = 0xFF; - } else { - memory[pointer]--; - } - } - - public static void main(String[] args) throws IOException { - Brainfuck brainfuck = new Brainfuck(); - - if (args.length < 1) { - System.out.println("Please specify a path"); - return; - } - - String program = Files.readString(Paths.get(args[0])); - List minified = brainfuck.minify(program); - long time1 = System.currentTimeMillis(); - String result = brainfuck.interpret(minified); - long time = System.currentTimeMillis() - time1; - System.out.println(result); - System.out.println("Finished execution in " + time + "ms"); - } -} +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +public class Brainfuck { + + private static final int MEM_SIZE = 0xFFFF; + + public List minify(String program) { + List chars = List.of('>', '<', '+', '-', '.', ',', '[', ']'); + return program.chars() + .mapToObj(c -> (char) c) + .filter(chars::contains) + .collect(Collectors.toList()); + } + + + public String interpret(List pgm) { + StringBuilder out = new StringBuilder(); + int pointer = 0; + short[] memory = new short[MEM_SIZE]; + int pc = 0; + + while (pc < pgm.size()) { + switch (pgm.get(pc)) { + case '>' -> { + if (pointer == MEM_SIZE - 1) { + pointer = 0; + } else { + pointer++; + } + } + case '<' -> { + if (pointer == 0) { + pointer = MEM_SIZE - 1; + } else { + pointer--; + } + } + case '+' -> increment(memory, pointer); + case '-' -> decrement(memory, pointer); + case '.' -> { + out.append((char) memory[pointer]); + } + case ',' -> { + } //todo implement i guess + case '[' -> { + if (memory[pointer] == 0) { + int level = 0; + while (pgm.get(pc) != ']' || level > -1) { + pc++; + char instruction = pgm.get(pc); + if (instruction == '[') level++; + else if (instruction == ']') level--; + } + } + } + case ']' -> { //error lies here + if (memory[pointer] != 0) { + int level = 0; + while (pgm.get(pc) != '[' || level > -1) { + pc--; + char instruction = pgm.get(pc); + if (instruction == '[') level--; + else if (instruction == ']') level++; + } + } + } + } + + pc++; + } + + return out.toString(); + } + + private void increment(short[] memory, int pointer) { + if (memory[pointer] == 0xFF) { + memory[pointer] = 0; + } else { + memory[pointer]++; + } + } + + private void decrement(short[] memory, int pointer) { + if (memory[pointer] == 0) { + memory[pointer] = 0xFF; + } else { + memory[pointer]--; + } + } + + public static void main(String[] args) throws IOException { + Brainfuck brainfuck = new Brainfuck(); + + if (args.length < 1) { + System.out.println("Please specify a path"); + return; + } + + String program = Files.readString(Paths.get(args[0])); + List minified = brainfuck.minify(program); + long time1 = System.currentTimeMillis(); + String result = brainfuck.interpret(minified); + long time = System.currentTimeMillis() - time1; + System.out.println(result); + System.out.println("Finished execution in " + time + "ms"); + } +} diff --git a/bfi-rust/.gitignore b/bfi-rust/.gitignore index 5180a2e..c891b9a 100644 --- a/bfi-rust/.gitignore +++ b/bfi-rust/.gitignore @@ -1,3 +1,5 @@ -/target -.idea -# brainfuck testing code, get your own +/target +.idea +# brainfuck testing code, get your own +*.b +*.bf \ No newline at end of file diff --git a/bfi-rust/Cargo.lock b/bfi-rust/Cargo.lock index 5a78639..f25fde6 100644 --- a/bfi-rust/Cargo.lock +++ b/bfi-rust/Cargo.lock @@ -2,4 +2,4 @@ # It is not intended for manual editing. [[package]] name = "bfinterpreter" -version = "0.1.1" +version = "0.1.0" diff --git a/bfi-rust/Cargo.toml b/bfi-rust/Cargo.toml index f811989..22a7cc0 100644 --- a/bfi-rust/Cargo.toml +++ b/bfi-rust/Cargo.toml @@ -1,15 +1,13 @@ -[package] -name = "bfinterpreter" -version = "0.1.1" -authors = ["Nilstrieb "] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] - -[profile.release] -debug = true - -[profile.dev] -opt-level = 3 +[package] +name = "bfinterpreter" +version = "0.1.0" +authors = ["Nilstrieb "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + + +[profile.dev] +opt-level = 3 \ No newline at end of file diff --git a/bfi-rust/flamegraph.svg b/bfi-rust/flamegraph.svg deleted file mode 100644 index 6c2d580..0000000 --- a/bfi-rust/flamegraph.svg +++ /dev/null @@ -1,412 +0,0 @@ -Flame Graph Reset ZoomSearch <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.02%)core::slice::iter::Iter<T>::post_inc_start (1 samples, 0.02%)core::ptr::non_null::NonNull<T>::new_unchecked (1 samples, 0.02%)amd_pmu_wait_on_overflow (6 samples, 0.13%)native_read_msr (6 samples, 0.13%)native_write_msr (2 samples, 0.04%)perf_pmu_disable.part.0 (9 samples, 0.19%)x86_pmu_disable (9 samples, 0.19%)amd_pmu_disable_all (9 samples, 0.19%)x86_pmu_disable_all (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__perf_event_task_sched_out (10 samples, 0.21%)task_ctx_sched_out (10 samples, 0.21%)ctx_sched_out (10 samples, 0.21%)sched_clock_cpu (1 samples, 0.02%)<std::io::stdio::Stdout as std::io::Write>::flush (21 samples, 0.45%)<&std::io::stdio::Stdout as std::io::Write>::flush (21 samples, 0.45%)<std::io::stdio::StdoutLock as std::io::Write>::flush (21 samples, 0.45%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::flush (21 samples, 0.45%)<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::flush (21 samples, 0.45%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (21 samples, 0.45%)<std::io::stdio::StdoutRaw as std::io::Write>::write (21 samples, 0.45%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (21 samples, 0.45%)std::sys::unix::fd::FileDesc::write (21 samples, 0.45%)__libc_write (21 samples, 0.45%)entry_SYSCALL_64_after_hwframe (21 samples, 0.45%)do_syscall_64 (21 samples, 0.45%)__syscall_return_slowpath (21 samples, 0.45%)__prepare_exit_to_usermode (21 samples, 0.45%)schedule (21 samples, 0.45%)__schedule (21 samples, 0.45%)finish_task_switch (11 samples, 0.24%)__perf_event_task_sched_in (11 samples, 0.24%)perf_pmu_enable.part.0 (11 samples, 0.24%)x86_pmu_enable (11 samples, 0.24%)native_write_msr (11 samples, 0.24%)<usize as core::ops::arith::AddAssign<&usize>>::add_assign (3 samples, 0.06%)<usize as core::ops::arith::AddAssign>::add_assign (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (3 samples, 0.06%)sysvec_apic_timer_interrupt (3 samples, 0.06%)__sysvec_apic_timer_interrupt (3 samples, 0.06%)hrtimer_interrupt (3 samples, 0.06%)__hrtimer_run_queues (3 samples, 0.06%)tick_sched_timer (3 samples, 0.06%)tick_sched_handle.isra.0 (3 samples, 0.06%)update_process_times (3 samples, 0.06%)scheduler_tick (3 samples, 0.06%)perf_event_task_tick (3 samples, 0.06%)perf_pmu_disable.part.0 (3 samples, 0.06%)x86_pmu_disable (3 samples, 0.06%)amd_pmu_disable_all (3 samples, 0.06%)amd_pmu_wait_on_overflow (3 samples, 0.06%)native_read_msr (3 samples, 0.06%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.09%)core::slice::iter::Iter<T>::post_inc_start (4 samples, 0.09%)core::ptr::non_null::NonNull<T>::new_unchecked (4 samples, 0.09%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)amd_pmu_wait_on_overflow (4 samples, 0.09%)native_read_msr (4 samples, 0.09%)__syscall_return_slowpath (6 samples, 0.13%)__prepare_exit_to_usermode (6 samples, 0.13%)schedule (6 samples, 0.13%)__schedule (6 samples, 0.13%)__perf_event_task_sched_out (6 samples, 0.13%)task_ctx_sched_out (6 samples, 0.13%)ctx_sched_out (6 samples, 0.13%)perf_pmu_disable.part.0 (6 samples, 0.13%)x86_pmu_disable (6 samples, 0.13%)amd_pmu_disable_all (6 samples, 0.13%)x86_pmu_disable_all (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)file_tty_write.isra.0 (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<std::io::stdio::Stdout as std::io::Write>::flush (10 samples, 0.21%)<&std::io::stdio::Stdout as std::io::Write>::flush (10 samples, 0.21%)<std::io::stdio::StdoutLock as std::io::Write>::flush (10 samples, 0.21%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::flush (10 samples, 0.21%)<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::flush (10 samples, 0.21%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (10 samples, 0.21%)<std::io::stdio::StdoutRaw as std::io::Write>::write (10 samples, 0.21%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (10 samples, 0.21%)std::sys::unix::fd::FileDesc::write (10 samples, 0.21%)__libc_write (10 samples, 0.21%)entry_SYSCALL_64_after_hwframe (10 samples, 0.21%)do_syscall_64 (10 samples, 0.21%)__x64_sys_write (4 samples, 0.09%)ksys_write (4 samples, 0.09%)vfs_write (4 samples, 0.09%)new_sync_write (4 samples, 0.09%)tty_write (3 samples, 0.06%)tty_ldisc_deref (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (2 samples, 0.04%)sysvec_apic_timer_interrupt (2 samples, 0.04%)asm_call_sysvec_on_stack (2 samples, 0.04%)__sysvec_apic_timer_interrupt (2 samples, 0.04%)hrtimer_interrupt (2 samples, 0.04%)tick_program_event (1 samples, 0.02%)clockevents_program_event (1 samples, 0.02%)lapic_next_event (1 samples, 0.02%)native_write_msr (1 samples, 0.02%)__hrtimer_run_queues (7 samples, 0.15%)tick_sched_timer (7 samples, 0.15%)tick_sched_handle.isra.0 (7 samples, 0.15%)update_process_times (7 samples, 0.15%)scheduler_tick (7 samples, 0.15%)perf_event_task_tick (7 samples, 0.15%)perf_pmu_disable.part.0 (7 samples, 0.15%)x86_pmu_disable (7 samples, 0.15%)amd_pmu_disable_all (7 samples, 0.15%)amd_pmu_wait_on_overflow (7 samples, 0.15%)native_read_msr (7 samples, 0.15%)__sysvec_apic_timer_interrupt (9 samples, 0.19%)hrtimer_interrupt (9 samples, 0.19%)tick_program_event (2 samples, 0.04%)clockevents_program_event (2 samples, 0.04%)lapic_next_event (2 samples, 0.04%)native_write_msr (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (10 samples, 0.21%)sysvec_apic_timer_interrupt (10 samples, 0.21%)idtentry_exit_cond_rcu (1 samples, 0.02%)prepare_exit_to_usermode (1 samples, 0.02%)__prepare_exit_to_usermode (1 samples, 0.02%)schedule (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__const_udelay (1 samples, 0.02%)delay_tsc (1 samples, 0.02%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (109 samples, 2.34%)<..core::slice::iter::Iter<T>::post_inc_start (95 samples, 2.04%)c..core::ptr::non_null::NonNull<T>::new_unchecked (95 samples, 2.04%)c..asm_sysvec_apic_timer_interrupt (10 samples, 0.21%)sysvec_apic_timer_interrupt (10 samples, 0.21%)__sysvec_apic_timer_interrupt (10 samples, 0.21%)hrtimer_interrupt (10 samples, 0.21%)__hrtimer_run_queues (10 samples, 0.21%)tick_sched_timer (10 samples, 0.21%)tick_sched_handle.isra.0 (10 samples, 0.21%)update_process_times (10 samples, 0.21%)scheduler_tick (10 samples, 0.21%)perf_event_task_tick (10 samples, 0.21%)perf_pmu_disable.part.0 (10 samples, 0.21%)x86_pmu_disable (10 samples, 0.21%)amd_pmu_disable_all (10 samples, 0.21%)amd_pmu_wait_on_overflow (10 samples, 0.21%)native_read_msr (9 samples, 0.19%)amd_pmu_wait_on_overflow (23 samples, 0.49%)native_read_msr (23 samples, 0.49%)native_write_msr (1 samples, 0.02%)__perf_event_task_sched_out (29 samples, 0.62%)task_ctx_sched_out (29 samples, 0.62%)ctx_sched_out (29 samples, 0.62%)perf_pmu_disable.part.0 (29 samples, 0.62%)x86_pmu_disable (29 samples, 0.62%)amd_pmu_disable_all (29 samples, 0.62%)x86_pmu_disable_all (5 samples, 0.11%)native_read_msr (5 samples, 0.11%)__syscall_return_slowpath (30 samples, 0.64%)__prepare_exit_to_usermode (30 samples, 0.64%)schedule (30 samples, 0.64%)__schedule (30 samples, 0.64%)finish_task_switch (1 samples, 0.02%)__perf_event_task_sched_in (1 samples, 0.02%)perf_pmu_enable.part.0 (1 samples, 0.02%)x86_pmu_enable (1 samples, 0.02%)native_write_msr (1 samples, 0.02%)__fget_light (1 samples, 0.02%)new_sync_write (1 samples, 0.02%)fsnotify_parent (1 samples, 0.02%)__check_object_size (2 samples, 0.04%)__virt_addr_valid (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)copyin (1 samples, 0.02%)down_read (1 samples, 0.02%)_cond_resched (1 samples, 0.02%)preempt_schedule_common (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__lock_text_start (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)_raw_spin_lock_irqsave (1 samples, 0.02%)memcpy (1 samples, 0.02%)__smp_call_single_queue (26 samples, 0.56%)send_call_function_single_ipi (26 samples, 0.56%)native_send_call_func_single_ipi (26 samples, 0.56%)native_write_msr (26 samples, 0.56%)__queue_work (28 samples, 0.60%)insert_work (27 samples, 0.58%)wake_up_process (27 samples, 0.58%)try_to_wake_up (27 samples, 0.58%)ttwu_queue_wakelist (27 samples, 0.58%)sched_clock (1 samples, 0.02%)tty_flip_buffer_push (31 samples, 0.66%)queue_work_on (31 samples, 0.66%)asm_sysvec_apic_timer_interrupt (2 samples, 0.04%)sysvec_apic_timer_interrupt (2 samples, 0.04%)asm_call_sysvec_on_stack (2 samples, 0.04%)__sysvec_apic_timer_interrupt (2 samples, 0.04%)hrtimer_interrupt (2 samples, 0.04%)__hrtimer_run_queues (2 samples, 0.04%)tick_sched_timer (2 samples, 0.04%)tick_sched_handle.isra.0 (2 samples, 0.04%)update_process_times (2 samples, 0.04%)scheduler_tick (2 samples, 0.04%)perf_event_task_tick (2 samples, 0.04%)perf_pmu_disable.part.0 (2 samples, 0.04%)x86_pmu_disable (2 samples, 0.04%)amd_pmu_disable_all (2 samples, 0.04%)amd_pmu_wait_on_overflow (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)pty_write (36 samples, 0.77%)tty_insert_flip_string_fixed_flag (1 samples, 0.02%)n_tty_write (38 samples, 0.81%)tty_flip_buffer_push (1 samples, 0.02%)tty_ldisc_ref_wait (1 samples, 0.02%)ldsem_down_read (1 samples, 0.02%)new_sync_write (46 samples, 0.99%)tty_write (45 samples, 0.96%)file_tty_write.isra.0 (45 samples, 0.96%)tty_write_unlock (1 samples, 0.02%)__wake_up (1 samples, 0.02%)__wake_up_common_lock (1 samples, 0.02%)__x64_sys_write (51 samples, 1.09%)ksys_write (51 samples, 1.09%)vfs_write (49 samples, 1.05%)rw_verify_area (2 samples, 0.04%)security_file_permission (1 samples, 0.02%)apparmor_file_permission (1 samples, 0.02%)common_file_perm (1 samples, 0.02%)<std::io::stdio::Stdout as std::io::Write>::flush (82 samples, 1.76%)<&std::io::stdio::Stdout as std::io::Write>::flush (82 samples, 1.76%)<std::io::stdio::StdoutLock as std::io::Write>::flush (82 samples, 1.76%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::flush (82 samples, 1.76%)<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::flush (82 samples, 1.76%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (82 samples, 1.76%)<std::io::stdio::StdoutRaw as std::io::Write>::write (82 samples, 1.76%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (82 samples, 1.76%)std::sys::unix::fd::FileDesc::write (82 samples, 1.76%)__libc_write (82 samples, 1.76%)entry_SYSCALL_64_after_hwframe (82 samples, 1.76%)do_syscall_64 (82 samples, 1.76%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<usize as core::ops::arith::AddAssign<&usize>>::add_assign (3 samples, 0.06%)<usize as core::ops::arith::AddAssign>::add_assign (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)amd_pmu_wait_on_overflow (42 samples, 0.90%)native_read_msr (42 samples, 0.90%)__hrtimer_run_queues (43 samples, 0.92%)tick_sched_timer (43 samples, 0.92%)tick_sched_handle.isra.0 (43 samples, 0.92%)update_process_times (43 samples, 0.92%)scheduler_tick (43 samples, 0.92%)perf_event_task_tick (43 samples, 0.92%)perf_pmu_disable.part.0 (43 samples, 0.92%)x86_pmu_disable (43 samples, 0.92%)amd_pmu_disable_all (43 samples, 0.92%)native_write_msr (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (44 samples, 0.94%)sysvec_apic_timer_interrupt (44 samples, 0.94%)__sysvec_apic_timer_interrupt (44 samples, 0.94%)hrtimer_interrupt (44 samples, 0.94%)tick_program_event (1 samples, 0.02%)clockevents_program_event (1 samples, 0.02%)lapic_next_event (1 samples, 0.02%)native_write_msr (1 samples, 0.02%)__const_udelay (1 samples, 0.02%)delay_tsc (1 samples, 0.02%)<alloc::boxed::Box<T,A> as core::ops::deref::Deref>::deref (41 samples, 0.88%)asm_sysvec_apic_timer_interrupt (6 samples, 0.13%)sysvec_apic_timer_interrupt (6 samples, 0.13%)__sysvec_apic_timer_interrupt (6 samples, 0.13%)hrtimer_interrupt (6 samples, 0.13%)__hrtimer_run_queues (6 samples, 0.13%)tick_sched_timer (6 samples, 0.13%)tick_sched_handle.isra.0 (6 samples, 0.13%)update_process_times (6 samples, 0.13%)scheduler_tick (6 samples, 0.13%)perf_event_task_tick (6 samples, 0.13%)perf_pmu_disable.part.0 (6 samples, 0.13%)x86_pmu_disable (6 samples, 0.13%)amd_pmu_disable_all (6 samples, 0.13%)amd_pmu_wait_on_overflow (6 samples, 0.13%)native_read_msr (5 samples, 0.11%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (17 samples, 0.36%)core::slice::iter::Iter<T>::post_inc_start (15 samples, 0.32%)core::ptr::non_null::NonNull<T>::new_unchecked (15 samples, 0.32%)asm_sysvec_apic_timer_interrupt (3 samples, 0.06%)sysvec_apic_timer_interrupt (3 samples, 0.06%)__sysvec_apic_timer_interrupt (3 samples, 0.06%)hrtimer_interrupt (3 samples, 0.06%)__hrtimer_run_queues (3 samples, 0.06%)tick_sched_timer (3 samples, 0.06%)tick_sched_handle.isra.0 (3 samples, 0.06%)update_process_times (3 samples, 0.06%)scheduler_tick (3 samples, 0.06%)perf_event_task_tick (3 samples, 0.06%)perf_pmu_disable.part.0 (3 samples, 0.06%)x86_pmu_disable (3 samples, 0.06%)amd_pmu_disable_all (3 samples, 0.06%)amd_pmu_wait_on_overflow (3 samples, 0.06%)native_read_msr (3 samples, 0.06%)__syscall_return_slowpath (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__syscall_return_slowpath (1 samples, 0.02%)__prepare_exit_to_usermode (1 samples, 0.02%)schedule (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__fdget_pos (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)new_sync_write (1 samples, 0.02%)__check_object_size (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__check_heap_object (1 samples, 0.02%)_copy_from_iter (2 samples, 0.04%)copy_user_generic_string (1 samples, 0.02%)mutex_unlock (1 samples, 0.02%)add_wait_queue (1 samples, 0.02%)process_echoes (1 samples, 0.02%)__lock_text_start (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)_raw_spin_lock_irqsave (2 samples, 0.04%)queue_work_on (1 samples, 0.02%)get_work_pool (1 samples, 0.02%)idr_find (1 samples, 0.02%)radix_tree_lookup (1 samples, 0.02%)__radix_tree_lookup (1 samples, 0.02%)_raw_spin_lock_irqsave (1 samples, 0.02%)select_task_rq_fair (2 samples, 0.04%)available_idle_cpu (2 samples, 0.04%)native_send_call_func_single_ipi (1 samples, 0.02%)native_write_msr (129 samples, 2.76%)na..__smp_call_single_queue (134 samples, 2.87%)__..send_call_function_single_ipi (133 samples, 2.85%)se..native_send_call_func_single_ipi (131 samples, 2.81%)na..x2apic_send_IPI (2 samples, 0.04%)try_to_wake_up (138 samples, 2.96%)try..ttwu_queue_wakelist (135 samples, 2.89%)tt..llist_add_batch (1 samples, 0.02%)__queue_work (140 samples, 3.00%)__q..insert_work (139 samples, 2.98%)ins..wake_up_process (139 samples, 2.98%)wak..ttwu_queue_wakelist (1 samples, 0.02%)hrtimer_wakeup (2 samples, 0.04%)wake_up_process (2 samples, 0.04%)try_to_wake_up (2 samples, 0.04%)ttwu_do_activate (2 samples, 0.04%)psi_task_change (2 samples, 0.04%)__const_udelay (1 samples, 0.02%)delay_tsc (1 samples, 0.02%)__hrtimer_run_queues (26 samples, 0.56%)tick_sched_timer (24 samples, 0.51%)tick_sched_handle.isra.0 (24 samples, 0.51%)update_process_times (24 samples, 0.51%)scheduler_tick (24 samples, 0.51%)perf_event_task_tick (24 samples, 0.51%)perf_pmu_disable.part.0 (24 samples, 0.51%)x86_pmu_disable (24 samples, 0.51%)amd_pmu_disable_all (24 samples, 0.51%)amd_pmu_wait_on_overflow (24 samples, 0.51%)native_read_msr (23 samples, 0.49%)asm_sysvec_apic_timer_interrupt (29 samples, 0.62%)sysvec_apic_timer_interrupt (29 samples, 0.62%)asm_call_sysvec_on_stack (29 samples, 0.62%)__sysvec_apic_timer_interrupt (29 samples, 0.62%)hrtimer_interrupt (29 samples, 0.62%)tick_program_event (3 samples, 0.06%)clockevents_program_event (3 samples, 0.06%)lapic_next_event (3 samples, 0.06%)native_write_msr (3 samples, 0.06%)tty_flip_buffer_push (172 samples, 3.69%)tty_..queue_work_on (172 samples, 3.69%)queu..insert_work (2 samples, 0.04%)pty_write (177 samples, 3.79%)pty_..tty_insert_flip_string_fixed_flag (1 samples, 0.02%)__tty_buffer_request_room (1 samples, 0.02%)n_tty_write (185 samples, 3.96%)n_tt..pty_write_room (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)process_echoes (1 samples, 0.02%)new_sync_write (195 samples, 4.18%)new_s..tty_write (195 samples, 4.18%)tty_w..file_tty_write.isra.0 (193 samples, 4.14%)file_..tty_ldisc_ref_wait (1 samples, 0.02%)_cond_resched (1 samples, 0.02%)apparmor_file_permission (2 samples, 0.04%)rw_verify_area (3 samples, 0.06%)security_file_permission (1 samples, 0.02%)apparmor_file_permission (1 samples, 0.02%)common_file_perm (1 samples, 0.02%)__libc_write (209 samples, 4.48%)__lib..entry_SYSCALL_64_after_hwframe (209 samples, 4.48%)entry..do_syscall_64 (207 samples, 4.44%)do_sy..__x64_sys_write (205 samples, 4.39%)__x64..ksys_write (203 samples, 4.35%)ksys_..vfs_write (202 samples, 4.33%)vfs_w..tty_write (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (210 samples, 4.50%)<std:..std::sys::unix::fd::FileDesc::write (210 samples, 4.50%)std::..bfinterpreter::interpreter::optimized::execute (1 samples, 0.02%)entry_SYSCALL_64 (1 samples, 0.02%)<std::io::stdio::StdoutLock as std::io::Write>::flush (211 samples, 4.52%)<std:..<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::flush (211 samples, 4.52%)<std:..<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::flush (211 samples, 4.52%)<std:..std::io::buffered::bufwriter::BufWriter<W>::flush_buf (211 samples, 4.52%)std::..<std::io::stdio::StdoutRaw as std::io::Write>::write (211 samples, 4.52%)<std:..std::io::stdio::handle_ebadf (1 samples, 0.02%)<std::io::stdio::Stdout as std::io::Write>::flush (213 samples, 4.56%)<std:..<&std::io::stdio::Stdout as std::io::Write>::flush (213 samples, 4.56%)<&std..core::ptr::drop_in_place<std::io::stdio::StdoutLock> (1 samples, 0.02%)core::ptr::drop_in_place<std::sys_common::remutex::ReentrantMutexGuard<core::cell::RefCell<std::io::buffered::linewriter::LineWriter<std::io::stdio::StdoutRaw>>>> (1 samples, 0.02%)<std::sys_common::remutex::ReentrantMutexGuard<T> as core::ops::drop::Drop>::drop (1 samples, 0.02%)std::sys::unix::mutex::ReentrantMutex::unlock (1 samples, 0.02%)__GI___pthread_mutex_unlock (1 samples, 0.02%)__pthread_mutex_unlock_usercnt (1 samples, 0.02%)<usize as core::ops::arith::AddAssign<&usize>>::add_assign (3 samples, 0.06%)<usize as core::ops::arith::AddAssign>::add_assign (3 samples, 0.06%)asm_common_interrupt (1 samples, 0.02%)common_interrupt (1 samples, 0.02%)handle_edge_irq (1 samples, 0.02%)irq_chip_ack_parent (1 samples, 0.02%)apic_ack_edge (1 samples, 0.02%)native_apic_msr_eoi_write (1 samples, 0.02%)__const_udelay (5 samples, 0.11%)delay_tsc (3 samples, 0.06%)perf_pmu_disable.part.0 (167 samples, 3.58%)perf..x86_pmu_disable (167 samples, 3.58%)x86_..amd_pmu_disable_all (167 samples, 3.58%)amd_..amd_pmu_wait_on_overflow (167 samples, 3.58%)amd_..native_read_msr (161 samples, 3.45%)nat..__hrtimer_run_queues (168 samples, 3.60%)__hr..tick_sched_timer (168 samples, 3.60%)tick..tick_sched_handle.isra.0 (168 samples, 3.60%)tick..update_process_times (168 samples, 3.60%)upda..scheduler_tick (168 samples, 3.60%)sche..perf_event_task_tick (168 samples, 3.60%)perf..x86_pmu_stop (1 samples, 0.02%)amd_pmu_disable_event (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__sysvec_apic_timer_interrupt (173 samples, 3.71%)__sy..hrtimer_interrupt (173 samples, 3.71%)hrti..tick_program_event (5 samples, 0.11%)clockevents_program_event (5 samples, 0.11%)lapic_next_event (5 samples, 0.11%)native_write_msr (5 samples, 0.11%)__prepare_exit_to_usermode (2 samples, 0.04%)schedule (2 samples, 0.04%)__schedule (2 samples, 0.04%)__perf_event_task_sched_out (2 samples, 0.04%)task_ctx_sched_out (2 samples, 0.04%)ctx_sched_out (2 samples, 0.04%)perf_pmu_disable.part.0 (2 samples, 0.04%)x86_pmu_disable (2 samples, 0.04%)amd_pmu_disable_all (2 samples, 0.04%)amd_pmu_wait_on_overflow (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)idtentry_exit_cond_rcu (3 samples, 0.06%)prepare_exit_to_usermode (3 samples, 0.06%)fpregs_assert_state_consistent (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (178 samples, 3.81%)asm_..sysvec_apic_timer_interrupt (178 samples, 3.81%)sysv..irq_exit_rcu (2 samples, 0.04%)do_softirq_own_stack (2 samples, 0.04%)asm_call_sysvec_on_stack (2 samples, 0.04%)__softirqentry_text_start (2 samples, 0.04%)rcu_core_si (2 samples, 0.04%)rcu_core (2 samples, 0.04%)rcu_report_qs_rnp (2 samples, 0.04%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)asm_sysvec_call_function_single (3 samples, 0.06%)sysvec_call_function_single (3 samples, 0.06%)idtentry_exit_cond_rcu (3 samples, 0.06%)prepare_exit_to_usermode (3 samples, 0.06%)__prepare_exit_to_usermode (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (3 samples, 0.06%)sysvec_apic_timer_interrupt (3 samples, 0.06%)asm_call_sysvec_on_stack (3 samples, 0.06%)__sysvec_apic_timer_interrupt (3 samples, 0.06%)hrtimer_interrupt (3 samples, 0.06%)__hrtimer_run_queues (3 samples, 0.06%)tick_sched_timer (3 samples, 0.06%)tick_sched_handle.isra.0 (3 samples, 0.06%)update_process_times (3 samples, 0.06%)scheduler_tick (3 samples, 0.06%)perf_event_task_tick (3 samples, 0.06%)perf_pmu_disable.part.0 (3 samples, 0.06%)x86_pmu_disable (3 samples, 0.06%)amd_pmu_disable_all (3 samples, 0.06%)x86_pmu_disable_all (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)<alloc::boxed::Box<T,A> as core::ops::deref::Deref>::deref (18 samples, 0.39%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (45 samples, 0.96%)core::slice::iter::Iter<T>::post_inc_start (43 samples, 0.92%)core::ptr::non_null::NonNull<T>::new_unchecked (43 samples, 0.92%)asm_sysvec_apic_timer_interrupt (5 samples, 0.11%)sysvec_apic_timer_interrupt (5 samples, 0.11%)__sysvec_apic_timer_interrupt (5 samples, 0.11%)hrtimer_interrupt (5 samples, 0.11%)__hrtimer_run_queues (5 samples, 0.11%)tick_sched_timer (5 samples, 0.11%)tick_sched_handle.isra.0 (5 samples, 0.11%)update_process_times (5 samples, 0.11%)scheduler_tick (5 samples, 0.11%)perf_event_task_tick (5 samples, 0.11%)perf_pmu_disable.part.0 (5 samples, 0.11%)x86_pmu_disable (5 samples, 0.11%)amd_pmu_disable_all (5 samples, 0.11%)amd_pmu_wait_on_overflow (5 samples, 0.11%)native_read_msr (5 samples, 0.11%)__fget_light (1 samples, 0.02%)new_sync_write (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)fsnotify (1 samples, 0.02%)__check_object_size (1 samples, 0.02%)__check_heap_object (1 samples, 0.02%)__virt_addr_valid (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__check_object_size (6 samples, 0.13%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)_copy_from_iter (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)ldsem_down_read (1 samples, 0.02%)mutex_lock (1 samples, 0.02%)_raw_spin_lock_irqsave (1 samples, 0.02%)add_wait_queue (1 samples, 0.02%)__tty_buffer_request_room (1 samples, 0.02%)_raw_spin_lock_irqsave (4 samples, 0.09%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)memcpy (1 samples, 0.02%)select_task_rq_fair (1 samples, 0.02%)select_idle_sibling (1 samples, 0.02%)native_send_call_func_single_ipi (80 samples, 1.71%)native_write_msr (80 samples, 1.71%)__queue_work (82 samples, 1.76%)insert_work (82 samples, 1.76%)wake_up_process (82 samples, 1.76%)try_to_wake_up (82 samples, 1.76%)ttwu_queue_wakelist (81 samples, 1.74%)__smp_call_single_queue (81 samples, 1.74%)send_call_function_single_ipi (81 samples, 1.74%)x2apic_send_IPI (1 samples, 0.02%)__hrtimer_run_queues (13 samples, 0.28%)tick_sched_timer (13 samples, 0.28%)tick_sched_handle.isra.0 (13 samples, 0.28%)update_process_times (13 samples, 0.28%)scheduler_tick (13 samples, 0.28%)perf_event_task_tick (13 samples, 0.28%)perf_pmu_disable.part.0 (13 samples, 0.28%)x86_pmu_disable (13 samples, 0.28%)amd_pmu_disable_all (13 samples, 0.28%)amd_pmu_wait_on_overflow (13 samples, 0.28%)native_read_msr (13 samples, 0.28%)pty_write (105 samples, 2.25%)p..tty_flip_buffer_push (97 samples, 2.08%)t..queue_work_on (97 samples, 2.08%)q..asm_sysvec_apic_timer_interrupt (14 samples, 0.30%)sysvec_apic_timer_interrupt (14 samples, 0.30%)asm_call_sysvec_on_stack (14 samples, 0.30%)__sysvec_apic_timer_interrupt (14 samples, 0.30%)hrtimer_interrupt (14 samples, 0.30%)tick_program_event (1 samples, 0.02%)clockevents_program_event (1 samples, 0.02%)lapic_next_event (1 samples, 0.02%)native_write_msr (1 samples, 0.02%)n_tty_write (112 samples, 2.40%)n_..tty_write_room (1 samples, 0.02%)tty_buffer_space_avail (1 samples, 0.02%)new_sync_write (128 samples, 2.74%)ne..tty_write (128 samples, 2.74%)tt..file_tty_write.isra.0 (127 samples, 2.72%)fi..up_read (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)rw_verify_area (3 samples, 0.06%)security_file_permission (3 samples, 0.06%)common_file_perm (3 samples, 0.06%)asm_sysvec_apic_timer_interrupt (2 samples, 0.04%)sysvec_apic_timer_interrupt (2 samples, 0.04%)asm_call_sysvec_on_stack (2 samples, 0.04%)__sysvec_apic_timer_interrupt (2 samples, 0.04%)hrtimer_interrupt (2 samples, 0.04%)tick_program_event (1 samples, 0.02%)clockevents_program_event (1 samples, 0.02%)lapic_next_event (1 samples, 0.02%)native_write_msr (1 samples, 0.02%)security_file_permission (1 samples, 0.02%)<std::io::stdio::Stdout as std::io::Write>::flush (141 samples, 3.02%)<st..<&std::io::stdio::Stdout as std::io::Write>::flush (141 samples, 3.02%)<&s..<std::io::stdio::StdoutLock as std::io::Write>::flush (140 samples, 3.00%)<st..<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::flush (140 samples, 3.00%)<st..<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::flush (140 samples, 3.00%)<st..std::io::buffered::bufwriter::BufWriter<W>::flush_buf (140 samples, 3.00%)std..<std::io::stdio::StdoutRaw as std::io::Write>::write (140 samples, 3.00%)<st..<std::sys::unix::stdio::Stdout as std::io::Write>::write (140 samples, 3.00%)<st..std::sys::unix::fd::FileDesc::write (140 samples, 3.00%)std..__libc_write (140 samples, 3.00%)__l..entry_SYSCALL_64_after_hwframe (139 samples, 2.98%)ent..do_syscall_64 (138 samples, 2.96%)do_..__x64_sys_write (138 samples, 2.96%)__x..ksys_write (138 samples, 2.96%)ksy..vfs_write (136 samples, 2.91%)vf..tty_write (1 samples, 0.02%)<usize as core::ops::arith::AddAssign<&usize>>::add_assign (18 samples, 0.39%)<usize as core::ops::arith::AddAssign>::add_assign (18 samples, 0.39%)asm_sysvec_apic_timer_interrupt (2 samples, 0.04%)sysvec_apic_timer_interrupt (2 samples, 0.04%)__sysvec_apic_timer_interrupt (2 samples, 0.04%)hrtimer_interrupt (2 samples, 0.04%)__hrtimer_run_queues (2 samples, 0.04%)tick_sched_timer (2 samples, 0.04%)tick_sched_handle.isra.0 (2 samples, 0.04%)update_process_times (2 samples, 0.04%)scheduler_tick (2 samples, 0.04%)perf_event_task_tick (2 samples, 0.04%)perf_pmu_disable.part.0 (2 samples, 0.04%)x86_pmu_disable (2 samples, 0.04%)amd_pmu_disable_all (2 samples, 0.04%)amd_pmu_wait_on_overflow (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)__sysvec_apic_timer_interrupt (53 samples, 1.14%)hrtimer_interrupt (53 samples, 1.14%)__hrtimer_run_queues (53 samples, 1.14%)tick_sched_timer (53 samples, 1.14%)tick_sched_handle.isra.0 (53 samples, 1.14%)update_process_times (53 samples, 1.14%)scheduler_tick (53 samples, 1.14%)perf_event_task_tick (53 samples, 1.14%)perf_pmu_disable.part.0 (52 samples, 1.11%)x86_pmu_disable (52 samples, 1.11%)amd_pmu_disable_all (52 samples, 1.11%)amd_pmu_wait_on_overflow (52 samples, 1.11%)native_read_msr (52 samples, 1.11%)idtentry_exit_cond_rcu (1 samples, 0.02%)prepare_exit_to_usermode (1 samples, 0.02%)__prepare_exit_to_usermode (1 samples, 0.02%)schedule (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (56 samples, 1.20%)sysvec_apic_timer_interrupt (55 samples, 1.18%)native_apic_msr_eoi_write (1 samples, 0.02%)<alloc::boxed::Box<T,A> as core::ops::deref::Deref>::deref (49 samples, 1.05%)asm_sysvec_apic_timer_interrupt (6 samples, 0.13%)sysvec_apic_timer_interrupt (6 samples, 0.13%)__sysvec_apic_timer_interrupt (6 samples, 0.13%)hrtimer_interrupt (6 samples, 0.13%)__hrtimer_run_queues (6 samples, 0.13%)tick_sched_timer (6 samples, 0.13%)tick_sched_handle.isra.0 (6 samples, 0.13%)update_process_times (6 samples, 0.13%)scheduler_tick (6 samples, 0.13%)perf_event_task_tick (6 samples, 0.13%)perf_pmu_disable.part.0 (6 samples, 0.13%)x86_pmu_disable (6 samples, 0.13%)amd_pmu_disable_all (6 samples, 0.13%)amd_pmu_wait_on_overflow (6 samples, 0.13%)native_read_msr (6 samples, 0.13%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (25 samples, 0.54%)core::slice::iter::Iter<T>::post_inc_start (22 samples, 0.47%)core::ptr::non_null::NonNull<T>::new_unchecked (22 samples, 0.47%)asm_sysvec_apic_timer_interrupt (2 samples, 0.04%)sysvec_apic_timer_interrupt (2 samples, 0.04%)__sysvec_apic_timer_interrupt (2 samples, 0.04%)hrtimer_interrupt (2 samples, 0.04%)__hrtimer_run_queues (2 samples, 0.04%)tick_sched_timer (2 samples, 0.04%)tick_sched_handle.isra.0 (2 samples, 0.04%)update_process_times (2 samples, 0.04%)scheduler_tick (2 samples, 0.04%)perf_event_task_tick (2 samples, 0.04%)perf_pmu_disable.part.0 (2 samples, 0.04%)x86_pmu_disable (2 samples, 0.04%)amd_pmu_disable_all (2 samples, 0.04%)amd_pmu_wait_on_overflow (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)<usize as core::ops::arith::AddAssign<&usize>>::add_assign (39 samples, 0.84%)<usize as core::ops::arith::AddAssign>::add_assign (39 samples, 0.84%)asm_sysvec_apic_timer_interrupt (2 samples, 0.04%)sysvec_apic_timer_interrupt (2 samples, 0.04%)__sysvec_apic_timer_interrupt (2 samples, 0.04%)hrtimer_interrupt (2 samples, 0.04%)__hrtimer_run_queues (2 samples, 0.04%)tick_sched_timer (2 samples, 0.04%)tick_sched_handle.isra.0 (2 samples, 0.04%)update_process_times (2 samples, 0.04%)scheduler_tick (2 samples, 0.04%)perf_event_task_tick (2 samples, 0.04%)perf_pmu_disable.part.0 (2 samples, 0.04%)x86_pmu_disable (2 samples, 0.04%)amd_pmu_disable_all (2 samples, 0.04%)amd_pmu_wait_on_overflow (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)__irqentry_text_end (1 samples, 0.02%)__const_udelay (1 samples, 0.02%)delay_tsc (1 samples, 0.02%)amd_pmu_wait_on_overflow (98 samples, 2.10%)a..native_read_msr (97 samples, 2.08%)n..perf_event_task_tick (99 samples, 2.12%)p..perf_pmu_disable.part.0 (99 samples, 2.12%)p..x86_pmu_disable (99 samples, 2.12%)x..amd_pmu_disable_all (99 samples, 2.12%)a..x86_pmu_disable_all (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)__sysvec_apic_timer_interrupt (100 samples, 2.14%)_..hrtimer_interrupt (100 samples, 2.14%)h..__hrtimer_run_queues (100 samples, 2.14%)_..tick_sched_timer (100 samples, 2.14%)t..tick_sched_handle.isra.0 (100 samples, 2.14%)t..update_process_times (100 samples, 2.14%)u..scheduler_tick (100 samples, 2.14%)s..task_tick_fair (1 samples, 0.02%)update_load_avg (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (101 samples, 2.16%)a..sysvec_apic_timer_interrupt (101 samples, 2.16%)s..idtentry_exit_cond_rcu (1 samples, 0.02%)prepare_exit_to_usermode (1 samples, 0.02%)__prepare_exit_to_usermode (1 samples, 0.02%)schedule (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)asm_sysvec_irq_work (1 samples, 0.02%)sysvec_irq_work (1 samples, 0.02%)__sysvec_irq_work (1 samples, 0.02%)irq_work_run (1 samples, 0.02%)irq_work_run_list (1 samples, 0.02%)irq_work_single (1 samples, 0.02%)perf_pending_event (1 samples, 0.02%)perf_event_wakeup (1 samples, 0.02%)__wake_up (1 samples, 0.02%)__wake_up_common_lock (1 samples, 0.02%)__wake_up_common (1 samples, 0.02%)pollwake (1 samples, 0.02%)default_wake_function (1 samples, 0.02%)try_to_wake_up (1 samples, 0.02%)ttwu_queue_wakelist (1 samples, 0.02%)__smp_call_single_queue (1 samples, 0.02%)send_call_function_single_ipi (1 samples, 0.02%)native_send_call_func_single_ipi (1 samples, 0.02%)native_write_msr (1 samples, 0.02%)<alloc::boxed::Box<T,A> as core::ops::deref::Deref>::deref (46 samples, 0.99%)asm_sysvec_apic_timer_interrupt (9 samples, 0.19%)sysvec_apic_timer_interrupt (9 samples, 0.19%)__sysvec_apic_timer_interrupt (9 samples, 0.19%)hrtimer_interrupt (9 samples, 0.19%)__hrtimer_run_queues (9 samples, 0.19%)tick_sched_timer (9 samples, 0.19%)tick_sched_handle.isra.0 (9 samples, 0.19%)update_process_times (9 samples, 0.19%)scheduler_tick (9 samples, 0.19%)perf_event_task_tick (9 samples, 0.19%)perf_pmu_disable.part.0 (9 samples, 0.19%)x86_pmu_disable (9 samples, 0.19%)amd_pmu_disable_all (9 samples, 0.19%)amd_pmu_wait_on_overflow (9 samples, 0.19%)native_read_msr (9 samples, 0.19%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.04%)core::slice::iter::Iter<T>::post_inc_start (2 samples, 0.04%)core::ptr::non_null::NonNull<T>::new_unchecked (2 samples, 0.04%)<usize as core::ops::arith::AddAssign<&usize>>::add_assign (18 samples, 0.39%)<usize as core::ops::arith::AddAssign>::add_assign (18 samples, 0.39%)asm_sysvec_apic_timer_interrupt (3 samples, 0.06%)sysvec_apic_timer_interrupt (3 samples, 0.06%)__sysvec_apic_timer_interrupt (3 samples, 0.06%)hrtimer_interrupt (3 samples, 0.06%)__hrtimer_run_queues (3 samples, 0.06%)tick_sched_timer (3 samples, 0.06%)tick_sched_handle.isra.0 (3 samples, 0.06%)update_process_times (3 samples, 0.06%)scheduler_tick (3 samples, 0.06%)perf_event_task_tick (3 samples, 0.06%)perf_pmu_disable.part.0 (3 samples, 0.06%)x86_pmu_disable (3 samples, 0.06%)amd_pmu_disable_all (3 samples, 0.06%)amd_pmu_wait_on_overflow (3 samples, 0.06%)native_read_msr (3 samples, 0.06%)__const_udelay (3 samples, 0.06%)delay_tsc (3 samples, 0.06%)__hrtimer_run_queues (63 samples, 1.35%)tick_sched_timer (63 samples, 1.35%)tick_sched_handle.isra.0 (63 samples, 1.35%)update_process_times (63 samples, 1.35%)scheduler_tick (63 samples, 1.35%)perf_event_task_tick (63 samples, 1.35%)perf_pmu_disable.part.0 (63 samples, 1.35%)x86_pmu_disable (63 samples, 1.35%)amd_pmu_disable_all (63 samples, 1.35%)amd_pmu_wait_on_overflow (63 samples, 1.35%)native_read_msr (60 samples, 1.29%)asm_sysvec_apic_timer_interrupt (66 samples, 1.41%)sysvec_apic_timer_interrupt (66 samples, 1.41%)__sysvec_apic_timer_interrupt (66 samples, 1.41%)hrtimer_interrupt (66 samples, 1.41%)tick_program_event (3 samples, 0.06%)clockevents_program_event (3 samples, 0.06%)lapic_next_event (3 samples, 0.06%)native_write_msr (3 samples, 0.06%)bfinterpreter::interpreter::optimized::execute (1,427 samples, 30.58%)bfinterpreter::interpreter::optimized::executebfinterpreter::interpreter::optimized::execute (551 samples, 11.81%)bfinterpreter::int..bfinterpreter::interpreter::optimized::execute (24 samples, 0.51%)asm_sysvec_apic_timer_interrupt (4 samples, 0.09%)sysvec_apic_timer_interrupt (4 samples, 0.09%)__sysvec_apic_timer_interrupt (4 samples, 0.09%)hrtimer_interrupt (4 samples, 0.09%)__hrtimer_run_queues (4 samples, 0.09%)tick_sched_timer (4 samples, 0.09%)tick_sched_handle.isra.0 (4 samples, 0.09%)update_process_times (4 samples, 0.09%)scheduler_tick (4 samples, 0.09%)perf_event_task_tick (4 samples, 0.09%)perf_pmu_disable.part.0 (4 samples, 0.09%)x86_pmu_disable (4 samples, 0.09%)amd_pmu_disable_all (4 samples, 0.09%)amd_pmu_wait_on_overflow (4 samples, 0.09%)native_read_msr (4 samples, 0.09%)<char as core::fmt::Display>::fmt (2 samples, 0.04%)core::option::Option<T>::is_none (2 samples, 0.04%)core::option::Option<T>::is_some (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::write_all (1 samples, 0.02%)alloc::vec::Vec<T,A>::extend_from_slice (1 samples, 0.02%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<&T,core::slice::iter::Iter<T>>>::spec_extend (1 samples, 0.02%)alloc::vec::Vec<T,A>::append_elements (1 samples, 0.02%)core::intrinsics::copy_nonoverlapping (1 samples, 0.02%)__memcpy_avx_unaligned (1 samples, 0.02%)std::io::buffered::linewritershim::LineWriterShim<W>::flush_if_completed_line (1 samples, 0.02%)core::slice::<impl [T]>::last (1 samples, 0.02%)bfinterpreter::interpreter::optimized::execute (2,102 samples, 45.04%)bfinterpreter::interpreter::optimized::executestd::io::stdio::_print (6 samples, 0.13%)std::io::stdio::print_to (6 samples, 0.13%)<std::io::stdio::Stdout as std::io::Write>::write_fmt (6 samples, 0.13%)<&std::io::stdio::Stdout as std::io::Write>::write_fmt (6 samples, 0.13%)std::io::Write::write_fmt (6 samples, 0.13%)core::fmt::write (5 samples, 0.11%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (3 samples, 0.06%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (3 samples, 0.06%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (3 samples, 0.06%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (3 samples, 0.06%)std::memchr::memrchr (1 samples, 0.02%)std::sys::unix::memchr::memrchr (1 samples, 0.02%)std::sys::unix::memchr::memrchr::memrchr_specific (1 samples, 0.02%)core::result::Result<T,E>::unwrap (1 samples, 0.02%)core::ptr::drop_in_place<std::io::stdio::StdoutLock> (1 samples, 0.02%)core::ptr::drop_in_place<std::sys_common::remutex::ReentrantMutexGuard<core::cell::RefCell<std::io::buffered::linewriter::LineWriter<std::io::stdio::StdoutRaw>>>> (1 samples, 0.02%)<std::sys_common::remutex::ReentrantMutexGuard<T> as core::ops::drop::Drop>::drop (1 samples, 0.02%)std::sys::unix::mutex::ReentrantMutex::unlock (1 samples, 0.02%)__GI___pthread_mutex_unlock (1 samples, 0.02%)__pthread_mutex_unlock_usercnt (1 samples, 0.02%)std::io::stdio::_print (2 samples, 0.04%)std::io::stdio::print_to (2 samples, 0.04%)<std::io::stdio::Stdout as std::io::Write>::write_fmt (2 samples, 0.04%)<&std::io::stdio::Stdout as std::io::Write>::write_fmt (2 samples, 0.04%)std::io::Write::write_fmt (1 samples, 0.02%)core::fmt::write (1 samples, 0.02%)core::fmt::Write::write_char (1 samples, 0.02%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.02%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.02%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.02%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.02%)std::memchr::memrchr (1 samples, 0.02%)std::sys::unix::memchr::memrchr (1 samples, 0.02%)std::sys::unix::memchr::memrchr::memrchr_specific (1 samples, 0.02%)__memrchr_avx2 (1 samples, 0.02%)bfinterpreter::interpreter::optimized::execute (3,926 samples, 84.12%)bfinterpreter::interpreter::optimized::executestd::io::stdio::stdout (1 samples, 0.02%)std::lazy::SyncOnceCell<T>::get_or_init_pin (1 samples, 0.02%)std::lazy::SyncOnceCell<T>::get (1 samples, 0.02%)std::lazy::SyncOnceCell<T>::is_initialized (1 samples, 0.02%)std::sync::once::Once::is_completed (1 samples, 0.02%)core::sync::atomic::AtomicUsize::load (1 samples, 0.02%)core::sync::atomic::atomic_load (1 samples, 0.02%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (3 samples, 0.06%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (3 samples, 0.06%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (3 samples, 0.06%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (3 samples, 0.06%)<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::write_all (3 samples, 0.06%)alloc::vec::Vec<T,A>::extend_from_slice (2 samples, 0.04%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<&T,core::slice::iter::Iter<T>>>::spec_extend (2 samples, 0.04%)alloc::vec::Vec<T,A>::append_elements (2 samples, 0.04%)core::intrinsics::copy_nonoverlapping (2 samples, 0.04%)__memcpy_avx_unaligned (2 samples, 0.04%)std::io::Write::write_fmt (6 samples, 0.13%)core::fmt::write (6 samples, 0.13%)core::fmt::Write::write_char (2 samples, 0.04%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (2 samples, 0.04%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (2 samples, 0.04%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (2 samples, 0.04%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (2 samples, 0.04%)std::memchr::memrchr (2 samples, 0.04%)std::sys::unix::memchr::memrchr (2 samples, 0.04%)std::sys::unix::memchr::memrchr::memrchr_specific (2 samples, 0.04%)__memrchr_avx2 (1 samples, 0.02%)bfinterpreter::interpreter::optimized::execute (4,469 samples, 95.76%)bfinterpreter::interpreter::optimized::executestd::io::stdio::_print (9 samples, 0.19%)std::io::stdio::print_to (8 samples, 0.17%)<std::io::stdio::Stdout as std::io::Write>::write_fmt (8 samples, 0.17%)<&std::io::stdio::Stdout as std::io::Write>::write_fmt (8 samples, 0.17%)std::io::stdio::Stdout::lock (2 samples, 0.04%)std::sys_common::remutex::ReentrantMutex<T>::lock (2 samples, 0.04%)std::sys::unix::mutex::ReentrantMutex::lock (2 samples, 0.04%)__GI___pthread_mutex_lock (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (2 samples, 0.04%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (2 samples, 0.04%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (2 samples, 0.04%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (2 samples, 0.04%)<std::io::buffered::bufwriter::BufWriter<W> as std::io::Write>::write_all (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)std::io::stdio::_print (3 samples, 0.06%)std::io::stdio::print_to (3 samples, 0.06%)<std::io::stdio::Stdout as std::io::Write>::write_fmt (3 samples, 0.06%)<&std::io::stdio::Stdout as std::io::Write>::write_fmt (3 samples, 0.06%)std::io::Write::write_fmt (3 samples, 0.06%)core::fmt::write (3 samples, 0.06%)core::fmt::Write::write_char (1 samples, 0.02%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.02%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.02%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.02%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.02%)<std::io::stdio::StdoutRaw as std::io::Write>::write_all (1 samples, 0.02%)std::io::Write::write_all (1 samples, 0.02%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.02%)std::sys::unix::fd::FileDesc::write (1 samples, 0.02%)__libc_write (1 samples, 0.02%)entry_SYSCALL_64_after_hwframe (1 samples, 0.02%)do_syscall_64 (1 samples, 0.02%)__x64_sys_write (1 samples, 0.02%)ksys_write (1 samples, 0.02%)vfs_write (1 samples, 0.02%)new_sync_write (1 samples, 0.02%)tty_write (1 samples, 0.02%)file_tty_write.isra.0 (1 samples, 0.02%)n_tty_write (1 samples, 0.02%)do_output_char (1 samples, 0.02%)pty_write (1 samples, 0.02%)memcpy (1 samples, 0.02%)bfinterpreter::interpreter::optimized::interpret (4,616 samples, 98.91%)bfinterpreter::interpreter::optimized::interpretbfinterpreter::interpreter::optimized::execute (4,616 samples, 98.91%)bfinterpreter::interpreter::optimized::executebfinterpreter::interpreter::optimized::execute (4,615 samples, 98.89%)bfinterpreter::interpreter::optimized::executebfinterpreter::interpreter::optimized::execute (4,612 samples, 98.82%)bfinterpreter::interpreter::optimized::executebfinterpreter::interpreter::optimized::execute (4,570 samples, 97.92%)bfinterpreter::interpreter::optimized::executestd::io::stdio::stdout (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)_int_malloc (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (2 samples, 0.04%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::slice::<impl [T]>::to_vec_in (2 samples, 0.04%)alloc::slice::hack::to_vec (2 samples, 0.04%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.04%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (2 samples, 0.04%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::slice::<impl [T]>::to_vec_in (2 samples, 0.04%)alloc::slice::hack::to_vec (2 samples, 0.04%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.04%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (2 samples, 0.04%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::slice::<impl [T]>::to_vec_in (2 samples, 0.04%)alloc::slice::hack::to_vec (2 samples, 0.04%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.04%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (2 samples, 0.04%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::slice::<impl [T]>::to_vec_in (2 samples, 0.04%)alloc::slice::hack::to_vec (2 samples, 0.04%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.04%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (2 samples, 0.04%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::slice::<impl [T]>::to_vec_in (2 samples, 0.04%)alloc::slice::hack::to_vec (2 samples, 0.04%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.04%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (2 samples, 0.04%)<alloc::boxed::Box<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::boxed::Box<T,A>::new_uninit_in (2 samples, 0.04%)alloc::boxed::Box<T,A>::try_new_uninit_in (2 samples, 0.04%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.04%)alloc::alloc::Global::alloc_impl (2 samples, 0.04%)alloc::alloc::alloc (2 samples, 0.04%)__GI___libc_malloc (2 samples, 0.04%)checked_request2size (1 samples, 0.02%)alloc::vec::Vec<T,A>::push (1 samples, 0.02%)alloc::vec::Vec<T,A>::reserve (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.02%)alloc::raw_vec::finish_grow (1 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::grow (1 samples, 0.02%)alloc::alloc::Global::grow_impl (1 samples, 0.02%)alloc::alloc::realloc (1 samples, 0.02%)__GI___libc_realloc (1 samples, 0.02%)_int_realloc (1 samples, 0.02%)_int_malloc (1 samples, 0.02%)malloc_consolidate (1 samples, 0.02%)unlink_chunk (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (4 samples, 0.09%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::boxed::Box<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)<alloc::boxed::Box<T,A> as core::clone::Clone>::clone (2 samples, 0.04%)alloc::boxed::Box<T,A>::new_uninit_in (2 samples, 0.04%)alloc::boxed::Box<T,A>::try_new_uninit_in (2 samples, 0.04%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.04%)alloc::alloc::Global::alloc_impl (2 samples, 0.04%)alloc::alloc::alloc (2 samples, 0.04%)__GI___libc_malloc (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (3 samples, 0.06%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (3 samples, 0.06%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (3 samples, 0.06%)alloc::slice::<impl [T]>::to_vec_in (3 samples, 0.06%)alloc::slice::hack::to_vec (3 samples, 0.06%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 0.06%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (3 samples, 0.06%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (3 samples, 0.06%)alloc::slice::<impl [T]>::to_vec_in (3 samples, 0.06%)alloc::slice::hack::to_vec (3 samples, 0.06%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 0.06%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (3 samples, 0.06%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (3 samples, 0.06%)alloc::slice::<impl [T]>::to_vec_in (3 samples, 0.06%)alloc::slice::hack::to_vec (3 samples, 0.06%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 0.06%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (3 samples, 0.06%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (3 samples, 0.06%)alloc::slice::<impl [T]>::to_vec_in (3 samples, 0.06%)alloc::slice::hack::to_vec (3 samples, 0.06%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 0.06%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (3 samples, 0.06%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.02%)alloc::slice::hack::to_vec (1 samples, 0.02%)<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.02%)alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.02%)alloc::alloc::Global::alloc_impl (1 samples, 0.02%)alloc::alloc::alloc (1 samples, 0.02%)__GI___libc_malloc (1 samples, 0.02%)_int_malloc (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::boxed::Box<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.02%)alloc::slice::hack::to_vec (1 samples, 0.02%)<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::boxed::Box<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)<T as alloc::alloc::WriteCloneIntoRaw>::write_clone_into_raw (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (2 samples, 0.04%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)_int_free (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.02%)alloc::slice::hack::to_vec (1 samples, 0.02%)<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::boxed::Box<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::boxed::Box<T,A>::new_uninit_in (1 samples, 0.02%)alloc::boxed::Box<T,A>::try_new_uninit_in (1 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.02%)alloc::alloc::Global::alloc_impl (1 samples, 0.02%)alloc::alloc::alloc (1 samples, 0.02%)__GI___libc_malloc (1 samples, 0.02%)_int_malloc (1 samples, 0.02%)asm_exc_page_fault (1 samples, 0.02%)exc_page_fault (1 samples, 0.02%)do_user_addr_fault (1 samples, 0.02%)handle_mm_fault (1 samples, 0.02%)__handle_mm_fault (1 samples, 0.02%)alloc::vec::Vec<T,A>::push (1 samples, 0.02%)alloc::vec::Vec<T,A>::reserve (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::reserve (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::grow_amortized (1 samples, 0.02%)alloc::raw_vec::finish_grow (1 samples, 0.02%)__GI___libc_malloc (1 samples, 0.02%)_int_malloc (1 samples, 0.02%)asm_exc_page_fault (1 samples, 0.02%)exc_page_fault (1 samples, 0.02%)do_user_addr_fault (1 samples, 0.02%)handle_mm_fault (1 samples, 0.02%)pmd_devmap_trans_unstable (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (3 samples, 0.06%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_repeat (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.02%)alloc::slice::hack::to_vec (1 samples, 0.02%)<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.02%)alloc::slice::hack::to_vec (1 samples, 0.02%)<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.02%)<bfinterpreter::interpreter::optimized::ExStatement as core::clone::Clone>::clone (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (1 samples, 0.02%)alloc::slice::hack::to_vec (1 samples, 0.02%)<T as alloc::slice::hack::ConvertVec>::to_vec (1 samples, 0.02%)alloc::vec::Vec<T,A>::with_capacity_in (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (1 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (1 samples, 0.02%)alloc::alloc::Global::alloc_impl (1 samples, 0.02%)alloc::alloc::alloc (1 samples, 0.02%)__GI___libc_malloc (1 samples, 0.02%)_int_malloc (1 samples, 0.02%)asm_exc_page_fault (1 samples, 0.02%)exc_page_fault (1 samples, 0.02%)do_user_addr_fault (1 samples, 0.02%)handle_mm_fault (1 samples, 0.02%)__handle_mm_fault (1 samples, 0.02%)do_anonymous_page (1 samples, 0.02%)alloc_pages_vma (1 samples, 0.02%)__alloc_pages_nodemask (1 samples, 0.02%)get_page_from_freelist (1 samples, 0.02%)rmqueue (1 samples, 0.02%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.04%)core::iter::traits::iterator::Iterator::for_each (2 samples, 0.04%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.04%)core::iter::traits::iterator::Iterator::fold (2 samples, 0.04%)core::iter::adapters::map::map_fold::{{closure}} (2 samples, 0.04%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (2 samples, 0.04%)bfinterpreter::interpreter::optimized::optimize (2 samples, 0.04%)bfinterpreter::interpreter::optimized::o_set_null (1 samples, 0.02%)core::iter::traits::iterator::Iterator::collect (1 samples, 0.02%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1 samples, 0.02%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.02%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (1 samples, 0.02%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.02%)core::iter::traits::iterator::Iterator::for_each (1 samples, 0.02%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.02%)core::iter::traits::iterator::Iterator::fold (1 samples, 0.02%)core::iter::adapters::map::map_fold::{{closure}} (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (1 samples, 0.02%)_cond_resched (1 samples, 0.02%)preempt_schedule_common (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (7 samples, 0.15%)bfinterpreter::interpreter::optimized::optimize (7 samples, 0.15%)bfinterpreter::interpreter::optimized::o_set_null (4 samples, 0.09%)core::iter::traits::iterator::Iterator::collect (4 samples, 0.09%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (4 samples, 0.09%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (4 samples, 0.09%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (4 samples, 0.09%)alloc::vec::Vec<T>::with_capacity (2 samples, 0.04%)alloc::vec::Vec<T,A>::with_capacity_in (2 samples, 0.04%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (2 samples, 0.04%)alloc::raw_vec::RawVec<T,A>::allocate_in (2 samples, 0.04%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.04%)alloc::alloc::Global::alloc_impl (2 samples, 0.04%)alloc::alloc::alloc (2 samples, 0.04%)__GI___libc_malloc (2 samples, 0.04%)_int_malloc (2 samples, 0.04%)asm_exc_page_fault (2 samples, 0.04%)exc_page_fault (2 samples, 0.04%)do_user_addr_fault (2 samples, 0.04%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)bfinterpreter::interpreter::optimized::optimize (19 samples, 0.41%)bfinterpreter::interpreter::optimized::o_set_null (15 samples, 0.32%)core::iter::traits::iterator::Iterator::collect (15 samples, 0.32%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (15 samples, 0.32%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (15 samples, 0.32%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (15 samples, 0.32%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (15 samples, 0.32%)core::iter::traits::iterator::Iterator::for_each (15 samples, 0.32%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (15 samples, 0.32%)core::iter::traits::iterator::Iterator::fold (15 samples, 0.32%)core::iter::adapters::map::map_fold::{{closure}} (15 samples, 0.32%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (15 samples, 0.32%)bfinterpreter::interpreter::optimized::optimize (15 samples, 0.32%)bfinterpreter::interpreter::optimized::o_set_null (12 samples, 0.26%)core::iter::traits::iterator::Iterator::collect (12 samples, 0.26%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (12 samples, 0.26%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (12 samples, 0.26%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (12 samples, 0.26%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (12 samples, 0.26%)core::iter::traits::iterator::Iterator::for_each (12 samples, 0.26%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (12 samples, 0.26%)core::iter::traits::iterator::Iterator::fold (12 samples, 0.26%)core::iter::adapters::map::map_fold::{{closure}} (12 samples, 0.26%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (12 samples, 0.26%)bfinterpreter::interpreter::optimized::optimize (12 samples, 0.26%)bfinterpreter::interpreter::optimized::o_set_null (11 samples, 0.24%)core::iter::traits::iterator::Iterator::collect (11 samples, 0.24%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (11 samples, 0.24%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (11 samples, 0.24%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (11 samples, 0.24%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (11 samples, 0.24%)core::iter::traits::iterator::Iterator::for_each (11 samples, 0.24%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (11 samples, 0.24%)core::iter::traits::iterator::Iterator::fold (11 samples, 0.24%)core::iter::adapters::map::map_fold::{{closure}} (11 samples, 0.24%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (11 samples, 0.24%)bfinterpreter::interpreter::optimized::optimize (11 samples, 0.24%)bfinterpreter::interpreter::optimized::o_set_null (9 samples, 0.19%)core::iter::traits::iterator::Iterator::collect (9 samples, 0.19%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (9 samples, 0.19%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (9 samples, 0.19%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (9 samples, 0.19%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (9 samples, 0.19%)core::iter::traits::iterator::Iterator::for_each (9 samples, 0.19%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (9 samples, 0.19%)core::iter::traits::iterator::Iterator::fold (9 samples, 0.19%)core::iter::adapters::map::map_fold::{{closure}} (9 samples, 0.19%)bfinterpreter::interpreter::optimized::o_set_null::{{closure}} (9 samples, 0.19%)bfinterpreter::interpreter::optimized::optimize (9 samples, 0.19%)bfinterpreter::interpreter::optimized::o_set_null (8 samples, 0.17%)core::iter::traits::iterator::Iterator::collect (8 samples, 0.17%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (8 samples, 0.17%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 0.17%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (8 samples, 0.17%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (8 samples, 0.17%)core::iter::traits::iterator::Iterator::for_each (8 samples, 0.17%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (8 samples, 0.17%)core::iter::traits::iterator::Iterator::fold (8 samples, 0.17%)core::iter::adapters::map::map_fold::{{closure}} (8 samples, 0.17%)core::iter::traits::iterator::Iterator::for_each::call::{{closure}} (1 samples, 0.02%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend::{{closure}} (1 samples, 0.02%)core::ptr::write (1 samples, 0.02%)asm_exc_page_fault (1 samples, 0.02%)asm_exc_page_fault (1 samples, 0.02%)exc_page_fault (1 samples, 0.02%)do_user_addr_fault (1 samples, 0.02%)handle_mm_fault (1 samples, 0.02%)__handle_mm_fault (1 samples, 0.02%)do_anonymous_page (1 samples, 0.02%)alloc_pages_vma (1 samples, 0.02%)__alloc_pages_nodemask (1 samples, 0.02%)get_page_from_freelist (1 samples, 0.02%)clear_page_rep (1 samples, 0.02%)do_brk_flags (1 samples, 0.02%)perf_event_mmap (1 samples, 0.02%)perf_iterate_sb (1 samples, 0.02%)perf_iterate_ctx (1 samples, 0.02%)_int_malloc (3 samples, 0.06%)sysmalloc (2 samples, 0.04%)__GI___default_morecore (2 samples, 0.04%)__GI___sbrk (2 samples, 0.04%)__GI___sbrk (2 samples, 0.04%)__brk (2 samples, 0.04%)entry_SYSCALL_64_after_hwframe (2 samples, 0.04%)do_syscall_64 (2 samples, 0.04%)__x64_sys_brk (2 samples, 0.04%)perf_event_mmap (1 samples, 0.02%)asm_sysvec_apic_timer_interrupt (1 samples, 0.02%)sysvec_apic_timer_interrupt (1 samples, 0.02%)asm_call_sysvec_on_stack (1 samples, 0.02%)__sysvec_apic_timer_interrupt (1 samples, 0.02%)hrtimer_interrupt (1 samples, 0.02%)__hrtimer_run_queues (1 samples, 0.02%)tick_sched_timer (1 samples, 0.02%)tick_sched_handle.isra.0 (1 samples, 0.02%)update_process_times (1 samples, 0.02%)scheduler_tick (1 samples, 0.02%)perf_event_task_tick (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)cgroup_throttle_swaprate (1 samples, 0.02%)alloc::vec::Vec<T,A>::push (6 samples, 0.13%)alloc::vec::Vec<T,A>::reserve (6 samples, 0.13%)alloc::raw_vec::RawVec<T,A>::reserve (6 samples, 0.13%)alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (6 samples, 0.13%)alloc::raw_vec::RawVec<T,A>::grow_amortized (6 samples, 0.13%)alloc::raw_vec::finish_grow (6 samples, 0.13%)<alloc::alloc::Global as core::alloc::Allocator>::grow (6 samples, 0.13%)alloc::alloc::Global::grow_impl (6 samples, 0.13%)alloc::alloc::realloc (6 samples, 0.13%)__GI___libc_realloc (6 samples, 0.13%)_int_realloc (6 samples, 0.13%)asm_exc_page_fault (3 samples, 0.06%)exc_page_fault (3 samples, 0.06%)do_user_addr_fault (3 samples, 0.06%)handle_mm_fault (2 samples, 0.04%)__handle_mm_fault (2 samples, 0.04%)do_anonymous_page (1 samples, 0.02%)alloc_pages_vma (1 samples, 0.02%)__alloc_pages_nodemask (1 samples, 0.02%)get_page_from_freelist (1 samples, 0.02%)rmqueue (1 samples, 0.02%)bfinterpreter::interpreter::parse (8 samples, 0.17%)asm_exc_page_fault (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::Statement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::Statement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::Statement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::Statement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::Statement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::Statement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::Statement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::Statement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::Statement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::Statement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::Statement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::Statement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::Statement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::Statement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::Statement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::Statement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::Statement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::Statement> (1 samples, 0.02%)[unknown] (4,645 samples, 99.53%)[unknown]bfinterpreter::interpreter::optimized::run (4,645 samples, 99.53%)bfinterpreter::interpreter::optimized::runcore::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<bfinterpreter::interpreter::optimized::ExStatement>> (1 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%)core::ptr::drop_in_place<[bfinterpreter::interpreter::optimized::ExStatement]> (1 samples, 0.02%)core::ptr::drop_in_place<bfinterpreter::interpreter::optimized::ExStatement> (1 samples, 0.02%)__cpu_indicator_init (1 samples, 0.02%)tick_sched_handle.isra.0 (2 samples, 0.04%)update_process_times (2 samples, 0.04%)scheduler_tick (2 samples, 0.04%)perf_event_task_tick (2 samples, 0.04%)perf_pmu_disable.part.0 (2 samples, 0.04%)x86_pmu_disable (2 samples, 0.04%)amd_pmu_disable_all (2 samples, 0.04%)amd_pmu_wait_on_overflow (2 samples, 0.04%)native_read_msr (2 samples, 0.04%)__sysvec_apic_timer_interrupt (3 samples, 0.06%)hrtimer_interrupt (3 samples, 0.06%)__hrtimer_run_queues (3 samples, 0.06%)tick_sched_timer (3 samples, 0.06%)update_process_times (1 samples, 0.02%)_dl_start_user (11 samples, 0.24%)_dl_init (11 samples, 0.24%)call_init (11 samples, 0.24%)call_init (11 samples, 0.24%)init_cacheinfo (10 samples, 0.21%)handle_amd (10 samples, 0.21%)asm_sysvec_apic_timer_interrupt (4 samples, 0.09%)sysvec_apic_timer_interrupt (4 samples, 0.09%)idtentry_exit_cond_rcu (1 samples, 0.02%)prepare_exit_to_usermode (1 samples, 0.02%)__prepare_exit_to_usermode (1 samples, 0.02%)schedule (1 samples, 0.02%)__schedule (1 samples, 0.02%)__perf_event_task_sched_out (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)std::fs::read_to_string (1 samples, 0.02%)std::fs::read_to_string::inner (1 samples, 0.02%)std::io::Read::read_to_string (1 samples, 0.02%)std::io::append_to_string (1 samples, 0.02%)std::io::Read::read_to_string::{{closure}} (1 samples, 0.02%)std::io::read_to_end (1 samples, 0.02%)std::io::read_to_end_with_reservation (1 samples, 0.02%)<std::fs::File as std::io::Read>::read (1 samples, 0.02%)std::sys::unix::fs::File::read (1 samples, 0.02%)std::sys::unix::fd::FileDesc::read (1 samples, 0.02%)__libc_read (1 samples, 0.02%)entry_SYSCALL_64_after_hwframe (1 samples, 0.02%)do_syscall_64 (1 samples, 0.02%)__x64_sys_read (1 samples, 0.02%)ksys_read (1 samples, 0.02%)vfs_read (1 samples, 0.02%)new_sync_read (1 samples, 0.02%)ext4_file_read_iter (1 samples, 0.02%)generic_file_read_iter (1 samples, 0.02%)generic_file_buffered_read (1 samples, 0.02%)touch_atime (1 samples, 0.02%)update_time (1 samples, 0.02%)generic_update_time (1 samples, 0.02%)__mark_inode_dirty (1 samples, 0.02%)ext4_dirty_inode (1 samples, 0.02%)__ext4_mark_inode_dirty (1 samples, 0.02%)ext4_reserve_inode_write (1 samples, 0.02%)__ext4_journal_get_write_access (1 samples, 0.02%)jbd2_journal_get_write_access (1 samples, 0.02%)jbd2_journal_add_journal_head (1 samples, 0.02%)_start (2 samples, 0.04%)__libc_start_main (2 samples, 0.04%)main (2 samples, 0.04%)std::rt::lang_start_internal (2 samples, 0.04%)std::panic::catch_unwind (2 samples, 0.04%)std::panicking::try (2 samples, 0.04%)std::panicking::try::do_call (2 samples, 0.04%)core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (2 samples, 0.04%)std::rt::lang_start::{{closure}} (2 samples, 0.04%)std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 0.04%)core::ops::function::FnOnce::call_once (2 samples, 0.04%)bfinterpreter::main (2 samples, 0.04%)bfinterpreter::run_program (2 samples, 0.04%)std::io::stdio::_print (1 samples, 0.02%)std::io::stdio::print_to (1 samples, 0.02%)<std::io::stdio::Stdout as std::io::Write>::write_fmt (1 samples, 0.02%)<&std::io::stdio::Stdout as std::io::Write>::write_fmt (1 samples, 0.02%)std::io::Write::write_fmt (1 samples, 0.02%)core::fmt::write (1 samples, 0.02%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.02%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.02%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.02%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.02%)<std::io::stdio::StdoutRaw as std::io::Write>::write_all (1 samples, 0.02%)std::io::Write::write_all (1 samples, 0.02%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.02%)std::sys::unix::fd::FileDesc::write (1 samples, 0.02%)__libc_write (1 samples, 0.02%)entry_SYSCALL_64_after_hwframe (1 samples, 0.02%)do_syscall_64 (1 samples, 0.02%)__x64_sys_write (1 samples, 0.02%)ksys_write (1 samples, 0.02%)vfs_write (1 samples, 0.02%)new_sync_write (1 samples, 0.02%)tty_write (1 samples, 0.02%)file_tty_write.isra.0 (1 samples, 0.02%)n_tty_write (1 samples, 0.02%)do_output_char (1 samples, 0.02%)pty_write (1 samples, 0.02%)tty_flip_buffer_push (1 samples, 0.02%)queue_work_on (1 samples, 0.02%)__queue_work (1 samples, 0.02%)insert_work (1 samples, 0.02%)wake_up_process (1 samples, 0.02%)try_to_wake_up (1 samples, 0.02%)ttwu_queue_wakelist (1 samples, 0.02%)__smp_call_single_queue (1 samples, 0.02%)send_call_function_single_ipi (1 samples, 0.02%)entry_SYSCALL_64 (1 samples, 0.02%)mmput (2 samples, 0.04%)exit_mmap (2 samples, 0.04%)unmap_vmas (2 samples, 0.04%)unmap_single_vma (2 samples, 0.04%)unmap_page_range (2 samples, 0.04%)zap_pte_range.isra.0 (2 samples, 0.04%)bfinterpreter (4,662 samples, 99.89%)bfinterpreterentry_SYSCALL_64_after_hwframe (3 samples, 0.06%)do_syscall_64 (3 samples, 0.06%)__x64_sys_exit_group (3 samples, 0.06%)do_group_exit (3 samples, 0.06%)do_exit (3 samples, 0.06%)perf_event_exit_task (1 samples, 0.02%)task_ctx_sched_out (1 samples, 0.02%)ctx_sched_out (1 samples, 0.02%)perf_pmu_disable.part.0 (1 samples, 0.02%)x86_pmu_disable (1 samples, 0.02%)amd_pmu_disable_all (1 samples, 0.02%)amd_pmu_wait_on_overflow (1 samples, 0.02%)native_read_msr (1 samples, 0.02%)all (4,667 samples, 100%)perf (5 samples, 0.11%)entry_SYSCALL_64_after_hwframe (5 samples, 0.11%)do_syscall_64 (5 samples, 0.11%)__x64_sys_execve (5 samples, 0.11%)__do_execve_file.isra.0 (5 samples, 0.11%)exec_binprm (5 samples, 0.11%)load_elf_binary (5 samples, 0.11%)begin_new_exec (5 samples, 0.11%)perf_event_exec (5 samples, 0.11%)ctx_resched (5 samples, 0.11%)perf_pmu_enable.part.0 (5 samples, 0.11%)x86_pmu_enable (5 samples, 0.11%)native_write_msr (5 samples, 0.11%) \ No newline at end of file diff --git a/bfi-rust/src/interpreter/mod.rs b/bfi-rust/src/interpreter/mod.rs index 7f9cba3..d72e82e 100644 --- a/bfi-rust/src/interpreter/mod.rs +++ b/bfi-rust/src/interpreter/mod.rs @@ -1,96 +1,96 @@ -use crate::interpreter::optimized::PrintMode; -use std::str::Chars; - -pub mod simple; -pub mod parsed; -pub mod optimized; - -pub const MEM_SIZE: usize = 0xFFFF; - -pub type Memory = [u8; MEM_SIZE]; - -#[derive(Debug, PartialOrd, PartialEq, Ord, Eq, Clone)] -pub enum Statement { - Inc, - Dec, - R, - L, - Out, - DOut, - In, - Loop(Vec), -} - -const ALLOWED_CHARS: [char; 8] = ['>', '<', '+', '-', '.', ',', '[', ']']; - -pub fn minify(code: &str) -> String { - code.chars().filter(|c| ALLOWED_CHARS.contains(c)).collect() -} - -pub fn parse(chars: Chars, print_mode: PrintMode) -> Vec { - let mut loop_stack = vec![vec![]]; - - for c in chars { - match c { - '+' => loop_stack.last_mut().unwrap().push(Statement::Inc), - '-' => loop_stack.last_mut().unwrap().push(Statement::Dec), - '>' => loop_stack.last_mut().unwrap().push(Statement::R), - '<' => loop_stack.last_mut().unwrap().push(Statement::L), - '.' => { - match print_mode { - PrintMode::ToString => loop_stack.last_mut().unwrap().push(Statement::Out), - PrintMode::DirectPrint => loop_stack.last_mut().unwrap().push(Statement::DOut) - } - } - ',' => loop_stack.last_mut().unwrap().push(Statement::In), - '[' => loop_stack.push(vec![]), - ']' => { - let statement = Statement::Loop(loop_stack.pop().unwrap()); - loop_stack.last_mut().unwrap().push(statement); - } - _ => () - } - } - - loop_stack.pop().unwrap() -} - -#[cfg(test)] -mod tests { - use crate::interpreter::{parse, minify}; - use crate::interpreter::Statement::{Dec, In, Inc, L, Loop, Out, R}; - - #[test] - fn minify_test() { - let program = "sdahf+saga-46a[r]r.hr,e"; - let expected = "+-<>[].,"; - assert_eq!(String::from(expected), minify(program)); - } - - #[test] - fn parse_no_loop() { - let program = "+-<>,."; - let statements = vec![Inc, Dec, L, R, In, Out]; - let result = parse(program.chars().collect(), false); - - assert_eq!(statements, result); - } - - #[test] - fn parse_simple_loop() { - let program = "+[<<]-"; - let statements = vec![Inc, Loop(vec![L, L]), Dec]; - let result = parse(program.chars().collect(), false); - - assert_eq!(statements, result); - } - - #[test] - fn parse_complex_loops() { - let program = ">[<[][<[<]>]>[>]]"; - let statements = vec![R, Loop(vec![L, Loop(vec![]), Loop(vec![L, Loop(vec![L]), R]), R, Loop(vec![R])])]; - let result = parse(program.chars().collect(), false); - - assert_eq!(statements, result); - } +use crate::interpreter::optimized::PrintMode; +use std::str::Chars; + +pub mod simple; +pub mod parsed; +pub mod optimized; + +pub const MEM_SIZE: usize = 0xFFFF; + +pub type Memory = [u8; MEM_SIZE]; + +#[derive(Debug, PartialOrd, PartialEq, Ord, Eq, Clone)] +pub enum Statement { + Inc, + Dec, + R, + L, + Out, + DOut, + In, + Loop(Vec), +} + +const ALLOWED_CHARS: [char; 8] = ['>', '<', '+', '-', '.', ',', '[', ']']; + +pub fn minify(code: &str) -> String { + code.chars().filter(|c| ALLOWED_CHARS.contains(c)).collect() +} + +pub fn parse(chars: Chars, print_mode: PrintMode) -> Vec { + let mut loop_stack = vec![vec![]]; + + for c in chars { + match c { + '+' => loop_stack.last_mut().unwrap().push(Statement::Inc), + '-' => loop_stack.last_mut().unwrap().push(Statement::Dec), + '>' => loop_stack.last_mut().unwrap().push(Statement::R), + '<' => loop_stack.last_mut().unwrap().push(Statement::L), + '.' => { + match print_mode { + PrintMode::ToString => loop_stack.last_mut().unwrap().push(Statement::Out), + PrintMode::DirectPrint => loop_stack.last_mut().unwrap().push(Statement::DOut) + } + } + ',' => loop_stack.last_mut().unwrap().push(Statement::In), + '[' => loop_stack.push(vec![]), + ']' => { + let statement = Statement::Loop(loop_stack.pop().unwrap()); + loop_stack.last_mut().unwrap().push(statement); + } + _ => () + } + } + + loop_stack.pop().unwrap() +} + +#[cfg(test)] +mod tests { + use crate::interpreter::{parse, minify}; + use crate::interpreter::Statement::{Dec, In, Inc, L, Loop, Out, R}; + + #[test] + fn minify_test() { + let program = "sdahf+saga-46a[r]r.hr,e"; + let expected = "+-<>[].,"; + assert_eq!(String::from(expected), minify(program)); + } + + #[test] + fn parse_no_loop() { + let program = "+-<>,."; + let statements = vec![Inc, Dec, L, R, In, Out]; + let result = parse(program.chars().collect(), false); + + assert_eq!(statements, result); + } + + #[test] + fn parse_simple_loop() { + let program = "+[<<]-"; + let statements = vec![Inc, Loop(vec![L, L]), Dec]; + let result = parse(program.chars().collect(), false); + + assert_eq!(statements, result); + } + + #[test] + fn parse_complex_loops() { + let program = ">[<[][<[<]>]>[>]]"; + let statements = vec![R, Loop(vec![L, Loop(vec![]), Loop(vec![L, Loop(vec![L]), R]), R, Loop(vec![R])])]; + let result = parse(program.chars().collect(), false); + + assert_eq!(statements, result); + } } \ No newline at end of file diff --git a/bfi-rust/src/interpreter/optimized/mod.rs b/bfi-rust/src/interpreter/optimized/mod.rs index 11ed1fc..3a598b0 100644 --- a/bfi-rust/src/interpreter/optimized/mod.rs +++ b/bfi-rust/src/interpreter/optimized/mod.rs @@ -1,229 +1,229 @@ -//! # optimization time -//! some better optimizations like set null, repeating and doing more stuff with simplifying stuff -//! - -mod patterns; - -use std::io::{Read, stdin, Write}; - -use crate::interpreter::{minify, parse, Statement, Memory, MEM_SIZE}; -use std::error::Error; -use std::fmt::{Display, Formatter}; -use std::fmt; -use std::ops::Deref; - -#[derive(PartialOrd, PartialEq, Ord, Eq, Clone, Debug)] -enum ExStatement { - Inc, - Dec, - R, - L, - Out, - DOut, - In, - Loop(Vec), - SetNull, - Repeat(Box, usize), - _ForLoop(usize, Box), -} - -impl From for ExStatement { - fn from(s: Statement) -> Self { - match s { - Statement::L => ExStatement::L, - Statement::R => ExStatement::R, - Statement::Inc => ExStatement::Inc, - Statement::Dec => ExStatement::Dec, - Statement::In => ExStatement::In, - Statement::Out => ExStatement::Out, - Statement::Loop(v) => ExStatement::Loop( - v.into_iter().map(ExStatement::from).collect() - ), - Statement::DOut => ExStatement::DOut - } - } -} - -#[derive(Debug)] -pub struct BfErr { - msg: &'static str, -} - -impl BfErr { - pub fn new(msg: &'static str) -> BfErr { - BfErr { msg } - } -} - -impl Display for BfErr { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "Error interpreting brainfuck code: {}", self.msg) - } -} - -impl Error for BfErr {} - - -pub enum PrintMode { - ToString, - DirectPrint, -} - -pub fn run(pgm: &str, print_mode: PrintMode) -> Result { - let pgm = minify(pgm); - if pgm.is_empty() { return Err(BfErr::new("no program found")); }; - let pgm = parse(pgm.chars(), print_mode); - let pgm = optimize(&pgm); - let out = interpret(&pgm); - Ok(out) -} - -fn optimize(code: &[Statement]) -> Vec { - let code = o_set_null(code); - o_repeat(code) -} - -fn o_set_null(code: &[Statement]) -> Vec { - code.iter().map(|s| { - match s { - Statement::Loop(v) => { - if let [Statement::Dec] = v[..] { - ExStatement::SetNull - } else { - ExStatement::Loop(optimize(v)) - } - } - Statement::Inc => ExStatement::Inc, - Statement::Dec => ExStatement::Dec, - Statement::R => ExStatement::R, - Statement::L => ExStatement::L, - Statement::Out => ExStatement::Out, - Statement::DOut => ExStatement::DOut, - Statement::In => ExStatement::In, - } - }).collect() -} - -fn o_repeat(code: Vec) -> Vec { - let mut amount = 0; - let mut result: Vec = vec![]; - - for i in 0..code.len() { - if code.get(i) == code.get(i + 1) { - amount += 1; - } else if amount == 0 { - result.push(code[i].clone()) - } else { - amount += 1; - result.push(ExStatement::Repeat(Box::new(code[i].clone()), amount as usize)); - amount = 0; - } - } - - result -} - -fn interpret(pgm: &[ExStatement]) -> String { - let mut out = String::new(); - let mut pointer: usize = 0; - let mut mem: [u8; MEM_SIZE] = [0; MEM_SIZE]; - - for s in pgm { - execute(s, &mut mem, &mut pointer, &mut out) - } - - out -} - -fn execute(statement: &ExStatement, mem: &mut Memory, pointer: &mut usize, out: &mut String) { - match statement { - ExStatement::R => if *pointer == MEM_SIZE - 1 { *pointer = 0 } else { *pointer += 1 }, - ExStatement::L => if *pointer == 0 { *pointer = MEM_SIZE - 1 } else { *pointer -= 1 }, - ExStatement::Inc => mem[*pointer] = mem[*pointer].wrapping_add(1), - ExStatement::Dec => mem[*pointer] = mem[*pointer].wrapping_sub(1), - ExStatement::SetNull => mem[*pointer] = 0, - ExStatement::Out => out.push(mem[*pointer] as u8 as char), - ExStatement::DOut => { - print!("{}", mem[*pointer] as u8 as char); - std::io::stdout().flush().unwrap(); - } - ExStatement::In => { - let mut in_buffer = [0, 1]; - stdin().read_exact(&mut in_buffer).unwrap(); - mem[*pointer] = in_buffer[0] as u8; - } - ExStatement::Loop(vec) => { - while mem[*pointer] != 0 { - for s in vec { - execute(&s, mem, pointer, out); - } - } - } - ExStatement::Repeat(statement, amount) => { - match statement.deref() { - ExStatement::R => { - *pointer += amount; - if *pointer > MEM_SIZE { - *pointer %= MEM_SIZE - } - } - ExStatement::L => *pointer = (*pointer).wrapping_sub(*amount), - ExStatement::Inc => mem[*pointer] = mem[*pointer].wrapping_add(*amount as u8), - ExStatement::Dec => mem[*pointer] = mem[*pointer].wrapping_sub(*amount as u8), - ExStatement::Loop(v) => { - for _ in 0..*amount { - execute(&ExStatement::Loop(v.clone()), mem, pointer, out) - } - } - s => { - for _ in 0..*amount { - execute(s, mem, pointer, out) - } - } - } - } - ExStatement::_ForLoop(offset, statement) => { - *pointer += offset; - while mem[*pointer - offset] != 0 { - execute(statement, mem, pointer, out); - } - } - }; -} - - -#[cfg(test)] -mod test { - use crate::interpreter::optimized::{run, o_repeat}; - use crate::interpreter::optimized::ExStatement::{Inc, Repeat, R, L, Dec}; - - #[test] - fn run_loop() { - let program = "++++++++++[>++++++++++<-]>."; - let out = run(program, false).unwrap(); - assert_eq!(out, String::from("d")); - } - - #[test] - fn hello_world() { - let program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; - let out = run(program, false).unwrap(); - assert_eq!(out, String::from("Hello World!\n")); - } - - #[test] - fn o_repeat_simple() { - let code = vec![Inc, Inc, Inc, R]; - let expected = vec![Repeat(Box::new(Inc), 3), R]; - println!("{}", code.len()); - assert_eq!(expected, o_repeat(code)); - } - - #[test] - fn o_repeat_long() { - let code = vec![Inc, Inc, Inc, R, L, L, L, Dec, L, L, Dec]; - let expected = vec![Repeat(Box::new(Inc), 3), R, Repeat(Box::new(L), 3), Dec, Repeat(Box::new(L), 2), Dec]; - assert_eq!(expected, o_repeat(code)); - } -} - +//! # optimization time +//! some better optimizations like set null, repeating and doing more stuff with simplifying stuff +//! + +mod patterns; + +use std::io::{Read, stdin, Write}; + +use crate::interpreter::{minify, parse, Statement, Memory, MEM_SIZE}; +use std::error::Error; +use std::fmt::{Display, Formatter}; +use std::fmt; +use std::ops::Deref; + +#[derive(PartialOrd, PartialEq, Ord, Eq, Clone, Debug)] +enum ExStatement { + Inc, + Dec, + R, + L, + Out, + DOut, + In, + Loop(Vec), + SetNull, + Repeat(Box, usize), + _ForLoop(usize, Box), +} + +impl From for ExStatement { + fn from(s: Statement) -> Self { + match s { + Statement::L => ExStatement::L, + Statement::R => ExStatement::R, + Statement::Inc => ExStatement::Inc, + Statement::Dec => ExStatement::Dec, + Statement::In => ExStatement::In, + Statement::Out => ExStatement::Out, + Statement::Loop(v) => ExStatement::Loop( + v.into_iter().map(ExStatement::from).collect() + ), + Statement::DOut => ExStatement::DOut + } + } +} + +#[derive(Debug)] +pub struct BfErr { + msg: &'static str, +} + +impl BfErr { + pub fn new(msg: &'static str) -> BfErr { + BfErr { msg } + } +} + +impl Display for BfErr { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "Error interpreting brainfuck code: {}", self.msg) + } +} + +impl Error for BfErr {} + + +pub enum PrintMode { + ToString, + DirectPrint, +} + +pub fn run(pgm: &str, print_mode: PrintMode) -> Result { + let pgm = minify(pgm); + if pgm.is_empty() { return Err(BfErr::new("no program found")); }; + let pgm = parse(pgm.chars(), print_mode); + let pgm = optimize(&pgm); + let out = interpret(&pgm); + Ok(out) +} + +fn optimize(code: &[Statement]) -> Vec { + let code = o_set_null(code); + o_repeat(code) +} + +fn o_set_null(code: &[Statement]) -> Vec { + code.iter().map(|s| { + match s { + Statement::Loop(v) => { + if let [Statement::Dec] = v[..] { + ExStatement::SetNull + } else { + ExStatement::Loop(optimize(v)) + } + } + Statement::Inc => ExStatement::Inc, + Statement::Dec => ExStatement::Dec, + Statement::R => ExStatement::R, + Statement::L => ExStatement::L, + Statement::Out => ExStatement::Out, + Statement::DOut => ExStatement::DOut, + Statement::In => ExStatement::In, + } + }).collect() +} + +fn o_repeat(code: Vec) -> Vec { + let mut amount = 0; + let mut result: Vec = vec![]; + + for i in 0..code.len() { + if code.get(i) == code.get(i + 1) { + amount += 1; + } else if amount == 0 { + result.push(code[i].clone()) + } else { + amount += 1; + result.push(ExStatement::Repeat(Box::new(code[i].clone()), amount as usize)); + amount = 0; + } + } + + result +} + +fn interpret(pgm: &[ExStatement]) -> String { + let mut out = String::new(); + let mut pointer: usize = 0; + let mut mem: [u8; MEM_SIZE] = [0; MEM_SIZE]; + + for s in pgm { + execute(s, &mut mem, &mut pointer, &mut out) + } + + out +} + +fn execute(statement: &ExStatement, mem: &mut Memory, pointer: &mut usize, out: &mut String) { + match statement { + ExStatement::R => if *pointer == MEM_SIZE - 1 { *pointer = 0 } else { *pointer += 1 }, + ExStatement::L => if *pointer == 0 { *pointer = MEM_SIZE - 1 } else { *pointer -= 1 }, + ExStatement::Inc => mem[*pointer] = mem[*pointer].wrapping_add(1), + ExStatement::Dec => mem[*pointer] = mem[*pointer].wrapping_sub(1), + ExStatement::SetNull => mem[*pointer] = 0, + ExStatement::Out => out.push(mem[*pointer] as u8 as char), + ExStatement::DOut => { + print!("{}", mem[*pointer] as u8 as char); + std::io::stdout().flush().unwrap(); + } + ExStatement::In => { + let mut in_buffer = [0, 1]; + stdin().read_exact(&mut in_buffer).unwrap(); + mem[*pointer] = in_buffer[0] as u8; + } + ExStatement::Loop(vec) => { + while mem[*pointer] != 0 { + for s in vec { + execute(&s, mem, pointer, out); + } + } + } + ExStatement::Repeat(statement, amount) => { + match statement.deref() { + ExStatement::R => { + *pointer += amount; + if *pointer > MEM_SIZE { + *pointer %= MEM_SIZE + } + } + ExStatement::L => *pointer = (*pointer).wrapping_sub(*amount), + ExStatement::Inc => mem[*pointer] = mem[*pointer].wrapping_add(*amount as u8), + ExStatement::Dec => mem[*pointer] = mem[*pointer].wrapping_sub(*amount as u8), + ExStatement::Loop(v) => { + for _ in 0..*amount { + execute(&ExStatement::Loop(v.clone()), mem, pointer, out) + } + } + s => { + for _ in 0..*amount { + execute(s, mem, pointer, out) + } + } + } + } + ExStatement::_ForLoop(offset, statement) => { + *pointer += offset; + while mem[*pointer - offset] != 0 { + execute(statement, mem, pointer, out); + } + } + }; +} + + +#[cfg(test)] +mod test { + use crate::interpreter::optimized::{run, o_repeat}; + use crate::interpreter::optimized::ExStatement::{Inc, Repeat, R, L, Dec}; + + #[test] + fn run_loop() { + let program = "++++++++++[>++++++++++<-]>."; + let out = run(program, false).unwrap(); + assert_eq!(out, String::from("d")); + } + + #[test] + fn hello_world() { + let program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; + let out = run(program, false).unwrap(); + assert_eq!(out, String::from("Hello World!\n")); + } + + #[test] + fn o_repeat_simple() { + let code = vec![Inc, Inc, Inc, R]; + let expected = vec![Repeat(Box::new(Inc), 3), R]; + println!("{}", code.len()); + assert_eq!(expected, o_repeat(code)); + } + + #[test] + fn o_repeat_long() { + let code = vec![Inc, Inc, Inc, R, L, L, L, Dec, L, L, Dec]; + let expected = vec![Repeat(Box::new(Inc), 3), R, Repeat(Box::new(L), 3), Dec, Repeat(Box::new(L), 2), Dec]; + assert_eq!(expected, o_repeat(code)); + } +} + diff --git a/bfi-rust/src/interpreter/optimized/patterns.rs b/bfi-rust/src/interpreter/optimized/patterns.rs index f1075f2..d41e82d 100644 --- a/bfi-rust/src/interpreter/optimized/patterns.rs +++ b/bfi-rust/src/interpreter/optimized/patterns.rs @@ -1,43 +1,43 @@ -//! -//! # Patterns find and replace -//! Pattern-match ExStatements and replace them with optimizations like add, multiply etc - - -use crate::interpreter::optimized::ExStatement; - -/// -/// Replace this: `[>>x<<-]` or `[->>x<<]` with `WhileAdd(2, x)` -fn _for_loop(to_test: ExStatement) -> ExStatement { - match to_test { - ExStatement::Loop(v) => { - match v[..] { - [ExStatement::R, ExStatement::Inc, ExStatement::L, ExStatement::Dec] => { - ExStatement::_ForLoop(1, Box::from(ExStatement::Inc)) - } - _ => ExStatement::Loop(v) - } - }, - s => s - } -} - - - - -#[cfg(test)] -mod test { - use crate::interpreter::optimized::ExStatement::{Out, Loop, Inc, R, L, Dec, _ForLoop}; - use crate::interpreter::optimized::patterns::_for_loop; - - #[test] - fn for_loop_false() { - let statement = Loop(vec![Out, Inc]); - assert_eq!(statement.clone(), _for_loop(statement)); - } - - #[test] - fn for_loop_simplest() { - let statement = Loop(vec![R, Inc, L, Dec]); - assert_eq!(_ForLoop(1, Box::from(Inc)), _for_loop(statement)); - } +//! +//! # Patterns find and replace +//! Pattern-match ExStatements and replace them with optimizations like add, multiply etc + + +use crate::interpreter::optimized::ExStatement; + +/// +/// Replace this: `[>>x<<-]` or `[->>x<<]` with `WhileAdd(2, x)` +fn _for_loop(to_test: ExStatement) -> ExStatement { + match to_test { + ExStatement::Loop(v) => { + match v[..] { + [ExStatement::R, ExStatement::Inc, ExStatement::L, ExStatement::Dec] => { + ExStatement::_ForLoop(1, Box::from(ExStatement::Inc)) + } + _ => ExStatement::Loop(v) + } + }, + s => s + } +} + + + + +#[cfg(test)] +mod test { + use crate::interpreter::optimized::ExStatement::{Out, Loop, Inc, R, L, Dec, _ForLoop}; + use crate::interpreter::optimized::patterns::_for_loop; + + #[test] + fn for_loop_false() { + let statement = Loop(vec![Out, Inc]); + assert_eq!(statement.clone(), _for_loop(statement)); + } + + #[test] + fn for_loop_simplest() { + let statement = Loop(vec![R, Inc, L, Dec]); + assert_eq!(_ForLoop(1, Box::from(Inc)), _for_loop(statement)); + } } \ No newline at end of file diff --git a/bfi-rust/src/interpreter/parsed.rs b/bfi-rust/src/interpreter/parsed.rs index 8b02262..f30bbaf 100644 --- a/bfi-rust/src/interpreter/parsed.rs +++ b/bfi-rust/src/interpreter/parsed.rs @@ -1,122 +1,122 @@ -//! -//! # optimization time -//! -//! first parse the bf so that it can be executed faster -//! most importantly: loop jumps should be immediate -#![allow(dead_code)] - -use std::io::{Read, stdin, Write}; - -use crate::interpreter::{MEM_SIZE, Memory, minify, parse, Statement}; -use crate::interpreter::optimized::PrintMode; -use crate::repl::BrainfuckState; - -pub fn run(pgm: &str) -> String { - let pgm = minify(pgm); - let pgm = parse(pgm.chars(), PrintMode::ToString); - interpret(&pgm) -} - - -fn interpret(pgm: &[Statement]) -> String { - let mut out = String::new(); - let mut pointer: usize = 0; - let mut mem: [u8; MEM_SIZE] = [0; MEM_SIZE]; - - for s in pgm { - execute(s, &mut mem, &mut pointer, &mut out) - } - - out -} - -pub fn interpret_with_state(pgm: &[Statement], state: &mut BrainfuckState) { - for s in pgm { - execute(s, &mut state.memory, &mut state.pointer, &mut String::new()) - } -} - -fn execute(statement: &Statement, mem: &mut Memory, pointer: &mut usize, out: &mut String) { - match statement { - Statement::R => if *pointer == MEM_SIZE - 1 { *pointer = 0 } else { *pointer += 1 }, - Statement::L => if *pointer == 0 { *pointer = MEM_SIZE - 1 } else { *pointer -= 1 }, - Statement::Inc => mem[*pointer] = mem[*pointer].wrapping_add(1), - Statement::Dec => mem[*pointer] = mem[*pointer].wrapping_sub(1), - Statement::Out => out.push(mem[*pointer] as u8 as char), - Statement::In => { - let mut in_buffer = [0, 1]; - stdin().read_exact(&mut in_buffer).unwrap(); - mem[*pointer] = in_buffer[0] as u8; - } - Statement::Loop(vec) => { - while mem[*pointer] != 0 { - for s in vec { - execute(&s, mem, pointer, out); - } - } - } - Statement::DOut => { - print!("{}", mem[*pointer] as u8 as char); - std::io::stdout().flush().unwrap(); - } - } -} - - -#[cfg(test)] -mod test { - use crate::interpreter::parsed::{execute, run, Statement}; - - #[test] - fn execute_simple() { - let mut pointer: usize = 0; - let mut mem: [u8; 65535] = [0; 65535]; - let mut out = String::new(); - - execute(&Statement::R, &mut mem, &mut pointer, &mut out); - assert_eq!(pointer, 1); - execute(&Statement::L, &mut mem, &mut pointer, &mut out); - assert_eq!(pointer, 0); - execute(&Statement::Inc, &mut mem, &mut pointer, &mut out); - assert_eq!(mem[pointer], 1); - execute(&Statement::Dec, &mut mem, &mut pointer, &mut out); - assert_eq!(mem[pointer], 0); - } - - #[test] - fn execute_false_loop() { - let statement = Statement::Loop(vec![Statement::Inc, Statement::Inc, Statement::R]); - let mut pointer: usize = 0; - let mut mem: [u8; 65535] = [0; 65535]; - - execute(&statement, &mut mem, &mut pointer, &mut String::new()); - assert_eq!(mem[0], 0); - assert_eq!(mem[1], 0); - } - - #[test] - fn execute_loop() { - let statement = Statement::Loop(vec![Statement::Inc, Statement::Inc, Statement::R]); - let mut pointer: usize = 0; - let mut mem: [u8; 65535] = [0; 65535]; - mem[0] = 1; - - execute(&statement, &mut mem, &mut pointer, &mut String::new()); - assert_eq!(mem[0], 3); - assert_eq!(mem[1], 0); - } - - #[test] - fn run_loop() { - let program = "++++++++++[>++++++++++<-]>."; - let out = run(program); - assert_eq!(out, String::from("d")); - } - - #[test] - fn hello_world() { - let program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; - let out = run(program); - assert_eq!(out, String::from("Hello World!\n")); - } +//! +//! # optimization time +//! +//! first parse the bf so that it can be executed faster +//! most importantly: loop jumps should be immediate +#![allow(dead_code)] + +use std::io::{Read, stdin, Write}; + +use crate::interpreter::{MEM_SIZE, Memory, minify, parse, Statement}; +use crate::interpreter::optimized::PrintMode; +use crate::repl::BrainfuckState; + +pub fn run(pgm: &str) -> String { + let pgm = minify(pgm); + let pgm = parse(pgm.chars(), PrintMode::ToString); + interpret(&pgm) +} + + +fn interpret(pgm: &[Statement]) -> String { + let mut out = String::new(); + let mut pointer: usize = 0; + let mut mem: [u8; MEM_SIZE] = [0; MEM_SIZE]; + + for s in pgm { + execute(s, &mut mem, &mut pointer, &mut out) + } + + out +} + +pub fn interpret_with_state(pgm: &[Statement], state: &mut BrainfuckState) { + for s in pgm { + execute(s, &mut state.memory, &mut state.pointer, &mut String::new()) + } +} + +fn execute(statement: &Statement, mem: &mut Memory, pointer: &mut usize, out: &mut String) { + match statement { + Statement::R => if *pointer == MEM_SIZE - 1 { *pointer = 0 } else { *pointer += 1 }, + Statement::L => if *pointer == 0 { *pointer = MEM_SIZE - 1 } else { *pointer -= 1 }, + Statement::Inc => mem[*pointer] = mem[*pointer].wrapping_add(1), + Statement::Dec => mem[*pointer] = mem[*pointer].wrapping_sub(1), + Statement::Out => out.push(mem[*pointer] as u8 as char), + Statement::In => { + let mut in_buffer = [0, 1]; + stdin().read_exact(&mut in_buffer).unwrap(); + mem[*pointer] = in_buffer[0] as u8; + } + Statement::Loop(vec) => { + while mem[*pointer] != 0 { + for s in vec { + execute(&s, mem, pointer, out); + } + } + } + Statement::DOut => { + print!("{}", mem[*pointer] as u8 as char); + std::io::stdout().flush().unwrap(); + } + } +} + + +#[cfg(test)] +mod test { + use crate::interpreter::parsed::{execute, run, Statement}; + + #[test] + fn execute_simple() { + let mut pointer: usize = 0; + let mut mem: [u8; 65535] = [0; 65535]; + let mut out = String::new(); + + execute(&Statement::R, &mut mem, &mut pointer, &mut out); + assert_eq!(pointer, 1); + execute(&Statement::L, &mut mem, &mut pointer, &mut out); + assert_eq!(pointer, 0); + execute(&Statement::Inc, &mut mem, &mut pointer, &mut out); + assert_eq!(mem[pointer], 1); + execute(&Statement::Dec, &mut mem, &mut pointer, &mut out); + assert_eq!(mem[pointer], 0); + } + + #[test] + fn execute_false_loop() { + let statement = Statement::Loop(vec![Statement::Inc, Statement::Inc, Statement::R]); + let mut pointer: usize = 0; + let mut mem: [u8; 65535] = [0; 65535]; + + execute(&statement, &mut mem, &mut pointer, &mut String::new()); + assert_eq!(mem[0], 0); + assert_eq!(mem[1], 0); + } + + #[test] + fn execute_loop() { + let statement = Statement::Loop(vec![Statement::Inc, Statement::Inc, Statement::R]); + let mut pointer: usize = 0; + let mut mem: [u8; 65535] = [0; 65535]; + mem[0] = 1; + + execute(&statement, &mut mem, &mut pointer, &mut String::new()); + assert_eq!(mem[0], 3); + assert_eq!(mem[1], 0); + } + + #[test] + fn run_loop() { + let program = "++++++++++[>++++++++++<-]>."; + let out = run(program); + assert_eq!(out, String::from("d")); + } + + #[test] + fn hello_world() { + let program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; + let out = run(program); + assert_eq!(out, String::from("Hello World!\n")); + } } \ No newline at end of file diff --git a/bfi-rust/src/interpreter/simple.rs b/bfi-rust/src/interpreter/simple.rs index bdb9d64..4652577 100644 --- a/bfi-rust/src/interpreter/simple.rs +++ b/bfi-rust/src/interpreter/simple.rs @@ -1,71 +1,71 @@ -//! -//! The very basic interpreter without any optimizations -#![allow(dead_code)] - -use crate::interpreter::{MEM_SIZE, minify}; -use std::io::{stdin, Read}; - -pub fn run(program: &str) -> String{ - let program = minify(program); - let out = interpret(program.chars().collect()); - out -} - -fn interpret(pgm: Vec) -> String { - let mut out = String::new(); - let mut pointer: usize = 0; - let mut mem: [u8; MEM_SIZE] = [0; MEM_SIZE]; - let mut in_buffer = [0; 1]; - let mut pc = 0; - let len = pgm.len(); - - while pc < len { - match pgm[pc] { - '>' => if pointer == MEM_SIZE - 1 { pointer = 0 } else { pointer += 1 }, - '<' => if pointer == 0 { pointer = MEM_SIZE - 1 } else { pointer -= 1 }, - '+' => mem[pointer] = mem[pointer].wrapping_add(1), - '-' => mem[pointer] = mem[pointer].wrapping_sub(1), - '.' => out.push(mem[pointer] as u8 as char), - ',' => { - stdin().read_exact(&mut in_buffer).unwrap(); - mem[pointer] = in_buffer[0] as u8; - } - '[' => { - //jump to corresponding ] - if mem[pointer] == 0 { - let mut level = 0; - while pgm[pc] != ']' || level > -1 { - pc += 1; - match pgm[pc] { - '[' => { - level += 1 - } - ']' => { - level -= 1 - } - _ => (), - } - } - } - } - ']' => { - if mem[pointer] != 0 { - //jump to corresponding [ - let mut level = 0; - while pgm[pc] != '[' || level > -1 { - pc -= 1; - match pgm[pc] { - '[' => level -= 1, - ']' => level += 1, - _ => (), - } - } - } - } - _ => (), - } - pc += 1; - } - - out +//! +//! The very basic interpreter without any optimizations +#![allow(dead_code)] + +use crate::interpreter::{MEM_SIZE, minify}; +use std::io::{stdin, Read}; + +pub fn run(program: &str) -> String{ + let program = minify(program); + let out = interpret(program.chars().collect()); + out +} + +fn interpret(pgm: Vec) -> String { + let mut out = String::new(); + let mut pointer: usize = 0; + let mut mem: [u8; MEM_SIZE] = [0; MEM_SIZE]; + let mut in_buffer = [0; 1]; + let mut pc = 0; + let len = pgm.len(); + + while pc < len { + match pgm[pc] { + '>' => if pointer == MEM_SIZE - 1 { pointer = 0 } else { pointer += 1 }, + '<' => if pointer == 0 { pointer = MEM_SIZE - 1 } else { pointer -= 1 }, + '+' => mem[pointer] = mem[pointer].wrapping_add(1), + '-' => mem[pointer] = mem[pointer].wrapping_sub(1), + '.' => out.push(mem[pointer] as u8 as char), + ',' => { + stdin().read_exact(&mut in_buffer).unwrap(); + mem[pointer] = in_buffer[0] as u8; + } + '[' => { + //jump to corresponding ] + if mem[pointer] == 0 { + let mut level = 0; + while pgm[pc] != ']' || level > -1 { + pc += 1; + match pgm[pc] { + '[' => { + level += 1 + } + ']' => { + level -= 1 + } + _ => (), + } + } + } + } + ']' => { + if mem[pointer] != 0 { + //jump to corresponding [ + let mut level = 0; + while pgm[pc] != '[' || level > -1 { + pc -= 1; + match pgm[pc] { + '[' => level -= 1, + ']' => level += 1, + _ => (), + } + } + } + } + _ => (), + } + pc += 1; + } + + out } \ No newline at end of file diff --git a/bfi-rust/src/main.rs b/bfi-rust/src/main.rs index 6cd4785..d005897 100644 --- a/bfi-rust/src/main.rs +++ b/bfi-rust/src/main.rs @@ -1,37 +1,37 @@ -mod interpreter; -mod repl; - -use std::{env, fs}; -use std::time::SystemTime; -use crate::repl::start_repl; -use crate::interpreter::optimized::{PrintMode}; -use std::error::Error; - - -fn main() { - let path = env::args().nth(1); - - match path { - Some(p) => { - if let Err(why) = run_program(p) { - eprintln!("An error occurred in the program: {}", why) - } - }, - None => start_repl() - }; -} - -fn run_program(path: String) -> Result<(), Box> { - let program = match fs::read_to_string(path) { - Ok(p) => p, - Err(e) => { - println!("Error reading file: {}", e); - return Err(Box::from(e)); - } - }; - let start_time = SystemTime::now(); - let out = interpreter::optimized::run(&*program, PrintMode::DirectPrint)?; - let duration = start_time.elapsed()?; - println!("{}\nFinished execution. Took {}ms", out, duration.as_millis()); - Ok(()) +mod interpreter; +mod repl; + +use std::{env, fs}; +use std::time::SystemTime; +use crate::repl::start_repl; +use crate::interpreter::optimized::{PrintMode}; +use std::error::Error; + + +fn main() { + let path = env::args().nth(1); + + match path { + Some(p) => { + if let Err(why) = run_program(p) { + eprintln!("An error occurred in the program: {}", why) + } + }, + None => start_repl() + }; +} + +fn run_program(path: String) -> Result<(), Box> { + let program = match fs::read_to_string(path) { + Ok(p) => p, + Err(e) => { + println!("Error reading file: {}", e); + return Err(Box::from(e)); + } + }; + let start_time = SystemTime::now(); + let out = interpreter::optimized::run(&*program, PrintMode::DirectPrint)?; + let duration = start_time.elapsed()?; + println!("{}\nFinished execution. Took {}ms", out, duration.as_millis()); + Ok(()) } \ No newline at end of file diff --git a/bfi-rust/src/repl/mod.rs b/bfi-rust/src/repl/mod.rs index 440b3c1..0cb452c 100644 --- a/bfi-rust/src/repl/mod.rs +++ b/bfi-rust/src/repl/mod.rs @@ -1,111 +1,111 @@ -use std::fmt::{Display, Formatter}; -use std::fmt; -use std::io::{stdin, stdout, Write}; -use crate::interpreter::{minify, parse, parsed, Memory, MEM_SIZE}; -use crate::interpreter::optimized::PrintMode; - -pub struct BrainfuckState { - pub memory: Memory, - pub pointer: usize, -} - -impl Display for BrainfuckState { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}", display_state(self)) - } -} - -fn display_state(state: &BrainfuckState) -> String { - let start = if state.pointer < 5 { - 0 - } else if state.pointer > MEM_SIZE - 10 { - MEM_SIZE - 10 - } else { - state.pointer - 5 - }; - - format!("{}-\n|{}|\n{}-\n{}|\n{}|\n{}|\n{}-\n {}^^^^", - "----------".repeat(10), - { - let mut out = String::new(); - let end = start + 10; - for i in start..end { - out.push_str(&*format!(" {: >5} ", i)); - } - out - }, - "----------".repeat(10), - "| ".repeat(10), - { - let mut out = String::new(); - let end = start + 10; - for i in start..end { - out.push_str(&*format!("| {: >3} ", state.memory[i])); - } - out - }, - "| ".repeat(10), - "----------".repeat(10), - " ".repeat(state.pointer - start)) -} - -pub fn start_repl() { - println!("Brainfuck REPL"); - - let mut state = BrainfuckState { - memory: [0; MEM_SIZE], - pointer: 0, - }; - - println!("Enter Brainfuck programs and they will be executed immediatly."); - println!("State is kept."); - println!("{}", state); - loop { - print!(">> "); - stdout().flush().unwrap(); - match read_line() { - Ok(s) => { - match &*s { - ":q" => break, - ":?" | "help" | "?" => print_help(), - ":r" => { - reset(&mut state); - println!("{}", state); - }, - _ => { - print!("Output: "); - println!(); - parse_input(s, &mut state); - println!("{}", state); - } - } - } - Err(why) => println!("Error reading input: {}\nPlease try again.", why) - } - } -} - -fn reset(state: &mut BrainfuckState) { - state.pointer = 0; - state.memory = [0; MEM_SIZE]; -} - -fn print_help() { - println!("Brainfuck REPL help - :q => quit - :? => help - :r => reset state"); -} - -fn parse_input(pgm: String, state: &mut BrainfuckState) { - let pgm = minify(&*pgm); - let pgm = parse(pgm.chars(), PrintMode::DirectPrint); - parsed::interpret_with_state(&*pgm, state); -} - -pub fn read_line() -> Result { - let mut buf = String::new(); - stdin().read_line(&mut buf)?; - buf.pop(); - Ok(buf) +use std::fmt::{Display, Formatter}; +use std::fmt; +use std::io::{stdin, stdout, Write}; +use crate::interpreter::{minify, parse, parsed, Memory, MEM_SIZE}; +use crate::interpreter::optimized::PrintMode; + +pub struct BrainfuckState { + pub memory: Memory, + pub pointer: usize, +} + +impl Display for BrainfuckState { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", display_state(self)) + } +} + +fn display_state(state: &BrainfuckState) -> String { + let start = if state.pointer < 5 { + 0 + } else if state.pointer > MEM_SIZE - 10 { + MEM_SIZE - 10 + } else { + state.pointer - 5 + }; + + format!("{}-\n|{}|\n{}-\n{}|\n{}|\n{}|\n{}-\n {}^^^^", + "----------".repeat(10), + { + let mut out = String::new(); + let end = start + 10; + for i in start..end { + out.push_str(&*format!(" {: >5} ", i)); + } + out + }, + "----------".repeat(10), + "| ".repeat(10), + { + let mut out = String::new(); + let end = start + 10; + for i in start..end { + out.push_str(&*format!("| {: >3} ", state.memory[i])); + } + out + }, + "| ".repeat(10), + "----------".repeat(10), + " ".repeat(state.pointer - start)) +} + +pub fn start_repl() { + println!("Brainfuck REPL"); + + let mut state = BrainfuckState { + memory: [0; MEM_SIZE], + pointer: 0, + }; + + println!("Enter Brainfuck programs and they will be executed immediatly."); + println!("State is kept."); + println!("{}", state); + loop { + print!(">> "); + stdout().flush().unwrap(); + match read_line() { + Ok(s) => { + match &*s { + ":q" => break, + ":?" | "help" | "?" => print_help(), + ":r" => { + reset(&mut state); + println!("{}", state); + }, + _ => { + print!("Output: "); + println!(); + parse_input(s, &mut state); + println!("{}", state); + } + } + } + Err(why) => println!("Error reading input: {}\nPlease try again.", why) + } + } +} + +fn reset(state: &mut BrainfuckState) { + state.pointer = 0; + state.memory = [0; MEM_SIZE]; +} + +fn print_help() { + println!("Brainfuck REPL help + :q => quit + :? => help + :r => reset state"); +} + +fn parse_input(pgm: String, state: &mut BrainfuckState) { + let pgm = minify(&*pgm); + let pgm = parse(pgm.chars(), PrintMode::DirectPrint); + parsed::interpret_with_state(&*pgm, state); +} + +pub fn read_line() -> Result { + let mut buf = String::new(); + stdin().read_line(&mut buf)?; + buf.pop(); + Ok(buf) } \ No newline at end of file diff --git a/ibfi-ts/.gitignore b/ibfi-ts/.gitignore deleted file mode 100644 index 4d29575..0000000 --- a/ibfi-ts/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/ibfi-ts/README.md b/ibfi-ts/README.md deleted file mode 100644 index 66319f7..0000000 --- a/ibfi-ts/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Interactive Brainfuck Interpreter in React TS - -This is an interactive interpreter for the brainfuck programming language. -It provides simple brainfuck execution, along with a view of the memory, the memory pointer, the current state of the -code and more. - -It is great for debugging brainfuck programs, including a memory view, program view, the location of the pointers, the -ability to directly edit memory. -You can step manually through the program, or set the execution speed to whatever speed fits best. -This interpreter also has the ability to set breakpoints using the • symbol. This means you can let your code run fast and -stopping it at any point in your program to see what went wrong. - -## Features -* brainfuck execution including IO -* memory view -* code state view -* manual stepping -* breakpoints -* error messages -* seeing ASCII characters in memory -* manual code input -* fast excecution mode (no debugging info) - -### Future features -* none-blocking fast excecution mode -* better speed control -* (limited) backstepping \ No newline at end of file diff --git a/ibfi-ts/package.json b/ibfi-ts/package.json deleted file mode 100644 index 6807856..0000000 --- a/ibfi-ts/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ibfi-ts", - "version": "0.1.0", - "homepage": "https://nilstrieb.github.io/brainfuck", - "private": false, - "dependencies": { - "@testing-library/jest-dom": "^5.11.4", - "@testing-library/react": "^11.1.0", - "@testing-library/user-event": "^12.1.10", - "@types/jest": "^26.0.15", - "@types/node": "^12.0.0", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "node-sass": "^6.0.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-scripts": "4.0.3", - "sass": "^1.35.1", - "typescript": "^4.1.2", - "web-vitals": "^1.0.1" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "deploy": "yarn build && gh-pages -d build" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "gh-pages": "^3.2.3" - } -} diff --git a/ibfi-ts/public/favicon.ico b/ibfi-ts/public/favicon.ico deleted file mode 100644 index a11777c..0000000 Binary files a/ibfi-ts/public/favicon.ico and /dev/null differ diff --git a/ibfi-ts/public/index.html b/ibfi-ts/public/index.html deleted file mode 100644 index 934f289..0000000 --- a/ibfi-ts/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - Brainfuck Interpreter - - - -
- - - diff --git a/ibfi-ts/public/logo192.png b/ibfi-ts/public/logo192.png deleted file mode 100644 index fc44b0a..0000000 Binary files a/ibfi-ts/public/logo192.png and /dev/null differ diff --git a/ibfi-ts/public/logo512.png b/ibfi-ts/public/logo512.png deleted file mode 100644 index a4e47a6..0000000 Binary files a/ibfi-ts/public/logo512.png and /dev/null differ diff --git a/ibfi-ts/public/manifest.json b/ibfi-ts/public/manifest.json deleted file mode 100644 index 080d6c7..0000000 --- a/ibfi-ts/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/ibfi-ts/public/robots.txt b/ibfi-ts/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/ibfi-ts/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/ibfi-ts/src/App.scss b/ibfi-ts/src/App.scss deleted file mode 100644 index 9fa2117..0000000 --- a/ibfi-ts/src/App.scss +++ /dev/null @@ -1,128 +0,0 @@ -$main-color: #282c34; -$main-color-brighter: #323942; -$light-color: ghostwhite; -$medium-color: #78787f; - -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -.App-header { - background-color: $main-color; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: $light-color; -} - -.App-link { - color: #61dafb; -} - -.bf-input { - .code-input { - resize: none; - width: 80vw; - height: 400px; - font-size: 100px; - } - - .code-options-wrapper > * { - margin: 10px; - } -} - -.code-display-wrapper { - max-width: 80vw; - font-family: monospace; - - span { - word-wrap: break-word; - } -} - -.memory-display-table { - $border: 1px solid $light-color; - - th, .cell { - border: $border; - } - - th, td { - min-width: 60px; - text-align: center; - } - - .array-set-value-field { - min-width: 50px; - max-width: 100px; - height: 40px; - color: $light-color; - font-size: 30px; - background-color: $main-color-brighter; - } -} - -.run-button { - height: 50px; - width: 200px; - -} - -.bf-run { - margin: 20px; - - - .speed-control-wrapper > * { - margin: 10px; - } - - .small-speed-button { - height: 40px; - width: 40px; - } - - .program-input-area { - resize: none; - width: 80vw; - height: 50px; - font-size: 30px; - } - - .info { - background-color: #579ca7; - } -} - -.bf-output { - .output-area { - resize: none; - width: 80vw; - height: 200px; - font-size: 20px; - } -} - -textarea { - background-color: $main-color-brighter; - color: $light-color; -} - -button { - background-color: $medium-color; - font-size: 20px; - border: 1px solid $main-color; - - &:hover { - cursor: pointer; - background-color: $light-color; - } -} \ No newline at end of file diff --git a/ibfi-ts/src/brainfuck/Interpreter.ts b/ibfi-ts/src/brainfuck/Interpreter.ts deleted file mode 100644 index 0c4b25a..0000000 --- a/ibfi-ts/src/brainfuck/Interpreter.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {CodeOptions} from "../components/CodeInput"; - -type InHandler = (() => number); -type OutHandler = ((char: number) => void); - -export default class Interpreter { - private readonly _array: Uint8Array; - private _pointer: number; - private readonly _code: string; - private _programCounter: number; - - private readonly _inHandler: InHandler; - private readonly _outHandler: OutHandler; - - private readonly _options: CodeOptions; - - constructor(input: [string, CodeOptions], outHandler: OutHandler, inHandler: InHandler) { - const buf = new ArrayBuffer(32000); - this._array = new Uint8Array(buf); - this._pointer = 0; - - this._options = input[1]; - if (input[1].minify) { - this._code = this.minify(input[0]) - } else { - this._code = input[0]; - } - - this._programCounter = 0; - this._inHandler = inHandler; - this._outHandler = outHandler; - } - - public next() { - this.execute(this._code[this._programCounter++]); - } - - public execute(char: string) { - switch (char) { - case '+': - this._array[this._pointer]++; - break; - case '-': - this._array[this._pointer]--; - break; - case '>': - this._pointer++; - break; - case '<': - if (this._pointer === 0) { - throw new Error("Cannot wrap left"); - } - this._pointer--; - break; - case '.': - this._outHandler(this.value); - break; - case ',': - this.input(); - break; - case '[': - this.loopForwards(); - break; - case ']': - this.loopBackwards(); - break; - case '•': - if (this._options.enableBreakpoints) { - throw new Error("Breakpoint reached"); - } - break; - case undefined: - this._programCounter = this._code.length; - break; - default: - break; - } - } - - private loopForwards() { - if (this.value === 0) { - let level = 0; - while (this.lastInstruction !== ']' || level > -1) { - this._programCounter++; - if (this._programCounter > this._code.length) { - throw new Error("Reached end of code while searching ']'"); - } - if (this.lastInstruction === '[') level++; - else if (this.lastInstruction === ']') level--; - } - } - } - - private loopBackwards() { - if (this.value !== 0) { - let level = 0; - while (this.lastInstruction !== '[' || level > -1) { - this._programCounter--; - if (this._programCounter < 0) { - throw new Error("Reached start of code while searching '['"); - } - if (this.lastInstruction === '[') level--; - else if (this.lastInstruction === ']') level++; - } - } - } - - private input() { - try { - this._array[this._pointer] = this._inHandler(); - } catch { - this._programCounter--; - } - } - - get reachedEnd(): boolean { - return this._programCounter === this._code.length; - } - - get lastInstruction(): string { - return this._code[this._programCounter - 1]; - } - - get value(): number { - return this._array[this._pointer]; - } - - get array(): Uint8Array { - return this._array; - } - - get pointer(): number { - return this._pointer; - } - - get code(): string { - return this._code; - } - - get programCounter(): number { - return this._programCounter; - } - - private minify(code: string): string { - const CHARS = ['+', '-', '<', '>', '.', ',', '[', ']']; - if (this._options.enableBreakpoints) { - CHARS.push('•'); - } - - return code.split("") - .filter(c => CHARS.includes(c)) - .join(""); - } -} - - - diff --git a/ibfi-ts/src/components/App.tsx b/ibfi-ts/src/components/App.tsx deleted file mode 100644 index edf98c3..0000000 --- a/ibfi-ts/src/components/App.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import '../App.scss'; -import CodeInput, {CodeOptions} from "./CodeInput"; -import ProgramOutput from "./ProgramOutput"; -import React, {useCallback, useState} from "react"; -import Runner from "./Runner"; - -export const OptionContext = React.createContext({}); - -function App() { - const [out, setOut] = useState(""); - const [input, setInput] = useState<[string, CodeOptions]>(["", {}]); - const [running, setRunning] = useState(false); - - const outHandler = useCallback((char: number) => { - setOut(oldOut => oldOut + String.fromCharCode(char)) - }, []); - - const runHandler = (run: boolean) => { - setRunning(run); - if (!run) { - setOut(""); - } - } - - const inputHandler = (code: string, options: CodeOptions) => setInput([code, options]); - return ( -
- - { - !running && - } - - { - running && - } - -
- ); -} - -export default App; \ No newline at end of file diff --git a/ibfi-ts/src/components/CodeDisplay.tsx b/ibfi-ts/src/components/CodeDisplay.tsx deleted file mode 100644 index 9d2d5ab..0000000 --- a/ibfi-ts/src/components/CodeDisplay.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -interface CodeDisplayProps { - code: string, - index: number, -} - -const CodeDisplay = ({code, index}: CodeDisplayProps) => { - - const firstCodePart = code.substr(0, index); - const secondCodePart = code.substr(index + 1, code.length - index + 1); - - return ( -
- {firstCodePart} - {code[index] || " "} - {secondCodePart} -
- ); -}; - -export default CodeDisplay; \ No newline at end of file diff --git a/ibfi-ts/src/components/CodeInput.tsx b/ibfi-ts/src/components/CodeInput.tsx deleted file mode 100644 index 37fa956..0000000 --- a/ibfi-ts/src/components/CodeInput.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, {ChangeEvent, useState} from 'react'; -import presets from "../presets.json"; - -export interface CodeOptions { - minify?: boolean, - directStart?: boolean, - startSuperSpeed?: boolean, - enableBreakpoints?: boolean - asciiView?: boolean -} - -interface CodeInputProps { - setInput: ((code: string, options: CodeOptions) => void), - input: [string, CodeOptions] -} - -const codeOptions: Array<[string, keyof CodeOptions]> = [ - ["Minify Code", "minify"], - ["Start directly", "directStart"], - ["Start in blocking mode", "startSuperSpeed"], - ["Breakpoints (•)", "enableBreakpoints"], - ["Show ASCII in memory", "asciiView"] -] - -const CodeInput = ({input: [code, options], setInput}: CodeInputProps) => { - const [fontSize, setFontSize] = useState(40); - - const setPreset = (name: keyof typeof presets) => () => { - setInput(presets[name], options); - } - - const changeHandler = (name: keyof CodeOptions) => (event: ChangeEvent) => { - setInput(code, {...options, [name]: event.target.checked}) - } - - return ( -
-
-
- - setFontSize(+v.target.value)}/> -
- - {codeOptions.map(([display, id]) => - - )} - -
-