您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進(jìn)行js引擎v8源碼分析HeapNumber,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
HeapNumber是保存大整形的對象。v8里有smi保存整形,但是他只有31位,超過31位的就需要用HeapNumber。
// 存儲了數(shù)字的堆對象
class HeapNumber: public HeapObject {
public:
inline double value();
inline void set_value(double value);
static inline HeapNumber* cast(Object* obj);
Object* HeapNumberToBoolean();
// Layout description.
// kSize之前的空間存儲map對象的指針
static const int kValueOffset = HeapObject::kSize;
// kValueOffset - kSize之間存儲數(shù)字的值,double型
static const int kSize = kValueOffset + kDoubleSize;
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber);
};
下面實現(xiàn)。
1 存取數(shù)值
// 返回double類型的值
double HeapNumber::value() {
return READ_DOUBLE_FIELD(this, kValueOffset);
}
// 寫double值到對象
void HeapNumber::set_value(double value) {
WRITE_DOUBLE_FIELD(this, kValueOffset, value);
}
2 數(shù)字轉(zhuǎn)boolean值。0和NAN是false,其余為true。
Object* HeapNumber::HeapNumberToBoolean() {
// NaN, +0, and -0 should return the false object
switch (fpclassify(value())) {
case FP_NAN: // fall through
case FP_ZERO: return Heap::false_value();
default: return Heap::true_value();
}
}
// 參考ieee對浮點數(shù)的定義
int fpclassify(double x) {
// Use the MS-specific _fpclass() for classification.
int flags = _fpclass(x);
// 非0正值或非0負(fù)值
if (flags & (_FPCLASS_PN | _FPCLASS_NN)) return FP_NORMAL;
// 正數(shù)0或負(fù)數(shù)0
if (flags & (_FPCLASS_PZ | _FPCLASS_NZ)) return FP_ZERO;
// 非標(biāo)準(zhǔn)化的正或負(fù)值
if (flags & (_FPCLASS_PD | _FPCLASS_ND)) return FP_SUBNORMAL;
// 正負(fù)無窮
if (flags & (_FPCLASS_PINF | _FPCLASS_NINF)) return FP_INFINITE;
// All cases should be covered by the code above.
// 不是數(shù)值
ASSERT(flags & (_FPCLASS_SNAN | _FPCLASS_QNAN));
return FP_NAN;
}
上述就是小編為大家分享的如何進(jìn)行js引擎v8源碼分析HeapNumber了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。