зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1141329, prelude - Make ObjectOpResult pointer-sized to fix amazingly bogus code and assertions in IonCaches, introduced by rev 0712a3d4b79c. r=efaust.
--HG-- extra : rebase_source : 1d82219b61105088cf27154c6200e647091a36e0
This commit is contained in:
Родитель
a9a1c904c3
Коммит
eedeed1e47
|
@ -80,14 +80,26 @@ class AutoIdVector;
|
|||
class ObjectOpResult
|
||||
{
|
||||
private:
|
||||
uint32_t code_;
|
||||
/*
|
||||
* code_ is either one of the special codes OkCode or Uninitialized, or
|
||||
* an error code. For now the error codes are private to the JS engine;
|
||||
* they're defined in js/src/js.msg.
|
||||
*
|
||||
* code_ is uintptr_t (rather than uint32_t) for the convenience of the
|
||||
* JITs, which would otherwise have to deal with either padding or stack
|
||||
* alignment on 64-bit platforms.
|
||||
*/
|
||||
uintptr_t code_;
|
||||
|
||||
public:
|
||||
enum { OkCode = 0, Uninitialized = 0xffffffff };
|
||||
enum SpecialCodes : uintptr_t {
|
||||
OkCode = 0,
|
||||
Uninitialized = uintptr_t(-1)
|
||||
};
|
||||
|
||||
ObjectOpResult() : code_(Uninitialized) {}
|
||||
|
||||
/* Return true if fail() was not called. */
|
||||
/* Return true if succeed() was called. */
|
||||
bool ok() const {
|
||||
MOZ_ASSERT(code_ != Uninitialized);
|
||||
return code_ == OkCode;
|
||||
|
@ -129,7 +141,7 @@ class ObjectOpResult
|
|||
|
||||
uint32_t failureCode() const {
|
||||
MOZ_ASSERT(!ok());
|
||||
return code_;
|
||||
return uint32_t(code_);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1464,11 +1464,11 @@ GetPropertyIC::tryAttachTypedArrayLength(JSContext *cx, HandleScript outerScript
|
|||
}
|
||||
|
||||
static void
|
||||
PushObjectOpResult(MacroAssembler &masm, uint32_t value = ObjectOpResult::Uninitialized)
|
||||
PushObjectOpResult(MacroAssembler &masm)
|
||||
{
|
||||
static_assert(sizeof(ObjectOpResult) == sizeof(int32_t),
|
||||
static_assert(sizeof(ObjectOpResult) == sizeof(uintptr_t),
|
||||
"ObjectOpResult size must match size reserved by masm.Push() here");
|
||||
masm.Push(Imm32(value));
|
||||
masm.Push(ImmWord(uintptr_t(ObjectOpResult::Uninitialized)));
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -1515,7 +1515,7 @@ EmitCallProxyGet(JSContext *cx, MacroAssembler &masm, IonCache::StubAttacher &at
|
|||
masm.movePtr(StackPointer, argProxyReg);
|
||||
|
||||
// Unused space, to keep the same stack layout as Proxy::set frames.
|
||||
PushObjectOpResult(masm, 0);
|
||||
PushObjectOpResult(masm);
|
||||
|
||||
masm.loadJSContext(argJSContextReg);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче