@@ -168,6 +168,10 @@ URLPattern::URLPattern(Environment* env,
168168
169169void URLPattern::MemoryInfo (MemoryTracker* tracker) const {
170170 tracker->TraitTrackInline (url_pattern_, " url_pattern" );
171+ #define URL_PATTERN_CACHED_VALUES (_, lowercase ) \
172+ tracker->TrackField (#lowercase, lowercase);
173+ URL_PATTERN_COMPONENTS (URL_PATTERN_CACHED_VALUES)
174+ #undef URL_PATTERN_CACHED_VALUES
171175}
172176
173177void URLPattern::New (const FunctionCallbackInfo<Value>& args) {
@@ -466,10 +470,20 @@ URLPattern::URLPatternOptions::FromJsObject(Environment* env,
466470 return options;
467471}
468472
473+ // Perform value lookup and cache the result in a v8::Global.
469474#define URL_PATTERN_COMPONENT_GETTERS (uppercase_name, lowercase_name ) \
470- MaybeLocal<Value> URLPattern::uppercase_name () const { \
471- auto context = env ()->context (); \
472- return ToV8Value (context, url_pattern_.get_ ##lowercase_name ()); \
475+ MaybeLocal<Value> URLPattern::uppercase_name () { \
476+ auto isolate = env ()->isolate (); \
477+ if (lowercase_name.IsEmpty ()) { \
478+ Local<Value> value; \
479+ if (ToV8Value (env ()->context (), url_pattern_.get_ ##lowercase_name ()) \
480+ .ToLocal (&value)) { \
481+ lowercase_name.Reset (isolate, value); \
482+ return value; \
483+ } \
484+ return {}; \
485+ } \
486+ return lowercase_name.Get (isolate); \
473487 }
474488URL_PATTERN_COMPONENTS (URL_PATTERN_COMPONENT_GETTERS)
475489#undef URL_PATTERN_COMPONENT_GETTERS
0 commit comments