1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 * JavaScript Debugging support - Object support
17 #define TRACEOBJ(jsdc, jsdobj, which) _traceObj(jsdc, jsdobj, which)
20 _describeObj(JSDContext
* jsdc
, JSDObject
*jsdobj
)
23 JS_smprintf("%0x new'd in %s at line %d using ctor %s in %s at line %d",
25 JSD_GetObjectNewURL(jsdc
, jsdobj
),
26 JSD_GetObjectNewLineNumber(jsdc
, jsdobj
),
27 JSD_GetObjectConstructorName(jsdc
, jsdobj
),
28 JSD_GetObjectConstructorURL(jsdc
, jsdobj
),
29 JSD_GetObjectConstructorLineNumber(jsdc
, jsdobj
));
33 _traceObj(JSDContext
* jsdc
, JSDObject
* jsdobj
, int which
)
40 description
= _describeObj(jsdc
, jsdobj
);
44 which
== 1 ? "final" :
51 #define TRACEOBJ(jsdc, jsdobj, which) ((void)0)
52 #endif /* JSD_TRACE */
55 void JSD_ASSERT_VALID_OBJECT(JSDObject
* jsdobj
)
58 JS_ASSERT(!JS_CLIST_IS_EMPTY(&jsdobj
->links
));
59 JS_ASSERT(jsdobj
->obj
);
65 _destroyJSDObject(JSDContext
* jsdc
, JSDObject
* jsdobj
)
67 JS_ASSERT(JSD_OBJECTS_LOCKED(jsdc
));
69 JS_REMOVE_LINK(&jsdobj
->links
);
70 JS_HashTableRemove(jsdc
->objectsTable
, jsdobj
->obj
);
73 jsd_DropAtom(jsdc
, jsdobj
->newURL
);
75 jsd_DropAtom(jsdc
, jsdobj
->ctorURL
);
77 jsd_DropAtom(jsdc
, jsdobj
->ctorName
);
82 jsd_Constructing(JSDContext
* jsdc
, JSContext
*cx
, JSObject
*obj
,
89 JSString
* ctorNameStr
;
92 JSD_LOCK_OBJECTS(jsdc
);
93 jsdobj
= jsd_GetJSDObjectForJSObject(jsdc
, obj
);
94 if( jsdobj
&& !jsdobj
->ctorURL
)
96 script
= JS_GetFrameScript(cx
, fp
);
99 ctorURL
= JS_GetScriptFilename(cx
, script
);
101 jsdobj
->ctorURL
= jsd_AddAtom(jsdc
, ctorURL
);
103 JSD_LOCK_SCRIPTS(jsdc
);
104 jsdscript
= jsd_FindOrCreateJSDScript(jsdc
, cx
, script
, fp
);
105 JSD_UNLOCK_SCRIPTS(jsdc
);
106 if( jsdscript
&& (ctorNameStr
= jsd_GetScriptFunctionId(jsdc
, jsdscript
)) ) {
107 if( (ctorName
= JS_EncodeString(cx
, ctorNameStr
)) ) {
108 jsdobj
->ctorName
= jsd_AddAtom(jsdc
, ctorName
);
109 JS_free(cx
, (void *) ctorName
);
112 jsdobj
->ctorLineno
= JS_GetScriptBaseLineNumber(cx
, script
);
115 TRACEOBJ(jsdc
, jsdobj
, 3);
116 JSD_UNLOCK_OBJECTS(jsdc
);
120 _hash_root(const void *key
)
122 return ((JSHashNumber
)(ptrdiff_t) key
) >> 2; /* help lame MSVC1.5 on Win16 */
126 jsd_InitObjectManager(JSDContext
* jsdc
)
128 JS_INIT_CLIST(&jsdc
->objectsList
);
129 jsdc
->objectsTable
= JS_NewHashTable(256, _hash_root
,
130 JS_CompareValues
, JS_CompareValues
,
132 return !!jsdc
->objectsTable
;
136 jsd_DestroyObjectManager(JSDContext
* jsdc
)
138 jsd_DestroyObjects(jsdc
);
139 JSD_LOCK_OBJECTS(jsdc
);
140 JS_HashTableDestroy(jsdc
->objectsTable
);
141 JSD_UNLOCK_OBJECTS(jsdc
);
145 jsd_DestroyObjects(JSDContext
* jsdc
)
147 JSD_LOCK_OBJECTS(jsdc
);
148 while( !JS_CLIST_IS_EMPTY(&jsdc
->objectsList
) )
149 _destroyJSDObject(jsdc
, (JSDObject
*)JS_NEXT_LINK(&jsdc
->objectsList
));
150 JSD_UNLOCK_OBJECTS(jsdc
);
154 jsd_IterateObjects(JSDContext
* jsdc
, JSDObject
** iterp
)
156 JSDObject
*jsdobj
= *iterp
;
158 JS_ASSERT(JSD_OBJECTS_LOCKED(jsdc
));
161 jsdobj
= (JSDObject
*)jsdc
->objectsList
.next
;
162 if( jsdobj
== (JSDObject
*)&jsdc
->objectsList
)
164 *iterp
= (JSDObject
*) jsdobj
->links
.next
;
169 jsd_GetWrappedObject(JSDContext
* jsdc
, JSDObject
* jsdobj
)
175 jsd_GetObjectNewURL(JSDContext
* jsdc
, JSDObject
* jsdobj
)
178 return JSD_ATOM_TO_STRING(jsdobj
->newURL
);
183 jsd_GetObjectNewLineNumber(JSDContext
* jsdc
, JSDObject
* jsdobj
)
185 return jsdobj
->newLineno
;
189 jsd_GetObjectConstructorURL(JSDContext
* jsdc
, JSDObject
* jsdobj
)
191 if( jsdobj
->ctorURL
)
192 return JSD_ATOM_TO_STRING(jsdobj
->ctorURL
);
197 jsd_GetObjectConstructorLineNumber(JSDContext
* jsdc
, JSDObject
* jsdobj
)
199 return jsdobj
->ctorLineno
;
203 jsd_GetObjectConstructorName(JSDContext
* jsdc
, JSDObject
* jsdobj
)
205 if( jsdobj
->ctorName
)
206 return JSD_ATOM_TO_STRING(jsdobj
->ctorName
);
211 jsd_GetJSDObjectForJSObject(JSDContext
* jsdc
, JSObject
* jsobj
)
215 JSD_LOCK_OBJECTS(jsdc
);
216 jsdobj
= (JSDObject
*) JS_HashTableLookup(jsdc
->objectsTable
, jsobj
);
217 JSD_UNLOCK_OBJECTS(jsdc
);
222 jsd_GetObjectForValue(JSDContext
* jsdc
, JSDValue
* jsdval
)
224 return jsd_GetJSDObjectForJSObject(jsdc
, JSVAL_TO_OBJECT(jsdval
->val
));
228 jsd_GetValueForObject(JSDContext
* jsdc
, JSDObject
* jsdobj
)
230 return jsd_NewValue(jsdc
, OBJECT_TO_JSVAL(jsdobj
->obj
));