Skip to content

Commit 01397e1

Browse files
committed
Forbid abstract or interface instantiation
1 parent d4b040a commit 01397e1

21 files changed

+141
-38
lines changed

java_runtime/src/classes/java/io/input_stream.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use alloc::vec;
22

33
use java_class_proto::JavaMethodProto;
4+
use java_constants::ClassAccessFlags;
45
use jvm::{Array, ClassInstanceRef, Jvm, Result};
56

67
use crate::{RuntimeClassProto, RuntimeContext};
78

8-
// class java.io.InputStream
9+
// abstract class java.io.InputStream
910
pub struct InputStream;
1011

1112
impl InputStream {
@@ -26,7 +27,7 @@ impl InputStream {
2627
JavaMethodProto::new("reset", "()V", Self::reset, Default::default()),
2728
],
2829
fields: vec![],
29-
access_flags: Default::default(),
30+
access_flags: ClassAccessFlags::ABSTRACT,
3031
}
3132
}
3233

java_runtime/src/classes/java/io/output_stream.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use alloc::vec;
22

33
use java_class_proto::JavaMethodProto;
4+
use java_constants::ClassAccessFlags;
45
use jvm::{Array, ClassInstanceRef, Jvm, Result};
56

67
use crate::{RuntimeClassProto, RuntimeContext};
78

8-
// class java.io.OutputStream
9+
// abstract class java.io.OutputStream
910
pub struct OutputStream;
1011

1112
impl OutputStream {
@@ -23,7 +24,7 @@ impl OutputStream {
2324
JavaMethodProto::new("close", "()V", Self::close, Default::default()),
2425
],
2526
fields: vec![],
26-
access_flags: Default::default(),
27+
access_flags: ClassAccessFlags::ABSTRACT,
2728
}
2829
}
2930

java_runtime/src/classes/java/io/reader.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use alloc::vec;
22

33
use java_class_proto::JavaMethodProto;
4+
use java_constants::ClassAccessFlags;
45
use jvm::{ClassInstanceRef, JavaChar, Jvm, Result};
56

67
use crate::{RuntimeClassProto, RuntimeContext};
78

8-
// class java.io.Reader
9+
// abstract class java.io.Reader
910
pub struct Reader;
1011

1112
impl Reader {
@@ -21,7 +22,7 @@ impl Reader {
2122
JavaMethodProto::new_abstract("close", "()V", Default::default()),
2223
],
2324
fields: vec![],
24-
access_flags: Default::default(),
25+
access_flags: ClassAccessFlags::ABSTRACT,
2526
}
2627
}
2728

java_runtime/src/classes/java/io/writer.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use alloc::vec;
22

33
use java_class_proto::JavaMethodProto;
4+
use java_constants::ClassAccessFlags;
45
use jvm::{Array, ClassInstanceRef, JavaChar, Jvm, Result};
56

67
use crate::{RuntimeClassProto, RuntimeContext};
78

8-
// class java.io.Writer
9+
// abstract class java.io.Writer
910
pub struct Writer;
1011

1112
impl Writer {
@@ -20,7 +21,7 @@ impl Writer {
2021
JavaMethodProto::new("write", "(Ljava/lang/String;)V", Self::write_string, Default::default()),
2122
],
2223
fields: vec![],
23-
access_flags: Default::default(),
24+
access_flags: ClassAccessFlags::ABSTRACT,
2425
}
2526
}
2627

java_runtime/src/classes/java/lang.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mod exception;
66
mod illegal_argument_exception;
77
mod incompatible_class_change_error;
88
mod index_out_of_bounds_exception;
9+
mod instantiation_error;
910
mod integer;
1011
mod interrupted_exception;
1112
mod linkage_error;
@@ -29,9 +30,10 @@ mod unsupported_operation_exception;
2930
pub use self::{
3031
array_index_out_of_bounds_exception::ArrayIndexOutOfBoundsException, class::Class, class_loader::ClassLoader, error::Error, exception::Exception,
3132
illegal_argument_exception::IllegalArgumentException, incompatible_class_change_error::IncompatibleClassChangeError,
32-
index_out_of_bounds_exception::IndexOutOfBoundsException, integer::Integer, interrupted_exception::InterruptedException,
33-
linkage_error::LinkageError, math::Math, no_class_def_found_error::NoClassDefFoundError, no_such_field_error::NoSuchFieldError,
34-
no_such_method_error::NoSuchMethodError, null_pointer_exception::NullPointerException, object::Object, runnable::Runnable, runtime::Runtime,
35-
runtime_exception::RuntimeException, security_exception::SecurityException, string::String, string_buffer::StringBuffer, system::System,
36-
thread::Thread, throwable::Throwable, unsupported_operation_exception::UnsupportedOperationException,
33+
index_out_of_bounds_exception::IndexOutOfBoundsException, instantiation_error::InstantiationError, integer::Integer,
34+
interrupted_exception::InterruptedException, linkage_error::LinkageError, math::Math, no_class_def_found_error::NoClassDefFoundError,
35+
no_such_field_error::NoSuchFieldError, no_such_method_error::NoSuchMethodError, null_pointer_exception::NullPointerException, object::Object,
36+
runnable::Runnable, runtime::Runtime, runtime_exception::RuntimeException, security_exception::SecurityException, string::String,
37+
string_buffer::StringBuffer, system::System, thread::Thread, throwable::Throwable,
38+
unsupported_operation_exception::UnsupportedOperationException,
3739
};
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use alloc::vec;
2+
3+
use java_class_proto::JavaMethodProto;
4+
use jvm::{ClassInstanceRef, Jvm, Result};
5+
6+
use crate::{RuntimeClassProto, RuntimeContext, classes::java::lang::String};
7+
8+
// class java.lang.InstantiationError
9+
pub struct InstantiationError;
10+
11+
impl InstantiationError {
12+
pub fn as_proto() -> RuntimeClassProto {
13+
RuntimeClassProto {
14+
name: "java/lang/InstantiationError",
15+
parent_class: Some("java/lang/IncompatibleClassChangeError"),
16+
interfaces: vec![],
17+
methods: vec![
18+
JavaMethodProto::new("<init>", "()V", Self::init, Default::default()),
19+
JavaMethodProto::new("<init>", "(Ljava/lang/String;)V", Self::init_with_message, Default::default()),
20+
],
21+
fields: vec![],
22+
access_flags: Default::default(),
23+
}
24+
}
25+
26+
async fn init(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<()> {
27+
tracing::debug!("java.lang.InstantiationError::<init>({:?})", &this);
28+
29+
let _: () = jvm
30+
.invoke_special(&this, "java/lang/IncompatibleClassChangeError", "<init>", "()V", ())
31+
.await?;
32+
33+
Ok(())
34+
}
35+
36+
async fn init_with_message(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, message: ClassInstanceRef<String>) -> Result<()> {
37+
tracing::debug!("java.lang.InstantiationError::<init>({:?}, {:?})", &this, &message);
38+
39+
let _: () = jvm
40+
.invoke_special(
41+
&this,
42+
"java/lang/IncompatibleClassChangeError",
43+
"<init>",
44+
"(Ljava/lang/String;)V",
45+
(message,),
46+
)
47+
.await?;
48+
49+
Ok(())
50+
}
51+
}

java_runtime/src/classes/java/lang/runnable.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use alloc::vec;
22

33
use java_class_proto::JavaMethodProto;
4+
use java_constants::ClassAccessFlags;
45

56
use crate::RuntimeClassProto;
67

@@ -16,7 +17,7 @@ impl Runnable {
1617
interfaces: vec![],
1718
methods: vec![JavaMethodProto::new_abstract("run", "()V", Default::default())],
1819
fields: vec![],
19-
access_flags: Default::default(),
20+
access_flags: ClassAccessFlags::INTERFACE,
2021
}
2122
}
2223
}

java_runtime/src/classes/java/net/jar_url_connection.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use alloc::{vec, vec::Vec};
22

33
use java_class_proto::{JavaFieldProto, JavaMethodProto};
4+
use java_constants::ClassAccessFlags;
45
use jvm::{ClassInstanceRef, Jvm, Result, runtime::JavaLangString};
56

67
use crate::{
78
RuntimeClassProto, RuntimeContext,
89
classes::java::{lang::String, net::URL, util::jar::Attributes},
910
};
1011

11-
// class java.net.JarURLConnection
12+
// abstract class java.net.JarURLConnection
1213
pub struct JarURLConnection;
1314

1415
impl JarURLConnection {
@@ -34,7 +35,7 @@ impl JarURLConnection {
3435
JavaFieldProto::new("fileUrl", "Ljava/net/URL;", Default::default()),
3536
JavaFieldProto::new("entry", "Ljava/lang/String;", Default::default()),
3637
],
37-
access_flags: Default::default(),
38+
access_flags: ClassAccessFlags::ABSTRACT,
3839
}
3940
}
4041

java_runtime/src/classes/java/net/url_stream_handler.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use alloc::{borrow::ToOwned, string::ToString, vec};
22

3+
use java_constants::ClassAccessFlags;
34
use url::Url;
45

56
use java_class_proto::JavaMethodProto;
@@ -10,7 +11,7 @@ use crate::{
1011
classes::java::{lang::String, net::URL},
1112
};
1213

13-
// class java.net.URLStreamHandler
14+
// abstract class java.net.URLStreamHandler
1415
pub struct URLStreamHandler;
1516

1617
impl URLStreamHandler {
@@ -31,7 +32,7 @@ impl URLStreamHandler {
3132
),
3233
],
3334
fields: vec![],
34-
access_flags: Default::default(),
35+
access_flags: ClassAccessFlags::ABSTRACT,
3536
}
3637
}
3738

java_runtime/src/classes/java/util/abstract_collection.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use alloc::vec;
22

33
use java_class_proto::JavaMethodProto;
4+
use java_constants::ClassAccessFlags;
45
use jvm::{ClassInstanceRef, Jvm, Result};
56

67
use crate::{RuntimeClassProto, RuntimeContext};
78

8-
// class java.util.AbstractCollection
9+
// abstract class java.util.AbstractCollection
910
pub struct AbstractCollection;
1011

1112
impl AbstractCollection {
@@ -16,7 +17,7 @@ impl AbstractCollection {
1617
interfaces: vec![],
1718
methods: vec![JavaMethodProto::new("<init>", "()V", Self::init, Default::default())],
1819
fields: vec![],
19-
access_flags: Default::default(),
20+
access_flags: ClassAccessFlags::ABSTRACT,
2021
}
2122
}
2223

0 commit comments

Comments
 (0)