十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行js引擎v8源碼分析HeapNumber,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、建安網(wǎng)站維護(hù)、網(wǎng)站推廣。
HeapNumber是保存大整形的對(duì)象。v8里有smi保存整形,但是他只有31位,超過(guò)31位的就需要用HeapNumber。
// 存儲(chǔ)了數(shù)字的堆對(duì)象
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之前的空間存儲(chǔ)map對(duì)象的指針
static const int kValueOffset = HeapObject::kSize;
// kValueOffset - kSize之間存儲(chǔ)數(shù)字的值,double型
static const int kSize = kValueOffset + kDoubleSize;
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber);
};
下面實(shí)現(xiàn)。
1 存取數(shù)值
// 返回double類型的值
double HeapNumber::value() {
return READ_DOUBLE_FIELD(this, kValueOffset);
}
// 寫(xiě)double值到對(duì)象
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對(duì)浮點(diǎn)數(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ù)無(wú)窮
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)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。