mirror of
https://github.com/MorizzG/rlox.git
synced 2025-12-06 04:12:42 +00:00
added type Attrs = FxHashMap<SmolStr, Value>
This commit is contained in:
parent
812cf0d2d0
commit
943528a0db
4 changed files with 14 additions and 9 deletions
|
|
@ -2,9 +2,9 @@ use std::fmt::Display;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use rlox2_frontend::parser::{Expr, Stmt};
|
use rlox2_frontend::parser::{Expr, Stmt};
|
||||||
use rustc_hash::FxHashMap;
|
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
|
|
||||||
|
use crate::value::Attrs;
|
||||||
use crate::{LoxFunction, LoxReference, Value};
|
use crate::{LoxFunction, LoxReference, Value};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
@ -13,7 +13,7 @@ pub struct LoxClass {
|
||||||
|
|
||||||
name: SmolStr,
|
name: SmolStr,
|
||||||
|
|
||||||
methods: FxHashMap<String, Value>,
|
methods: Attrs,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Representation of a class in Lox. Always behind an Rc to ensure uniqueness. Should never be
|
/// Representation of a class in Lox. Always behind an Rc to ensure uniqueness. Should never be
|
||||||
|
|
@ -21,7 +21,7 @@ pub struct LoxClass {
|
||||||
impl LoxClass {
|
impl LoxClass {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
name: impl Into<SmolStr>,
|
name: impl Into<SmolStr>,
|
||||||
methods: FxHashMap<String, Value>,
|
methods: Attrs,
|
||||||
superclass: Option<Rc<LoxClass>>,
|
superclass: Option<Rc<LoxClass>>,
|
||||||
) -> Rc<Self> {
|
) -> Rc<Self> {
|
||||||
let name = name.into();
|
let name = name.into();
|
||||||
|
|
@ -41,11 +41,12 @@ impl LoxClass {
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_init = Value::function(LoxFunction::new(name, closure, param_names, body));
|
let new_init = Value::function(LoxFunction::new(name, closure, param_names, body));
|
||||||
methods.insert("init".to_owned(), new_init);
|
|
||||||
|
methods.insert("init".into(), new_init);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref superclass) = superclass {
|
if let Some(ref superclass) = superclass {
|
||||||
let mut new_methods: FxHashMap<String, Value> = FxHashMap::default();
|
let mut new_methods = Attrs::default();
|
||||||
|
|
||||||
// Rc<LoxFunction> is immutable, so we need to drain, change, and replace
|
// Rc<LoxFunction> is immutable, so we need to drain, change, and replace
|
||||||
for (name, value) in methods {
|
for (name, value) in methods {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use rlox2_frontend::parser::{BinaryOp, Expr, Literal, LogicalOp, Stmt, UnaryOp};
|
use rlox2_frontend::parser::{BinaryOp, Expr, Literal, LogicalOp, Stmt, UnaryOp};
|
||||||
use rustc_hash::FxHashMap;
|
|
||||||
|
|
||||||
use super::environment::Environment;
|
use super::environment::Environment;
|
||||||
use super::{LoxFunction, Runtime, Value};
|
use super::{LoxFunction, Runtime, Value};
|
||||||
use crate::error::RuntimeError;
|
use crate::error::RuntimeError;
|
||||||
use crate::function::LoxExternFunction;
|
use crate::function::LoxExternFunction;
|
||||||
|
use crate::value::Attrs;
|
||||||
use crate::{LoxClass, LoxReference};
|
use crate::{LoxClass, LoxReference};
|
||||||
|
|
||||||
pub type EvalResult<T> = Result<T, RuntimeError>;
|
pub type EvalResult<T> = Result<T, RuntimeError>;
|
||||||
|
|
@ -206,7 +206,7 @@ impl Eval for Expr {
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut methods: FxHashMap<String, Value> = FxHashMap::default();
|
let mut methods = Attrs::default();
|
||||||
|
|
||||||
// this is the scope "this" will get injected in
|
// this is the scope "this" will get injected in
|
||||||
env.enter_scope()?;
|
env.enter_scope()?;
|
||||||
|
|
@ -215,7 +215,7 @@ impl Eval for Expr {
|
||||||
let method = method_expr.eval(env)?;
|
let method = method_expr.eval(env)?;
|
||||||
|
|
||||||
if let Value::Function(ref fun) = method {
|
if let Value::Function(ref fun) = method {
|
||||||
let name = fun.name().to_owned();
|
let name = fun.name().into();
|
||||||
methods.insert(name, method);
|
methods.insert(name, method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ use std::rc::Rc;
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
|
|
||||||
|
use crate::value::Attrs;
|
||||||
use crate::{LoxClass, Value};
|
use crate::{LoxClass, Value};
|
||||||
|
|
||||||
/// This struct is private, since *nothing* is supposed to be handling an object directly,
|
/// This struct is private, since *nothing* is supposed to be handling an object directly,
|
||||||
|
|
@ -13,7 +14,7 @@ use crate::{LoxClass, Value};
|
||||||
struct LoxObject {
|
struct LoxObject {
|
||||||
class: Rc<LoxClass>,
|
class: Rc<LoxClass>,
|
||||||
|
|
||||||
attrs: FxHashMap<SmolStr, Value>,
|
attrs: Attrs,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LoxObject {
|
impl LoxObject {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,15 @@
|
||||||
use std::fmt::{Debug, Display};
|
use std::fmt::{Debug, Display};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use rustc_hash::FxHashMap;
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
|
|
||||||
use super::function::LoxExternFunction;
|
use super::function::LoxExternFunction;
|
||||||
use super::LoxFunction;
|
use super::LoxFunction;
|
||||||
use crate::{LoxClass, LoxReference};
|
use crate::{LoxClass, LoxReference};
|
||||||
|
|
||||||
|
pub type Attrs = FxHashMap<SmolStr, Value>;
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, PartialEq)]
|
#[derive(Debug, Default, Clone, PartialEq)]
|
||||||
pub enum Value {
|
pub enum Value {
|
||||||
Object(LoxReference),
|
Object(LoxReference),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue