FIX: v0.7.0 completely broke stdlib loading.

This commit is contained in:
Jeremy Wall 2019-12-09 20:11:42 -06:00
parent 9a3bfbad02
commit 13f0749ac8
5 changed files with 48 additions and 15 deletions

View File

@ -639,6 +639,7 @@ impl ModuleDef {
); );
// std/ paths are special and do not get made into absolute paths. // std/ paths are special and do not get made into absolute paths.
if path.starts_with(format!("std{}", main_separator)) { if path.starts_with(format!("std{}", main_separator)) {
dbg!(&path);
return; return;
} }
#[cfg(not(windows))] #[cfg(not(windows))]

View File

@ -45,7 +45,7 @@ pub mod ir;
pub mod opcode; pub mod opcode;
pub mod scope; pub mod scope;
mod stdlib; pub mod stdlib;
pub use self::ir::Val; pub use self::ir::Val;
@ -115,7 +115,8 @@ where
stdout: Stdout, stdout: Stdout,
stderr: Stderr, stderr: Stderr,
) -> Self { ) -> Self {
let environment = Environment::new_with_vars(stdout, stderr, env::vars().collect()); let mut environment = Environment::new_with_vars(stdout, stderr, env::vars().collect());
environment.populate_stdlib();
FileBuilder { FileBuilder {
environment: Rc::new(RefCell::new(environment)), environment: Rc::new(RefCell::new(environment)),
strict: false, strict: false,

View File

@ -21,6 +21,7 @@ use super::cache;
use super::pointer::OpPointer; use super::pointer::OpPointer;
use super::Error; use super::Error;
use super::Value; use super::Value;
use crate::build::stdlib;
use crate::build::AssertCollector; use crate::build::AssertCollector;
use crate::build::Val; use crate::build::Val;
use crate::convert::{ConverterRegistry, ImporterRegistry}; use crate::convert::{ConverterRegistry, ImporterRegistry};
@ -97,6 +98,35 @@ impl<Stdout: Write + Clone, Stderr: Write + Clone> Environment<Stdout, Stderr> {
) )
} }
fn add_ops_for_path_and_content<P>(&mut self, path: P, contents: &str) -> Result<(), Error>
where
P: Into<PathBuf> + Clone,
{
let path_copy = path.clone();
self.op_cache.entry(path.clone()).get_pointer_or_else(
|| {
let p = path.into();
let root = p.parent().unwrap();
let iter = OffsetStrIter::new(contents).with_src_file(&p);
// FIXME(jwall): Unify BuildError and our other Error
let stmts = parse(iter, None).unwrap();
// then we create an ops from it
let ops = super::translate::AST::translate(stmts, &root);
Ok(ops)
},
path_copy,
)?;
Ok(())
}
pub fn populate_stdlib(&mut self) {
for (p, s) in stdlib::get_libs().drain() {
// We unwrap the error here since we expect stdlibs to
// always compile.
self.add_ops_for_path_and_content(p, s).unwrap();
}
}
pub fn record_assert_result(&mut self, desc: &str, ok: bool) { pub fn record_assert_result(&mut self, desc: &str, ok: bool) {
self.assert_results.record_assert_result(desc, ok); self.assert_results.record_assert_result(desc, ok);
} }

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use std::cell::RefCell; use std::cell::RefCell;
use std::fmt::Debug; use std::fmt::{Debug, Display};
use std::fs::File; use std::fs::File;
use std::io::Read; use std::io::Read;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -101,7 +101,7 @@ impl Builtins {
// Try a relative path first. // Try a relative path first.
let path = path.into(); let path = path.into();
// stdlib paths are special // stdlib paths are special
if path.starts_with("std/") { if path.starts_with(format!("std{}", std::path::MAIN_SEPARATOR)) {
return Ok(path); return Ok(path);
} }
let mut normalized = base_path.into(); let mut normalized = base_path.into();
@ -144,18 +144,19 @@ impl Builtins {
pos: Position, pos: Position,
) -> Result<PathBuf, Error> ) -> Result<PathBuf, Error>
where where
P: Into<PathBuf>, P: Into<PathBuf> + Display + Clone,
BP: Into<PathBuf>, BP: Into<PathBuf>,
{ {
// Try a relative path first.
// FIXME(jwall): Use import paths if desired. // FIXME(jwall): Use import paths if desired.
let normalized = self.normalize_path(base_path, use_import_path, path)?; match self.normalize_path(base_path, use_import_path, path.clone()) {
match normalized.canonicalize() {
Ok(p) => Ok(p), Ok(p) => Ok(p),
Err(_e) => Err(Error::new( Err(e) => {
format!("Invalid path: {}", normalized.to_string_lossy()), //panic!(format!("Error finding path {}: {}", path, e));
pos.clone(), Err(Error::new(
)), format!("Error finding path {}: {}", path, e),
pos,
))
}
} }
} }

View File

@ -510,7 +510,7 @@ where
} }
fn op_fcall(&mut self, pos: Position) -> Result<(), Error> { fn op_fcall(&mut self, pos: Position) -> Result<(), Error> {
let (f, f_pos) = dbg!(self.pop())?; let (f, f_pos) = self.pop()?;
let (arg_length, _) = self.pop()?; let (arg_length, _) = self.pop()?;
if let &F(ref f) = f.as_ref() { if let &F(ref f) = f.as_ref() {
if let &P(Int(arg_length)) = arg_length.as_ref() { if let &P(Int(arg_length)) = arg_length.as_ref() {
@ -809,7 +809,7 @@ where
fn op_index(&mut self, safe: bool, pos: Position) -> Result<(), Error> { fn op_index(&mut self, safe: bool, pos: Position) -> Result<(), Error> {
// left and then right // left and then right
let (right, right_pos) = dbg!(self.pop())?; let (right, right_pos) = self.pop()?;
let (left, _) = self.pop()?; let (left, _) = self.pop()?;
match right.as_ref() { match right.as_ref() {
&P(Int(i)) => { &P(Int(i)) => {
@ -824,7 +824,7 @@ where
if let &C(Tuple(ref flds, _)) = left.as_ref() { if let &C(Tuple(ref flds, _)) = left.as_ref() {
for &(ref key, ref val) in flds.iter() { for &(ref key, ref val) in flds.iter() {
if key == s { if key == s {
self.push(dbg!(val).clone(), right_pos)?; self.push(val.clone(), right_pos)?;
return Ok(()); return Ok(());
} }
} }