Browse Source

Removed the object & module maps from the Script subsystem. Use instead AngelScript userdata to map from script constructs to C++ objects.
Customized asCScriptObject to contain userdata.

Lasse Öörni 13 years ago
parent
commit
8a5d1b5322

+ 0 - 9
Engine/Script/Script.h

@@ -92,11 +92,6 @@ public:
     /// Return retained mode log messages.
     /// Return retained mode log messages.
     const String& GetLogMessages() const { return logMessages_; }
     const String& GetLogMessages() const { return logMessages_; }
     
     
-    /// Return script module to script file map.
-    Map<asIScriptModule*, ScriptFile*>& GetModuleMap() { return moduleMap_; }
-    /// Return script object to script instance map.
-    Map<void*, ScriptInstance*>& GetObjectMap() { return objectMap_; }
-    
 private:
 private:
     /// Increase script nesting level.
     /// Increase script nesting level.
     void IncScriptNestingLevel() { ++scriptNestingLevel_; }
     void IncScriptNestingLevel() { ++scriptNestingLevel_; }
@@ -119,10 +114,6 @@ private:
     WeakPtr<Scene> defaultScene_;
     WeakPtr<Scene> defaultScene_;
     /// Script function/method execution contexts.
     /// Script function/method execution contexts.
     Vector<asIScriptContext*> scriptFileContexts_;
     Vector<asIScriptContext*> scriptFileContexts_;
-    /// Map of script modules to script files.
-    Map<asIScriptModule*, ScriptFile*> moduleMap_;
-    /// Map of script objects to script instance components.
-    Map<void*, ScriptInstance*> objectMap_;
     /// Search cache for inbuilt object types.
     /// Search cache for inbuilt object types.
     Map<const char*, asIObjectType*> objectTypes_;
     Map<const char*, asIObjectType*> objectTypes_;
     /// Script engine logging mode.
     /// Script engine logging mode.

+ 7 - 10
Engine/Script/ScriptFile.cpp

@@ -64,8 +64,6 @@ bool ScriptFile::Load(Deserializer& source)
     ReleaseModule();
     ReleaseModule();
     
     
     // Create the module. Discard previous module if there was one
     // Create the module. Discard previous module if there was one
-    if (scriptModule_)
-        script_->GetModuleMap().Erase(scriptModule_);
     asIScriptEngine* engine = script_->GetScriptEngine();
     asIScriptEngine* engine = script_->GetScriptEngine();
     scriptModule_ = engine->GetModule(GetName().CString(), asGM_ALWAYS_CREATE);
     scriptModule_ = engine->GetModule(GetName().CString(), asGM_ALWAYS_CREATE);
     if (!scriptModule_)
     if (!scriptModule_)
@@ -94,7 +92,8 @@ bool ScriptFile::Load(Deserializer& source)
     
     
     LOGINFO("Compiled script module " + GetName());
     LOGINFO("Compiled script module " + GetName());
     compiled_ = true;
     compiled_ = true;
-    script_->GetModuleMap()[scriptModule_] = this;
+    // Map script module to script resource with userdata
+    scriptModule_->SetUserData(this);
     
     
     return true;
     return true;
 }
 }
@@ -534,7 +533,7 @@ void ScriptFile::ReleaseModule()
         UnsubscribeFromAllEventsWithUserData();
         UnsubscribeFromAllEventsWithUserData();
         
         
         // Remove the module
         // Remove the module
-        script_->GetModuleMap().Erase(scriptModule_);
+        scriptModule_->SetUserData(0);
         asIScriptEngine* engine = script_->GetScriptEngine();
         asIScriptEngine* engine = script_->GetScriptEngine();
         engine->DiscardModule(GetName().CString());
         engine->DiscardModule(GetName().CString());
         scriptModule_ = 0;
         scriptModule_ = 0;
@@ -563,12 +562,10 @@ void ScriptFile::HandleScriptEvent(StringHash eventType, VariantMap& eventData)
 ScriptFile* GetScriptContextFile()
 ScriptFile* GetScriptContextFile()
 {
 {
     asIScriptContext* context = asGetActiveContext();
     asIScriptContext* context = asGetActiveContext();
-    asIScriptFunction* function = context->GetFunction();
-    asIScriptModule* module = function->GetEngine()->GetModule(function->GetModuleName());
-    Map<asIScriptModule*, ScriptFile*>& moduleMap = static_cast<Script*>(context->GetEngine()->GetUserData())->GetModuleMap();
-    Map<asIScriptModule*, ScriptFile*>::ConstIterator i = moduleMap.Find(module);
-    if (i != moduleMap.End())
-        return i->second_;
+    asIScriptFunction* function = context ? context->GetFunction() : 0;
+    asIScriptModule* module = function ? function->GetEngine()->GetModule(function->GetModuleName()) : 0;
+    if (module)
+        return static_cast<ScriptFile*>(module->GetUserData());
     else
     else
         return 0;
         return 0;
 }
 }

+ 7 - 8
Engine/Script/ScriptInstance.cpp

@@ -315,7 +315,9 @@ void ScriptInstance::CreateObject()
     scriptObject_ = scriptFile_->CreateObject(className_);
     scriptObject_ = scriptFile_->CreateObject(className_);
     if (scriptObject_)
     if (scriptObject_)
     {
     {
-        script_->GetObjectMap()[(void*)scriptObject_] = this;
+        // Map script object to script instance with userdata
+        scriptObject_->SetUserData(this);
+        
         ClearDelayedExecute();
         ClearDelayedExecute();
         GetSupportedMethods();
         GetSupportedMethods();
         if (methods_[METHOD_START])
         if (methods_[METHOD_START])
@@ -336,10 +338,9 @@ void ScriptInstance::ReleaseObject()
         ClearMethods();
         ClearMethods();
         ClearDelayedExecute();
         ClearDelayedExecute();
         
         
+        scriptObject_->SetUserData(0);
         scriptObject_->Release();
         scriptObject_->Release();
         scriptObject_ = 0;
         scriptObject_ = 0;
-        
-        script_->GetObjectMap().Erase((void*)scriptObject_);
     }
     }
 }
 }
 
 
@@ -497,11 +498,9 @@ Context* GetScriptContext()
 ScriptInstance* GetScriptContextInstance()
 ScriptInstance* GetScriptContextInstance()
 {
 {
     asIScriptContext* context = asGetActiveContext();
     asIScriptContext* context = asGetActiveContext();
-    void* object = context->GetThisPointer();
-    Map<void*, ScriptInstance*>& objectMap = static_cast<Script*>(context->GetEngine()->GetUserData())->GetObjectMap();
-    Map<void*, ScriptInstance*>::ConstIterator i = objectMap.Find(object);
-    if (i != objectMap.End())
-        return i->second_;
+    asIScriptObject* object = context ? static_cast<asIScriptObject*>(context->GetThisPointer()) : 0;
+    if (object)
+        return static_cast<ScriptInstance*>(object->GetUserData());
     else
     else
         return 0;
         return 0;
 }
 }

+ 4 - 0
ThirdParty/AngelScript/include/angelscript.h

@@ -824,6 +824,10 @@ public:
 	virtual asIScriptEngine *GetEngine() const = 0;
 	virtual asIScriptEngine *GetEngine() const = 0;
 	virtual int              CopyFrom(asIScriptObject *other) = 0;
 	virtual int              CopyFrom(asIScriptObject *other) = 0;
 
 
+	// Urho3D: added userdata
+	virtual void *SetUserData(void *data) = 0;
+	virtual void *GetUserData() const = 0;
+
 protected:
 protected:
 	virtual ~asIScriptObject() {}
 	virtual ~asIScriptObject() {}
 };
 };

+ 18 - 0
ThirdParty/AngelScript/source/as_scriptobject.cpp

@@ -28,6 +28,7 @@
    [email protected]
    [email protected]
 */
 */
 
 
+// Modified by Lasse Öörni for Urho3D
 
 
 #include <new>
 #include <new>
 #include "as_config.h"
 #include "as_config.h"
@@ -199,6 +200,9 @@ asCScriptObject::asCScriptObject(asCObjectType *ot)
 			}
 			}
 		}
 		}
 	}
 	}
+	
+	// Urho3D: initialize userdata
+	userData = 0;
 }
 }
 
 
 void asCScriptObject::Destruct()
 void asCScriptObject::Destruct()
@@ -340,6 +344,20 @@ int asCScriptObject::GetTypeId() const
 	return objType->engine->GetTypeIdFromDataType(dt);
 	return objType->engine->GetTypeIdFromDataType(dt);
 }
 }
 
 
+// interface
+void *asCScriptObject::SetUserData(void *data)
+{
+	void *oldData = userData;
+	userData = data;
+	return oldData;
+}
+
+// interface
+void *asCScriptObject::GetUserData() const
+{
+	return userData;
+}
+
 asUINT asCScriptObject::GetPropertyCount() const
 asUINT asCScriptObject::GetPropertyCount() const
 {
 {
 	return asUINT(objType->properties.GetLength());
 	return asUINT(objType->properties.GetLength());

+ 8 - 1
ThirdParty/AngelScript/source/as_scriptobject.h

@@ -28,7 +28,7 @@
    [email protected]
    [email protected]
 */
 */
 
 
-
+// Modified by Lasse Öörni for Urho3D
 
 
 //
 //
 // as_scriptobject.h
 // as_scriptobject.h
@@ -75,6 +75,10 @@ public:
 
 
 	int         CopyFrom(asIScriptObject *other);
 	int         CopyFrom(asIScriptObject *other);
 
 
+	// Urho3D: added userdata
+	void *SetUserData(void *data);
+	void *GetUserData() const;
+
 //====================================
 //====================================
 // Internal
 // Internal
 //====================================
 //====================================
@@ -105,6 +109,9 @@ protected:
 	mutable asCAtomic refCount;
 	mutable asCAtomic refCount;
 	mutable bool gcFlag;
 	mutable bool gcFlag;
 	bool isDestructCalled;
 	bool isDestructCalled;
+	
+	// Urho3D: added userdata
+	void* userData;
 };
 };
 
 
 void ScriptObject_Construct(asCObjectType *objType, asCScriptObject *self);
 void ScriptObject_Construct(asCObjectType *objType, asCScriptObject *self);