Bug 632253 - Move filename check to JS_XDRScript, r=igor

This commit is contained in:
Michael Wu 2011-03-15 18:01:00 -07:00
Родитель 20eca7a69e
Коммит ee48d4040e
3 изменённых файлов: 31 добавлений и 19 удалений

Просмотреть файл

@ -319,7 +319,6 @@ js_XDRScript(JSXDRState *xdr, JSScript **scriptp)
uint16 nClosedArgs = 0, nClosedVars = 0;
JSPrincipals *principals;
uint32 encodeable;
JSBool filenameWasSaved;
jssrcnote *sn;
JSSecurityCallbacks *callbacks;
uint32 scriptBits = 0;
@ -327,7 +326,6 @@ js_XDRScript(JSXDRState *xdr, JSScript **scriptp)
JSContext *cx = xdr->cx;
JSScript *script = *scriptp;
nsrcnotes = ntrynotes = natoms = nobjects = nregexps = nconsts = 0;
filenameWasSaved = JS_FALSE;
jssrcnote *notes = NULL;
/* Should not XDR scripts optimized for a single global object. */
@ -594,12 +592,16 @@ js_XDRScript(JSXDRState *xdr, JSScript **scriptp)
goto error;
if (!JS_XDRBytes(xdr, (char *)notes, nsrcnotes * sizeof(jssrcnote)) ||
!JS_XDRCStringOrNull(xdr, (char **)&script->filename) ||
!JS_XDRUint32(xdr, &lineno) ||
!JS_XDRUint32(xdr, &nslots)) {
goto error;
}
JS_ASSERT_IF(xdr->mode == JSXDR_ENCODE, xdr->filename == script->filename);
if (xdr->mode == JSXDR_DECODE)
script->filename = xdr->filename;
callbacks = JS_GetSecurityCallbacks(cx);
if (xdr->mode == JSXDR_ENCODE) {
principals = script->principals;
@ -626,19 +628,9 @@ js_XDRScript(JSXDRState *xdr, JSScript **scriptp)
}
if (xdr->mode == JSXDR_DECODE) {
const char *filename = script->filename;
if (filename) {
filename = js_SaveScriptFilename(cx, filename);
if (!filename)
goto error;
cx->free((void *) script->filename);
script->filename = filename;
filenameWasSaved = JS_TRUE;
}
script->lineno = (uintN)lineno;
script->nslots = (uint16)nslots;
script->staticLevel = (uint16)(nslots >> 16);
}
for (i = 0; i != natoms; ++i) {
@ -730,10 +722,6 @@ js_XDRScript(JSXDRState *xdr, JSScript **scriptp)
error:
if (xdr->mode == JSXDR_DECODE) {
if (script->filename && !filenameWasSaved) {
cx->free((void *) script->filename);
script->filename = NULL;
}
js_DestroyScript(cx, script);
*scriptp = NULL;
}
@ -1965,6 +1953,9 @@ js_CloneScript(JSContext *cx, JSScript *script)
// we don't want gecko to transcribe our principals for us
DisablePrincipalsTranscoding disable(cx);
#ifdef DEBUG
w->filename = script->filename;
#endif
if (!js_XDRScript(w, &script)) {
JS_XDRDestroy(w);
return NULL;
@ -1989,6 +1980,8 @@ js_CloneScript(JSContext *cx, JSScript *script)
JS_XDRMemSetData(r, p, nbytes);
JS_XDRMemSetData(w, NULL, 0);
r->filename = script->filename;
if (!js_XDRScript(r, &script))
return NULL;

Просмотреть файл

@ -239,6 +239,7 @@ JS_XDRInitBase(JSXDRState *xdr, JSXDRMode mode, JSContext *cx)
xdr->reghash = NULL;
xdr->userdata = NULL;
xdr->script = NULL;
xdr->filename = NULL;
}
JS_PUBLIC_API(JSXDRState *)
@ -665,6 +666,8 @@ js_XDRAtom(JSXDRState *xdr, JSAtom **atomp)
JS_PUBLIC_API(JSBool)
JS_XDRScriptObject(JSXDRState *xdr, JSObject **scriptObjp)
{
JS_ASSERT(!xdr->filename);
JSScript *script;
uint32 magic;
if (xdr->mode == JSXDR_DECODE) {
@ -684,7 +687,22 @@ JS_XDRScriptObject(JSXDRState *xdr, JSObject **scriptObjp)
return false;
}
if (!js_XDRScript(xdr, &script))
if (xdr->mode == JSXDR_ENCODE)
xdr->filename = script->filename;
if (!JS_XDRCStringOrNull(xdr, (char **) &xdr->filename))
return false;
if (xdr->mode == JSXDR_DECODE && xdr->filename) {
const char *filename = xdr->filename;
filename = js_SaveScriptFilename(xdr->cx, filename);
xdr->cx->free((void *) xdr->filename);
xdr->filename = filename;
if (!filename)
return false;
}
bool ok = js_XDRScript(xdr, &script);
xdr->filename = NULL;
if (!ok)
return false;
if (xdr->mode == JSXDR_DECODE) {

Просмотреть файл

@ -115,6 +115,7 @@ struct JSXDRState {
void *reghash;
void *userdata;
JSScript *script;
const char *filename;
};
extern JS_PUBLIC_API(void)
@ -205,7 +206,7 @@ JS_XDRFindClassById(JSXDRState *xdr, uint32 id);
* before deserialization of bytecode. If the saved version does not match
* the current version, abort deserialization and invalidate the file.
*/
#define JSXDR_BYTECODE_VERSION (0xb973c0de - 83)
#define JSXDR_BYTECODE_VERSION (0xb973c0de - 84)
/*
* Library-private functions.