package st.gravel.support.jvm;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import st.gravel.core.Symbol;
import st.gravel.support.compiler.ast.AbstractClassMapping;
import st.gravel.support.compiler.ast.ClassMapping;
import st.gravel.support.jvm.runtime.ImageBootstrapper;
import st.gravel.support.jvm.runtime.MethodTools;
public class ObjectExtensions {
public static Method getCloneMethod(Class clazz) {
try {
return clazz.getMethod("clone");
} catch (NoSuchMethodException | SecurityException e) {
throw new RuntimeException(e);
}
}
public static <X> X assert_(X receiver, boolean test) {
if (!test) {
throw new AssertionFailed();
}
return receiver;
}
public static <X> X deny_(X receiver, boolean test) {
if (test) {
throw new AssertionFailed();
}
return receiver;
}
public static boolean inheritsFrom_(ObjectClass receiver, Object arg) {
ClassMapping cm = ImageBootstrapper.systemMapping
.classMappingForJavaClass_(receiver.getClass());
ClassMapping other = ImageBootstrapper.systemMapping
.classMappingForJavaClass_(arg.getClass());
AbstractClassMapping sm = cm;
while (sm != null) {
sm = sm.superclassMappingIn_(ImageBootstrapper.systemMapping);
if (sm == other)
return true;
}
return false;
}
public static boolean includesBehavior_(ObjectClass receiver, Object arg) {
if (receiver == arg)
return true;
return inheritsFrom_(receiver, arg);
}
public static <X extends Object> X copy(X object) {
try {
return (X) getCloneMethod(object.getClass()).invoke(object);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException(e);
}
}
public static <X> X halt(X receiver) {
// receiver.toString();
// return receiver;
throw new RuntimeException("Halt encountered on: "
+ receiver.toString());
}
public static boolean equals_(Object receiver, Object other) {
return (receiver == null && other == null)
|| (receiver != null && other != null && receiver.equals(other));
}
public static boolean identityEquals_(Object receiver, Object other) {
return (receiver == null && other == null) || (receiver == other);
}
public static String classTitle(ObjectClass receiver) {
ClassMapping cm = ImageBootstrapper.systemMapping
.classMappingForJavaClass_(receiver.getClass());
return cm.reference().nonmeta().toString();
}
public static Object perform_(Object receiver, Symbol selector)
throws Throwable {
return MethodTools.perform(receiver, selector);
}
public static Object perform_with_(Object receiver, Symbol selector,
Object arg1) throws Throwable {
return MethodTools.perform(receiver, selector, arg1);
}
public static Object perform_with_with_(Object receiver, Symbol selector,
Object arg1, Object arg2) throws Throwable {
return MethodTools.perform(receiver, selector, arg1, arg2);
}
public static Object perform_with_with_with_(Object receiver,
Symbol selector, Object arg1, Object arg2, Object arg3)
throws Throwable {
return MethodTools.perform(receiver, selector, arg1, arg2, arg3);
}
public static Object perform_with_with_with_with_(Object receiver,
Symbol selector, Object arg1, Object arg2, Object arg3, Object arg4)
throws Throwable {
return MethodTools.perform(receiver, selector, arg1, arg2, arg3, arg4);
}
public static Object perform_withArguments_(Object receiver,
Symbol selector, Object[] args)
throws Throwable {
return MethodTools.perform_withArguments_(receiver, selector, args);
}
public static Object shallowCopy(Object receiver) {
Class<? extends Object> receiverClass = receiver.getClass();
try {
return receiverClass.getMethod("clone").invoke(receiver);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException | SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
if (receiverClass == Object.class) {
return new Object();
}
throw new RuntimeException(e);
}
}
public static Object breakpoint(Object receiver) {
receiver.toString();
return receiver;
}
}