From 6c5ec673e10a4bddb71da085f1dc9605838e9318 Mon Sep 17 00:00:00 2001 From: vczh Date: Sat, 21 Jan 2023 03:44:28 -0800 Subject: [PATCH] Update release and remove executable in tools --- Import/GacUI.cpp | 266 +++++++++++++++++++++++++++++++++++++-- Import/GacUI.h | 115 +++++++++++------ Import/GacUICompiler.cpp | 241 ++++++++++++++++++++--------------- Import/GacUICompiler.h | 17 +-- Import/Vlpp.cpp | 69 +++++----- Import/Vlpp.h | 85 +++++++------ Tools/CppMerge.exe | Bin 256512 -> 0 bytes Tools/GacCommon.ps1 | 8 +- Tools/GacGen.ps1 | 4 +- Tools/GacGen32.exe | Bin 5551104 -> 0 bytes Tools/GacGen64.exe | Bin 7026688 -> 0 bytes Tools/GlrParserGen.exe | Bin 2033664 -> 0 bytes Tools/ParserGen.exe | Bin 1268736 -> 0 bytes 13 files changed, 571 insertions(+), 234 deletions(-) delete mode 100644 Tools/CppMerge.exe delete mode 100644 Tools/GacGen32.exe delete mode 100644 Tools/GacGen64.exe delete mode 100644 Tools/GlrParserGen.exe delete mode 100644 Tools/ParserGen.exe diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index e5e9ba79..565d537a 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -518,7 +518,7 @@ GuiApplicationMain ThreadLocalStorage::DisposeStorages(); FinalizeGlobalStorage(); #ifndef VCZH_DEBUG_NO_REFLECTION - DestroyGlobalTypeManager(); + ResetGlobalTypeManager(); #endif } } @@ -33746,6 +33746,232 @@ SharedAsyncService } } +/*********************************************************************** +.\PLATFORMPROVIDERS\GACGEN\GACGENCONTROLLER.CPP +***********************************************************************/ + +using namespace vl; +using namespace vl::stream; +using namespace vl::reflection::description; +using namespace vl::presentation; + +class GacGenNativeController + : public Object + , public INativeController + , protected INativeCallbackService + , protected INativeResourceService + , protected INativeImageService + , protected INativeInputService +{ +public: + INativeCallbackService* CallbackService() override + { + return this; + } + + INativeResourceService* ResourceService() override + { + return this; + } + + INativeAsyncService* AsyncService() override + { + CHECK_FAIL(L"Not implemented!"); + } + + INativeClipboardService* ClipboardService() override + { + CHECK_FAIL(L"Not implemented!"); + } + + INativeImageService* ImageService() override + { + return this; + } + + INativeScreenService* ScreenService() override + { + CHECK_FAIL(L"Not implemented!"); + } + + INativeWindowService* WindowService() override + { + CHECK_FAIL(L"Not implemented!"); + } + + INativeInputService* InputService() override + { + return this; + } + + INativeDialogService* DialogService() override + { + CHECK_FAIL(L"Not implemented!"); + } + + WString GetExecutablePath() override + { + CHECK_FAIL(L"Not implemented!"); + } + + //////////////////////////////////////////////////////////////////// + // INativeCallbackService + //////////////////////////////////////////////////////////////////// + + bool InstallListener(INativeControllerListener* listener) override + { + return true; + } + + bool UninstallListener(INativeControllerListener* listener) override + { + return true; + } + + //////////////////////////////////////////////////////////////////// + // INativeResourceService + //////////////////////////////////////////////////////////////////// + + INativeCursor* GetSystemCursor(INativeCursor::SystemCursorType type) override + { + CHECK_FAIL(L"Not implemented!"); + } + + INativeCursor* GetDefaultSystemCursor() override + { + CHECK_FAIL(L"Not implemented!"); + } + + FontProperties GetDefaultFont() override + { + FontProperties font; + font.fontFamily = L"GacGen"; + font.size = 12; + font.bold = false; + font.italic = false; + font.underline = false; + font.strikeline = false; + font.antialias = false; + font.verticalAntialias = false; + return font; + } + + void SetDefaultFont(const FontProperties& value) override + { + CHECK_FAIL(L"Not implemented!"); + } + + //////////////////////////////////////////////////////////////////// + // INativeImageService + //////////////////////////////////////////////////////////////////// + + class NativeImage : public Object, public INativeImage + { + protected: + INativeImageService* imageService; + MemoryStream memoryStream; + + public: + NativeImage(INativeImageService* _imageService, IStream& inputStream) + : imageService(_imageService) + { + CopyStream(inputStream, memoryStream); + } + + INativeImageService* GetImageService() override + { + return imageService; + } + + FormatType GetFormat() override + { + CHECK_FAIL(L"Not implemented!"); + } + + vint GetFrameCount() override + { + return 0; + } + + INativeImageFrame* GetFrame(vint index) override + { + CHECK_FAIL(L"Not implemented!"); + } + + void SaveToStream(stream::IStream& imageStream, FormatType formatType) override + { + CHECK_ERROR(formatType == FormatType::Unknown, L"Not Implemented!"); + CopyStream(imageStream, memoryStream); + } + }; + + Ptr CreateImageFromFile(const WString& path) override + { + FileStream imageStream(path, FileStream::ReadOnly); + if (!imageStream.IsAvailable()) return nullptr; + return Ptr(new NativeImage(this, imageStream)); + } + + Ptr CreateImageFromMemory(void* buffer, vint length) override + { + MemoryWrapperStream imageStream(buffer, length); + return Ptr(new NativeImage(this, imageStream)); + } + + Ptr CreateImageFromStream(stream::IStream& imageStream) override + { + return Ptr(new NativeImage(this, imageStream)); + } + + //////////////////////////////////////////////////////////////////// + // INativeInputService + //////////////////////////////////////////////////////////////////// + + void StartTimer() override + { + } + + void StopTimer() override + { + } + + bool IsTimerEnabled() override + { + CHECK_FAIL(L"Not implemented!"); + } + + bool IsKeyPressing(VKEY code) override + { + CHECK_FAIL(L"Not implemented!"); + } + + bool IsKeyToggled(VKEY code) override + { + CHECK_FAIL(L"Not implemented!"); + } + + WString GetKeyName(VKEY code) override + { + CHECK_FAIL(L"Not implemented!"); + } + + VKEY GetKey(const WString& name) override + { + CHECK_FAIL(L"Not implemented!"); + } +}; + +extern void GuiApplicationMain(); + +int SetupGacGenNativeController() +{ + GacGenNativeController controller; + SetCurrentController(&controller); + GuiApplicationMain(); + SetCurrentController(nullptr); + return 0; +} + /*********************************************************************** .\PLATFORMPROVIDERS\HOSTED\GUIHOSTEDCONTROLLER.CPP ***********************************************************************/ @@ -41140,23 +41366,39 @@ GuiPluginManager Helpers ***********************************************************************/ - IGuiPluginManager* pluginManager=0; + GuiPluginDescriptor* firstPluginDescriptor = nullptr; + GuiPluginDescriptor** lastPluginDescriptor = &firstPluginDescriptor; + IGuiPluginManager* pluginManager = nullptr; IGuiPluginManager* GetPluginManager() { - if(!pluginManager) + if (!pluginManager) { - pluginManager=new GuiPluginManager; + pluginManager = new GuiPluginManager; + + auto current = firstPluginDescriptor; + while (current) + { + pluginManager->AddPlugin(current->CreatePlugin()); + current = current->next; + } } return pluginManager; } + void RegisterPluginDescriptor(GuiPluginDescriptor* pluginDescriptor) + { + CHECK_ERROR(!pluginManager, L"vl::presentation::RegisterPluginDescriptor(GuiPluginDescriptor*)#This function should be called before calling GetPluginManager."); + *lastPluginDescriptor = pluginDescriptor; + lastPluginDescriptor = &pluginDescriptor->next; + } + void DestroyPluginManager() { - if(pluginManager) + if (pluginManager) { delete pluginManager; - pluginManager=0; + pluginManager = nullptr; } } } @@ -42589,8 +42831,17 @@ GuiResource SaveResourceFolderToBinary(writer, typeNames); } - Ptr GuiResource::Precompile(IGuiResourcePrecompileCallback* callback, GuiResourceError::List& errors) + Ptr GuiResource::Precompile(GuiResourceCpuArchitecture targetCpuArchitecture, IGuiResourcePrecompileCallback* callback, GuiResourceError::List& errors) { + if (targetCpuArchitecture == GuiResourceCpuArchitecture::Unspecified) + { +#ifdef VCZH_64 + targetCpuArchitecture = GuiResourceCpuArchitecture::x64; +#else + targetCpuArchitecture = GuiResourceCpuArchitecture::x86; +#endif + } + if (GetFolder(L"Precompiled")) { errors.Add(GuiResourceError({Ptr(this)}, L"A precompiled resource cannot be compiled again.")); @@ -42598,6 +42849,7 @@ GuiResource } GuiResourcePrecompileContext context; + context.targetCpuArchitecture = targetCpuArchitecture; context.compilerCallback = callback ? callback->GetCompilerCallback() : nullptr; context.rootResource = this; context.resolver = Ptr(new GuiResourcePathResolver(Ptr(this), workingDirectory)); diff --git a/Import/GacUI.h b/Import/GacUI.h index 5ce82582..22ff5ba5 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -7785,20 +7785,36 @@ Plugin Plugin Manager ***********************************************************************/ + struct GuiPluginDescriptor + { + GuiPluginDescriptor* next = nullptr; + + virtual Ptr CreatePlugin() = 0; + }; + /// Get the global object. /// The global object. extern IGuiPluginManager* GetPluginManager(); + /// Register a plugin descriptor. Do not call this function directly, use GUI_REGISTER_PLUGIN macro instead. + /// The plugin descriptor. + extern void RegisterPluginDescriptor(GuiPluginDescriptor* pluginDescriptor); + /// Destroy the global object. extern void DestroyPluginManager(); #define GUI_REGISTER_PLUGIN(TYPE)\ - class GuiRegisterPluginClass_##TYPE\ + struct GuiRegisterPluginClass_##TYPE : private vl::presentation::GuiPluginDescriptor\ {\ + private:\ + vl::Ptr CreatePlugin() override\ + {\ + return vl::Ptr(new TYPE);\ + }\ public:\ GuiRegisterPluginClass_##TYPE()\ {\ - vl::presentation::GetPluginManager()->AddPlugin(Ptr(new TYPE));\ + vl::presentation::RegisterPluginDescriptor(this);\ }\ } instance_GuiRegisterPluginClass_##TYPE;\ @@ -7839,6 +7855,7 @@ namespace vl class GuiResourceItem; class GuiResourceFolder; class GuiResource; + class GuiResourcePathResolver; /*********************************************************************** Helper Functions @@ -7950,6 +7967,56 @@ Resource String WString GetText(); }; +/*********************************************************************** +Resource Precompile Context +***********************************************************************/ + + /// + /// CPU architecture + /// + enum class GuiResourceCpuArchitecture + { + x86, + x64, + Unspecified, + }; + + /// + /// Resource usage + /// + enum class GuiResourceUsage + { + DataOnly, + InstanceClass, + }; + + /// Provide a context for resource precompiling + struct GuiResourcePrecompileContext + { + typedef collections::Dictionary, Ptr> PropertyMap; + + /// The target CPU architecture. + GuiResourceCpuArchitecture targetCpuArchitecture = GuiResourceCpuArchitecture::Unspecified; + /// Progress callback. + workflow::IWfCompilerCallback* compilerCallback = nullptr; + /// The folder to contain compiled objects. + Ptr targetFolder; + /// The root resource object. + GuiResource* rootResource = nullptr; + /// Indicate the pass index of this precompiling pass. + vint passIndex = -1; + /// The path resolver. This is only for delay load resource. + Ptr resolver; + /// Additional properties for resource item contents + PropertyMap additionalProperties; + }; + + /// Provide a context for resource initializing + struct GuiResourceInitializeContext : GuiResourcePrecompileContext + { + GuiResourceUsage usage; + }; + /*********************************************************************** Resource Structure ***********************************************************************/ @@ -8039,9 +8106,6 @@ Resource Structure }; class DocumentModel; - class GuiResourcePathResolver; - struct GuiResourcePrecompileContext; - struct GuiResourceInitializeContext; class IGuiResourcePrecompileCallback; /// Resource item. @@ -8183,12 +8247,6 @@ Resource Structure Resource ***********************************************************************/ - enum class GuiResourceUsage - { - DataOnly, - InstanceClass, - }; - /// Resource metadata. class GuiResourceMetadata : public Object { @@ -8261,7 +8319,7 @@ Resource /// The resource folder contains all precompiled result. The folder will be added to the resource if there is no error. /// A callback to receive progress. /// All collected errors during precompiling a resource. - Ptr Precompile(IGuiResourcePrecompileCallback* callback, GuiResourceError::List& errors); + Ptr Precompile(GuiResourceCpuArchitecture targetCpuArchitecture, IGuiResourcePrecompileCallback* callback, GuiResourceError::List& errors); /// Initialize a precompiled resource. /// In which role an application is initializing this resource. @@ -8379,25 +8437,6 @@ Resource Type Resolver virtual IGuiResourceTypeResolver_IndirectLoad* IndirectLoad(){ return 0; } }; - /// Provide a context for resource precompiling - struct GuiResourcePrecompileContext - { - typedef collections::Dictionary, Ptr> PropertyMap; - - /// Progress callback. - workflow::IWfCompilerCallback* compilerCallback = nullptr; - /// The folder to contain compiled objects. - Ptr targetFolder; - /// The root resource object. - GuiResource* rootResource = nullptr; - /// Indicate the pass index of this precompiling pass. - vint passIndex = -1; - /// The path resolver. This is only for delay load resource. - Ptr resolver; - /// Additional properties for resource item contents - PropertyMap additionalProperties; - }; - /// /// Represents a precompiler for resources of a specified type. /// Current resources that needs precompiling: @@ -8463,12 +8502,6 @@ Resource Type Resolver virtual void OnPerResource(vint passIndex, Ptr resource) = 0; }; - /// Provide a context for resource initializing - struct GuiResourceInitializeContext : GuiResourcePrecompileContext - { - GuiResourceUsage usage; - }; - /// /// Represents a precompiler for resources of a specified type. /// Current resources that needs precompiling: @@ -21340,11 +21373,19 @@ using namespace vl::presentation::templates; #endif +// GacUI Compiler +extern int SetupGacGenNativeController(); + +// Windows extern int SetupWindowsGDIRenderer(); extern int SetupWindowsDirect2DRenderer(); extern int SetupHostedWindowsGDIRenderer(); extern int SetupHostedWindowsDirect2DRenderer(); +// Gtk +extern int SetupGtkRenderer(); + +// macOS extern int SetupOSXCoreGraphicsRenderer(); #endif diff --git a/Import/GacUICompiler.cpp b/Import/GacUICompiler.cpp index 8935b90f..4cccc447 100644 --- a/Import/GacUICompiler.cpp +++ b/Import/GacUICompiler.cpp @@ -29,10 +29,11 @@ namespace vl Ptr PrecompileResource( Ptr resource, + GuiResourceCpuArchitecture targetCpuArchitecture, IGuiResourcePrecompileCallback* callback, collections::List& errors) { - auto precompiledFolder = resource->Precompile(callback, errors); + auto precompiledFolder = resource->Precompile(targetCpuArchitecture, callback, errors); return precompiledFolder; } @@ -68,7 +69,7 @@ namespace vl } } - if (File(workflowPath).WriteAllText(text)) + if (File(workflowPath).WriteAllText(text, true, BomEncoder::Utf8)) { return compiled; } @@ -1630,19 +1631,19 @@ IGuiInstanceLoader { } - void IGuiInstanceLoader::GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames) + void IGuiInstanceLoader::GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames) { } - void IGuiInstanceLoader::GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames) + void IGuiInstanceLoader::GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames) { } - void IGuiInstanceLoader::GetPairedProperties(const PropertyInfo& propertyInfo, collections::List& propertyNames) + void IGuiInstanceLoader::GetPairedProperties(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo, collections::List& propertyNames) { } - Ptr IGuiInstanceLoader::GetPropertyType(const PropertyInfo& propertyInfo) + Ptr IGuiInstanceLoader::GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo) { return nullptr; } @@ -1944,7 +1945,7 @@ GuiDefaultInstanceLoader return nullptr; } - void CollectPropertyNames(const TypeInfo& typeInfo, ITypeDescriptor* typeDescriptor, collections::List& propertyNames) + void CollectPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, ITypeDescriptor* typeDescriptor, collections::List& propertyNames) { vint propertyCount = typeDescriptor->GetPropertyCount(); for (vint i = 0; i < propertyCount; i++) @@ -1952,7 +1953,7 @@ GuiDefaultInstanceLoader GlobalStringKey propertyName = GlobalStringKey::Get(typeDescriptor->GetProperty(i)->GetName()); if (!propertyNames.Contains(propertyName)) { - auto info = GetPropertyType(PropertyInfo(typeInfo, propertyName)); + auto info = GetPropertyType(precompileContext, PropertyInfo(typeInfo, propertyName)); if (info && info->support != GuiInstancePropertyInfo::NotSupport) { propertyNames.Add(propertyName); @@ -1963,13 +1964,13 @@ GuiDefaultInstanceLoader vint parentCount = typeDescriptor->GetBaseTypeDescriptorCount(); for (vint i = 0; i < parentCount; i++) { - CollectPropertyNames(typeInfo, typeDescriptor->GetBaseTypeDescriptor(i), propertyNames); + CollectPropertyNames(precompileContext, typeInfo, typeDescriptor->GetBaseTypeDescriptor(i), propertyNames); } } //*********************************************************************************** - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { @@ -1987,10 +1988,10 @@ GuiDefaultInstanceLoader } } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); - CollectPropertyNames(typeInfo, typeInfo.typeInfo->GetTypeDescriptor(), propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); + CollectPropertyNames(precompileContext, typeInfo, typeInfo.typeInfo->GetTypeDescriptor(), propertyNames); } PropertyType GetPropertyTypeCached(const PropertyInfo& propertyInfo) @@ -2040,7 +2041,7 @@ GuiDefaultInstanceLoader } } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { return GetPropertyTypeCached(propertyInfo).f0; } @@ -3939,7 +3940,17 @@ GuiDataProcessorDeserializer else { decl->name.value = L"Compare"; - decl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + switch (precompileContext.targetCpuArchitecture) + { + case GuiResourceCpuArchitecture::x86: + decl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + break; + case GuiResourceCpuArchitecture::x64: + decl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + break; + default: + CHECK_FAIL(L"The target CPU architecture is unspecified."); + } argumentNames.Add(L""); argumentNames.Add(L""); } @@ -4150,7 +4161,7 @@ namespace vl if (!compiled->assembly) { List codes; - auto manager = Workflow_GetSharedManager(); + auto manager = Workflow_GetSharedManager(context.targetCpuArchitecture); manager->Clear(false, true); auto addCode = [&codes](TextReader& reader) @@ -6864,7 +6875,7 @@ GuiAxisInstanceLoader return typeName; } - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { @@ -6872,12 +6883,12 @@ GuiAxisInstanceLoader } } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _AxisDirection) { @@ -6885,7 +6896,7 @@ GuiAxisInstanceLoader info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } bool CanCreate(const TypeInfo& typeInfo)override @@ -6941,12 +6952,12 @@ GuiCompositionInstanceLoader return typeName; } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(GlobalStringKey::Empty); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == GlobalStringKey::Empty) { @@ -6960,7 +6971,7 @@ GuiCompositionInstanceLoader } return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -7097,13 +7108,13 @@ GuiTableCompositionInstanceLoader return typeName; } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(_Rows); propertyNames.Add(_Columns); } - void GetPairedProperties(const PropertyInfo& propertyInfo, collections::List& propertyNames)override + void GetPairedProperties(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo, collections::List& propertyNames)override { if (propertyInfo.propertyName == _Rows || propertyInfo.propertyName == _Columns) { @@ -7112,13 +7123,13 @@ GuiTableCompositionInstanceLoader } } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _Rows || propertyInfo.propertyName == _Columns) { return GuiInstancePropertyInfo::Array(TypeInfoRetriver::CreateTypeInfo()); } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -7236,18 +7247,18 @@ GuiCellCompositionInstanceLoader return typeName; } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(_Site); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _Site) { return GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -7414,7 +7425,7 @@ GuiDocumentItemInstanceLoader return typeName; } - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { @@ -7422,13 +7433,13 @@ GuiDocumentItemInstanceLoader } } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); propertyNames.Add(GlobalStringKey::Empty); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == GlobalStringKey::Empty) { @@ -7443,7 +7454,7 @@ GuiDocumentItemInstanceLoader info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } @@ -7556,19 +7567,19 @@ GuiDocumentInstanceLoaderBase { } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(GlobalStringKey::Empty); - TBaseType::GetPropertyNames(typeInfo, propertyNames); + TBaseType::GetPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == GlobalStringKey::Empty) { return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver>::CreateTypeInfo()); } - return TBaseType::GetPropertyType(propertyInfo); + return TBaseType::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -7714,22 +7725,22 @@ GuiComboBoxInstanceLoader _ListControl = GlobalStringKey::Get(L"ListControl"); } - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { propertyNames.Add(_ListControl); } - BASE_TYPE::GetRequiredPropertyNames(typeInfo, propertyNames); + BASE_TYPE::GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); + BASE_TYPE::GetPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _ListControl) { @@ -7737,7 +7748,7 @@ GuiComboBoxInstanceLoader info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } - return BASE_TYPE::GetPropertyType(propertyInfo); + return BASE_TYPE::GetPropertyType(precompileContext, propertyInfo); } }; #undef BASE_TYPE @@ -7762,16 +7773,16 @@ GuiTreeViewInstanceLoader _Nodes = GlobalStringKey::Get(L"Nodes"); } - void GetPropertyNames(const typename BASE_TYPE::TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const typename BASE_TYPE::TypeInfo& typeInfo, collections::List& propertyNames)override { if (!bindable) { propertyNames.Add(_Nodes); } - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); + BASE_TYPE::GetPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const typename BASE_TYPE::PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const typename BASE_TYPE::PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _Nodes) { @@ -7780,7 +7791,7 @@ GuiTreeViewInstanceLoader return GuiInstancePropertyInfo::Collection(TypeInfoRetriver>::CreateTypeInfo()); } } - return BASE_TYPE::GetPropertyType(propertyInfo); + return BASE_TYPE::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const typename BASE_TYPE::TypeInfo& typeInfo, GlobalStringKey variableName, typename BASE_TYPE::ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -7867,7 +7878,7 @@ GuiTreeNodeInstanceLoader return typeName; } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(_Text); propertyNames.Add(_Image); @@ -7875,7 +7886,7 @@ GuiTreeNodeInstanceLoader propertyNames.Add(GlobalStringKey::Empty); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _Text) { @@ -7899,7 +7910,7 @@ GuiTreeNodeInstanceLoader { return GuiInstancePropertyInfo::Collection(TypeInfoRetriver>::CreateTypeInfo()); } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } bool CanCreate(const TypeInfo& typeInfo)override @@ -8170,12 +8181,12 @@ GuiControlInstanceLoader return typeName; } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(GlobalStringKey::Empty); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == GlobalStringKey::Empty) { @@ -8188,7 +8199,7 @@ GuiControlInstanceLoader } return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -8473,7 +8484,7 @@ GuiCommonDatePickerLookLoader return typeName; } - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { @@ -8483,12 +8494,12 @@ GuiCommonDatePickerLookLoader } } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _BackgroundColor || propertyInfo.propertyName == _PrimaryTextColor || propertyInfo.propertyName == _SecondaryTextColor) { @@ -8496,7 +8507,7 @@ GuiCommonDatePickerLookLoader info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } bool CanCreate(const TypeInfo& typeInfo)override @@ -8559,7 +8570,7 @@ GuiCommonScrollViewLookLoader return typeName; } - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { @@ -8567,20 +8578,31 @@ GuiCommonScrollViewLookLoader } } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _DefaultScrollSize) { - auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); + Ptr info; + switch (precompileContext.targetCpuArchitecture) + { + case GuiResourceCpuArchitecture::x86: + info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); + break; + case GuiResourceCpuArchitecture::x64: + info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); + break; + default: + CHECK_FAIL(L"The target CPU architecture is unspecified."); + } info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } bool CanCreate(const TypeInfo& typeInfo)override @@ -8718,19 +8740,19 @@ GuiToolstripInstanceLoaderBase { } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(GlobalStringKey::Empty); - TBaseType::GetPropertyNames(typeInfo, propertyNames); + TBaseType::GetPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == GlobalStringKey::Empty) { return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver::CreateTypeInfo()); } - return TBaseType::GetPropertyType(propertyInfo); + return TBaseType::GetPropertyType(precompileContext, propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -8845,19 +8867,19 @@ GuiToolstripButtonInstanceLoader _SubMenu = GlobalStringKey::Get(L"SubMenu"); } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(_SubMenu); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); + BASE_TYPE::GetPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _SubMenu) { return GuiInstancePropertyInfo::Set(TypeInfoRetriver::CreateTypeInfo()); } - return BASE_TYPE::GetPropertyType(propertyInfo); + return BASE_TYPE::GetPropertyType(precompileContext, propertyInfo); } Ptr GetParameter(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const PropertyInfo& propertyInfo, GlobalStringKey variableName, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -8932,7 +8954,7 @@ GuiRibbonButtonsInstanceLoader _MinSize = GlobalStringKey::Get(L"MinSize"); } - void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { if (CanCreate(typeInfo)) { @@ -8941,12 +8963,12 @@ GuiRibbonButtonsInstanceLoader } } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames)override { - GetRequiredPropertyNames(typeInfo, propertyNames); + GetRequiredPropertyNames(precompileContext, typeInfo, propertyNames); } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _MaxSize || propertyInfo.propertyName == _MinSize) { @@ -8954,7 +8976,7 @@ GuiRibbonButtonsInstanceLoader info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); + return IGuiInstanceLoader::GetPropertyType(precompileContext, propertyInfo); } }; #undef BASE_TYPE @@ -10024,7 +10046,7 @@ WorkflowEventNamesVisitor auto prop = repr->setters.Keys()[index]; WString errorPrefix; - if (Workflow_GetPropertyTypes(errorPrefix, resolvingResult, loader, resolvedTypeInfo, prop, setter, possibleInfos, errors)) + if (Workflow_GetPropertyTypes(precompileContext, errorPrefix, resolvingResult, loader, resolvedTypeInfo, prop, setter, possibleInfos, errors)) { if (setter->binding == GlobalStringKey::_Set) { @@ -10384,7 +10406,7 @@ Workflow_GenerateInstanceClass if (paramTd) { - auto typeInfo = Workflow_GetSuggestedParameterType(paramTd); + auto typeInfo = Workflow_GetSuggestedParameterType(precompileContext, paramTd); switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: return { typeInfo,className + L"*" }; @@ -10516,7 +10538,7 @@ Workflow_GenerateInstanceClass prop->functionKind = WfFunctionKind::Normal; prop->name.value = localized->name.ToString(); - prop->type = GetTypeFromTypeInfo(Workflow_GetSuggestedParameterType(lsiTd).Obj()); + prop->type = GetTypeFromTypeInfo(Workflow_GetSuggestedParameterType(precompileContext, lsiTd).Obj()); prop->configConst = WfAPConst::Writable; prop->configObserve = WfAPObserve::Observable; @@ -10946,11 +10968,28 @@ GuiWorkflowSharedManagerPlugin sharedManagerPlugin = 0; } - WfLexicalScopeManager* GetWorkflowManager() + WfLexicalScopeManager* GetWorkflowManager(GuiResourceCpuArchitecture targetCpuArchitecture) { + WfCpuArchitecture wfCpuArchitecture = WfCpuArchitecture::AsExecutable; + switch (targetCpuArchitecture) + { + case GuiResourceCpuArchitecture::x86: + wfCpuArchitecture = WfCpuArchitecture::x86; + break; + case GuiResourceCpuArchitecture::x64: + wfCpuArchitecture = WfCpuArchitecture::x64; + break; + default: + CHECK_FAIL(L"The target CPU architecture is unspecified."); + } + if (!workflowManager) { - workflowManager = Ptr(new WfLexicalScopeManager(workflowParser, WfCpuArchitecture::AsExecutable)); + workflowManager = Ptr(new WfLexicalScopeManager(workflowParser, wfCpuArchitecture)); + } + else + { + CHECK_ERROR(workflowManager->cpuArchitecture == wfCpuArchitecture, L"The target CPU architecture cannot be changed."); } return workflowManager.Obj(); } @@ -10964,9 +11003,9 @@ GuiWorkflowSharedManagerPlugin }; GUI_REGISTER_PLUGIN(GuiWorkflowSharedManagerPlugin) - WfLexicalScopeManager* Workflow_GetSharedManager() + WfLexicalScopeManager* Workflow_GetSharedManager(GuiResourceCpuArchitecture targetCpuArchitecture) { - return sharedManagerPlugin->GetWorkflowManager(); + return sharedManagerPlugin->GetWorkflowManager(targetCpuArchitecture); } Ptr Workflow_TransferSharedManager() @@ -10993,7 +11032,7 @@ namespace vl Workflow_AdjustPropertySearchType ***********************************************************************/ - IGuiInstanceLoader::TypeInfo Workflow_AdjustPropertySearchType(types::ResolvingResult& resolvingResult, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop) + IGuiInstanceLoader::TypeInfo Workflow_AdjustPropertySearchType(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop) { if (resolvedTypeInfo.typeName.ToString() == resolvingResult.context->className) { @@ -11037,9 +11076,9 @@ Workflow_AdjustPropertySearchType Workflow_GetPropertyTypes ***********************************************************************/ - bool Workflow_GetPropertyTypes(WString& errorPrefix, types::ResolvingResult& resolvingResult, IGuiInstanceLoader* loader, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop, Ptr setter, collections::List& possibleInfos, GuiResourceError::List& errors) + bool Workflow_GetPropertyTypes(GuiResourcePrecompileContext& precompileContext, WString& errorPrefix, types::ResolvingResult& resolvingResult, IGuiInstanceLoader* loader, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop, Ptr setter, collections::List& possibleInfos, GuiResourceError::List& errors) { - resolvedTypeInfo = Workflow_AdjustPropertySearchType(resolvingResult, resolvedTypeInfo, prop); + resolvedTypeInfo = Workflow_AdjustPropertySearchType(precompileContext, resolvingResult, resolvedTypeInfo, prop); bool reportedNotSupported = false; IGuiInstanceLoader::PropertyInfo propertyInfo(resolvedTypeInfo, prop); @@ -11049,7 +11088,7 @@ Workflow_GetPropertyTypes while (currentLoader) { - if (auto propertyTypeInfo = currentLoader->GetPropertyType(propertyInfo)) + if (auto propertyTypeInfo = currentLoader->GetPropertyType(precompileContext, propertyInfo)) { if (propertyTypeInfo->support == GuiInstancePropertyInfo::NotSupport) { @@ -11244,7 +11283,7 @@ WorkflowReferenceNamesVisitor auto prop = repr->setters.Keys()[index]; WString errorPrefix; - if (Workflow_GetPropertyTypes(errorPrefix, resolvingResult, loader, resolvedTypeInfo, prop, setter, possibleInfos, errors)) + if (Workflow_GetPropertyTypes(precompileContext, errorPrefix, resolvingResult, loader, resolvedTypeInfo, prop, setter, possibleInfos, errors)) { if (setter->binding == GlobalStringKey::Empty) { @@ -11350,7 +11389,7 @@ WorkflowReferenceNamesVisitor auto currentLoader = loader; while (currentLoader) { - currentLoader->GetRequiredPropertyNames(resolvedTypeInfo, requiredProps); + currentLoader->GetRequiredPropertyNames(precompileContext, resolvedTypeInfo, requiredProps); currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); } } @@ -11363,7 +11402,7 @@ WorkflowReferenceNamesVisitor auto currentLoader = loader; while (currentLoader && !info) { - info = currentLoader->GetPropertyType({ resolvedTypeInfo, prop }); + info = currentLoader->GetPropertyType(precompileContext, { resolvedTypeInfo, prop }); currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); } } @@ -11387,7 +11426,7 @@ WorkflowReferenceNamesVisitor IGuiInstanceLoader::PropertyInfo propertyInfo(resolvedTypeInfo, prop); List pairProps; - loader->GetPairedProperties(propertyInfo, pairProps); + loader->GetPairedProperties(precompileContext, propertyInfo, pairProps); if (pairProps.Count() > 0) { List missingProps; @@ -11616,10 +11655,10 @@ WorkflowReferenceNamesVisitor if (repr == resolvingResult.context->instance.Obj()) { List propertyNames; - loader->GetPropertyNames(resolvedTypeInfo, propertyNames); + loader->GetPropertyNames(precompileContext, resolvedTypeInfo, propertyNames); for (vint i = propertyNames.Count() - 1; i >= 0; i--) { - auto info = loader->GetPropertyType({ resolvedTypeInfo, propertyNames[i] }); + auto info = loader->GetPropertyType(precompileContext, { resolvedTypeInfo, propertyNames[i] }); if (!info || info->usage == GuiInstancePropertyInfo::Property) { propertyNames.RemoveAt(i); @@ -11669,7 +11708,7 @@ WorkflowReferenceNamesVisitor } }; - Ptr Workflow_GetSuggestedParameterType(reflection::description::ITypeDescriptor* typeDescriptor) + Ptr Workflow_GetSuggestedParameterType(GuiResourcePrecompileContext& precompileContext, reflection::description::ITypeDescriptor* typeDescriptor) { auto elementType = Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)); if ((typeDescriptor->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined) @@ -11730,7 +11769,7 @@ WorkflowReferenceNamesVisitor } else { - auto referenceType = Workflow_GetSuggestedParameterType(type); + auto referenceType = Workflow_GetSuggestedParameterType(precompileContext, type); resolvingResult.typeInfos.Add(parameter->name, { GlobalStringKey::Get(type->GetTypeName()),referenceType }); } } @@ -12159,7 +12198,7 @@ WorkflowGenerateCreatingVisitor ) { List pairedProps; - info.loader->GetPairedProperties(propInfo, pairedProps); + info.loader->GetPairedProperties(precompileContext, propInfo, pairedProps); if (pairedProps.Count() == 0) { pairedProps.Add(propInfo.propertyName); diff --git a/Import/GacUICompiler.h b/Import/GacUICompiler.h index aa63970c..d0cf56d6 100644 --- a/Import/GacUICompiler.h +++ b/Import/GacUICompiler.h @@ -39,6 +39,7 @@ namespace vl extern Ptr PrecompileResource( Ptr resource, + GuiResourceCpuArchitecture targetCpuArchitecture, IGuiResourcePrecompileCallback* callback, collections::List& errors); @@ -781,10 +782,10 @@ Instance Loader virtual GlobalStringKey GetTypeName() = 0; virtual void ClearReflectionCache(); - virtual void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames); - virtual void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames); - virtual void GetPairedProperties(const PropertyInfo& propertyInfo, collections::List& propertyNames); - virtual Ptr GetPropertyType(const PropertyInfo& propertyInfo); + virtual void GetRequiredPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames); + virtual void GetPropertyNames(GuiResourcePrecompileContext& precompileContext, const TypeInfo& typeInfo, collections::List& propertyNames); + virtual void GetPairedProperties(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo, collections::List& propertyNames); + virtual Ptr GetPropertyType(GuiResourcePrecompileContext& precompileContext, const PropertyInfo& propertyInfo); virtual bool CanCreate(const TypeInfo& typeInfo); virtual Ptr CreateRootInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, ArgumentMap& arguments, GuiResourceError::List& errors); @@ -1095,7 +1096,7 @@ namespace vl PropertyResolvingMap propertyResolvings; // information of property values which are calling constructors }; } - extern workflow::analyzer::WfLexicalScopeManager* Workflow_GetSharedManager(); + extern workflow::analyzer::WfLexicalScopeManager* Workflow_GetSharedManager(GuiResourceCpuArchitecture targetCpuArchitecture); extern Ptr Workflow_TransferSharedManager(); @@ -1166,9 +1167,9 @@ WorkflowCompiler (Compile) } }; - extern IGuiInstanceLoader::TypeInfo Workflow_AdjustPropertySearchType(types::ResolvingResult& resolvingResult, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop); - extern bool Workflow_GetPropertyTypes(WString& errorPrefix, types::ResolvingResult& resolvingResult, IGuiInstanceLoader* loader, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop, Ptr setter, collections::List& possibleInfos, GuiResourceError::List& errors); - extern Ptr Workflow_GetSuggestedParameterType(reflection::description::ITypeDescriptor* typeDescriptor); + extern IGuiInstanceLoader::TypeInfo Workflow_AdjustPropertySearchType(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop); + extern bool Workflow_GetPropertyTypes(GuiResourcePrecompileContext& precompileContext, WString& errorPrefix, types::ResolvingResult& resolvingResult, IGuiInstanceLoader* loader, IGuiInstanceLoader::TypeInfo resolvedTypeInfo, GlobalStringKey prop, Ptr setter, collections::List& possibleInfos, GuiResourceError::List& errors); + extern Ptr Workflow_GetSuggestedParameterType(GuiResourcePrecompileContext& precompileContext, reflection::description::ITypeDescriptor* typeDescriptor); extern IGuiInstanceLoader::TypeInfo Workflow_CollectReferences(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, GuiResourceError::List& errors); extern void Workflow_GenerateCreating(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, Ptr statements, GuiResourceError::List& errors); extern void Workflow_GenerateBindings(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, Ptr statements, GuiResourceError::List& errors); diff --git a/Import/Vlpp.cpp b/Import/Vlpp.cpp index 1d0455f3..a6736fcc 100644 --- a/Import/Vlpp.cpp +++ b/Import/Vlpp.cpp @@ -129,72 +129,61 @@ namespace vl { using namespace collections; - class GlobalStorageManager - { - public: - Ptr> storages; +/*********************************************************************** +Helper Functions +***********************************************************************/ - GlobalStorageManager() + GlobalStorageDescriptor* firstGlobalStorageDescriptor = nullptr; + GlobalStorageDescriptor** lastGlobalStorageDescriptor = &firstGlobalStorageDescriptor; + + void RegisterStorageDescriptor(GlobalStorageDescriptor* globalStorageDescriptor) + { + *lastGlobalStorageDescriptor = globalStorageDescriptor; + lastGlobalStorageDescriptor = &globalStorageDescriptor->next; + } + + void FinalizeGlobalStorage() + { + auto current = firstGlobalStorageDescriptor; + while (current) { + current->globalStorage->EnsureFinalized(); + current = current->next; } - }; - - GlobalStorageManager& GetGlobalStorageManager() - { - static GlobalStorageManager globalStorageManager; - return globalStorageManager; } /*********************************************************************** GlobalStorage ***********************************************************************/ - GlobalStorage::GlobalStorage(const wchar_t* key) + GlobalStorage::GlobalStorage() { - InitializeGlobalStorage(); - GetGlobalStorageManager().storages->Add(key, this); } GlobalStorage::~GlobalStorage() { } - bool GlobalStorage::Cleared() + bool GlobalStorage::IsInitialized() { - return cleared; + return initialized; } -/*********************************************************************** -Helper Functions -***********************************************************************/ - - GlobalStorage* GetGlobalStorage(const wchar_t* key) + void GlobalStorage::EnsureInitialized() { - return GetGlobalStorage(WString::Unmanaged(key)); - } - - GlobalStorage* GetGlobalStorage(const WString& key) - { - return GetGlobalStorageManager().storages->Get(key); - } - - void InitializeGlobalStorage() - { - if (!GetGlobalStorageManager().storages) + if (!initialized) { - GetGlobalStorageManager().storages = Ptr(new Dictionary); + initialized = true; + InitializeResource(); } } - void FinalizeGlobalStorage() + void GlobalStorage::EnsureFinalized() { - if (GetGlobalStorageManager().storages) + if (initialized) { - for (vint i = 0; i < GetGlobalStorageManager().storages->Count(); i++) - { - GetGlobalStorageManager().storages->Values().Get(i)->ClearResource(); - } - GetGlobalStorageManager().storages = nullptr; + initialized = false; + FinalizeResource(); } } } diff --git a/Import/Vlpp.h b/Import/Vlpp.h index 7606554b..331284b4 100644 --- a/Import/Vlpp.h +++ b/Import/Vlpp.h @@ -8094,55 +8094,70 @@ namespace vl class GlobalStorage : public Object { private: - bool cleared = false; + bool initialized = false; + + protected: + virtual void InitializeResource() = 0; + virtual void FinalizeResource() = 0; + public: NOT_COPYABLE(GlobalStorage); - GlobalStorage(const wchar_t* key); + GlobalStorage(); ~GlobalStorage(); - bool Cleared(); - virtual void ClearResource() = 0; + bool IsInitialized(); + void EnsureInitialized(); + void EnsureFinalized(); }; - extern GlobalStorage* GetGlobalStorage(const wchar_t* key); - extern GlobalStorage* GetGlobalStorage(const WString& key); + struct GlobalStorageDescriptor + { + GlobalStorage* globalStorage = nullptr; + GlobalStorageDescriptor* next = nullptr; + }; + + extern void RegisterStorageDescriptor(GlobalStorageDescriptor* globalStorageDescriptor); - extern void InitializeGlobalStorage(); /// Free all memories used by global storages. extern void FinalizeGlobalStorage(); } -#define BEGIN_GLOBAL_STORAGE_CLASS(NAME) \ - class NAME : public vl::GlobalStorage \ - { \ - public: \ - NAME() \ - :vl::GlobalStorage(L ## #NAME) \ - { \ - InitializeClearResource(); \ - } \ - ~NAME() \ - { \ - if(!Cleared())ClearResource(); \ - } \ +#define BEGIN_GLOBAL_STORAGE_CLASS(NAME) \ + class NAME \ + : public vl::GlobalStorage \ + , private vl::GlobalStorageDescriptor \ + { \ + public: \ + NAME() \ + { \ + globalStorage = this; \ + vl::RegisterStorageDescriptor(this); \ + } \ + ~NAME() \ + { \ + EnsureFinalized(); \ + } \ -#define INITIALIZE_GLOBAL_STORAGE_CLASS \ - void InitializeClearResource() \ - { \ +#define INITIALIZE_GLOBAL_STORAGE_CLASS \ + protected: \ + void InitializeResource() \ + { \ -#define FINALIZE_GLOBAL_STORAGE_CLASS \ - } \ - void ClearResource() \ - { \ +#define FINALIZE_GLOBAL_STORAGE_CLASS \ + } \ + protected: \ + void FinalizeResource() \ + { \ -#define END_GLOBAL_STORAGE_CLASS(NAME) \ - } \ - }; \ - NAME& Get##NAME() \ - { \ - static NAME __global_storage_##NAME; \ - return __global_storage_##NAME; \ - } \ +#define END_GLOBAL_STORAGE_CLASS(NAME) \ + } \ + }; \ + NAME& Get##NAME() \ + { \ + static NAME __global_storage_##NAME; \ + __global_storage_##NAME.EnsureInitialized(); \ + return __global_storage_##NAME; \ + } \ #define EXTERN_GLOBAL_STORAGE_CLASS(NAME)\ class NAME;\ diff --git a/Tools/CppMerge.exe b/Tools/CppMerge.exe deleted file mode 100644 index 951f71724c5cf18b16e9d39d08e830bf5b1e9fec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256512 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 z 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