Thanks, but note that your last test is not guaranteed to always succeed. You're checking that some value is not found on stack, and trying to prevent leftover stale values on stack to make the test pass. Most times this will likely work, but you can't 100% guarantee that some value will not be present on the stack, and if it does your test will flakily fail. This could happen if e.g. a pointer somehow leaks to stack unexpectedly (stale value, some compiler optimization, etc...) or just a random false positive (i.e. the address of your object randomly appearing on stack regardless of any actual pointers to it).
On Friday, August 9, 2024 at 1:53:15 AM UTC+2 zcb...@gmail.com wrote: > For future reference, here is the test that verifies pointers in > std::variant can be retained but pointers in std::vector can not: > > https://github.com/compilets/compilets/blob/abb49a4/cpp/runtime/tests/stack_unittest.cc > > On Thursday, August 8, 2024 at 9:59:11 PM UTC+9 Cheng wrote: > >> Thanks for the explanation! >> >> I was actually quite confused why pointer in vector was also retained, >> I'll fix my tests. >> >> On Thursday, August 8, 2024 at 8:00:44 PM UTC+9 omer...@chromium.org >> wrote: >> >>> For some reasons my previous replies didn't get to the mailing list. >>> >>> The question is whether the pointer itself is on the stack or not. >>> IIRC std::variant uses inline storage to store values, so a pointer that >>> you keep in a std::variant would be on stack and would be found by stack >>> scanning. >>> std::vector, on the other hand, allocates an off-stack backing store >>> that it allocates (and reallocates as the vector grows), so pointers kept >>> in a std::vector would not be found by stack scanning. >>> >>> If your tests pass, it's because the GC is finding your pointer >>> somewhere else on the stack (e.g. left over from calling set_needle), but >>> not in the vector. >>> On Thursday, August 8, 2024 at 10:43:43 AM UTC+2 zcb...@gmail.com wrote: >>> >>>> To answer my own question, I wrote some tests: >>>> >>>> https://github.com/compilets/compilets/commit/d69722fb36260caa278843311cb043f5fe8a90d7 >>>> >>>> It seems that pointers stored in containers can be retained. >>>> (It would be great if someone can verify this though.) >>>> >>>> On Thursday, August 8, 2024 at 9:11:33 AM UTC+9 Cheng wrote: >>>> >>>>> Cppgc does stack scanning so objects pointed by raw pointers on stack >>>>> are not garbage collected: >>>>> >>>>> Object* ptr = MakeGarbageCollected<Object>(); // retained. >>>>> >>>>> But what if I put the pointer in a variant? >>>>> >>>>> std::variant<Object*, std::monostate> ptr = >>>>> MakeGarbageCollected<Object>(); // retain? >>>>> >>>>> Or even in a vector? >>>>> >>>>> std::vector<Object*> ptrs = { MakeGarbageCollected<Object>() }; // >>>>> retain? >>>>> >>>>> Will the object still be retained by the container of pointer on stack? >>>>> >>>> -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/744847de-cb8c-42a8-b8ee-4ebaa7b66323n%40googlegroups.com.