You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by pa...@apache.org on 2017/04/10 11:54:48 UTC
[8/9] polygene-java git commit: POLYGENE-29 Handle mixed method
return type auto-unboxing
POLYGENE-29 Handle mixed method return type auto-unboxing
Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/7fdf9609
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/7fdf9609
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/7fdf9609
Branch: refs/heads/develop
Commit: 7fdf9609e7d67885627e9e2d5bc33008d6dd0b05
Parents: a5bf65b
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Apr 10 13:51:02 2017 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Apr 10 13:51:02 2017 +0200
----------------------------------------------------------------------
.../polygene/library/scripting/ScriptMixin.java | 52 +++++++++++++++++++-
1 file changed, 51 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/7fdf9609/libraries/scripting/src/main/java/org/apache/polygene/library/scripting/ScriptMixin.java
----------------------------------------------------------------------
diff --git a/libraries/scripting/src/main/java/org/apache/polygene/library/scripting/ScriptMixin.java b/libraries/scripting/src/main/java/org/apache/polygene/library/scripting/ScriptMixin.java
index 61c033b..bca28d3 100644
--- a/libraries/scripting/src/main/java/org/apache/polygene/library/scripting/ScriptMixin.java
+++ b/libraries/scripting/src/main/java/org/apache/polygene/library/scripting/ScriptMixin.java
@@ -116,7 +116,8 @@ public class ScriptMixin
public Object invoke( Object proxy, Method method, Object[] objects )
throws Throwable
{
- return ( (Invocable) engine ).invokeFunction( method.getName(), objects );
+ Object result = ( (Invocable) engine ).invokeFunction( method.getName(), objects );
+ return castInvocationResult( method.getReturnType(), result );
}
@Override
@@ -186,4 +187,53 @@ public class ScriptMixin
{
engine.getContext().setAttribute( name, value, ScriptContext.GLOBAL_SCOPE );
}
+
+ /**
+ * Needed to prevent class cast exception between boxed and unboxed types.
+ * Explicit casting to primitive type, triggers the auto-unboxing compiler trick.
+ */
+ @SuppressWarnings( "RedundantCast" )
+ private static Object castInvocationResult( Class<?> returnType, Object result )
+ {
+ if( void.class.equals( returnType ) || Void.class.equals( returnType ) )
+ {
+ return null;
+ }
+ if( returnType.isPrimitive() )
+ {
+ if( char.class.equals( returnType ) )
+ {
+ return (char) result;
+ }
+ if( boolean.class.equals( returnType ) )
+ {
+ return (boolean) result;
+ }
+ if( short.class.equals( returnType ) )
+ {
+ return (short) result;
+ }
+ if( int.class.equals( returnType ) )
+ {
+ return (int) result;
+ }
+ if( byte.class.equals( returnType ) )
+ {
+ return (byte) result;
+ }
+ if( long.class.equals( returnType ) )
+ {
+ return (long) result;
+ }
+ if( float.class.equals( returnType ) )
+ {
+ return (float) result;
+ }
+ if( double.class.equals( returnType ) )
+ {
+ return (double) result;
+ }
+ }
+ return returnType.cast( result );
+ }
}