The goal (what we've used them for now) is to have a unique copy of a string so we can track the source of a string. We attach Persistent<v8::Object> properties to the string so that a string from one source can be differentiated from a string from another source. Specifically, we track strings that are user-input.
I was a little fast and loose with the comment about "add some external data to x". More precisely, I create a subclass that extends v8::String::ExternalStringResource and the subclass has a Persistent<v8::Object> member. Is there another way to differentiate between two strings of identical form/content/representation? On Monday, April 17, 2023 at 8:40:23 AM UTC-7 pth...@google.com wrote: > The purpose of internalized strings is to have a canonical, unique > representation of a string. So yes if strings are internalized that > are duplicates of already internalized values, we "throw away"/discard that > duplicate and point them to the unique string instead (i.e. the string > becomes a ThinString). > If you want to take ownership of the buffer of an internalized string, you > can by externalizing the internalized string (as opposed to internalizing > an external string). > > Maybe you can tell us what your intent is? Because you mentioned "add some > external data to x" I am not sure if external strings are really what you > are looking for. The purpose of external strings is only to allow embedders > to have ownership of the string buffer, not to attach arbitrary data to > strings. > > On Mon, Apr 17, 2023 at 4:30 PM Bruce MacNaughton <bmacna...@gmail.com> > wrote: > >> "(either one or two byte) because defaulting to throw away the external >> data" should be "(either one or two byte) BEFORE defaulting to throw away >> the external data" >> >> On Monday, April 17, 2023 at 7:12:19 AM UTC-7 Bruce MacNaughton wrote: >> >>> This is my first relatively deep dive into v8 strings; if I >>> misinterpreted what's going on, please correct me. >>> >>> When a string is used as a key: >>> >>> const x = 'xyzzy'; >>> // add some external data to x >>> const obj = { [x]: 1234 }; >>> >>> the external data is lost because StringTable:::LookupKey() finds an >>> entry (data->FindEntry()) and returns a Handle<String> to it. That String >>> is *not* internalized, so >>> String::MakeThin() is called on the original string (as 'this') with the >>> Handle<String> returned by FindEntry(). MakeThin() finds >>> this->IsExternalString() true so calls MigrateExternalString(), >>> internalized is *not* an External string, so FinalizeExternalString() is >>> called, discarding the external data. >>> >>> whew. >>> >>> It seems like, to propagate the external data that, in LookupString(), >>> if string->IsExternal() and !result->IsExternal() then result should be >>> reconstructed as an External string. >>> >>> It may be that the way it works is intended, but it's not clear because >>> MigrateExternalString() in string.cc checks to see if 'internalized' is an >>> external string (either one or two byte) because defaulting to throw away >>> the external data. >>> >>> But maybe there are considerations with the shared heap that I have yet >>> to understand. >>> >>> Basic question: is this is a bug or intentional design? >>> >>> >>> -- >> -- >> v8-users mailing list >> v8-u...@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+u...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-users/e88c1553-4a78-435f-bc75-cc42f0b3f147n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-users/e88c1553-4a78-435f-bc75-cc42f0b3f147n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- 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/ad4e1dae-d9c7-49d0-91f1-a79c19d090afn%40googlegroups.com.