static JSBool js_getsize(JSContext *cx, uintN argc, jsval *arglist) { jsval *argv=JS_ARGV(cx, arglist); JSObject* tmp_obj; if(!JSVAL_IS_OBJECT(argv[0])) { JS_ReportError(cx, "get_size() error! Parameter is not an object."); return(JS_FALSE); } tmp_obj=JSVAL_TO_OBJECT(argv[0]); if(!tmp_obj) return(JS_FALSE); JS_SET_RVAL(cx, arglist, DOUBLE_TO_JSVAL(JS_GetObjectTotalSize(cx, tmp_obj))); return(JS_TRUE); }
static size_t GetAtomTotalSize(JSContext *cx, JSAtom *atom) { size_t nbytes; nbytes = sizeof *atom; if (ATOM_IS_STRING(atom)) { nbytes += sizeof(JSString); nbytes += (ATOM_TO_STRING(atom)->length + 1) * sizeof(jschar); } else if (ATOM_IS_DOUBLE(atom)) { nbytes += sizeof(jsdouble); } else if (ATOM_IS_OBJECT(atom)) { nbytes += JS_GetObjectTotalSize(cx, ATOM_TO_OBJECT(atom)); } return nbytes; }
JS_GetScriptTotalSize(JSContext *cx, JSScript *script) { size_t nbytes, pbytes; JSObject *obj; jsatomid i; jssrcnote *sn, *notes; JSTryNote *tn, *tnotes; JSPrincipals *principals; nbytes = sizeof *script; obj = script->object; if (obj) nbytes += JS_GetObjectTotalSize(cx, obj); nbytes += script->length * sizeof script->code[0]; nbytes += script->atomMap.length * sizeof script->atomMap.vector[0]; for (i = 0; i < script->atomMap.length; i++) nbytes += GetAtomTotalSize(cx, script->atomMap.vector[i]); if (script->filename) nbytes += strlen(script->filename) + 1; notes = script->notes; if (notes) { for (sn = notes; !SN_IS_TERMINATOR(sn); sn += SN_LENGTH(sn)) continue; nbytes += (sn - notes + 1) * sizeof *sn; } tnotes = script->trynotes; if (tnotes) { for (tn = tnotes; tn->catchStart; tn++) continue; nbytes += (tn - tnotes + 1) * sizeof *tn; } principals = script->principals; if (principals) { JS_ASSERT(principals->refcount); pbytes = sizeof *principals; if (principals->refcount > 1) pbytes = (pbytes + principals->refcount - 1) / principals->refcount; nbytes += pbytes; } return nbytes; }
JS_GetFunctionTotalSize(JSContext *cx, JSFunction *fun) { size_t nbytes, obytes; JSObject *obj; JSAtom *atom; nbytes = sizeof *fun; JS_ASSERT(fun->nrefs); obj = fun->object; if (obj) { obytes = JS_GetObjectTotalSize(cx, obj); if (fun->nrefs > 1) obytes = (obytes + fun->nrefs - 1) / fun->nrefs; nbytes += obytes; } if (fun->script) nbytes += JS_GetScriptTotalSize(cx, fun->script); atom = fun->atom; if (atom) nbytes += GetAtomTotalSize(cx, atom); return nbytes; }