зеркало из https://github.com/mozilla/gecko-dev.git
Bug 632253 - Move filename check to JS_XDRScript, r=igor
This commit is contained in:
Родитель
20eca7a69e
Коммит
ee48d4040e
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче