Jakob, you rule. That in fact fixed all my problems. Thanks to you and Zac for all the guidance!
On Thursday, June 21, 2018 at 11:12:24 PM UTC+2, Jakob Kummerow wrote: > > The Local class defines an operator == that should do exactly what you > need. > > On Thu, Jun 21, 2018 at 5:43 AM Gonzalo Diethelm <gonzalo....@gmail.com > <javascript:>> wrote: > >> Sure, slot does have a value, I just didn't include it in the code. >> Something like: >> >> Local<Value> slot = String::NewFromUtf8(isolate, "MyBeautifulSlot", >> NewStringType::kNormal).ToLocalChecked(); >> >> Cheers! >> >> On Thursday, June 21, 2018 at 2:27:00 PM UTC+2, Zac Hansen wrote: >>> >>> You're dereferencing a "super pointer" to get to a "pointer", hence * >>> not &. You can't "go back" because the local/global<T> represents an >>> "reference count" to the object which must be known to the JS runtime. >>> >>> As for p0 and p1, have you tried setting slot to a fixed string value >>> before using it as a key for storing/lookup? I don't know what the >>> expected behavior of using an empty value as a key into an object is. >>> >>> These are all just guesses - if someone else answers differently, I'm >>> probably wrong. >>> >>> >>> On Thursday, June 21, 2018 at 5:07:50 AM UTC-7, Gonzalo Diethelm wrote: >>>> >>>> Note to self: this might be related to Local<Object> vs Global<Object> >>>> (or Persistent<Object>? so many names...) >>>> >>>> Need to look into that. >>>> >>>> On Thursday, June 21, 2018 at 7:58:37 AM UTC+2, Gonzalo Diethelm wrote: >>>>> >>>>> I run the following JS code in the Chrome console: >>>>> >>>>> // Version 67.0.3396.87 (Official Build) (64-bit) >>>>> >>>>> var x = [1, 2, {"foo": 11}]; >>>>> x[2].bar = x; >>>>> >>>>> Now from C++ code, I get ahold of x as a Local<Object>, and wish to >>>>> traverse the whole structure; for the sake of the example, let's say I am >>>>> converting it into serialized data (I know I can use JSON.stringify() to >>>>> do >>>>> this, serializing is just an example to clarify ideas). My question is, >>>>> how can I keep track of the nodes in the structure that I have already >>>>> seen, and their associated serialized value, so that I can avoid an >>>>> infinite traversal? >>>>> >>>>> It seems to me doing this would require a way to get a unique identity >>>>> for each node, so that the C++ code can do something similar to this: >>>>> >>>>> typedef map<NodeId, NodeData> NodeMap; >>>>> NodeMap seen; >>>>> ... >>>>> Local<Object> node = current.GetNextChild(); >>>>> NodeId id = node.GetUniqueId(); >>>>> NodeMap::iterator k = seen.find(id); >>>>> NodeData data; >>>>> if (k != seen.end()) { >>>>> // node already seen, reuse its serialization >>>>> data = k->first; >>>>> } else { >>>>> // first time we see node, serialize and remember >>>>> data = node.Serialize(); // recurses >>>>> seen[id] = data; >>>>> } >>>>> >>>>> The specific question is: what type could be NodeId, and how do I get >>>>> the equivalent of GetUniqueId()? >>>>> >>>>> I am very tempted to ask for a way to get a raw void* to each node, >>>>> but I guess any way of doing this is fine, as long as I can get a unique >>>>> id >>>>> that is stable while I'm traversing the data. For these reasons, >>>>> GetIdentityHash() does not seem to fit the bill: "*The return value >>>>> will never be 0. Also, it is not guaranteed to be unique.*" >>>>> >>>>> Incidentally, If I try to use JSON.stringify for my data, I get this: >>>>> >>>>> JSON.stringify(x) >>>>> VM170:1 Uncaught TypeError: Converting circular structure to JSON >>>>> at JSON.stringify (<anonymous>) >>>>> at <anonymous>:1:6 >>>>> >>>>> This is taken care of here in the V8 code: >>>>> >>>>> JsonStringifier::Result JsonStringifier::StackPush(Handle<Object> >>>>> object) { >>>>> ... >>>>> // member stack_ is: Handle<JSArray> stack_; >>>>> int length = Smi::ToInt(stack_->length()); >>>>> FixedArray* elements = FixedArray::cast(stack_->elements()); >>>>> for (int i = 0; i < length; i++) { >>>>> FixedArray* elements = FixedArray::cast(stack_->elements()); >>>>> if (elements->get(i) == *object) { >>>>> // boom >>>>> } >>>>> } >>>>> } >>>>> >>>>> So, operator*() in a Handle<Object> gives me a unique id? Which is the >>>>> type for this? Can I store that in a C++ map? Is it stable (enough)? >>>>> >>>>> Thanks! >>>>> >>>> -- >> -- >> v8-users mailing list >> v8-u...@googlegroups.com <javascript:> >> 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+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > -- -- 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. For more options, visit https://groups.google.com/d/optout.