您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何進行js引擎v8源碼分析HeapNumber,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
HeapNumber是保存大整形的對象。v8里有smi保存整形,但是他只有31位,超過31位的就需要用HeapNumber。
// 存儲了數字的堆對象
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之間存儲數字的值,double型
static const int kSize = kValueOffset + kDoubleSize;
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber);
};
下面實現。
1 存取數值
// 返回double類型的值
double HeapNumber::value() {
return READ_DOUBLE_FIELD(this, kValueOffset);
}
// 寫double值到對象
void HeapNumber::set_value(double value) {
WRITE_DOUBLE_FIELD(this, kValueOffset, value);
}
2 數字轉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對浮點數的定義
int fpclassify(double x) {
// Use the MS-specific _fpclass() for classification.
int flags = _fpclass(x);
// 非0正值或非0負值
if (flags & (_FPCLASS_PN | _FPCLASS_NN)) return FP_NORMAL;
// 正數0或負數0
if (flags & (_FPCLASS_PZ | _FPCLASS_NZ)) return FP_ZERO;
// 非標準化的正或負值
if (flags & (_FPCLASS_PD | _FPCLASS_ND)) return FP_SUBNORMAL;
// 正負無窮
if (flags & (_FPCLASS_PINF | _FPCLASS_NINF)) return FP_INFINITE;
// All cases should be covered by the code above.
// 不是數值
ASSERT(flags & (_FPCLASS_SNAN | _FPCLASS_QNAN));
return FP_NAN;
}
上述就是小編為大家分享的如何進行js引擎v8源碼分析HeapNumber了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。