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
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.