Bug 1206485 - "Boot loop after first boot on some devices (Xperia M2, ...)" [r=terrence f=lissyx+mozillians]

This commit is contained in:
Jon Coppeard 2015-09-22 05:40:00 -07:00
Родитель fd3361fcbd
Коммит b1c196880f
2 изменённых файлов: 9 добавлений и 3 удалений

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

@ -54,6 +54,7 @@ JSFunction::AutoParseUsingFunctionBox::AutoParseUsingFunctionBox(ExclusiveContex
: fun_(cx, funbox->function()), : fun_(cx, funbox->function()),
oldEnv_(cx, fun_->environment()) oldEnv_(cx, fun_->environment())
{ {
fun_->unsetEnvironment();
fun_->setFunctionBox(funbox); fun_->setFunctionBox(funbox);
funbox->computeAllowSyntax(fun_); funbox->computeAllowSyntax(fun_);
funbox->computeInWith(fun_); funbox->computeInWith(fun_);
@ -62,7 +63,7 @@ JSFunction::AutoParseUsingFunctionBox::AutoParseUsingFunctionBox(ExclusiveContex
JSFunction::AutoParseUsingFunctionBox::~AutoParseUsingFunctionBox() JSFunction::AutoParseUsingFunctionBox::~AutoParseUsingFunctionBox()
{ {
fun_->unsetFunctionBox(); fun_->unsetFunctionBox();
fun_->setEnvironment(oldEnv_); fun_->initEnvironment(oldEnv_);
} }
namespace js { namespace js {

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

@ -319,17 +319,22 @@ class JSFunction : public js::NativeObject
void setEnvironment(JSObject* obj) { void setEnvironment(JSObject* obj) {
MOZ_ASSERT(isInterpreted() && !isBeingParsed()); MOZ_ASSERT(isInterpreted() && !isBeingParsed());
*(js::HeapPtrObject*)&u.i.env_ = obj; *reinterpret_cast<js::HeapPtrObject*>(&u.i.env_) = obj;
} }
void initEnvironment(JSObject* obj) { void initEnvironment(JSObject* obj) {
MOZ_ASSERT(isInterpreted() && !isBeingParsed()); MOZ_ASSERT(isInterpreted() && !isBeingParsed());
((js::HeapPtrObject*)&u.i.env_)->init(obj); reinterpret_cast<js::HeapPtrObject*>(&u.i.env_)->init(obj);
}
void unsetEnvironment() {
setEnvironment(nullptr);
} }
private: private:
void setFunctionBox(js::frontend::FunctionBox* funbox) { void setFunctionBox(js::frontend::FunctionBox* funbox) {
MOZ_ASSERT(isInterpreted()); MOZ_ASSERT(isInterpreted());
MOZ_ASSERT_IF(!isBeingParsed(), !environment());
flags_ |= BEING_PARSED; flags_ |= BEING_PARSED;
u.i.funbox_ = funbox; u.i.funbox_ = funbox;
} }