@@ -214,13 +214,16 @@ namespace chaiscript
214214
215215 Type_Conversions ()
216216 : m_num_types(0 ),
217- m_thread_cache (this )
217+ m_thread_cache (this ),
218+ m_conversion_saves(this )
218219 {
219220 }
220221
221222 Type_Conversions (const Type_Conversions &t_other)
222223 : m_conversions(t_other.get_conversions()), m_num_types(m_conversions.size()),
223- m_thread_cache(this )
224+ m_thread_cache(this ),
225+ m_conversion_saves(this )
226+
224227 {
225228 }
226229
@@ -273,7 +276,9 @@ namespace chaiscript
273276 Boxed_Value boxed_type_conversion (const Boxed_Value &from) const
274277 {
275278 try {
276- return get_conversion (user_type<To>(), from.get_type_info ())->convert (from);
279+ Boxed_Value ret = get_conversion (user_type<To>(), from.get_type_info ())->convert (from);
280+ if (m_conversion_saves->enabled ) m_conversion_saves->saves .push_back (ret);
281+ return ret;
277282 } catch (const std::out_of_range &) {
278283 throw exception::bad_boxed_dynamic_cast (from.get_type_info (), typeid (To), " No known conversion" );
279284 } catch (const std::bad_cast &) {
@@ -285,14 +290,27 @@ namespace chaiscript
285290 Boxed_Value boxed_type_down_conversion (const Boxed_Value &to) const
286291 {
287292 try {
288- return get_conversion (to.get_type_info (), user_type<From>())->convert_down (to);
293+ Boxed_Value ret = get_conversion (to.get_type_info (), user_type<From>())->convert_down (to);
294+ if (m_conversion_saves->enabled ) m_conversion_saves->saves .push_back (ret);
295+ return ret;
289296 } catch (const std::out_of_range &) {
290297 throw exception::bad_boxed_dynamic_cast (to.get_type_info (), typeid (From), " No known conversion" );
291298 } catch (const std::bad_cast &) {
292299 throw exception::bad_boxed_dynamic_cast (to.get_type_info (), typeid (From), " Unable to perform dynamic_cast operation" );
293300 }
294301 }
295302
303+ void enable_conversion_saves (bool t_val)
304+ {
305+ m_conversion_saves->enabled = t_val;
306+ }
307+
308+ std::vector<Boxed_Value> take_saves ()
309+ {
310+ std::vector<Boxed_Value> ret;
311+ std::swap (ret, m_conversion_saves->saves );
312+ return ret;
313+ }
296314
297315 bool has_conversion (const Type_Info &to, const Type_Info &from) const
298316 {
@@ -334,11 +352,18 @@ namespace chaiscript
334352 }
335353
336354
355+ struct Conversion_Saves
356+ {
357+ bool enabled = false ;
358+ std::vector<Boxed_Value> saves;
359+ };
360+
337361 mutable chaiscript::detail::threading::shared_mutex m_mutex;
338362 std::set<std::shared_ptr<detail::Type_Conversion_Base>> m_conversions;
339363 std::set<const std::type_info *, Less_Than> m_convertableTypes;
340364 std::atomic_size_t m_num_types;
341365 chaiscript::detail::threading::Thread_Storage<std::set<const std::type_info *, Less_Than>> m_thread_cache;
366+ chaiscript::detail::threading::Thread_Storage<Conversion_Saves> m_conversion_saves;
342367 };
343368
344369 typedef std::shared_ptr<chaiscript::detail::Type_Conversion_Base> Type_Conversion;
@@ -400,8 +425,13 @@ namespace chaiscript
400425 static_assert (std::is_convertible<From, To>::value, " Types are not automatically convertible" );
401426 auto func = [](const Boxed_Value &t_bv) -> Boxed_Value {
402427 // not even attempting to call boxed_cast so that we don't get caught in some call recursion
403- auto to = To{detail::Cast_Helper<const From &>::cast (t_bv, nullptr )};
404- return chaiscript::Boxed_Value (std::move (to));
428+ std::cout << " Type conversion to : " << typeid (To).name () << " from " << typeid (From).name () << std::endl;
429+ auto &&from = detail::Cast_Helper<From>::cast (t_bv, nullptr );
430+ std::cout << " Ptr" << static_cast <const void *>(from) << std::endl;
431+ std::cout << " Ptr" << from << std::endl;
432+
433+ To to (from);
434+ return chaiscript::Boxed_Value (to);
405435 };
406436
407437 return std::make_shared<detail::Type_Conversion_Impl<decltype (func)>>(user_type<From>(), user_type<To>(), func);
0 commit comments