From dea5dea49af2252736115aa1463991d2882a3ff8 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 3 Sep 2018 12:47:32 +0300 Subject: [PATCH] Fix C# binding thread-safety. GitOrigin-RevId: 48b4ec74878f815d2a3d280a9f9f8a524509ab93 --- .../DotnetTlDocumentationGenerator.php | 2 +- td/generate/tl_writer_dotnet.h | 4 +-- td/tl/tl_dotnet_object.h | 29 +++++++------------ 3 files changed, 12 insertions(+), 23 deletions(-) diff --git a/td/generate/DotnetTlDocumentationGenerator.php b/td/generate/DotnetTlDocumentationGenerator.php index 7e11cc665..fd99c0c42 100644 --- a/td/generate/DotnetTlDocumentationGenerator.php +++ b/td/generate/DotnetTlDocumentationGenerator.php @@ -213,7 +213,7 @@ EOT /// EOT; foreach ($known_fields as $name => $type) { - $full_doc .= '\r\n /// '.$info[$name].""; + $full_doc .= "\r\n /// getParameterName($name, $class_name).'">'.$info[$name].""; } $this->addDocumentation($full_constructor, $full_doc); } diff --git a/td/generate/tl_writer_dotnet.h b/td/generate/tl_writer_dotnet.h index d6f6f3d90..011f4a390 100644 --- a/td/generate/tl_writer_dotnet.h +++ b/td/generate/tl_writer_dotnet.h @@ -527,9 +527,7 @@ class TlWriterDotNet : public TL_writer { return ss.str(); } ss << "{\n"; - ss << " CallFromUnmanaged<" << class_name << "^> res;\n"; - ss << " downcast_call(from, res);\n"; - ss << " return CallFromUnmanagedRes<" << class_name << "^>::res;\n"; + ss << " return DoFromUnmanaged<" << class_name << "^>(from);\n"; ss << "}\n"; } return ss.str(); diff --git a/td/tl/tl_dotnet_object.h b/td/tl/tl_dotnet_object.h index d81420a20..b60f28638 100644 --- a/td/tl/tl_dotnet_object.h +++ b/td/tl/tl_dotnet_object.h @@ -100,30 +100,21 @@ auto CLRCALL FromUnmanaged(td::td_api::object_ptr &from) -> decltype(FromUnma return FromUnmanaged(*from.get()); } -template -ref class CallFromUnmanagedRes { -public: - static property ResT res; -}; - -template -struct CallFromUnmanaged { - template - void operator()(T &val) const { - CallFromUnmanagedRes::res = FromUnmanaged(val); - } -}; +template +inline ResT DoFromUnmanaged(T &from) { + ResT res; + downcast_call(from, [&](auto &from_downcasted) { + res = FromUnmanaged(from_downcasted); + }); + return res; +} inline BaseObject^ FromUnmanaged(td::td_api::Function &from) { - CallFromUnmanaged res; - downcast_call(from, res); - return CallFromUnmanagedRes::res; + return DoFromUnmanaged(from); } inline BaseObject^ FromUnmanaged(td::td_api::Object &from) { - CallFromUnmanaged res; - downcast_call(from, res); - return CallFromUnmanagedRes::res; + return DoFromUnmanaged(from); } // to unmanaged