ecere/com/instance: Tweak to ensureCOM strategy for bindings
[sdk] / ecere / src / com / instance.ec
index 3f947c6..a96db41 100644 (file)
@@ -390,6 +390,7 @@ public:
    int numParams;       // TOTAL number of params including all base classes; use templateParams.count for this level
    bool isInstanceClass;
    bool byValueSystemClass;
+   void * bindingsClass;
 
    property const char *
    {
@@ -2089,7 +2090,7 @@ static void FixDerivativesBase(Class base, Class mod)
 {
    OldLink derivative;
 
-   ComputeClassParameters(base, strchr(base.name, '<'), null, true);
+   ComputeClassParameters(base, strchr(base.name, '<'), null, base.templateClass != mod);
 
    for(derivative = base.derivatives.first; derivative; derivative = derivative.next)
    {
@@ -3711,11 +3712,11 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
             {
                case type:
                   argument.dataTypeString = CopyString(value);
-                  argument.dataTypeClass = System_FindClass(findModule, value, true);
+                  argument.dataTypeClass = System_FindClass(findModule, value, registerInternalDecl);
                   if(!argument.dataTypeClass)
-                     argument.dataTypeClass = System_FindClass(_class.module, value, true);
+                     argument.dataTypeClass = System_FindClass(_class.module, value, registerInternalDecl);
                   if(!argument.dataTypeClass)
-                     argument.dataTypeClass = System_FindClass(_class.module.application, value, true);
+                     argument.dataTypeClass = System_FindClass(_class.module.application, value, registerInternalDecl);
                   if(registerInternalDecl && !argument.dataTypeClass)
                   {
                      ClassTemplateParameter param;
@@ -4618,12 +4619,12 @@ public dllexport Method eClass_FindMethod(Class _class, const char * name, Modul
 }
 
 // Construct an instance
-static bool ConstructInstance(void * instance, Class _class, Class from)
+static bool ConstructInstance(void * instance, Class _class, Class from, bool bindingsAlloc)
 {
    if(_class.templateClass) _class = _class.templateClass;
    if(_class.base && from != _class.base)
    {
-      if(!ConstructInstance(instance, _class.base, from))
+      if(!ConstructInstance(instance, _class.base, from, false))
          return false;
    }
    if(_class.Initialize)
@@ -4634,7 +4635,12 @@ static bool ConstructInstance(void * instance, Class _class, Class from)
    }
    if(_class.Constructor)
    {
-      if(!_class.Constructor(instance))
+      bool result;
+      if(_class.bindingsClass)
+         result = ((bool (*)(void *, bool))(void *)_class.Constructor)(instance, bindingsAlloc);
+      else
+         result = _class.Constructor(instance);
+      if(!result)
       {
          for(; _class; _class = _class.base)
          {
@@ -4649,7 +4655,7 @@ static bool ConstructInstance(void * instance, Class _class, Class from)
    return true;
 }
 
-public dllexport void * eInstance_New(Class _class)
+static void * Instance_New(Class _class, bool bindingsAlloc)
 {
    Instance instance = null;
    if(_class)
@@ -4711,7 +4717,7 @@ public dllexport void * eInstance_New(Class _class)
          // Copy the virtual table initially
          instance._vTbl = _class._vTbl;
       }
-      if(instance && !ConstructInstance(instance, _class, null))
+      if(instance && !ConstructInstance(instance, _class, null, bindingsAlloc))
       {
          _free(instance);
          instance = null;
@@ -4722,6 +4728,16 @@ public dllexport void * eInstance_New(Class _class)
    return instance;
 }
 
+public dllexport void * eInstance_New(Class _class)
+{
+   return Instance_New(_class, true);
+}
+
+public dllexport void * eInstance_NewEx(Class _class, bool bindingsAlloc)
+{
+   return Instance_New(_class, bindingsAlloc);
+}
+
 public dllexport void eInstance_Evolve(Instance * instancePtr, Class _class)
 {
    if(_class && instancePtr && *instancePtr)
@@ -4831,7 +4847,7 @@ public dllexport void eInstance_Evolve(Instance * instancePtr, Class _class)
       instance._vTbl = _class._vTbl;
 
       // We don't want to reconstruct the portion already constructed...
-      if(!ConstructInstance(instance, _class, fromClass))
+      if(!ConstructInstance(instance, _class, fromClass, false))
       {
          _free(instance);
          *instancePtr = null;
@@ -5634,7 +5650,7 @@ static Module Module_Load(Module fromModule, const char * name, AccessMode impor
    }
    if(ensureCOM && !strcmp(name, "ecere") && module)
    {
-      name = !strcmp(module.name, "ecereCOM") ? "ecere" : "ecereCOM";
+      name = !strcmp(module.name, "ecereCOM") ? "ecereCOM" : "ecere";
       if((!Load && !strcmp(module.name, "ecereCOM")) ||
          (Load && (!__thisModule || !__thisModule.name || !strcmp(__thisModule.name, "ecereCOM")) && Load != (void *)COM_LOAD_FUNCTION))
       {
@@ -6284,7 +6300,7 @@ public dllexport void eProperty_SelfWatch(Class _class, const char * name, void
    }
 }
 
-public dllexport void eInstance_Watch(void * instance, Property _property, void * object, void (*callback)(void *, void *))
+public dllexport void eInstance_Watch(Instance instance, Property _property, void * object, void (*callback)(void *, void *))
 {
    if(_property.isWatchable)
    {