jvm 0.3.0

Core abstractions and runtime services for embeddable JVM implementations
Documentation
use alloc::{borrow::Cow, boxed::Box, string::String, vec::Vec};
use core::fmt::Debug;

use dyn_clone::{DynClone, clone_trait_object};

use jvm_types::ClassAccessFlags;

use crate::{ArrayClassDefinition, ClassInstance, Field, JavaValue, Jvm, Method, Result, as_any::AsAny};

#[async_trait::async_trait]
pub trait ClassDefinition: Sync + Send + AsAny + Debug + DynClone {
    fn name(&self) -> Cow<'_, str>;
    fn super_class_name(&self) -> Option<String>;
    fn interface_names(&self) -> Vec<String>;
    fn access_flags(&self) -> ClassAccessFlags;
    async fn instantiate(&self, jvm: &Jvm) -> Result<Box<dyn ClassInstance>>;
    async fn prepare(&self, jvm: &Jvm) -> Result<()>;
    fn method(&self, name: &str, descriptor: &str, is_static: bool) -> Option<Box<dyn Method>>;
    fn field(&self, name: &str, descriptor: &str, is_static: bool) -> Option<Box<dyn Field>>;
    fn fields(&self) -> Vec<Box<dyn Field>>;
    fn get_static_field(&self, field: &dyn Field) -> Result<JavaValue>; // TODO do we need to split class? or rename classdefinition?
    fn put_static_field(&mut self, field: &dyn Field, value: JavaValue) -> Result<()>;
    fn as_array_class_definition(&self) -> Option<&dyn ArrayClassDefinition> {
        None
    }
}

clone_trait_object!(ClassDefinition);