Archive

Posts Tagged ‘C++’

JS and js namespaces in SpiderMonkey

January 30th, 2013 No comments

今天在Mozilla的SpiderMonkey C++编码规范[1]中找到了JS和js的说明:

Mozilla SpiderMonkey 中有两个不同的 namespace: JS 和 js。JS 名字空间用来存放公开的函数和类型名称。类似 JSXXX、jsXXX、JS_XXX 的函数和类型名都应该放在这个名字空间中;js 名字空间用来保存私有的函数和对象。

SpiderMonkey的这两个名字空间用大小写进行区分,带来的最大的不方便,就是用搜索引擎搜索的时候无法找到相关的说明。以前想找这两个名字空间的区别,搜索了半天都找不到相关的网页。

这个博客,估计想知道JS和js区别的SpiderMonkey初学者也搜不到。 🙂

 

[1]SpiderMonkey C++编码规范: https://wiki.mozilla.org/JavaScript:SpiderMonkey:C%2B%2B_Coding_Style

UnrootedScript in SpiderMonkey

December 19th, 2012 No comments

在 SpiderMonkey 中,JSScript 是比较常见的一个数据结构,它封装了一个 JavaScript 脚本。而 UnrootedScript 是在 SpiderMonkey 代码中经常作为函数返回值出现的类型。奇怪的是,使用 Eclipse IDE 找不到该类型的定义;使用 grep 搜索也只能找到该类型的使用,找不到该类型的定义(这个类型的使用非常广泛,眼睛都看花了);直接使用 Google 搜索,也找不到这个类型。

最后,在 Mozilla 的 Bugzilla 上看到 bug 817818,才意识到:这个类型是用宏定义拼出来的。

以下这段代码来自于 Mozilla-central/js/src/vm/Root.h:

在 Mozilla-central/js/src/JSScript.h 文件中,有一行对应的宏引用:

通过这种方式完成了 UnrootedScript 的定义。
类似的定义还有:

生成了以下类型:

评注:以前在 GCC 的代码中也见到了不少这样的技巧,用 C/C++ 中的宏拼出来很多的代码,使得源代码看起来简洁,代码行数更少。但是要看懂这样的代码也需要更多的耐心和技巧,对于初学者而言不是很友好。内部实现的文档稀缺,加之目前IDE中的智能提示系统(CCS)还搞不定这么复杂的宏展开,使得初学者的学习门槛更高了。