Open
Conversation
This part of the code makes a copy of the original reference without calling the destructor at any time for it (original reference).
Instead of using a default constructor / copy constructor and then one destructor for each, such C++ copy elision optimization, it's better to simply remove copy.
Simple example of the problem:
public global::Lldb.SBSymbolContext GetSymbolContext(uint resolve_scope)
{
var __ret = new global::Lldb.SBSymbolContext.__Internal();
__Internal.GetSymbolContext((__Instance + __PointerAdjustment), new IntPtr(&__ret), resolve_scope); // here __ret is initialized like a constructor
return global::Lldb.SBSymbolContext.__CreateInstance(__ret);
}
internal static global::Lldb.SBSymbolContext __CreateInstance(global::Lldb.SBSymbolContext.__Internal native, bool skipVTables = false)
{
return new global::Lldb.SBSymbolContext(native, skipVTables);
}
private SBSymbolContext(global::Lldb.SBSymbolContext.__Internal native, bool skipVTables = false)
: this(__CopyValue(native), skipVTables)
{
__ownsNativeInstance = true;
NativeToManagedMap[__Instance] = this;
}
private static void* __CopyValue(global::Lldb.SBSymbolContext.__Internal native)
{
var ret = Marshal.AllocHGlobal(sizeof(global::Lldb.SBSymbolContext.__Internal));
global::Lldb.SBSymbolContext.__Internal.cctor(ret, new global::System.IntPtr(&native));
return ret.ToPointer();
}
After the fix:
private static void* __CopyValue(global::Lldb.SBSymbolContext.__Internal native)
{
var ret = Marshal.AllocHGlobal(sizeof(global::Lldb.SBSymbolContext.__Internal));
*(global::Lldb.SBSymbolContext.__Internal*) ret = native;
return ret.ToPointer();
}
|
|
0464938 to
637018f
Compare
ddobrev
suggested changes
Nov 9, 2018
Contributor
ddobrev
left a comment
There was a problem hiding this comment.
The generated code now does not call the non-trivial constructor if any. I think this might lead to incorrect behaviours on the native side.
91e219c to
32da859
Compare
a0169c2 to
3ea7e97
Compare
a1559de to
304d673
Compare
a08e24b to
0e1fb0b
Compare
1610aa5 to
64b1efd
Compare
c930b78 to
c38556a
Compare
4c1e9b8 to
2fdd082
Compare
bcf41e4 to
851ec5e
Compare
97610ec to
a2aeaed
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This part of the code makes a copy of the original reference without calling the destructor at any time for it (original reference).
Instead of using a default constructor / copy constructor and then one destructor for each, such C++ copy elision optimization, it's better to simply remove copy.
Simple example of the problem:
After the fix: