2
0
Эх сурвалжийг харах

Avoid calling asGetActiveContext() in template functions, as it might result in undefined symbol when used in application code with shared library Urho3D build. Make GetScriptContext() safe to call when it would return null. Provide function GetActiveASContext() (in ScriptInstance.h) as a wrapper.

Lasse Öörni 8 жил өмнө
parent
commit
a5ff4f43c6

+ 15 - 15
Source/Urho3D/AngelScript/APITemplates.h

@@ -65,10 +65,10 @@ template <class T, class U> U* RefCast(T* t)
 /// Template function for Vector to array conversion.
 template <class T> CScriptArray* VectorToArray(const Vector<T>& vector, const char* arrayName)
 {
-    asIScriptContext* context = asGetActiveContext();
+    Context* context = GetScriptContext();
     if (context)
     {
-        asITypeInfo* type = GetScriptContext()->GetSubsystem<Script>()->GetObjectType(arrayName);
+        asITypeInfo* type = context->GetSubsystem<Script>()->GetObjectType(arrayName);
         CScriptArray* arr = CScriptArray::Create(type, vector.Size());
 
         for (unsigned i = 0; i < arr->GetSize(); ++i)
@@ -83,10 +83,10 @@ template <class T> CScriptArray* VectorToArray(const Vector<T>& vector, const ch
 /// Template function for PODVector to array conversion.
 template <class T> CScriptArray* VectorToArray(const PODVector<T>& vector, const char* arrayName)
 {
-    asIScriptContext* context = asGetActiveContext();
+    Context* context = GetScriptContext();
     if (context)
     {
-        asITypeInfo* type = GetScriptContext()->GetSubsystem<Script>()->GetObjectType(arrayName);
+        asITypeInfo* type = context->GetSubsystem<Script>()->GetObjectType(arrayName);
         CScriptArray* arr = CScriptArray::Create(type, vector.Size());
 
         for (unsigned i = 0; i < arr->GetSize(); ++i)
@@ -101,10 +101,10 @@ template <class T> CScriptArray* VectorToArray(const PODVector<T>& vector, const
 /// Template function for data buffer to array conversion.
 template <class T> CScriptArray* BufferToArray(const T* buffer, unsigned size, const char* arrayName)
 {
-    asIScriptContext* context = asGetActiveContext();
+    Context* context = GetScriptContext();
     if (context)
     {
-        asITypeInfo* type = GetScriptContext()->GetSubsystem<Script>()->GetObjectType(arrayName);
+        asITypeInfo* type = context->GetSubsystem<Script>()->GetObjectType(arrayName);
         CScriptArray* arr = CScriptArray::Create(type, size);
 
         for (unsigned i = 0; i < arr->GetSize(); ++i)
@@ -119,10 +119,10 @@ template <class T> CScriptArray* BufferToArray(const T* buffer, unsigned size, c
 /// Template function for Vector to handle array conversion.
 template <class T> CScriptArray* VectorToHandleArray(const Vector<T*>& vector, const char* arrayName)
 {
-    asIScriptContext* context = asGetActiveContext();
+    Context* context = GetScriptContext();
     if (context)
     {
-        asITypeInfo* type = GetScriptContext()->GetSubsystem<Script>()->GetObjectType(arrayName);
+        asITypeInfo* type = context->GetSubsystem<Script>()->GetObjectType(arrayName);
         CScriptArray* arr = CScriptArray::Create(type, vector.Size());
 
         for (unsigned i = 0; i < arr->GetSize(); ++i)
@@ -143,10 +143,10 @@ template <class T> CScriptArray* VectorToHandleArray(const Vector<T*>& vector, c
 /// Template function for PODVector to handle array conversion.
 template <class T> CScriptArray* VectorToHandleArray(const PODVector<T*>& vector, const char* arrayName)
 {
-    asIScriptContext* context = asGetActiveContext();
+    Context* context = GetScriptContext();
     if (context)
     {
-        asITypeInfo* type = GetScriptContext()->GetSubsystem<Script>()->GetObjectType(arrayName);
+        asITypeInfo* type = context->GetSubsystem<Script>()->GetObjectType(arrayName);
         CScriptArray* arr = CScriptArray::Create(type, vector.Size());
 
         for (unsigned i = 0; i < arr->GetSize(); ++i)
@@ -167,10 +167,10 @@ template <class T> CScriptArray* VectorToHandleArray(const PODVector<T*>& vector
 /// Template function for shared pointer Vector to handle array conversion.
 template <class T> CScriptArray* VectorToHandleArray(const Vector<SharedPtr<T> >& vector, const char* arrayName)
 {
-    asIScriptContext* context = asGetActiveContext();
+    Context* context = GetScriptContext();
     if (context)
     {
-        asITypeInfo* type = GetScriptContext()->GetSubsystem<Script>()->GetObjectType(arrayName);
+        asITypeInfo* type = context->GetSubsystem<Script>()->GetObjectType(arrayName);
         CScriptArray* arr = CScriptArray::Create(type, vector.Size());
 
         for (unsigned i = 0; i < arr->GetSize(); ++i)
@@ -415,7 +415,7 @@ static const AttributeInfo& SerializableGetAttributeInfo(unsigned index, Seriali
     const Vector<AttributeInfo>* attributes = ptr->GetAttributes();
     if (!attributes || index >= attributes->Size())
     {
-        asGetActiveContext()->SetException("Index out of bounds");
+        GetActiveASContext()->SetException("Index out of bounds");
         return noAttributeInfo;
     }
     else
@@ -537,7 +537,7 @@ static Component* NodeGetComponent(unsigned index, Node* ptr)
     const Vector<SharedPtr<Component> >& components = ptr->GetComponents();
     if (index >= components.Size())
     {
-        asGetActiveContext()->SetException("Index out of bounds");
+        GetActiveASContext()->SetException("Index out of bounds");
         return 0;
     }
     else
@@ -612,7 +612,7 @@ static Node* NodeGetChild(unsigned index, Node* ptr)
     const Vector<SharedPtr<Node> >& children = ptr->GetChildren();
     if (index >= children.Size())
     {
-        asGetActiveContext()->SetException("Index out of bounds");
+        GetActiveASContext()->SetException("Index out of bounds");
         return 0;
     }
     else

+ 10 - 1
Source/Urho3D/AngelScript/ScriptInstance.cpp

@@ -919,9 +919,18 @@ void ScriptInstance::HandleScriptFileReloadFinished(StringHash eventType, Varian
     }
 }
 
+asIScriptContext* GetActiveASContext()
+{
+    return asGetActiveContext();
+}
+
 Context* GetScriptContext()
 {
-    return static_cast<Script*>(asGetActiveContext()->GetEngine()->GetUserData())->GetContext();
+    asIScriptContext* context = asGetActiveContext();
+    if (context)
+        return static_cast<Script*>(context->GetEngine()->GetUserData())->GetContext();
+    else
+        return 0;
 }
 
 ScriptInstance* GetScriptContextInstance()

+ 9 - 6
Source/Urho3D/AngelScript/ScriptInstance.h

@@ -27,6 +27,7 @@
 
 class asIScriptFunction;
 class asIScriptObject;
+class asIScriptContext;
 
 namespace Urho3D
 {
@@ -209,17 +210,19 @@ private:
     bool subscribedPostFixed_;
 };
 
-/// Return the Urho3D context of the active script context.
+/// Return the active AngelScript context. Provided as a wrapper to the AngelScript API function to avoid undefined symbol error in shared library Urho3D builds.
+URHO3D_API asIScriptContext* GetActiveASContext();
+/// Return the Urho3D context of the active AngelScript context.
 URHO3D_API Context* GetScriptContext();
-/// Return the ScriptInstance of the active script context.
+/// Return the ScriptInstance of the active AngelScript context.
 URHO3D_API ScriptInstance* GetScriptContextInstance();
-/// Return the scene node of the active script context.
+/// Return the scene node of the active AngelScript context.
 URHO3D_API Node* GetScriptContextNode();
-/// Return the scene of the active script context.
+/// Return the scene of the active AngelScript context.
 URHO3D_API Scene* GetScriptContextScene();
-/// Return the event listener of the active script context.
+/// Return the event listener of the active AngelScript context.
 URHO3D_API ScriptEventListener* GetScriptContextEventListener();
-/// Return the event listener of the active script context as an Object pointer.
+/// Return the event listener of the active AngelScript context as an Object pointer.
 URHO3D_API Object* GetScriptContextEventListenerObject();
 
 }