From 5aa69b36cd7d20b5c5f730e345c8c1ca5c3bc2f7 Mon Sep 17 00:00:00 2001
From: Roel Standaert <roel@emweb.be>
Date: Mon, 10 Jan 2022 15:48:29 +0100
Subject: [PATCH] Proper dynamic cast

---
 java/src/eu/webtoolkit/jwt/utils/ObjectUtils.java |  4 ++++
 oink/elsa-stack/elsa/java_print.cc                | 12 ++++--------
 oink/elsa-stack/elsa/mapper_filler.cc             |  4 ++--
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/java/src/eu/webtoolkit/jwt/utils/ObjectUtils.java b/java/src/eu/webtoolkit/jwt/utils/ObjectUtils.java
index 0039159f..1971775c 100644
--- a/java/src/eu/webtoolkit/jwt/utils/ObjectUtils.java
+++ b/java/src/eu/webtoolkit/jwt/utils/ObjectUtils.java
@@ -32,4 +32,8 @@ public class ObjectUtils {
 
 	}
 
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object object, Class<T> clazz) {
+      return clazz.isInstance(object) ? (T)object : null;
+    }
 }
diff --git a/oink/elsa-stack/elsa/java_print.cc b/oink/elsa-stack/elsa/java_print.cc
index 29f58209..b5ee899b 100644
--- a/oink/elsa-stack/elsa/java_print.cc
+++ b/oink/elsa-stack/elsa/java_print.cc
@@ -4230,16 +4230,12 @@ void E_keywordCast::jiprint(PrintEnv &env)
   TreeWalkDebug treeDebug("E_keywordCast::iprint");
 
   if (key == CK_DYNAMIC){
-    // dynamic_cast<T>(o) -> ( o instanceof T ? (T)o : null )
-    *env.out << "((";
+    // dynamic_cast<T>(o) -> ObjectUtils.cast(o, T.class)
+    *env.out << "ObjectUtils.cast(";
     expr->jprint(env);
-    *env.out << ") instanceof ";
+    *env.out << ", ";
     ctype->jprint(env);
-    *env.out << " ? (";
-    ctype->jprint(env);
-    *env.out << ")(";
-    expr->jprint(env);
-    *env.out << ") : null)";
+    *env.out << ".class)";
   }
   else{
     //map static_cast<Enum>0 -> null
diff --git a/oink/elsa-stack/elsa/mapper_filler.cc b/oink/elsa-stack/elsa/mapper_filler.cc
index 77614853..bb585553 100644
--- a/oink/elsa-stack/elsa/mapper_filler.cc
+++ b/oink/elsa-stack/elsa/mapper_filler.cc
@@ -202,9 +202,9 @@ void StdMapperFiller::fill(Mapper &mapper) {
 	mapper.addFunction("", "Utils.stoll", "Long.parseLong", 1);
 	mapper.addFunction("", "Utils.stof", "Float.parseFloat", 1);
 	mapper.addFunction("", "Utils.stod", "Double.parseDouble", 1);
-	mapper.addFunction("", "Utils.dynamic_unique_ptr_cast", "", 1, "(($templates(cppfunction);)$0;)");
+	mapper.addFunction("", "Utils.dynamic_unique_ptr_cast", "", 1, "ObjectUtils.cast($0;, $templates(cppfunction);.class)");
 	mapper.addFunction("", "Utils.keyForUniquePtrValue", "CollectionUtils.keyForValue", 2);
-	mapper.addFunction("", "std.dynamic_pointer_cast", "", 1, "(($templates(cppfunction);)$0;)");
+	mapper.addFunction("", "std.dynamic_pointer_cast", "", 1, "ObjectUtils.cast($0;, $templates(cppfunction);.class)");
 
 	mapper.addClass("boost.intrusive.list", "LinkedList");
 	mapper.addFunction("boost.intrusive.list", "begin", "iterator", 0);
-- 
2.25.1

