Skip to content

Commit f83529c

Browse files
committed
feat(native): rename crate and update build scripts
1 parent 346dee4 commit f83529c

File tree

5 files changed

+73
-1
lines changed

5 files changed

+73
-1
lines changed

Justfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@ test:
55

66
bench name="heavy_work":
77
ruby test/benchmarks/run_benchmark.rb {{name}}
8+
9+
build-extension:
10+
cargo build --release --manifest-path ext/native_tracer/Cargo.toml

ext/native_tracer/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "codetracer_ruby_native_recoreder"
3+
version = "0.1.0"
4+
edition = "2021" # latest stable Rust edition
5+
description = "Native Ruby tracer using rb_add_event_hook2"
6+
7+
[lib]
8+
crate-type = ["cdylib"]
9+
10+
[dependencies]
11+
rb-sys = "0.9"
12+
runtime_tracing = "0.1"

ext/native_tracer/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# codetracer_ruby_native_recoreder
2+
3+
This crate provides a minimal Ruby tracer implemented in Rust.
4+
It registers a Ruby VM event hook using `rb_add_event_hook2` and
5+
records basic information for each executed line.
6+
7+
Recorded events are written using the [`runtime_tracing`](https://github.com/metacraft-labs/runtime_tracing) crate.
8+
9+
## Building
10+
11+
```
12+
cargo build --release
13+
```
14+
15+
If you have `just` installed, run `just build-extension` from the project root.
16+
17+
The produced shared library can be required from Ruby:
18+
19+
```ruby
20+
require_relative 'target/release/libcodetracer_ruby_native_recoreder'
21+
```
22+
23+
Once loaded, the tracer starts writing a trace to `trace.json` or the
24+
path specified via the `CODETRACER_DB_TRACE_PATH` environment variable.

ext/native_tracer/src/lib.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use std::ffi::CStr;
2+
use std::os::raw::{c_char, c_int};
3+
use rb_sys::{VALUE, ID, rb_add_event_hook2, rb_event_flag_t, RUBY_EVENT_LINE, rb_sourcefile, rb_sourceline, RUBY_EVENT_HOOK_FLAG_RAW_ARG};
4+
use runtime_tracing::{TraceWriter, StepRecord};
5+
6+
static mut WRITER: Option<TraceWriter<std::fs::File>> = None;
7+
8+
extern "C" fn event_hook(ev: rb_event_flag_t, _data: VALUE, _self: VALUE, _mid: ID, _klass: VALUE) {
9+
if ev & RUBY_EVENT_LINE as rb_event_flag_t != 0 {
10+
unsafe {
11+
if let Some(writer) = WRITER.as_mut() {
12+
let line: u32 = rb_sourceline() as u32;
13+
let file_ptr: *const c_char = rb_sourcefile();
14+
if !file_ptr.is_null() {
15+
if let Ok(path) = CStr::from_ptr(file_ptr).to_str() {
16+
let rec = StepRecord { path: path.into(), line };
17+
let _ = writer.write_step(&rec);
18+
}
19+
}
20+
}
21+
}
22+
}
23+
}
24+
25+
#[no_mangle]
26+
pub extern "C" fn Init_codetracer_ruby_native_recoreder() {
27+
unsafe {
28+
let out = std::env::var("CODETRACER_DB_TRACE_PATH").unwrap_or_else(|_| "trace.json".to_string());
29+
let file = std::fs::File::create(out).expect("failed to create trace output");
30+
WRITER = Some(TraceWriter::new(file));
31+
rb_add_event_hook2(Some(event_hook), RUBY_EVENT_LINE as rb_event_flag_t, 0 as VALUE, RUBY_EVENT_HOOK_FLAG_RAW_ARG as i32);
32+
}
33+
}

flake.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
let pkgs = import nixpkgs { inherit system; };
1313
in {
1414
default = pkgs.mkShell {
15-
packages = with pkgs; [ ruby just git-lfs ];
15+
packages = with pkgs; [ ruby rustc cargo just git-lfs ];
1616
};
1717
});
1818
};

0 commit comments

Comments
 (0)