Skip to content

Commit 9eaaef3

Browse files
committed
[[ Java FFI Support ]] Add suitable error typeinfos to foundation java
1 parent 59f8659 commit 9eaaef3

4 files changed

Lines changed: 84 additions & 34 deletions

File tree

libfoundation/src/foundation-java-private.cpp

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,50 @@ bool MCJavaPrivateCheckSignature(MCTypeInfoRef p_signature, MCStringRef p_args,
191191
}
192192
}
193193

194+
MCTypeInfoRef kMCJavaNativeMethodIdErrorTypeInfo;
195+
MCTypeInfoRef kMCJavaNativeMethodCallErrorTypeInfo;
196+
MCTypeInfoRef kMCJavaBindingStringSignatureErrorTypeInfo;
197+
MCTypeInfoRef kMCJavaCouldNotInitialiseJREErrorTypeInfo;
198+
MCTypeInfoRef kMCJavaJRENotSupportedErrorTypeInfo;
199+
200+
bool MCJavaPrivateErrorsInitialize()
201+
{
202+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.java.NativeMethodIdError"), MCNAME("java"), MCSTR("JNI exeception thrown when getting native method id"), kMCJavaNativeMethodIdErrorTypeInfo))
203+
return false;
204+
205+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.java.NativeMethodCallError"), MCNAME("java"), MCSTR("JNI exeception thrown when calling native method"), kMCJavaNativeMethodCallErrorTypeInfo))
206+
return false;
207+
208+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.java.BindingStringSignatureError"), MCNAME("java"), MCSTR("Java binding string does not match foreign handler signature"), kMCJavaBindingStringSignatureErrorTypeInfo))
209+
return false;
210+
211+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.java.CouldNotInitialiseJREError"), MCNAME("java"), MCSTR("Could not initialise Java Runtime Environment"), kMCJavaCouldNotInitialiseJREErrorTypeInfo))
212+
return false;
213+
214+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.java.JRENotSupported"), MCNAME("java"), MCSTR("Java Runtime Environment no supported with current configuration"), kMCJavaJRENotSupportedErrorTypeInfo))
215+
return false;
216+
217+
return true;
218+
}
219+
220+
void MCJavaPrivateErrorsFinalize()
221+
{
222+
MCValueRelease(kMCJavaNativeMethodIdErrorTypeInfo);
223+
MCValueRelease(kMCJavaNativeMethodCallErrorTypeInfo);
224+
MCValueRelease(kMCJavaBindingStringSignatureErrorTypeInfo);
225+
MCValueRelease(kMCJavaCouldNotInitialiseJREErrorTypeInfo);
226+
MCValueRelease(kMCJavaJRENotSupportedErrorTypeInfo);
227+
}
228+
229+
bool MCJavaPrivateErrorThrow(MCTypeInfoRef p_error_type)
230+
{
231+
MCAutoErrorRef t_error;
232+
if (!MCErrorCreate(p_error_type, nil, &t_error))
233+
return false;
234+
235+
return MCErrorThrow(*t_error);
236+
}
237+
194238
#ifdef TARGET_SUPPORTS_JAVA
195239
#include <jni.h>
196240

@@ -1213,10 +1257,7 @@ bool MCJavaPrivateCallJNIMethod(MCNameRef p_class_name, void *p_method_id, int p
12131257
if (s_env -> ExceptionCheck() == JNI_TRUE)
12141258
{
12151259
s_env -> ExceptionDescribe();
1216-
return MCErrorCreateAndThrow(kMCGenericErrorTypeInfo,
1217-
"reason",
1218-
MCSTR("JNI exeception thrown when calling native method"),
1219-
nullptr);
1260+
return MCJavaPrivateErrorThrow(kMCJavaNativeMethodCallErrorTypeInfo);
12201261
}
12211262

12221263
return true;
@@ -1363,10 +1404,7 @@ void* MCJavaPrivateGetMethodId(MCNameRef p_class_name, MCStringRef p_method_name
13631404
if (s_env -> ExceptionCheck() == JNI_TRUE)
13641405
{
13651406
s_env -> ExceptionDescribe();
1366-
MCErrorCreateAndThrow(kMCGenericErrorTypeInfo,
1367-
"reason",
1368-
MCSTR("JNI exeception thrown when getting native method id"),
1369-
nullptr);
1407+
MCJavaPrivateErrorThrow(kMCJavaNativeMethodCallErrorTypeInfo);
13701408
return nullptr;
13711409
}
13721410
return t_id;

libfoundation/src/foundation-java-private.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,15 @@ void* MCJavaPrivateGetMethodId(MCNameRef p_class_name, MCStringRef p_method_name
6262
void MCJavaPrivateDestroyObject(MCJavaObjectRef p_object);
6363
bool MCJavaPrivateCheckSignature(MCTypeInfoRef p_signature, MCStringRef p_args, MCStringRef p_return, int p_call_type);
6464
bool MCJavaPrivateGetJObjectClassName(MCJavaObjectRef p_object, MCStringRef &r_name);
65+
66+
bool MCJavaPrivateErrorThrow(MCTypeInfoRef p_error);
67+
bool MCJavaPrivateErrorsInitialize();
68+
void MCJavaPrivateErrorsFinalize();
69+
70+
extern MCTypeInfoRef kMCJavaNativeMethodIdErrorTypeInfo;
71+
extern MCTypeInfoRef kMCJavaNativeMethodCallErrorTypeInfo;
72+
extern MCTypeInfoRef kMCJavaBindingStringSignatureErrorTypeInfo;
73+
extern MCTypeInfoRef kMCJavaCouldNotInitialiseJREErrorTypeInfo;
74+
extern MCTypeInfoRef kMCJavaJRENotSupportedErrorTypeInfo;
75+
6576
#endif

libfoundation/src/foundation-java.cpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,23 @@ bool MCJavaInitialize()
2727
{
2828
if (s_java_initialised)
2929
return true;
30-
30+
31+
MCJavaPrivateErrorsInitialize();
32+
3133
s_java_initialised = initialise_jvm();
34+
35+
if (!s_java_initialised)
36+
return MCJavaPrivateErrorThrow(kMCJavaCouldNotInitialiseJREErrorTypeInfo);
37+
3238
return s_java_initialised;
3339
}
3440

3541
MC_DLLEXPORT_DEF
3642
void MCJavaFinalize()
3743
{
3844
finalise_jvm();
45+
46+
MCJavaPrivateErrorsFinalize();
3947
}
4048

4149
MC_DLLEXPORT_DEF MCTypeInfoRef kMCJavaObjectTypeInfo;
@@ -138,62 +146,68 @@ MC_DLLEXPORT_DEF void *MCJavaObjectGetObject(const MCJavaObjectRef p_obj)
138146
MC_DLLEXPORT_DEF
139147
bool MCJavaCheckSignature(MCTypeInfoRef p_signature, MCStringRef p_args, MCStringRef p_return, int p_call_type)
140148
{
141-
return MCJavaPrivateCheckSignature(p_signature, p_args, p_return, p_call_type);
149+
if (!MCJavaPrivateCheckSignature(p_signature, p_args, p_return, p_call_type))
150+
return MCJavaPrivateErrorThrow(kMCJavaBindingStringSignatureErrorTypeInfo);
151+
152+
return true;
142153
}
143154

144155
MC_DLLEXPORT_DEF
145156
bool MCJavaCallJNIMethod(MCNameRef p_class_name, void *p_method_id, int p_call_type, MCTypeInfoRef p_signature, void *r_return, void **p_args, uindex_t p_arg_count)
146157
{
147158
if (!s_java_initialised)
148-
return false;
159+
return MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
149160

150161
return MCJavaPrivateCallJNIMethod(p_class_name, p_method_id, p_call_type, p_signature, r_return, p_args, p_arg_count);
151162
}
152163

153164
MC_DLLEXPORT_DEF bool MCJavaConvertJStringToStringRef(MCJavaObjectRef p_object, MCStringRef &r_string)
154165
{
155166
if (!s_java_initialised)
156-
return false;
157-
167+
return MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
168+
158169
return MCJavaPrivateConvertJStringToStringRef(p_object, r_string);
159170
}
160171

161172
MC_DLLEXPORT_DEF bool MCJavaConvertStringRefToJString(MCStringRef p_string, MCJavaObjectRef &r_object)
162173
{
163174
if (!s_java_initialised)
164-
return false;
175+
return MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
165176

166177
return MCJavaPrivateConvertStringRefToJString(p_string, r_object);
167178
}
168179

169180
MC_DLLEXPORT_DEF bool MCJavaConvertJByteArrayToDataRef(MCJavaObjectRef p_object, MCDataRef &r_data)
170181
{
171182
if (!s_java_initialised)
172-
return false;
183+
return MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
173184

174185
return MCJavaPrivateConvertJByteArrayToDataRef(p_object, r_data);
175186
}
176187

177188
MC_DLLEXPORT_DEF bool MCJavaConvertDataRefToJByteArray(MCDataRef p_data, MCJavaObjectRef &r_object)
178189
{
179190
if (!s_java_initialised)
180-
return false;
191+
return MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
181192

182193
return MCJavaPrivateConvertDataRefToJByteArray(p_data, r_object);
183194
}
184195

185196
MC_DLLEXPORT_DEF void *MCJavaGetMethodId(MCNameRef p_class_name, MCStringRef p_method_name, MCStringRef p_arguments, MCStringRef p_return, int p_call_type)
186197
{
187198
if (!s_java_initialised)
199+
{
200+
MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
188201
return nullptr;
202+
}
189203

190204
return MCJavaPrivateGetMethodId(p_class_name, p_method_name, p_arguments, p_return, p_call_type);
191205
}
192206

193207
MC_DLLEXPORT bool MCJavaGetJObjectClassName(MCJavaObjectRef p_object, MCStringRef &r_name)
194208
{
195209
if (!s_java_initialised)
196-
return false;
210+
return MCJavaPrivateErrorThrow(kMCJavaJRENotSupportedErrorTypeInfo);
197211

198212
return MCJavaPrivateGetJObjectClassName(p_object, r_name);
199213
}

libscript/src/script-instance.cpp

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -800,20 +800,10 @@ __MCScriptResolveForeignFunctionBinding(MCScriptInstanceRef p_instance,
800800
*t_arguments,
801801
*t_return,
802802
p_handler -> java . call_type))
803-
{
804-
return MCErrorCreateAndThrow(kMCGenericErrorTypeInfo,
805-
"reason",
806-
MCSTR("java binding string does not match foreign handler signature"),
807-
nullptr);
808-
}
803+
return false;
809804

810805
if (!MCJavaInitialize())
811-
{
812-
return MCErrorCreateAndThrow(kMCGenericErrorTypeInfo,
813-
"reason",
814-
MCSTR("could not initialize java"),
815-
nullptr);
816-
}
806+
return false;
817807

818808
void *t_method_id = MCJavaGetMethodId(*t_class_name, *t_function, *t_arguments, *t_return, p_handler -> java . call_type);
819809

@@ -825,11 +815,8 @@ __MCScriptResolveForeignFunctionBinding(MCScriptInstanceRef p_instance,
825815
{
826816
if (r_bound == nullptr)
827817
{
828-
return MCErrorCreateAndThrow(kMCGenericErrorTypeInfo,
829-
"reason",
830-
MCSTR("java method not found"),
831-
nullptr);
832-
}
818+
return false;
819+
}
833820
*r_bound = false;
834821

835822
return true;

0 commit comments

Comments
 (0)