mirror of
https://github.com/elicpeter/nyx.git
synced 2026-06-12 19:55:14 +02:00
[pitboss/grind] deferred session-0017 (20260517T044708Z-e058)
This commit is contained in:
parent
5b90a67f5c
commit
5b4181e4dd
14 changed files with 489 additions and 131 deletions
|
|
@ -36,7 +36,7 @@
|
|||
//! Build container: `nyx-build-java:{toolchain_id}` (deferred; §19.1).
|
||||
|
||||
use crate::dynamic::environment::{Environment, RuntimeArtifacts};
|
||||
use crate::dynamic::lang::{ChainStepHarness, HarnessSource, LangEmitter};
|
||||
use crate::dynamic::lang::{ChainStepHarness, ChainStepTerminal, HarnessSource, LangEmitter};
|
||||
use crate::dynamic::spec::{EntryKind, HarnessSpec, PayloadSlot};
|
||||
use crate::evidence::UnsupportedReason;
|
||||
use std::path::PathBuf;
|
||||
|
|
@ -75,16 +75,23 @@ impl LangEmitter for JavaEmitter {
|
|||
materialize_java(env)
|
||||
}
|
||||
|
||||
fn compose_chain_step(&self, prev_output: Option<&[u8]>) -> ChainStepHarness {
|
||||
chain_step(prev_output)
|
||||
fn compose_chain_step(
|
||||
&self,
|
||||
prev_output: Option<&[u8]>,
|
||||
terminal: Option<&ChainStepTerminal>,
|
||||
) -> ChainStepHarness {
|
||||
chain_step(prev_output, terminal)
|
||||
}
|
||||
}
|
||||
|
||||
/// Phase 26 — Java chain-step harness.
|
||||
///
|
||||
/// Emits a `Step.java` class whose `main` reads `NYX_PREV_OUTPUT` and
|
||||
/// forwards it on stdout. The command shell-wraps `javac` + `java` so
|
||||
/// the step actually runs after the build step completes (the
|
||||
/// forwards it on stdout. When the step is the chain's terminal step
|
||||
/// the `main` body also calls `__nyx_probe(callee, prev)` and prints
|
||||
/// [`ChainStepHarness::SINK_HIT_SENTINEL`] so the runner flips
|
||||
/// `sink_hit` for the chain. The command shell-wraps `javac` + `java`
|
||||
/// so the step actually runs after the build step completes (the
|
||||
/// `ChainStepHarness.command` slot models a single process).
|
||||
///
|
||||
/// The Java probe shim (`__nyx_probe`, `__nyx_install_crash_guard`,
|
||||
|
|
@ -95,10 +102,23 @@ impl LangEmitter for JavaEmitter {
|
|||
/// fully-qualified `java.util.TreeMap` / `java.io.FileWriter` /
|
||||
/// `java.nio.charset.StandardCharsets`, so no extra `import` lines
|
||||
/// are needed beyond what stock Java implicitly imports.
|
||||
fn chain_step(prev_output: Option<&[u8]>) -> ChainStepHarness {
|
||||
fn chain_step(
|
||||
prev_output: Option<&[u8]>,
|
||||
terminal: Option<&ChainStepTerminal>,
|
||||
) -> ChainStepHarness {
|
||||
let shim = probe_shim();
|
||||
let mut body = String::from(
|
||||
" String prev = System.getenv(\"NYX_PREV_OUTPUT\");\n if (prev == null) prev = \"\";\n System.out.print(prev);\n",
|
||||
);
|
||||
if let Some(t) = terminal {
|
||||
let callee = java_string_literal(&t.sink_callee);
|
||||
let sentinel = java_string_literal(ChainStepHarness::SINK_HIT_SENTINEL);
|
||||
body.push_str(&format!(
|
||||
" __nyx_probe({callee}, prev);\n System.out.println({sentinel});\n System.out.flush();\n",
|
||||
));
|
||||
}
|
||||
let source = format!(
|
||||
"public class Step {{\n{shim}\n public static void main(String[] args) {{\n String prev = System.getenv(\"NYX_PREV_OUTPUT\");\n if (prev == null) prev = \"\";\n System.out.print(prev);\n }}\n}}\n"
|
||||
"public class Step {{\n{shim}\n public static void main(String[] args) {{\n{body} }}\n}}\n"
|
||||
);
|
||||
ChainStepHarness {
|
||||
source,
|
||||
|
|
@ -120,6 +140,12 @@ fn chain_step(prev_output: Option<&[u8]>) -> ChainStepHarness {
|
|||
}
|
||||
}
|
||||
|
||||
/// Escape a string for safe Java double-quoted literal embedding.
|
||||
fn java_string_literal(s: &str) -> String {
|
||||
let escaped = s.replace('\\', "\\\\").replace('"', "\\\"");
|
||||
format!("\"{escaped}\"")
|
||||
}
|
||||
|
||||
// ── Phase 14: shape detector ─────────────────────────────────────────────────
|
||||
|
||||
/// Concrete per-file shape resolved by reading the entry source.
|
||||
|
|
@ -1142,7 +1168,7 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn chain_step_splices_probe_shim_for_composite_reverify() {
|
||||
let step = chain_step(Some(b"<prev>"));
|
||||
let step = chain_step(Some(b"<prev>"), None);
|
||||
assert!(
|
||||
step.source.contains("__nyx_probe"),
|
||||
"Java chain step must splice the probe shim"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue