mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
Merge remote-tracking branch 'remote/main' into rebuild-platform
This commit is contained in:
commit
926014518f
221 changed files with 2990 additions and 2303 deletions
|
@ -973,7 +973,15 @@ pub fn build(
|
|||
// ManuallyDrop will leak the bytes because we don't drop manually
|
||||
let bytes = &ManuallyDrop::new(std::fs::read(&binary_path).unwrap());
|
||||
|
||||
roc_run(&arena, opt_level, target, args, bytes, expect_metadata)
|
||||
roc_run(
|
||||
&arena,
|
||||
path,
|
||||
opt_level,
|
||||
target,
|
||||
args,
|
||||
bytes,
|
||||
expect_metadata,
|
||||
)
|
||||
}
|
||||
BuildAndRunIfNoErrors => {
|
||||
if problems.fatally_errored {
|
||||
|
@ -1008,7 +1016,15 @@ pub fn build(
|
|||
// ManuallyDrop will leak the bytes because we don't drop manually
|
||||
let bytes = &ManuallyDrop::new(std::fs::read(&binary_path).unwrap());
|
||||
|
||||
roc_run(&arena, opt_level, target, args, bytes, expect_metadata)
|
||||
roc_run(
|
||||
&arena,
|
||||
path,
|
||||
opt_level,
|
||||
target,
|
||||
args,
|
||||
bytes,
|
||||
expect_metadata,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1021,6 +1037,7 @@ pub fn build(
|
|||
|
||||
fn roc_run<'a, I: IntoIterator<Item = &'a OsStr>>(
|
||||
arena: &Bump,
|
||||
script_path: &Path,
|
||||
opt_level: OptLevel,
|
||||
target: Target,
|
||||
args: I,
|
||||
|
@ -1060,7 +1077,14 @@ fn roc_run<'a, I: IntoIterator<Item = &'a OsStr>>(
|
|||
|
||||
Ok(0)
|
||||
}
|
||||
_ => roc_run_native(arena, opt_level, args, binary_bytes, expect_metadata),
|
||||
_ => roc_run_native(
|
||||
arena,
|
||||
script_path,
|
||||
opt_level,
|
||||
args,
|
||||
binary_bytes,
|
||||
expect_metadata,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1077,7 +1101,7 @@ fn os_str_as_utf8_bytes(os_str: &OsStr) -> &[u8] {
|
|||
|
||||
fn make_argv_envp<'a, I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
||||
arena: &'a Bump,
|
||||
executable: &ExecutableFile,
|
||||
script_path: &Path,
|
||||
args: I,
|
||||
) -> (
|
||||
bumpalo::collections::Vec<'a, CString>,
|
||||
|
@ -1085,8 +1109,7 @@ fn make_argv_envp<'a, I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
|||
) {
|
||||
use bumpalo::collections::CollectIn;
|
||||
|
||||
let path = executable.as_path();
|
||||
let path_cstring = CString::new(os_str_as_utf8_bytes(path.as_os_str())).unwrap();
|
||||
let path_cstring = CString::new(os_str_as_utf8_bytes(script_path.as_os_str())).unwrap();
|
||||
|
||||
// argv is an array of pointers to strings passed to the new program
|
||||
// as its command-line arguments. By convention, the first of these
|
||||
|
@ -1124,6 +1147,7 @@ fn make_argv_envp<'a, I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
|||
#[cfg(target_family = "unix")]
|
||||
fn roc_run_native<I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
||||
arena: &Bump,
|
||||
script_path: &Path,
|
||||
opt_level: OptLevel,
|
||||
args: I,
|
||||
binary_bytes: &[u8],
|
||||
|
@ -1132,7 +1156,7 @@ fn roc_run_native<I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
|||
use bumpalo::collections::CollectIn;
|
||||
|
||||
let executable = roc_run_executable_file_path(binary_bytes)?;
|
||||
let (argv_cstrings, envp_cstrings) = make_argv_envp(arena, &executable, args);
|
||||
let (argv_cstrings, envp_cstrings) = make_argv_envp(arena, script_path, args);
|
||||
|
||||
let argv: bumpalo::collections::Vec<*const c_char> = argv_cstrings
|
||||
.iter()
|
||||
|
@ -1387,6 +1411,7 @@ fn roc_run_executable_file_path(binary_bytes: &[u8]) -> std::io::Result<Executab
|
|||
#[cfg(not(target_family = "unix"))]
|
||||
fn roc_run_native<I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
||||
arena: &Bump, // This should be passed an owned value, not a reference, so we can usefully mem::forget it!
|
||||
script_path: &Path,
|
||||
opt_level: OptLevel,
|
||||
args: I,
|
||||
binary_bytes: &[u8],
|
||||
|
@ -1398,7 +1423,7 @@ fn roc_run_native<I: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
|||
let executable = roc_run_executable_file_path(binary_bytes)?;
|
||||
|
||||
// TODO forward the arguments
|
||||
let (argv_cstrings, envp_cstrings) = make_argv_envp(&arena, &executable, args);
|
||||
let (argv_cstrings, envp_cstrings) = make_argv_envp(&arena, script_path, args);
|
||||
|
||||
let argv: bumpalo::collections::Vec<*const c_char> = argv_cstrings
|
||||
.iter()
|
||||
|
|
|
@ -17,10 +17,12 @@ use roc_load::{LoadingProblem, Threading};
|
|||
use roc_packaging::cache::{self, RocCacheDir};
|
||||
use roc_target::Target;
|
||||
use std::fs::{self, FileType};
|
||||
use std::io::BufRead;
|
||||
use std::io::{self, Read, Write};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::str::FromStr;
|
||||
use target_lexicon::Triple;
|
||||
use tempfile::Builder;
|
||||
|
||||
#[global_allocator]
|
||||
static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
|
||||
|
@ -205,26 +207,89 @@ fn main() -> io::Result<()> {
|
|||
|
||||
let opt_main_path = matches.get_one::<PathBuf>(FLAG_MAIN);
|
||||
|
||||
match check_file(
|
||||
&arena,
|
||||
roc_file_path.to_owned(),
|
||||
opt_main_path.cloned(),
|
||||
emit_timings,
|
||||
RocCacheDir::Persistent(cache::roc_cache_packages_dir().as_path()),
|
||||
threading,
|
||||
) {
|
||||
Ok((problems, total_time)) => {
|
||||
problems.print_error_warning_count(total_time);
|
||||
Ok(problems.exit_code())
|
||||
}
|
||||
match roc_file_path.extension().and_then(OsStr::to_str) {
|
||||
Some("md") => {
|
||||
// Extract the blocks of roc code
|
||||
let file = fs::File::open(roc_file_path.as_path())?;
|
||||
let markdown_file_reader = io::BufReader::new(file);
|
||||
let mut roc_blocks: Vec<String> = Vec::new();
|
||||
let mut in_roc_block: bool = false;
|
||||
let mut current_block = String::new();
|
||||
|
||||
Err(LoadingProblem::FormattedReport(report)) => {
|
||||
print!("{report}");
|
||||
for line in markdown_file_reader.lines() {
|
||||
let line = line.unwrap();
|
||||
if line == "```roc" {
|
||||
in_roc_block = true;
|
||||
} else if (line == "```") & in_roc_block {
|
||||
in_roc_block = false;
|
||||
roc_blocks.push(current_block);
|
||||
current_block = String::new();
|
||||
} else if in_roc_block {
|
||||
current_block.push_str(&line);
|
||||
current_block.push_str("\n");
|
||||
}
|
||||
}
|
||||
|
||||
Ok(1)
|
||||
// now check each block, we exit early if any single block does not check
|
||||
let mut exit_code = 0;
|
||||
|
||||
for block in roc_blocks.iter() {
|
||||
let mut file = Builder::new().suffix(".roc").tempfile()?;
|
||||
write!(file, "{}", block)?;
|
||||
|
||||
match check_file(
|
||||
&arena,
|
||||
file.path().to_owned(),
|
||||
opt_main_path.cloned(),
|
||||
emit_timings,
|
||||
RocCacheDir::Persistent(cache::roc_cache_packages_dir().as_path()),
|
||||
threading,
|
||||
) {
|
||||
Ok((problems, total_time)) => {
|
||||
problems.print_error_warning_count(total_time);
|
||||
exit_code = problems.exit_code();
|
||||
}
|
||||
|
||||
Err(LoadingProblem::FormattedReport(report)) => {
|
||||
print!("{report}");
|
||||
|
||||
exit_code = 1;
|
||||
}
|
||||
Err(other) => {
|
||||
panic!("build_file failed with error:\n{other:?}");
|
||||
}
|
||||
}
|
||||
|
||||
if exit_code != 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(exit_code)
|
||||
}
|
||||
Err(other) => {
|
||||
panic!("build_file failed with error:\n{other:?}");
|
||||
_ => {
|
||||
match check_file(
|
||||
&arena,
|
||||
roc_file_path.to_owned(),
|
||||
opt_main_path.cloned(),
|
||||
emit_timings,
|
||||
RocCacheDir::Persistent(cache::roc_cache_packages_dir().as_path()),
|
||||
threading,
|
||||
) {
|
||||
Ok((problems, total_time)) => {
|
||||
problems.print_error_warning_count(total_time);
|
||||
Ok(problems.exit_code())
|
||||
}
|
||||
|
||||
Err(LoadingProblem::FormattedReport(report)) => {
|
||||
print!("{report}");
|
||||
|
||||
Ok(1)
|
||||
}
|
||||
Err(other) => {
|
||||
panic!("build_file failed with error:\n{other:?}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue