2025-09-17 05:56:33 +09:00
|
|
|
/*!
|
|
|
|
|
* CLI Directives Scanner — early source comments to env plumbing
|
|
|
|
|
*
|
|
|
|
|
* Supports lightweight, file-scoped directives placed in the first lines
|
|
|
|
|
* of a Nyash source file. Current directives:
|
|
|
|
|
* - // @env KEY=VALUE → export KEY=VALUE into process env
|
|
|
|
|
* - // @plugin-builtins → NYASH_USE_PLUGIN_BUILTINS=1
|
|
|
|
|
* - // @jit-debug → enable common JIT debug flags (no-op if JIT unused)
|
|
|
|
|
* - // @jit-strict → strict JIT flags (no VM fallback) for experiments
|
|
|
|
|
*
|
|
|
|
|
* Also runs the "fields-at-top" lint delegated to pipeline::lint_fields_top.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
pub(super) fn apply_cli_directives_from_source(
|
|
|
|
|
code: &str,
|
|
|
|
|
strict_fields: bool,
|
|
|
|
|
verbose: bool,
|
|
|
|
|
) -> Result<(), String> {
|
|
|
|
|
// Scan only the header area (up to the first non-comment content line)
|
|
|
|
|
for (i, line) in code.lines().take(128).enumerate() {
|
|
|
|
|
let l = line.trim();
|
|
|
|
|
if !(l.starts_with("//") || l.starts_with("#!") || l.is_empty()) {
|
2025-09-17 07:43:07 +09:00
|
|
|
if i > 0 {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-09-17 05:56:33 +09:00
|
|
|
}
|
|
|
|
|
if let Some(rest) = l.strip_prefix("//") {
|
|
|
|
|
let rest = rest.trim();
|
|
|
|
|
if let Some(dir) = rest.strip_prefix("@env ") {
|
|
|
|
|
if let Some((k, v)) = dir.split_once('=') {
|
|
|
|
|
let key = k.trim();
|
|
|
|
|
let val = v.trim();
|
2025-09-17 07:43:07 +09:00
|
|
|
if !key.is_empty() {
|
|
|
|
|
std::env::set_var(key, val);
|
|
|
|
|
}
|
2025-09-17 05:56:33 +09:00
|
|
|
}
|
|
|
|
|
} else if rest == "@plugin-builtins" {
|
|
|
|
|
std::env::set_var("NYASH_USE_PLUGIN_BUILTINS", "1");
|
|
|
|
|
} else if rest == "@jit-debug" {
|
|
|
|
|
// Safe even if JIT is disabled elsewhere; treated as no-op flags
|
|
|
|
|
std::env::set_var("NYASH_JIT_EXEC", "1");
|
|
|
|
|
std::env::set_var("NYASH_JIT_THRESHOLD", "1");
|
|
|
|
|
std::env::set_var("NYASH_JIT_EVENTS", "1");
|
|
|
|
|
std::env::set_var("NYASH_JIT_EVENTS_COMPILE", "1");
|
|
|
|
|
std::env::set_var("NYASH_JIT_EVENTS_RUNTIME", "1");
|
|
|
|
|
std::env::set_var("NYASH_JIT_SHIM_TRACE", "1");
|
|
|
|
|
} else if rest == "@jit-strict" {
|
|
|
|
|
std::env::set_var("NYASH_JIT_STRICT", "1");
|
|
|
|
|
std::env::set_var("NYASH_JIT_ARGS_HANDLE_ONLY", "1");
|
|
|
|
|
if std::env::var("NYASH_JIT_ONLY").ok().is_none() {
|
|
|
|
|
std::env::set_var("NYASH_JIT_ONLY", "1");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Lint: enforce fields at top-of-box (delegated)
|
|
|
|
|
super::pipeline::lint_fields_top(code, strict_fields, verbose)
|
|
|
|
|
}
|