Created
May 27, 2015 21:28
-
-
Save razielgn/00aa666c8ca39a001094 to your computer and use it in GitHub Desktop.
Aeon + Rc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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