QML 的底层实现之 JavaScript 变量编码



  • QML 是基于 ECMA-262(JavaScript),通过 Qt 的机制进行拓展的高级编程语言。下面会简单讲讲 JavaScript 变量是如何在 C++ 中定义的。

    先看如下一段话:

    We use two different ways of encoding JS values. One for 32bit and one for 64bit systems.

    In both cases, we use 8 bytes for a value and a different variant of NaN boxing. A Double NaN (actually -qNaN)
    is indicated by a number that has the top 13 bits set. The other values are usually set to 0 by the
    processor, and are thus free for us to store other data. We keep pointers in there for managed objects,
    and encode the other types using the free space given to use by the unused bits for NaN values. This also
    works for pointers on 64 bit systems, as they all currently only have 48 bits of addressable memory.

    On 32bit, we store doubles as doubles. All other values, have the high 32bits set to a value that
    will make the number a NaN. The Masks below are used for encoding the other types.

    On 64 bit, we xor Doubles with (0xffff8000 << 32). That has the effect that no doubles will get encoded
    with the 13 highest bits all 0. We are now using special values for bits 14-17 to encode our values. These
    can be used, as the highest valid pointer on a 64 bit system is 2^48-1.

    If they are all 0, we have a pointer to a Managed object. If bit 14 is set we have an integer.
    This makes testing for pointers and numbers very fast (we have a number if any of the highest 14 bits is set).

    Bit 15-17 is then used to encode other immediates.

    大意如下:

    使用两种不同的方式对 JS 值进行编码,一种是 32 位,一种是 64 位。

    在这两种情况下,使用 8 字节(int64)保存一个值或者一个包装了非数字变量的变体。使用前 13 个 bit 来标定 -qNaN,其他位一般置为零以便使用。在后 51 位中可以保存被管理对象的指针或者其他值,这是适用 64 位操作系统,因为现有的 64 位操作系统,一般只是用 48 位(2^48-1)进行寻址,这意味着有多余的 16 位( 2^16+1 )是不会被使用的。

    在 32 位系统上,直接将双精度浮点数进行保存。高 32 位配合位遮罩保存不同的非数字变量,例如 int 和指针。

    在 64 位上,通过 0xffff8000 << 32 这个位遮罩存取浮点数,这样的效果是,不直接对双精度进行编码,最高的 13 位直接置为零。现在可以使用 14~17 位对其他值进行编码,在64位系统上的最高有效指针是2 ^ 48-1。

    如果最高的 14 位全为零,那么低 48 位保存的是一个指针,如果第 14 位置为 1,保存的便是一个整数。这让数字和指针在运算过程中变得十分快速。(最高的 14 位中,任意一位为 1,保存的便是整数)

    然后使用 15-17 位来编码其他立即数。

    总结一下,就是使用 int64 作为 JavaScript 运行的 var,这个 var 可以保存数字或者指针。

    代码在这里 qv4value_p.h



  • @qyvlik 厉害,都研究到v4引擎来了。那么,作为我们QML开发者,需要注意那些呢?想知道知道。👷



  • @jiangcaiyang123 这种应该是 tagged pointer 的原理。



  • @qyvlik 能具体介绍一下吗?好像还是不懂的样子…………


 

最近的回复

  • @jiangcaiyang 如果需要自动化测试,也用的上

    阅读更多
  • @青山白云 这个可能有点用,但是可能更多局限于爬虫领域吧。

    阅读更多
  • https://blog.csdn.net/huilan_same/article/details/51896672

    python制作爬虫时候使用selenium进行自动化
    使用chromedriver时候需要对应版本

    chromedriver版本 支持的Chrome版本 v2.39 v66-68 v2.38 v65-67 v2.37 v64-66 v2.36 v63-65 v2.35 v62-64 v2.34 v61-63 v2.33 v60-62 v2.32 v59-61 v2.31 v58-60 v2.30 v58-60 v2.29 v56-58 v2.28 v55-57 v2.27 v54-56 v2.26 v53-55 v2.25 v53-55 v2.24 v52-54 v2.23 v51-53 v2.22 v49-52 v2.21 v46-50 v2.20 v43-48 v2.19 v43-47 v2.18 v43-46 v2.17 v42-43 v2.13 v42-45 v2.15 v40-43 v2.14 v39-42 v2.13 v38-41 v2.12 v36-40 v2.11 v36-40 v2.10 v33-36 v2.9 v31-34 v2.8 v30-33 v2.7 v30-33 v2.6 v29-32 v2.5 v29-32 v2.4 v29-32 查谷歌浏览器版本

    地址栏输入chrome://settings/help

    0_1528459921154_16bbaf4d-0e8e-42cd-9e52-f8fc43932871-image.png

    所有chromedriver均可在下面链接中下载到:

    http://chromedriver.storage.googleapis.com/index.html

    阅读更多
  • 0_1528166192946_20180605_103351.gif

    源代码

    Fork me on Gitee

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔