Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.dynjs.runtime.linker;
  
  import static java.lang.invoke.MethodType.*;
  
 
 
 
 public class DynJSCoercionMatrix extends CoercionMatrix {
 
 
         this. = manager;
         Lookup lookup = MethodHandles.lookup();
         addCoercion(3, String.classJSObject.classlookup.findStatic(DynJSCoercionMatrix.class"objectToString"methodType(String.classJSObject.class)));
     }
 
     public static String objectToString(JSObject object) {
         ExecutionContext context = ThreadContextManager.currentContext();
         Object toString = object.get(context"toString");
         if (toString instanceof JSFunction) {
             return context.call((JSFunctiontoStringobject).toString();
         }
 
         return null;
     }
 
     // ----------------------------------------------------------------------
     // ----------------------------------------------------------------------
 
     @Override
     public int isCompatible(Class<?> targetClass<?> actual) {
         int superCompat = super.isCompatible(targetactual);
         if (superCompat >= 0 && superCompat < 3 ) {
             return superCompat;
         }
         
         if ( actual == ..getClass() || actual == ..getClass() ) {
             return 3;
         }
 
         if (JSFunction.class.isAssignableFrom(actual)) {
             if ( isSingleAbstractMethod(target) != null) {
                 return 3;
             }
         }
         
         return -1;
     }
 
     @Override
     public MethodHandle getFilter(Class<?> targetClass<?> actual) {
         int superCompat = super.isCompatible(targetactual);
         
         if (superCompat >= 0 && superCompat < 3 ) {
             return super.getFilter(targetactual);
         }
         
         if ( actual == ..getClass() || actual == ..getClass() ) {
             try {
                 return nullReplacingFilter(target);
             } catch (NoSuchMethodException | IllegalAccessException e) {
                 e.printStackTrace();
             }
         }
 
         if (JSFunction.class.isAssignableFrom(actual)) {
             try {
                 String methodName = isSingleAbstractMethod(target);
                 if (methodName != null) {
                     return singleAbstractMethod(methodNametargetactual);
                 }
             } catch (NoSuchMethodException | IllegalAccessException e) {
                 e.printStackTrace();
             }
         }
 
         return MethodHandles.identity(actual);
     }
 
     // ----------------------------------------------------------------------
     // ----------------------------------------------------------------------
 
     protected String isSingleAbstractMethod(Class<?> target) {
         String methodName = null;
        Method[] methods = target.getMethods();
        for (int i = 0; i < methods.length; ++i) {
            int modifiers = methods[i].getModifiers();
            if (Modifier.isPublic(modifiers) && Modifier.isAbstract(modifiers)) {
                if (methodName == null) {
                    methodName = methods[i].getName();
                } else if (!methodName.equals(methods[i].getName())) {
                    return null;
                }
            }
        }
        return methodName;
    }
    protected MethodHandle singleAbstractMethod(String methodNameClass<?> targetClass<?> actualthrows NoSuchMethodExceptionIllegalAccessException {
        Lookup lookup = MethodHandles.lookup();
        MethodHandle method = lookup.findStatic(DynJSCoercionMatrix.class"singleAbstractMethod"methodType(Object.classJSJavaImplementationManager.classClass.classExecutionContext.classString.classJSObject.class));
        
        return Binder.from(methodType(targetObject.class))
                .insert(0, this.)
                .insert(1, target)
                .insert(2, ThreadContextManager.currentContext() )
                .insert(3, methodName )
                .invoke(method);
    }
    public static Object singleAbstractMethod(JSJavaImplementationManager managerClass<?> targetClassExecutionContext contextString methodNameJSObject implementation)
            throws Exception {
        JSObject implObj = new DynObject(context.getGlobalObject());
        implObj.put(contextmethodNameimplementationfalse);
        return manager.getImplementationWrapper(targetClasscontextimplObj);
    }
    
    
    public static MethodHandle nullReplacingFilter(Class<?> targetthrows NoSuchMethodExceptionIllegalAccessException {
        return Binder.frommethodType(targetObject.class) )
                .drop(0)
                .insert( 0, new Class[] { Object.class}, new Object[] { null } )
                .invoke( MethodHandles.identity(target));
    }
New to GrepCode? Check out our FAQ X