1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/jsd/jsd_obj.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,234 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * vim: set ts=8 sts=4 et sw=4 tw=99: 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +/* 1.11 + * JavaScript Debugging support - Object support 1.12 + */ 1.13 + 1.14 +#include "jsd.h" 1.15 + 1.16 +/* 1.17 +* #define JSD_TRACE 1 1.18 +*/ 1.19 + 1.20 +#ifdef JSD_TRACE 1.21 +#define TRACEOBJ(jsdc, jsdobj, which) _traceObj(jsdc, jsdobj, which) 1.22 + 1.23 +static char * 1.24 +_describeObj(JSDContext* jsdc, JSDObject *jsdobj) 1.25 +{ 1.26 + return 1.27 + JS_smprintf("%0x new'd in %s at line %d using ctor %s in %s at line %d", 1.28 + (int)jsdobj, 1.29 + JSD_GetObjectNewURL(jsdc, jsdobj), 1.30 + JSD_GetObjectNewLineNumber(jsdc, jsdobj), 1.31 + JSD_GetObjectConstructorName(jsdc, jsdobj), 1.32 + JSD_GetObjectConstructorURL(jsdc, jsdobj), 1.33 + JSD_GetObjectConstructorLineNumber(jsdc, jsdobj)); 1.34 +} 1.35 + 1.36 +static void 1.37 +_traceObj(JSDContext* jsdc, JSDObject* jsdobj, int which) 1.38 +{ 1.39 + char* description; 1.40 + 1.41 + if( !jsdobj ) 1.42 + return; 1.43 + 1.44 + description = _describeObj(jsdc, jsdobj); 1.45 + 1.46 + printf("%s : %s\n", 1.47 + which == 0 ? "new " : 1.48 + which == 1 ? "final" : 1.49 + "ctor ", 1.50 + description); 1.51 + if(description) 1.52 + free(description); 1.53 +} 1.54 +#else 1.55 +#define TRACEOBJ(jsdc, jsdobj, which) ((void)0) 1.56 +#endif /* JSD_TRACE */ 1.57 + 1.58 +#ifdef DEBUG 1.59 +void JSD_ASSERT_VALID_OBJECT(JSDObject* jsdobj) 1.60 +{ 1.61 + MOZ_ASSERT(jsdobj); 1.62 + MOZ_ASSERT(!JS_CLIST_IS_EMPTY(&jsdobj->links)); 1.63 + MOZ_ASSERT(jsdobj->obj); 1.64 +} 1.65 +#endif 1.66 + 1.67 + 1.68 +static void 1.69 +_destroyJSDObject(JSDContext* jsdc, JSDObject* jsdobj) 1.70 +{ 1.71 + MOZ_ASSERT(JSD_OBJECTS_LOCKED(jsdc)); 1.72 + 1.73 + JS_REMOVE_LINK(&jsdobj->links); 1.74 + JS_HashTableRemove(jsdc->objectsTable, jsdobj->obj); 1.75 + 1.76 + if(jsdobj->newURL) 1.77 + jsd_DropAtom(jsdc, jsdobj->newURL); 1.78 + if(jsdobj->ctorURL) 1.79 + jsd_DropAtom(jsdc, jsdobj->ctorURL); 1.80 + if(jsdobj->ctorName) 1.81 + jsd_DropAtom(jsdc, jsdobj->ctorName); 1.82 + free(jsdobj); 1.83 +} 1.84 + 1.85 +void 1.86 +jsd_Constructing(JSDContext* jsdc, JSContext *cx, JSObject *obj, 1.87 + JSAbstractFramePtr frame) 1.88 +{ 1.89 + JSDObject* jsdobj; 1.90 + JS::RootedScript script(cx); 1.91 + JSDScript* jsdscript; 1.92 + const char* ctorURL; 1.93 + JSString* ctorNameStr; 1.94 + const char* ctorName; 1.95 + 1.96 + JSD_LOCK_OBJECTS(jsdc); 1.97 + jsdobj = jsd_GetJSDObjectForJSObject(jsdc, obj); 1.98 + if( jsdobj && !jsdobj->ctorURL ) 1.99 + { 1.100 + script = frame.script(); 1.101 + if( script ) 1.102 + { 1.103 + ctorURL = JS_GetScriptFilename(script); 1.104 + if( ctorURL ) 1.105 + jsdobj->ctorURL = jsd_AddAtom(jsdc, ctorURL); 1.106 + 1.107 + JSD_LOCK_SCRIPTS(jsdc); 1.108 + jsdscript = jsd_FindOrCreateJSDScript(jsdc, cx, script, frame); 1.109 + JSD_UNLOCK_SCRIPTS(jsdc); 1.110 + if( jsdscript && (ctorNameStr = jsd_GetScriptFunctionId(jsdc, jsdscript)) ) { 1.111 + if( (ctorName = JS_EncodeString(cx, ctorNameStr)) ) { 1.112 + jsdobj->ctorName = jsd_AddAtom(jsdc, ctorName); 1.113 + JS_free(cx, (void *) ctorName); 1.114 + } 1.115 + } 1.116 + jsdobj->ctorLineno = JS_GetScriptBaseLineNumber(cx, script); 1.117 + } 1.118 + } 1.119 + TRACEOBJ(jsdc, jsdobj, 3); 1.120 + JSD_UNLOCK_OBJECTS(jsdc); 1.121 +} 1.122 + 1.123 +static JSHashNumber 1.124 +_hash_root(const void *key) 1.125 +{ 1.126 + return ((JSHashNumber)(ptrdiff_t) key) >> 2; /* help lame MSVC1.5 on Win16 */ 1.127 +} 1.128 + 1.129 +bool 1.130 +jsd_InitObjectManager(JSDContext* jsdc) 1.131 +{ 1.132 + JS_INIT_CLIST(&jsdc->objectsList); 1.133 + jsdc->objectsTable = JS_NewHashTable(256, _hash_root, 1.134 + JS_CompareValues, JS_CompareValues, 1.135 + nullptr, nullptr); 1.136 + return !!jsdc->objectsTable; 1.137 +} 1.138 + 1.139 +void 1.140 +jsd_DestroyObjectManager(JSDContext* jsdc) 1.141 +{ 1.142 + jsd_DestroyObjects(jsdc); 1.143 + JSD_LOCK_OBJECTS(jsdc); 1.144 + JS_HashTableDestroy(jsdc->objectsTable); 1.145 + JSD_UNLOCK_OBJECTS(jsdc); 1.146 +} 1.147 + 1.148 +void 1.149 +jsd_DestroyObjects(JSDContext* jsdc) 1.150 +{ 1.151 + JSD_LOCK_OBJECTS(jsdc); 1.152 + while( !JS_CLIST_IS_EMPTY(&jsdc->objectsList) ) 1.153 + _destroyJSDObject(jsdc, (JSDObject*)JS_NEXT_LINK(&jsdc->objectsList)); 1.154 + JSD_UNLOCK_OBJECTS(jsdc); 1.155 +} 1.156 + 1.157 +JSDObject* 1.158 +jsd_IterateObjects(JSDContext* jsdc, JSDObject** iterp) 1.159 +{ 1.160 + JSDObject *jsdobj = *iterp; 1.161 + 1.162 + MOZ_ASSERT(JSD_OBJECTS_LOCKED(jsdc)); 1.163 + 1.164 + if( !jsdobj ) 1.165 + jsdobj = (JSDObject *)jsdc->objectsList.next; 1.166 + if( jsdobj == (JSDObject *)&jsdc->objectsList ) 1.167 + return nullptr; 1.168 + *iterp = (JSDObject*) jsdobj->links.next; 1.169 + return jsdobj; 1.170 +} 1.171 + 1.172 +JSObject* 1.173 +jsd_GetWrappedObject(JSDContext* jsdc, JSDObject* jsdobj) 1.174 +{ 1.175 + return jsdobj->obj; 1.176 +} 1.177 + 1.178 +const char* 1.179 +jsd_GetObjectNewURL(JSDContext* jsdc, JSDObject* jsdobj) 1.180 +{ 1.181 + if( jsdobj->newURL ) 1.182 + return JSD_ATOM_TO_STRING(jsdobj->newURL); 1.183 + return nullptr; 1.184 +} 1.185 + 1.186 +unsigned 1.187 +jsd_GetObjectNewLineNumber(JSDContext* jsdc, JSDObject* jsdobj) 1.188 +{ 1.189 + return jsdobj->newLineno; 1.190 +} 1.191 + 1.192 +const char* 1.193 +jsd_GetObjectConstructorURL(JSDContext* jsdc, JSDObject* jsdobj) 1.194 +{ 1.195 + if( jsdobj->ctorURL ) 1.196 + return JSD_ATOM_TO_STRING(jsdobj->ctorURL); 1.197 + return nullptr; 1.198 +} 1.199 + 1.200 +unsigned 1.201 +jsd_GetObjectConstructorLineNumber(JSDContext* jsdc, JSDObject* jsdobj) 1.202 +{ 1.203 + return jsdobj->ctorLineno; 1.204 +} 1.205 + 1.206 +const char* 1.207 +jsd_GetObjectConstructorName(JSDContext* jsdc, JSDObject* jsdobj) 1.208 +{ 1.209 + if( jsdobj->ctorName ) 1.210 + return JSD_ATOM_TO_STRING(jsdobj->ctorName); 1.211 + return nullptr; 1.212 +} 1.213 + 1.214 +JSDObject* 1.215 +jsd_GetJSDObjectForJSObject(JSDContext* jsdc, JSObject* jsobj) 1.216 +{ 1.217 + JSDObject* jsdobj; 1.218 + 1.219 + JSD_LOCK_OBJECTS(jsdc); 1.220 + jsdobj = (JSDObject*) JS_HashTableLookup(jsdc->objectsTable, jsobj); 1.221 + JSD_UNLOCK_OBJECTS(jsdc); 1.222 + return jsdobj; 1.223 +} 1.224 + 1.225 +JSDObject* 1.226 +jsd_GetObjectForValue(JSDContext* jsdc, JSDValue* jsdval) 1.227 +{ 1.228 + return jsd_GetJSDObjectForJSObject(jsdc, JSVAL_TO_OBJECT(jsdval->val)); 1.229 +} 1.230 + 1.231 +JSDValue* 1.232 +jsd_GetValueForObject(JSDContext* jsdc, JSDObject* jsdobj) 1.233 +{ 1.234 + return jsd_NewValue(jsdc, OBJECT_TO_JSVAL(jsdobj->obj)); 1.235 +} 1.236 + 1.237 +