Skip to content

Instantly share code, notes, and snippets.

@yorickpeterse
Created June 2, 2015 15:06
Show Gist options
  • Save yorickpeterse/d6392afc1d451d8a3cd7 to your computer and use it in GitHub Desktop.
Save yorickpeterse/d6392afc1d451d8a3cd7 to your computer and use it in GitHub Desktop.
pub fn new() -> VirtualMachine {
let mut heap = Heap::new();
// Object extends Class
let object_class = heap.allocate_pinned_class("Object".to_string());
let class_class = heap.allocate_pinned_class("Class".to_string());
object_class.borrow_mut().set_parent_class(class_class.clone());
// Integer extends Object
let mut integer_class = heap.allocate_pinned_class("Integer".to_string());
integer_class.borrow_mut().set_parent_class(object_class.clone());
// Float extends Object
let mut float_class = heap.allocate_pinned_class("Float".to_string());
float_class.borrow_mut().set_parent_class(object_class.clone());
// String extends Object
let mut string_class = heap.allocate_pinned_class("String".to_string());
string_class.borrow_mut().set_parent_class(object_class.clone());
// Array extends Object
let mut array_class = heap.allocate_pinned_class("Array".to_string());
array_class.borrow_mut().set_parent_class(object_class.clone());
let class_instance = Object::new_class(class_class.clone(), class_class.clone());
let object_instance = Object::new_class(class_class.clone(), object_class.clone());
let integer_instance = Object::new_class(class_class.clone(), integer_class.clone());
let float_instance = Object::new_class(class_class.clone(), float_class.clone());
let string_instance = Object::new_class(class_class.clone(), string_class.clone());
let array_instance = Object::new_class(class_class.clone(), array_class.clone());
{
let mut object_ref = object_class.borrow_mut();
object_ref.add_constant("Class".to_string(), class_instance);
object_ref.add_constant("Object".to_string(), object_instance);
object_ref.add_constant("Integer".to_string(), integer_instance);
object_ref.add_constant("Float".to_string(), float_instance);
object_ref.add_constant("String".to_string(), string_instance);
object_ref.add_constant("Array".to_string(), array_instance);
}
VirtualMachine {
threads: Vec::new(),
global_heap: RwLock::new(heap),
object_class: object_class,
integer_class: integer_class,
float_class: float_class,
string_class: string_class,
array_class: array_class
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment