Bug 827007: Implement Stop for UserMediaStreams; add NotifyRemoved for MediaStream...
[gecko.git] / js / jsd / jsd_obj.cpp
blob463894c8cc26adce6a702ff9afbe5fe81e4ef1fd
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/. */
6 /*
7 * JavaScript Debugging support - Object support
8 */
10 #include "jsd.h"
13 * #define JSD_TRACE 1
16 #ifdef JSD_TRACE
17 #define TRACEOBJ(jsdc, jsdobj, which) _traceObj(jsdc, jsdobj, which)
19 static char *
20 _describeObj(JSDContext* jsdc, JSDObject *jsdobj)
22 return
23 JS_smprintf("%0x new'd in %s at line %d using ctor %s in %s at line %d",
24 (int)jsdobj,
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));
32 static void
33 _traceObj(JSDContext* jsdc, JSDObject* jsdobj, int which)
35 char* description;
37 if( !jsdobj )
38 return;
40 description = _describeObj(jsdc, jsdobj);
42 printf("%s : %s\n",
43 which == 0 ? "new " :
44 which == 1 ? "final" :
45 "ctor ",
46 description);
47 if(description)
48 free(description);
50 #else
51 #define TRACEOBJ(jsdc, jsdobj, which) ((void)0)
52 #endif /* JSD_TRACE */
54 #ifdef DEBUG
55 void JSD_ASSERT_VALID_OBJECT(JSDObject* jsdobj)
57 JS_ASSERT(jsdobj);
58 JS_ASSERT(!JS_CLIST_IS_EMPTY(&jsdobj->links));
59 JS_ASSERT(jsdobj->obj);
61 #endif
64 static void
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);
72 if(jsdobj->newURL)
73 jsd_DropAtom(jsdc, jsdobj->newURL);
74 if(jsdobj->ctorURL)
75 jsd_DropAtom(jsdc, jsdobj->ctorURL);
76 if(jsdobj->ctorName)
77 jsd_DropAtom(jsdc, jsdobj->ctorName);
78 free(jsdobj);
81 void
82 jsd_Constructing(JSDContext* jsdc, JSContext *cx, JSObject *obj,
83 JSStackFrame *fp)
85 JSDObject* jsdobj;
86 JSScript* script;
87 JSDScript* jsdscript;
88 const char* ctorURL;
89 JSString* ctorNameStr;
90 const char* ctorName;
92 JSD_LOCK_OBJECTS(jsdc);
93 jsdobj = jsd_GetJSDObjectForJSObject(jsdc, obj);
94 if( jsdobj && !jsdobj->ctorURL )
96 script = JS_GetFrameScript(cx, fp);
97 if( script )
99 ctorURL = JS_GetScriptFilename(cx, script);
100 if( ctorURL )
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);
119 static JSHashNumber
120 _hash_root(const void *key)
122 return ((JSHashNumber)(ptrdiff_t) key) >> 2; /* help lame MSVC1.5 on Win16 */
125 JSBool
126 jsd_InitObjectManager(JSDContext* jsdc)
128 JS_INIT_CLIST(&jsdc->objectsList);
129 jsdc->objectsTable = JS_NewHashTable(256, _hash_root,
130 JS_CompareValues, JS_CompareValues,
131 NULL, NULL);
132 return !!jsdc->objectsTable;
135 void
136 jsd_DestroyObjectManager(JSDContext* jsdc)
138 jsd_DestroyObjects(jsdc);
139 JSD_LOCK_OBJECTS(jsdc);
140 JS_HashTableDestroy(jsdc->objectsTable);
141 JSD_UNLOCK_OBJECTS(jsdc);
144 void
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);
153 JSDObject*
154 jsd_IterateObjects(JSDContext* jsdc, JSDObject** iterp)
156 JSDObject *jsdobj = *iterp;
158 JS_ASSERT(JSD_OBJECTS_LOCKED(jsdc));
160 if( !jsdobj )
161 jsdobj = (JSDObject *)jsdc->objectsList.next;
162 if( jsdobj == (JSDObject *)&jsdc->objectsList )
163 return NULL;
164 *iterp = (JSDObject*) jsdobj->links.next;
165 return jsdobj;
168 JSObject*
169 jsd_GetWrappedObject(JSDContext* jsdc, JSDObject* jsdobj)
171 return jsdobj->obj;
174 const char*
175 jsd_GetObjectNewURL(JSDContext* jsdc, JSDObject* jsdobj)
177 if( jsdobj->newURL )
178 return JSD_ATOM_TO_STRING(jsdobj->newURL);
179 return NULL;
182 unsigned
183 jsd_GetObjectNewLineNumber(JSDContext* jsdc, JSDObject* jsdobj)
185 return jsdobj->newLineno;
188 const char*
189 jsd_GetObjectConstructorURL(JSDContext* jsdc, JSDObject* jsdobj)
191 if( jsdobj->ctorURL )
192 return JSD_ATOM_TO_STRING(jsdobj->ctorURL);
193 return NULL;
196 unsigned
197 jsd_GetObjectConstructorLineNumber(JSDContext* jsdc, JSDObject* jsdobj)
199 return jsdobj->ctorLineno;
202 const char*
203 jsd_GetObjectConstructorName(JSDContext* jsdc, JSDObject* jsdobj)
205 if( jsdobj->ctorName )
206 return JSD_ATOM_TO_STRING(jsdobj->ctorName);
207 return NULL;
210 JSDObject*
211 jsd_GetJSDObjectForJSObject(JSDContext* jsdc, JSObject* jsobj)
213 JSDObject* jsdobj;
215 JSD_LOCK_OBJECTS(jsdc);
216 jsdobj = (JSDObject*) JS_HashTableLookup(jsdc->objectsTable, jsobj);
217 JSD_UNLOCK_OBJECTS(jsdc);
218 return jsdobj;
221 JSDObject*
222 jsd_GetObjectForValue(JSDContext* jsdc, JSDValue* jsdval)
224 return jsd_GetJSDObjectForJSObject(jsdc, JSVAL_TO_OBJECT(jsdval->val));
227 JSDValue*
228 jsd_GetValueForObject(JSDContext* jsdc, JSDObject* jsdobj)
230 return jsd_NewValue(jsdc, OBJECT_TO_JSVAL(jsdobj->obj));