aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-04-26 14:17:19 -0600
committerTobin Ehlis <tobine@google.com>2016-04-28 08:26:44 -0600
commit2c9664ec83161cffa0001f1b90a4a377822a399b (patch)
tree81d29513dc8abc9ac7d425dcea75ad711947297f
parent9071bb96976a02fd9e321abb308fffcd62e905dd (diff)
downloadusermoji-2c9664ec83161cffa0001f1b90a4a377822a399b.tar.xz
layers: Add copy constructors and initializers for safe_* structs
Any safe struct for which default copy constructor was incorrect was broken (anything with embedded ptrs). This change fixes that by adding correct copy constructors. Also had to add initializers that can take object ptrs in order for copy constructor code to work.
-rwxr-xr-xvk_helper.py14
1 files changed, 13 insertions, 1 deletions
diff --git a/vk_helper.py b/vk_helper.py
index a4e79488..fc99b1cc 100755
--- a/vk_helper.py
+++ b/vk_helper.py
@@ -1599,9 +1599,11 @@ class StructWrapperGen:
else:
ss_decls.append(" %s %s;" % (m_type, self.struct_dict[s][m]['name']))
ss_decls.append(" %s(const %s* pInStruct);" % (ss_name, s))
- ss_decls.append(" %s();" % (ss_name))
+ ss_decls.append(" %s(const %s& src);" % (ss_name, ss_name)) # Copy constructor
+ ss_decls.append(" %s();" % (ss_name)) # Default constructor
ss_decls.append(" ~%s();" % (ss_name))
ss_decls.append(" void initialize(const %s* pInStruct);" % (s))
+ ss_decls.append(" void initialize(const %s* src);" % (ss_name))
ss_decls.append(" %s *ptr() { return reinterpret_cast<%s *>(this); }" % (s, s))
ss_decls.append(" %s const *ptr() const { return reinterpret_cast<%s const *>(this); }" % (s, s))
ss_decls.append("};")
@@ -1732,8 +1734,18 @@ class StructWrapperGen:
construct_txt = custom_construct_txt[s]
ss_src.append("\n%s::%s(const %s* pInStruct) : %s\n{\n%s}" % (ss_name, ss_name, s, init_list, construct_txt))
ss_src.append("\n%s::%s() {}" % (ss_name, ss_name))
+ # Create slight variation of init and construct txt for copy constructor that takes a src object reference vs. struct ptr
+ copy_construct_init = init_func_txt.replace('pInStruct->', 'src.')
+ copy_construct_txt = construct_txt.replace(' (pInStruct->', ' (src.') # Exclude 'if' blocks from next line
+ copy_construct_txt = copy_construct_txt.replace('(pInStruct->', '(*src.') # Pass object to copy constructors
+ copy_construct_txt = copy_construct_txt.replace('pInStruct->', 'src.') # Modify remaining struct refs for src object
+ ss_src.append("\n%s::%s(const %s& src)\n{\n%s%s}" % (ss_name, ss_name, ss_name, copy_construct_init, copy_construct_txt)) # Copy constructor
ss_src.append("\n%s::~%s()\n{\n%s}" % (ss_name, ss_name, destruct_txt))
ss_src.append("\nvoid %s::initialize(const %s* pInStruct)\n{\n%s%s}" % (ss_name, s, init_func_txt, construct_txt))
+ # Copy initializer uses same txt as copy constructor but has a ptr and not a reference
+ init_copy = copy_construct_init.replace('src.', 'src->')
+ init_construct = copy_construct_txt.replace('src.', 'src->')
+ ss_src.append("\nvoid %s::initialize(const %s* src)\n{\n%s%s}" % (ss_name, ss_name, init_copy, init_construct))
if s in ifdef_dict:
ss_src.append('#endif')
return "\n".join(ss_src)