From 87558785ac69a68dbc9d91ea09d9b4dd0c75f1da Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:33:11 +0000 Subject: [PATCH 1/3] Initial plan From 321b3fdd82f0aec7ac4243f3b5d19950626882ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:35:48 +0000 Subject: [PATCH 2/3] Use WeakMap for capturedArgs instead of symbol-keyed property on component Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- .../glimmer/lib/component-managers/curly.ts | 15 +++++++++++++++ .../@ember/-internals/glimmer/lib/component.ts | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts index 8dfa03f8e98..e083d8e291b 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts @@ -56,6 +56,16 @@ import { processComponentArgs } from '../utils/process-args'; export const ARGS = Symbol('ARGS'); export const HAS_BLOCK = Symbol('HAS_BLOCK'); +// WeakMap to store capturedArgs for each component instance, avoiding +// symbol-keyed properties on the instance itself. +const COMPONENT_ARGS_MAP = new WeakMap(); + +export function getComponentCapturedArgs( + component: object +): CapturedArguments['named'] | undefined { + return COMPONENT_ARGS_MAP.get(component); +} + export const DIRTY_TAG = Symbol('DIRTY_TAG'); export const IS_DISPATCHING_ATTRS = Symbol('IS_DISPATCHING_ATTRS'); export const BOUNDS = Symbol('BOUNDS'); @@ -286,6 +296,11 @@ export default class CurlyComponentManager beginUntrackFrame(); let component = ComponentClass.create(props); + // Store capturedArgs in a WeakMap keyed by the component instance so that + // PROPERTY_DID_CHANGE can look them up without requiring symbol-keyed + // properties on the instance. + COMPONENT_ARGS_MAP.set(component, capturedArgs); + let finalizer = _instrumentStart('render.component', initialRenderInstrumentDetails, component); // We become the new parentView for downstream components, so save our diff --git a/packages/@ember/-internals/glimmer/lib/component.ts b/packages/@ember/-internals/glimmer/lib/component.ts index e4dbf48c09c..d66842da331 100644 --- a/packages/@ember/-internals/glimmer/lib/component.ts +++ b/packages/@ember/-internals/glimmer/lib/component.ts @@ -28,11 +28,11 @@ import type { DirtyableTag } from '@glimmer/validator'; import { createTag, dirtyTag } from '@glimmer/validator'; import type { SimpleElement } from '@simple-dom/interface'; import { - ARGS, BOUNDS, CURLY_COMPONENT_MANAGER, DIRTY_TAG, IS_DISPATCHING_ATTRS, + getComponentCapturedArgs, } from './component-managers/curly'; import { hasDOM } from '@ember/-internals/browser-environment'; @@ -1038,7 +1038,7 @@ class Component return; } - let args = (this as any)[ARGS]; + let args = getComponentCapturedArgs(this); let reference = args !== undefined ? args[key] : undefined; if (reference !== undefined && isUpdatableRef(reference)) { From b9ea54c50e7c133c08b0bdd1c209ccd676194eab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:39:42 +0000 Subject: [PATCH 3/3] Remove unused ARGS and HAS_BLOCK symbol exports from curly component manager Co-authored-by: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> --- .../@ember/-internals/glimmer/lib/component-managers/curly.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts index e083d8e291b..0dec0a4e9cf 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts @@ -53,9 +53,6 @@ import { import ComponentStateBucket from '../utils/curly-component-state-bucket'; import { processComponentArgs } from '../utils/process-args'; -export const ARGS = Symbol('ARGS'); -export const HAS_BLOCK = Symbol('HAS_BLOCK'); - // WeakMap to store capturedArgs for each component instance, avoiding // symbol-keyed properties on the instance itself. const COMPONENT_ARGS_MAP = new WeakMap();