67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use crate::vm::field::DvmField;
 | |
| use crate::vm::function::DvmFunction;
 | |
| use crate::vm::interface::DvmInterface;
 | |
| use crate::vm::method::DvmMethod;
 | |
| use crate::vm::object::DvmObject;
 | |
| use std::collections::HashMap;
 | |
| use std::fmt::Debug;
 | |
| use std::rc::Rc;
 | |
| 
 | |
| #[derive(Debug, Eq)]
 | |
| pub struct DvmImplementation {
 | |
|     fqn: String,
 | |
|     interface: Option<Rc<DvmInterface>>,
 | |
|     static_functions: HashMap<String, Rc<DvmFunction>>,
 | |
|     methods: HashMap<String, Rc<DvmMethod>>,
 | |
|     fields: HashMap<String, Rc<DvmField>>,
 | |
| }
 | |
| 
 | |
| impl PartialEq for DvmImplementation {
 | |
|     fn eq(&self, other: &Self) -> bool {
 | |
|         self.fqn == other.fqn
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl DvmImplementation {
 | |
|     pub fn new(fqn: &str, interface: Option<Rc<DvmInterface>>) -> Self {
 | |
|         DvmImplementation {
 | |
|             fqn: fqn.to_string(),
 | |
|             interface,
 | |
|             static_functions: HashMap::new(),
 | |
|             methods: HashMap::new(),
 | |
|             fields: HashMap::new(),
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     pub fn fqn(&self) -> &str {
 | |
|         self.fqn.as_str()
 | |
|     }
 | |
| 
 | |
|     pub fn add_function(&mut self, function: DvmFunction) {
 | |
|         self.static_functions
 | |
|             .insert(function.fqn().to_string(), Rc::new(function));
 | |
|     }
 | |
| 
 | |
|     pub fn add_method(&mut self, dvm_method: DvmMethod) {
 | |
|         self.methods
 | |
|             .insert(dvm_method.fqn().to_string(), Rc::new(dvm_method));
 | |
|     }
 | |
| 
 | |
|     pub fn find_method(&self, name: &str, self_object: &DvmObject) -> Option<Rc<DvmMethod>> {
 | |
|         self.methods.get(name).cloned()
 | |
|     }
 | |
| 
 | |
|     pub fn add_field(&mut self, dm_field: DvmField) {
 | |
|         self.fields
 | |
|             .insert(dm_field.name().to_string(), Rc::new(dm_field));
 | |
|     }
 | |
| 
 | |
|     pub fn find_field(&self, name: &str, self_object: &DvmObject) -> Option<Rc<DvmField>> {
 | |
|         self.fields.get(name).cloned()
 | |
|     }
 | |
| 
 | |
|     pub fn field_count(&self) -> usize {
 | |
|         self.fields.len()
 | |
|     }
 | |
| }
 | 
