package erjang.m.java;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import kilim.Pausable;
import erjang.BIF;
import erjang.EAtom;
import erjang.EFun;
import erjang.ENative;
import erjang.EObject;
import erjang.EProc;
import erjang.ERT;
import erjang.ESeq;
import erjang.EString;
import erjang.ErlangError;
public class Native extends ENative {
@BIF
static EObject get_static(EProc self, EObject clzz, EObject member) {
EAtom clz_am = clzz.testAtom();
EAtom mem_am = member.testAtom();
if (clz_am == null || mem_am == null)
throw ERT.badarg(clzz, member);
try {
Class<?> c = Class.forName(clz_am.getName());
Field f = c.getField(mem_am.getName());
if (java.lang.reflect.Modifier.isStatic(f.getModifiers())) {
return JavaObject.box(self, f.get(null));
} else {
throw new ErlangError(EString.fromString("not a static field"),
clzz, member);
}
} catch (Exception e) {
throw new ErlangError(EString.fromString(e.getMessage()), clzz,
member);
}
}
@BIF
static EObject call(EProc self, EObject obj, EObject member, EObject typez, EObject argz) {
EAtom mem_am = member.testAtom();
ESeq type_seq = typez.testSeq();
ESeq arg_seq = argz.testSeq();
Object receiver = JavaObject.unbox(self, Object.class, obj);
if (mem_am == null || type_seq == null || arg_seq == null
|| type_seq.length() != arg_seq.length() || receiver == null)
throw ERT.badarg(obj, member, typez, argz);
try {
Class<?> c = receiver.getClass();
Class<?>[] arg_types = new Class<?>[type_seq.length()];
EObject[] at = type_seq.toArray();
for (int i = 0; i < at.length; i++) {
EAtom am = at[i].testAtom();
if (am == null) {
throw ERT.badarg(obj, member, typez, argz);
}
arg_types[i] = Class.forName(am.getName());
}
Method m = c.getMethod(mem_am.getName(), arg_types);
Object res = m.invoke(receiver, JavaObject.convert_args(self, arg_types,
arg_seq));
if (m.getReturnType() == Void.TYPE) {
return ERT.am_ok;
}
return JavaObject.box(self, res);
/*
* } catch (ClassNotFoundException e) { // TODO Auto-generated catch
* block e.printStackTrace(); } catch (SecurityException e) { //
* TODO Auto-generated catch block e.printStackTrace(); } catch
* (NoSuchMethodException e) { // TODO Auto-generated catch block
* e.printStackTrace();
*
*
* } catch (IllegalArgumentException e) { // TODO Auto-generated
* catch block e.printStackTrace(); } catch (IllegalAccessException
* e) { // TODO Auto-generated catch block e.printStackTrace(); }
* catch (InvocationTargetException e) { // TODO Auto-generated
* catch block e.printStackTrace();
*/
} catch (Exception e) {
throw new ErlangError(EString.fromString(e.getMessage()), obj,
member, typez, argz);
} finally {
}
}
@BIF
public static EObject run(EProc proc, EObject fun) throws Pausable {
EFun f = fun.testFunction2(0);
if (f == null) {
throw ERT.badarg(fun);
}
return f.invoke(proc, new EObject[0]);
}
}