Skip to content

Instantly share code, notes, and snippets.

@razielgn
Created May 27, 2015 21:28
Show Gist options
  • Save razielgn/00aa666c8ca39a001094 to your computer and use it in GitHub Desktop.
Save razielgn/00aa666c8ca39a001094 to your computer and use it in GitHub Desktop.
Aeon + Rc
diff --git a/src/heap.rs b/src/heap.rs
index 190441a..ad961e0 100644
--- a/src/heap.rs
+++ b/src/heap.rs
@@ -1,9 +1,11 @@
-use object::{Object, ObjectValue};
+use std::rc::Rc;
+
+use object::{Object, RcObject, ObjectValue};
const DEFAULT_CAPACITY: usize = 1024;
pub struct Heap<'l> {
- members: Vec<Object<'l>>
+ members: Vec<RcObject<'l>>
}
impl <'l> Heap<'l> {
@@ -19,15 +21,15 @@ impl <'l> Heap<'l> {
self.members.capacity()
}
- pub fn allocate(&mut self, value: ObjectValue<'l>) -> &Object<'l> {
- let object = Object::new(value);
+ pub fn allocate(&mut self, value: ObjectValue<'l>) -> RcObject<'l> {
+ let object = Rc::new(Object::new(value));
- self.members.push(object);
+ self.members.push(object.clone());
- self.members.last().unwrap()
+ object
}
- pub fn allocate_integer(&mut self, value: isize) -> &Object<'l> {
+ pub fn allocate_integer(&mut self, value: isize) -> RcObject<'l> {
self.allocate(ObjectValue::Integer(value))
}
}
diff --git a/src/object.rs b/src/object.rs
index 146754b..7636bfb 100644
--- a/src/object.rs
+++ b/src/object.rs
@@ -1,13 +1,16 @@
use std::collections::HashMap;
+use std::rc::Rc;
use compiled_code::CompiledCode;
+pub type RcObject<'l> = Rc<Object<'l>>;
+
// TODO: use different Object structs instead of smacking all this in Object
pub enum ObjectValue<'l> {
Integer(isize),
Float(f64),
String(String),
- Array(Vec<&'l Object<'l>>)//,
+ Array(Vec<RcObject<'l>>)//,
//Hash(HashMap<&'l Object<'l>, &'l Object<'l>>)
}
diff --git a/src/register.rs b/src/register.rs
index 0ec8f0b..774a3db 100644
--- a/src/register.rs
+++ b/src/register.rs
@@ -1,9 +1,9 @@
use std::collections::HashMap;
-use object::Object;
+use object::RcObject;
pub struct Register<'l> {
- slots: HashMap<isize, &'l Object<'l>>
+ slots: HashMap<isize, RcObject<'l>>
}
impl<'l> Register<'l> {
@@ -11,11 +11,11 @@ impl<'l> Register<'l> {
Register { slots: HashMap::new() }
}
- pub fn set(&mut self, slot: isize, value: &'l Object<'l>) {
+ pub fn set(&mut self, slot: isize, value: RcObject<'l>) {
self.slots.insert(slot, value);
}
- pub fn get(&self, slot: isize) -> &'l Object<'l> {
- self.slots.get(&slot).unwrap()
+ pub fn get(&self, slot: isize) -> RcObject<'l> {
+ self.slots.get(&slot).unwrap().clone()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment