aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-01-05 16:34:59 -0700
committerJon Ashburn <jon@lunarg.com>2016-01-07 11:57:45 -0700
commit6814d87b30b8ae431d693f4b2163b3b7f26ea003 (patch)
tree78ed6e047a7b549f0b7699a8c355182ca8846dfa
parentec17404d1a07abf6dbc5e011787f1c43d1f344c6 (diff)
downloadusermoji-6814d87b30b8ae431d693f4b2163b3b7f26ea003.tar.xz
layers: UniqueObject updates based on review
Remove all of the DebugReport stuff, this layer doesn't use it. Update some corner cases to make sure objects are correctly restored.
-rw-r--r--layers/unique_objects.h208
-rwxr-xr-xvk-layer-generate.py42
2 files changed, 69 insertions, 181 deletions
diff --git a/layers/unique_objects.h b/layers/unique_objects.h
index f12cf8c3..68505e28 100644
--- a/layers/unique_objects.h
+++ b/layers/unique_objects.h
@@ -23,7 +23,6 @@
* Author: Tobin Ehlis <tobine@google.com>
*/
-// CODEGEN : file vk-layer-generate.py line #1757
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -37,26 +36,27 @@
#include "vulkan/vk_layer.h"
#include "vk_layer_config.h"
-//#include "vulkan/vk_lunarg_debug_report.h"
#include "vk_layer_table.h"
#include "vk_layer_data.h"
#include "vk_layer_logging.h"
#include "vk_layer_extension_utils.h"
struct layer_data {
- debug_report_data *report_data;
- VkDebugReportCallbackEXT logging_callback;
bool wsi_enabled;
layer_data() :
- report_data(nullptr),
- logging_callback(VK_NULL_HANDLE),
wsi_enabled(false)
{};
};
struct instExts {
bool wsi_enabled;
+ bool xlib_enabled;
+ bool xcb_enabled;
+ bool wayland_enabled;
+ bool mir_enabled;
+ bool android_enabled;
+ bool win32_enabled;
};
static std::unordered_map<void*, struct instExts> instanceExtMap;
@@ -70,33 +70,6 @@ struct VkUniqueObject
uint64_t actualObject;
};
-static void
-initUniqueObjects(
- layer_data *my_data,
- const VkAllocationCallbacks *pAllocator)
-{
- uint32_t report_flags = 0;
- uint32_t debug_action = 0;
- FILE *log_output = NULL;
- const char *option_str;
- // initialize UniqueObjects options
- report_flags = getLayerOptionFlags("UniqueObjectsReportFlags", 0);
- getLayerOptionEnum("UniqueObjectsDebugAction", (uint32_t *) &debug_action);
-
- if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
- {
- option_str = getLayerOption("UniqueObjectsLogFilename");
- log_output = getLayerLogOutput(option_str, "UniqueObjects");
- VkDebugReportCallbackCreateInfoEXT dbgInfo;
- memset(&dbgInfo, 0, sizeof(dbgInfo));
- dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
- dbgInfo.pfnCallback = log_callback;
- dbgInfo.pUserData = log_output;
- dbgInfo.flags = report_flags;
- layer_create_msg_callback(my_data->report_data, &dbgInfo, pAllocator, &my_data->logging_callback);
- }
-}
-
// Handle CreateInstance
static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreateInfo, VkInstance instance)
{
@@ -107,7 +80,7 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreate
pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
pDisp->GetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
pDisp->GetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR) gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
-#if VK_USE_PLATFORM_WIN32_KHR
+#ifdef VK_USE_PLATFORM_WIN32_KHR
pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR) gpa(instance, "vkCreateWin32SurfaceKHR");
pDisp->GetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR) gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
#endif // VK_USE_PLATFORM_WIN32_KHR
@@ -131,10 +104,34 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreate
pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR) gpa(instance, "vkCreateAndroidSurfaceKHR");
#endif // VK_USE_PLATFORM_ANDROID_KHR
- instanceExtMap[pDisp].wsi_enabled = false;
+ instanceExtMap[pDisp] = {};
for (i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) {
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0)
instanceExtMap[pDisp].wsi_enabled = true;
+#ifdef VK_USE_PLATFORM_XLIB_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0)
+ instanceExtMap[pDisp].xlib_enabled = true;
+#endif
+#ifdef VK_USE_PLATFORM_XCB_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0)
+ instanceExtMap[pDisp].xcb_enabled = true;
+#endif
+#ifdef VK_USE_PLATFORM_WAYLAND_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0)
+ instanceExtMap[pDisp].wayland_enabled = true;
+#endif
+#ifdef VK_USE_PLATFORM_MIR_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0)
+ instanceExtMap[pDisp].mir_enabled = true;
+#endif
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0)
+ instanceExtMap[pDisp].android_enabled = true;
+#endif
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0)
+ instanceExtMap[pDisp].win32_enabled = true;
+#endif
}
}
@@ -149,15 +146,7 @@ explicit_CreateInstance(
VkResult result = pInstanceTable->CreateInstance(pCreateInfo, pAllocator, pInstance);
if (result == VK_SUCCESS) {
- layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
- my_data->report_data = debug_report_create_instance(
- pInstanceTable,
- *pInstance,
- pCreateInfo->enabledExtensionNameCount,
- pCreateInfo->ppEnabledExtensionNames);
createInstanceRegisterExtensions(pCreateInfo, *pInstance);
-
- initUniqueObjects(my_data, pAllocator);
}
return result;
}
@@ -190,9 +179,6 @@ explicit_CreateDevice(
VkLayerDispatchTable *pDeviceTable = get_dispatch_table(unique_objects_device_table_map, *pDevice);
VkResult result = pDeviceTable->CreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
if (result == VK_SUCCESS) {
- layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map);
- layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
- my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
createDeviceRegisterExtensions(pCreateInfo, *pDevice);
}
return result;
@@ -449,11 +435,11 @@ VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipeli
}
}
if (VK_SUCCESS == result) {
- std::vector<VkUniqueObject*> uniquePipelines = {};
+ VkUniqueObject* pUO = NULL;
for (uint32_t i=0; i<createInfoCount; ++i) {
- uniquePipelines.push_back(new VkUniqueObject());
- uniquePipelines[i]->actualObject = (uint64_t)pPipelines[i];
- pPipelines[i] = (VkPipeline)uniquePipelines[i];
+ pUO = new VkUniqueObject();
+ pUO->actualObject = (uint64_t)pPipelines[i];
+ pPipelines[i] = (VkPipeline)pUO;
}
}
return result;
@@ -524,130 +510,16 @@ VkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipel
}
}
if (VK_SUCCESS == result) {
- std::vector<VkUniqueObject*> uniquePipelines = {};
+ VkUniqueObject* pUO = NULL;
for (uint32_t i=0; i<createInfoCount; ++i) {
- uniquePipelines.push_back(new VkUniqueObject());
- uniquePipelines[i]->actualObject = (uint64_t)pPipelines[i];
- pPipelines[i] = (VkPipeline)uniquePipelines[i];
+ pUO = new VkUniqueObject();
+ pUO->actualObject = (uint64_t)pPipelines[i];
+ pPipelines[i] = (VkPipeline)pUO;
}
}
return result;
}
-void explicit_UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies)
-{
-// UNWRAP USES:
-// 0 : pDescriptorWrites[descriptorWriteCount]->dstSet,VkDescriptorSet, pDescriptorWrites[descriptorWriteCount]->pImageInfo[descriptorCount]->sampler,VkSampler, pDescriptorWrites[descriptorWriteCount]->pImageInfo[descriptorCount]->imageView,VkImageView, pDescriptorWrites[descriptorWriteCount]->pBufferInfo[descriptorCount]->buffer,VkBuffer, pDescriptorCopies[descriptorCopyCount]->srcSet,VkDescriptorSet, pDescriptorCopies[descriptorCopyCount]->dstSet,VkDescriptorSet
- std::vector<VkDescriptorSet> original_dstSet1 = {};
- std::vector<VkSampler> original_sampler = {};
- std::vector<VkImageView> original_imageView = {};
- std::vector<VkBuffer> original_buffer = {};
- std::vector<VkDescriptorSet> original_srcSet = {};
- std::vector<VkDescriptorSet> original_dstSet2 = {};
-// descriptorCount : pDescriptorWrites[descriptorWriteCount]->pTexelBufferView,VkBufferView
- std::vector<VkBufferView> original_pTexelBufferView = {};
- if (pDescriptorWrites) {
- for (uint32_t index0=0; index0<descriptorWriteCount; ++index0) {
- if (pDescriptorWrites[index0].dstSet) {
- VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorWrites[index0].dstSet);
- original_dstSet1.push_back(pDescriptorWrites[index0].dstSet);
- *(pDescriptorSet) = (VkDescriptorSet)((VkUniqueObject*)pDescriptorWrites[index0].dstSet)->actualObject;
- }
- if (pDescriptorWrites[index0].pImageInfo) {
- for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) {
- if (pDescriptorWrites[index0].pImageInfo[index1].sampler) {
- VkSampler* pSampler = (VkSampler*)&(pDescriptorWrites[index0].pImageInfo[index1].sampler);
- original_sampler.push_back(pDescriptorWrites[index0].pImageInfo[index1].sampler);
- *(pSampler) = (VkSampler)((VkUniqueObject*)pDescriptorWrites[index0].pImageInfo[index1].sampler)->actualObject;
- }
- if (pDescriptorWrites[index0].pImageInfo[index1].imageView) {
- VkImageView* pImageView = (VkImageView*)&(pDescriptorWrites[index0].pImageInfo[index1].imageView);
- original_imageView.push_back(pDescriptorWrites[index0].pImageInfo[index1].imageView);
- *(pImageView) = (VkImageView)((VkUniqueObject*)pDescriptorWrites[index0].pImageInfo[index1].imageView)->actualObject;
- }
- }
- }
- if (pDescriptorWrites[index0].pBufferInfo) {
- for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) {
- if (pDescriptorWrites[index0].pBufferInfo[index1].buffer) {
- VkBuffer* pBuffer = (VkBuffer*)&(pDescriptorWrites[index0].pBufferInfo[index1].buffer);
- original_buffer.push_back(pDescriptorWrites[index0].pBufferInfo[index1].buffer);
- *(pBuffer) = (VkBuffer)((VkUniqueObject*)pDescriptorWrites[index0].pBufferInfo[index1].buffer)->actualObject;
- }
- }
- }
- if (pDescriptorWrites[index0].pTexelBufferView) {
- for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) {
- VkBufferView** ppBufferView = (VkBufferView**)&(pDescriptorWrites[index0].pTexelBufferView);
- original_pTexelBufferView.push_back(pDescriptorWrites[index0].pTexelBufferView[index1]);
- *(ppBufferView[index1]) = (VkBufferView)((VkUniqueObject*)pDescriptorWrites[index0].pTexelBufferView[index1])->actualObject;
- }
- }
- }
- }
- if (pDescriptorCopies) {
- for (uint32_t index0=0; index0<descriptorCopyCount; ++index0) {
- if (pDescriptorCopies[index0].srcSet) {
- VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].srcSet);
- original_srcSet.push_back(pDescriptorCopies[index0].srcSet);
- *(pDescriptorSet) = (VkDescriptorSet)((VkUniqueObject*)pDescriptorCopies[index0].srcSet)->actualObject;
- }
- if (pDescriptorCopies[index0].dstSet) {
- VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].dstSet);
- original_dstSet2.push_back(pDescriptorCopies[index0].dstSet);
- *(pDescriptorSet) = (VkDescriptorSet)((VkUniqueObject*)pDescriptorCopies[index0].dstSet)->actualObject;
- }
- }
- }
- get_dispatch_table(unique_objects_device_table_map, device)->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
- if (pDescriptorWrites) {
- for (uint32_t index0=0; index0<descriptorWriteCount; ++index0) {
- if (pDescriptorWrites[index0].dstSet) {
- VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorWrites[index0].dstSet);
- *(pDescriptorSet) = original_dstSet1[index0];
- }
- if (pDescriptorWrites[index0].pImageInfo) {
- for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) {
- if (pDescriptorWrites[index0].pImageInfo[index1].sampler) {
- VkSampler* pSampler = (VkSampler*)&(pDescriptorWrites[index0].pImageInfo[index1].sampler);
- *(pSampler) = original_sampler[index1];
- }
- if (pDescriptorWrites[index0].pImageInfo[index1].imageView) {
- VkImageView* pImageView = (VkImageView*)&(pDescriptorWrites[index0].pImageInfo[index1].imageView);
- *(pImageView) = original_imageView[index1];
- }
- }
- }
- if (pDescriptorWrites[index0].pBufferInfo) {
- for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) {
- if (pDescriptorWrites[index0].pBufferInfo[index1].buffer) {
- VkBuffer* pBuffer = (VkBuffer*)&(pDescriptorWrites[index0].pBufferInfo[index1].buffer);
- *(pBuffer) = original_buffer[index1];
- }
- }
- }
- if (pDescriptorWrites[index0].pTexelBufferView) {
- for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) {
- VkBufferView** ppBufferView = (VkBufferView**)&(pDescriptorWrites[index0].pTexelBufferView);
- *(ppBufferView[index1]) = original_pTexelBufferView[index1];
- }
- }
- }
- }
- if (pDescriptorCopies) {
- for (uint32_t index0=0; index0<descriptorCopyCount; ++index0) {
- if (pDescriptorCopies[index0].srcSet) {
- VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].srcSet);
- *(pDescriptorSet) = original_srcSet[index0];
- }
- if (pDescriptorCopies[index0].dstSet) {
- VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].dstSet);
- *(pDescriptorSet) = original_dstSet2[index0];
- }
- }
- }
-}
-
VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages)
{
// UNWRAP USES:
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index f7eabcb1..e4d4ea7b 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -1951,24 +1951,26 @@ class UniqueObjectsSubcommand(Subcommand):
return "\n".join(header_txt)
# Generate UniqueObjects code for given struct_uses dict of objects that need to be unwrapped
+ # vector_name_set is used to make sure we don't replicate vector names
+ # first_level_param indicates if elements are passed directly into the function else they're below a ptr/struct
# TODO : Comment this code
- def _gen_obj_code(self, struct_uses, indent, prefix, array_index, unique_count):
+ def _gen_obj_code(self, struct_uses, indent, prefix, array_index, vector_name_set, first_level_param):
decls = ''
pre_code = ''
post_code = ''
- for obj in struct_uses:
- unique_count += 1
+ for obj in sorted(struct_uses):
name = obj
array = ''
if '[' in obj:
(name, array) = obj.split('[')
array = array.strip(']')
+ ptr_type = False
+ if 'p' == obj[0]: # TODO : Not idea way to determine ptr
+ ptr_type = True
if isinstance(struct_uses[obj], dict):
local_prefix = ''
name = '%s%s' % (prefix, name)
- ptr_type = False
- if 'p' == obj[0]:
- ptr_type = True
+ if ptr_type:
pre_code += '%sif (%s) {\n' % (indent, name)
post_code += '%sif (%s) {\n' % (indent, name)
indent += ' '
@@ -1984,7 +1986,7 @@ class UniqueObjectsSubcommand(Subcommand):
else:
local_prefix = '%s.' % (name)
assert isinstance(decls, object)
- (tmp_decl, tmp_pre, tmp_post) = self._gen_obj_code(struct_uses[obj], indent, local_prefix, array_index, unique_count+1)
+ (tmp_decl, tmp_pre, tmp_post) = self._gen_obj_code(struct_uses[obj], indent, local_prefix, array_index, vector_name_set, False)
decls += tmp_decl
pre_code += tmp_pre
post_code += tmp_post
@@ -1997,12 +1999,12 @@ class UniqueObjectsSubcommand(Subcommand):
pre_code += '%s}\n' % (indent)
post_code += '%s}\n' % (indent)
else:
- if (array_index > 0):
+ if (array_index > 0) or array != '': # TODO : This is not ideal, really want to know if we're anywhere under an array
pre_code += '%sif (%s%s) {\n' %(indent, prefix, name)
post_code += '%sif (%s%s) {\n' %(indent, prefix, name)
indent += ' '
# Append unique_count to make sure name is unique (some aliasing for "buffer" and "image" names
- vec_name = 'original_%s%s' % (name, unique_count)
+ vec_name = 'original_%s' % (name)
if array != '':
idx = 'idx%s' % str(array_index)
array_index += 1
@@ -2013,7 +2015,9 @@ class UniqueObjectsSubcommand(Subcommand):
pName = 'p%s' % (struct_uses[obj][2:])
pre_code += '%s%s* %s = (%s*)&(%s%s);\n' % (indent, struct_uses[obj], pName, struct_uses[obj], prefix, name)
post_code += '%s%s* %s = (%s*)&(%s%s);\n' % (indent, struct_uses[obj], pName, struct_uses[obj], prefix, name)
- decls += ' std::vector<%s> %s = {};\n' % (struct_uses[obj], vec_name)
+ if name not in vector_name_set:
+ vector_name_set.add(name)
+ decls += ' std::vector<%s> %s = {};\n' % (struct_uses[obj], vec_name)
pre_code += '%s%s.push_back(%s%s);\n' % (indent, vec_name, prefix, name)
pre_code += '%s*(%s) = (%s)((VkUniqueObject*)%s%s)->actualObject;\n' % (indent, pName, struct_uses[obj], prefix, name)
post_code += '%s*(%s) = %s.front();\n' % (indent, pName, vec_name)
@@ -2028,10 +2032,19 @@ class UniqueObjectsSubcommand(Subcommand):
else:
pre_code += '%sif (%s%s) {\n' %(indent, prefix, name)
indent += ' '
- pre_code += '%s%s* p%s = (%s*)%s%s;\n' % (indent, struct_uses[obj], name, struct_uses[obj], prefix, name)
+ deref_txt = '&'
+ if ptr_type:
+ deref_txt = ''
+ pre_code += '%s%s* p%s = (%s*)%s%s%s;\n' % (indent, struct_uses[obj], name, struct_uses[obj], deref_txt, prefix, name)
pre_code += '%s*p%s = (%s)((VkUniqueObject*)%s%s)->actualObject;\n' % (indent, name, struct_uses[obj], prefix, name)
indent = indent[4:]
pre_code += '%s}\n' % (indent)
+ if not first_level_param: # embedded in a ptr/struct so need to undo the update
+ decls += ' %s local_%s = %s%s;\n' % (struct_uses[obj], name, prefix, name)
+ post_code += '%sif (%s%s) {\n' %(indent, prefix, name)
+ post_code += '%s %s* p%s = (%s*)%s%s%s;\n' % (indent, struct_uses[obj], name, struct_uses[obj], deref_txt, prefix, name)
+ post_code += '%s *p%s = local_%s;\n' % (indent, name, name)
+ post_code += '%s}\n' % (indent)
return decls, pre_code, post_code
def generate_intercept(self, proto, qual):
@@ -2044,9 +2057,12 @@ class UniqueObjectsSubcommand(Subcommand):
indent = ' ' # indent level for generated code
decl = proto.c_func(prefix="vk", attr="VKAPI")
# A few API cases that are manual code
+ # TODO : Special case Create*Pipelines funcs to handle creating multiple unique objects
explicit_object_tracker_functions = ['GetSwapchainImagesKHR',
'CreateInstance',
- 'CreateDevice',]
+ 'CreateDevice',
+ 'CreateComputePipelines',
+ 'CreateGraphicsPipelines']
# Give special treatment to create functions that return multiple new objects
# This dict stores array name and size of array
custom_create_dict = {'pDescriptorSets' : 'pAllocateInfo->setLayoutCount'}
@@ -2072,7 +2088,7 @@ class UniqueObjectsSubcommand(Subcommand):
if destroy_func: # only one object
for del_obj in struct_uses:
pre_call_txt += '%s%s local_%s = %s;\n' % (indent, struct_uses[del_obj], del_obj, del_obj)
- (pre_decl, pre_code, post_code) = self._gen_obj_code(struct_uses, ' ', '', 0, 0)
+ (pre_decl, pre_code, post_code) = self._gen_obj_code(struct_uses, ' ', '', 0, set(), True)
pre_call_txt += '%s%s' % (pre_decl, pre_code)
post_call_txt += post_code
elif create_func: