# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation. If not, see <https://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------
#
# Tokiwa Software GmbH, Germany
#
# Source code of Fuzion standard library feature fuzion.jvm
#
# -----------------------------------------------------------------------
private:public jvm : effect is
# NYI: UNDER DEVELOPMENT: support starting multiple jvms?
#
create_jvm(option_string universe.Array u8) unit => intrinsic
destroy_jvm unit => intrinsic
module is_null0(java_ref Java_Ref) bool => intrinsic
# short-hand to for jvm with no additional class path
#
public type.use(T type, code ()->T) T =>
fuzion.jvm.use T "" code
# - start jvm (or use an exisiting jvm)
# - instate effect `fuzion.jvm`
# - run code on the jvm
# - destroy jvm (if jvm had to be started)
#
public type.use(T type, class_path String, code ()->T) T =>
fuzion.jvm ! ()->
fuzion.jvm.env.create_jvm (fuzion.sys.c_string "-Djava.class.path=$class_path")
code.call
# cleanup the started jvm
#
public redef finally unit =>
destroy_jvm
# read a static field of given name in class with given name. Wrap result into
# an instance of T.
#
public get_static_field(T type, clazz String, field String, signature String) T =>
c := string_to_java_object1 clazz
f := string_to_java_object1 field
get_static_field0 T c f (sys.c_string signature)
# read a field of given name from given object instance thiz. Wrap result into
# an instance of T.
#
public get_field(T type, thiz fuzion.java.Java_Object, field String, signature String) T =>
f := string_to_java_object1 field
get_field0 T thiz.java_ref f (sys.c_string signature)
# set a static field of given name in class with given name.
#
public set_static_field(clazz String, field String, val fuzion.java.Java_Object, signature String) unit =>
c := string_to_java_object1 clazz
f := string_to_java_object1 field
set_static_field0 c f val.java_ref (sys.c_string signature)
# set a field of given name from given object instance thiz.
#
public set_field(thiz fuzion.java.Java_Object, field String, val fuzion.java.Java_Object, signature String) unit =>
f := string_to_java_object1 field
set_field0 thiz.java_ref f val.java_ref (sys.c_string signature)
# intrinsic to read static field
#
get_static_field0(T type, clazz, field Java_Ref, signature universe.Array u8) T => intrinsic
# intrinsic to read instance field
#
get_field0(T type, thiz, field Java_Ref, signature universe.Array u8) T => intrinsic
# intrinsic to set static field
#
set_static_field0(clazz, field, val Java_Ref, signature universe.Array u8) unit => intrinsic
# intrinsic to set instance field
#
set_field0(thiz, field, val Java_Ref, signature universe.Array u8) unit => intrinsic
# Call a virtual Java method class_name.name with given signature signature
# on instance thiz with given arguments
#
public call_virtual(T type,
class_name String,
name String,
signature String,
thiz fuzion.java.Java_Object,
args array fuzion.java.Java_Object) outcome T
pre
safety: !thiz.is_null
=>
c := string_to_java_object1 class_name
n := string_to_java_object1 name
s := string_to_java_object1 signature
t := thiz.java_ref
a := (args.map_to_array (x -> x.java_ref)).internal_array
call_v0 T c n s t a
# Call a static Java method with given name and signature with given
# arguments
#
public call_static(T type,
class_name String,
name String,
signature String,
args array fuzion.java.Java_Object) outcome T
=>
c := string_to_java_object1 class_name
n := string_to_java_object1 name
s := string_to_java_object1 signature
a := (args.map_to_array (x -> x.java_ref)).internal_array
call_s0 T c n s a
# Call a Java constructor with given signature for class with given name
# with given arguments
#
public call_constructor(T type,
class_name String,
signature String,
args array fuzion.java.Java_Object) outcome T
=>
c := string_to_java_object1 class_name
s := string_to_java_object1 signature
a := (args.map_to_array (x -> x.java_ref)).internal_array
call_c0 T c s a
# intrinsic to call given Java instance method
#
call_v0(T type,
class_name Java_Ref,
name Java_Ref,
signature Java_Ref,
thiz Java_Ref,
args fuzion.sys.internal_array Java_Ref) outcome T => intrinsic
# intrinsic to call given Java static method
#
call_s0(T type,
class_name Java_Ref,
name Java_Ref,
signature Java_Ref,
args fuzion.sys.internal_array Java_Ref) outcome T => intrinsic
# intrinsic to call given Java constructor
#
call_c0(T type,
class_name Java_Ref,
signature Java_Ref,
args fuzion.sys.internal_array Java_Ref) outcome T => intrinsic
# get a null value of type T
#
public null(T type : fuzion.java.Java_Object) outcome T
=>
# NYI: UNDER DEVELOPMENT: HACK!
cast T (call_static (fuzion.java.Java_Object) "java.lang.System" "getProperty" "(Ljava/lang/String;)Ljava/lang/String;" [(string_to_java_object "I_ABSOLUTELY_DEFINITELY_DO_NOT_EXIST")]).get
# cast this to some other class
#
public cast(T type : fuzion.java.Java_Object, thiz fuzion.java.Java_Object) outcome T
=>
cast0 T thiz.java_ref
# intrinsic to rewrap thiz in T
#
cast0(T type : fuzion.java.Java_Object, thiz Java_Ref) outcome T => intrinsic
# intrinsic to get the length of a Java array of arbitrary type
#
module array_length(T type, a Java_Ref) i32 => intrinsic
# intrinsic to get an element of a Java array of arbitrary type
#
module array_get(T type, a Java_Ref, ix i32, signature universe.Array u8) T => intrinsic
# convert a Sequence to a Java Array object
#
# This only works for types that map to java primitives
#
# If you want to create an array of complex types use `Java.as_java_object [...]`
#
public array_to_java_object(T type, a Sequence T) fuzion.java.Array T
pre
T : java_primitive
=>
fuzion.java.Array T (array_to_java_object0 T a.as_array.internal_array)
# intrinsic to convert an array to a Java Array object
#
array_to_java_object0(T type, a fuzion.sys.internal_array T) Java_Ref => intrinsic
# convert a string to a Java String object
#
public string_to_java_object(s String) fuzion.java.Java_Object =>
fuzion.java.Java_Object (string_to_java_object1 s)
string_to_java_object1(s String) =>
string_to_java_object0 s.utf8.as_array.internal_array
# intrinsic to convert a string to a Java String object
#
string_to_java_object0(s fuzion.sys.internal_array u8) Java_Ref => intrinsic
# convert a Java String to a string
#
module java_string_to_string(java_ref Java_Ref) String => intrinsic
primitive_to_java_object(T type, v T) Java_Ref
pre
T : java_primitive
=> intrinsic
# intrinsic to convert an i8 to a Java Byte object
#
public i8_to_java_object(v i8) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert an u16 to a Java Character object
#
public u16_to_java_object(v u16) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert an i16 to a Java Short object
#
public i16_to_java_object(v i16) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert an i32 to a Java Integer object
#
public i32_to_java_object(v i32) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert an i64 to a Java Long object
#
public i64_to_java_object(v i64) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert an f32 to a Java Float object
#
public f32_to_java_object(v f32) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert a f64 to a Java Double object
#
public f64_to_java_object(v f64) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object v)
# intrinsic to convert a bool to a Java Boolean object
#
public bool_to_java_object(b bool) fuzion.java.Java_Object => fuzion.java.Java_Object (primitive_to_java_object b)
# short-hands
#
public i8 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.i8_to_java_object val
public i16 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.i16_to_java_object val
public u16 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.u16_to_java_object val
public i32 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.i32_to_java_object val
public i64 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.i64_to_java_object val
public f32 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.f32_to_java_object val
public f64 .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.f64_to_java_object val
public bool .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.bool_to_java_object bool.this
public String.as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.string_to_java_object String.this
public array .as_java_object fuzion.java.Java_Object ! fuzion.jvm => fuzion.jvm.env.array_to_java_object array.this