-
Notifications
You must be signed in to change notification settings - Fork 205
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RAII #659
RAII #659
Conversation
…gnment and construction.
…py, and a simple implementation of a unique smart pointer type with move semantics.
…eing a 'var', 'literal' or 'constant'.
…havior: deferred destructor call to data of lhs is performed after copy assignment.
Thanks for submitting this. Looks like CI is still having trouble. You removed I think it might help to go through some representative code samples for different patterns and show:
It sounds like the compositional aspect is still unimplemented here. |
…, e.g 'var a : A = ...', by setting rhs type only when required.
Merging with changes made directly on the remote: SDKROOT code commented out.
…pointer-like type.
Thanks for considering the pull request. Regarding the CI. I forgot to uncomment the SDKROOT code for macos (issue #657 ). Also, it seems like the last two months the CI is broken. In particular, the test I am preparing some code examples (shall I post them here?) In short, the metamethods are checked all the time. The check for I will wait with the compositional aspect until we converge to well tested and supported solution. |
…pointer variables.
…of an offset pointer type, which has an overloaded __copy method.
…to enable composable raii datastructures. Missing __init, __copy, __dtor methods are generated on the fly when needed.
… methods, such that they can potentially be called in sourcecode.
…__copy assignment call. resource handling is in the hands of the programmer in case of __copy.
…assignment of managed variables with a custom copy method.
I fixed this in #662 so hopefully those crashes will go away now. |
And the FreeBSD build should also be fixed now. |
Fantastic! I'll have time to check this next week. |
merging with upstream.
Great! CI seems to be working. |
…porary allocvar is created.
…ould have been hascopy.
…cted, calling the copyconstructor of the menaged members.
… careful not to call the copyconstructor if that's not the idea.
…y construction of managed structs.
…le args from functions.
…ea and cmake-build-debug to .ignore list.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll need to get back to this, but I left some initial comments.
Overall in terms of the code, it would be easier to review this if we either (a) removed formatting changes to terralib.lua
or (b) applied those in a separate PR and then merged this PR on top of that one. I realize both approaches require effort but at the moment it's difficult to review simply due to the volume of whitespace changes we're talking about.
.gitignore
Outdated
@@ -1,6 +1,7 @@ | |||
/.idea | |||
/cmake-build-debug | |||
/build | |||
/cmake-build-debug |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is now a duplicate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed
lib/raii.md
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you put this file under docs/
then it will appear on the website once this PR is accepted, which I think would be nice.
I'm not sure how much it matters but I could suggest some formatting changes for the document itself:
- Capitalizing language names consistently: C++ not c++
- No need italicize language names: C++ not C++
- For code, types and function/method names, use code style not italics:
std::string
not std::string - Have you run a spell checker?
- For code blocks, you can generalize use
```
by itself and do not need to also indent - When you have a code block inside a list, I'm pretty sure GitHub's markdown is smart enough to make the code block part of the list item if you indent the entire block starting with the
```
line
I know there was quite a bit of effort that went into deciding this design, maybe that's worth documenting here too under a "Design decisions" section or similar?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Improved documentation and added under docs/raii.md
lib/raii.md
Outdated
``` | ||
terra foo() | ||
var b : A | ||
return bar(b) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This appears to be pass-by-value so is b
not copied on being passed to bar
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, but terra performs shallow copies. Indeed, the example would also hold if passed by reference.
Honestly, it's a very bad code pattern that should not compile. I've removed it from the documentation. I'll add a section later on "don'ts"
@@ -555,13 +555,13 @@ function T.terrafunction:setinlined(v) | |||
assert(self:isdefined(), "attempting to set the inlining state of an undefined function") | |||
self.definition.alwaysinline = not not v | |||
assert(not (self.definition.alwaysinline and self.definition.dontoptimize), | |||
"setinlined(true) and setoptimized(false) are incompatible") | |||
"setinlined(true) and setoptimized(false) are incompatible") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't begrudge removing the trailing whitespace in most of this file, but this change seems to not follow the rest of the formatting of the code generally.
Is there a standardized code formatter you used to generate this formatting? We should probably talk about this.
I will say that the whitespace formatting changes do make the diffs rather hard to read, simply due to sheer volume. I'm not sure whether they can be easily backed out or applied separately. I suppose one option is to apply the format to the master branch first and rebase/merge this branch on top.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know exactly how that happened. I am using CLion for the first time, because it has debug capability for the C++ as well as the Lua side of the compiler stack. Maybe I pushed a wrong button.
The implementation has gone through quite some addition and shaving. Maybe it's good I close and reopen the pull request such that we get a clean commit history. That also gives me the change to review all the parts again myself and add some additional documentation here and there.
reopened in #680 |
I've closed #658 [(https://github.com//pull/658)] and reopened it here in order to get a clean git commit history. This second attempt is implemented from scratch.
I'll summarize the pull request and the revised design:
Objective: The point of the contribution is to add some metamethods to enable RAII in order to implement smart containers and smart pointers, like
std::string
,std::vector
andstd::unique_ptr
,std::shared_ptr
,boost:offset_ptr
in C++.The design does not introduce any breaking changes. No new keywords are introduced. Heap resources are acquired and released using the regular C stdlib functions such malloc and free, leaving memory allocation in the hands of the programmer.
New metamethods: The following metamethods are implemented:
__init(self : &A)
__dtor(self : &A)
__copy(from : &A, to : &B)
If implemented, these methods are inserted judiciously during the type checking phase, implemented in terralib.lua. All these metamethods can be implemented as macro's or as terra functions.
I will explain the metamethods in some more depth:
A managed type is one that implements the above metamethods. In the following I assume
struct A
is a managed type.__init
is used to initialize managed variables:The implementation checks for an
__init
metamethod in any defvar statement:var a : A
and applies it if it exists.__dtor
can be used to free heap memoryThe implementation adds a deferred call to
__dtor
(right before any return statements) for any variable local to the current scope that is not returned. Hence, it is tied to the lifetime of the object.__dtor
is also called before any copy-assignment.__copy
enables specialized copy-assignment and, combined with__init
, copy construction.__copy
takes two arguments, which can be different, as long as one of them is a managed type, e.g.and / or
__copy
can be an overloaded function. In object construction, in case ofb
below,__copy
is combined with__init
to perform copy construction:which is the same as writing
I think the above covers all the use cases of smart containers and pointers in c++. I still need to make the metamethods work properly in the case of compositional API's, like mentioned in #658 (
vector(vector(int))
or avector(string)
).First, let's verify that the CI is passing. Over the next few days I'll add some more tests to test managed data-structures.