分享

58JavaScript

 mediatv 2013-01-16


 

aluateUCScriptForPrincip; 处理统一码的函数工作方式与原来的同名函数一样,除;操作JS数据类型;JavaScript定义了他自己的数据类型;一般而言,你在应用程序中声明和使 用JS数据类型就;操作JS值;除了JS数据类型之外,JS引擎也使用JS值,称 之;??????;JSVAL_IS_OBJECTJSVAL_IS_;Besidestest

aluateUCScriptForPrincipals JS_NewUCString JS_NewUCStringCopyN JS_NewUCStringCopyZ JS_InternUCString JS_InternUCStringN

处理统一码的函数工作方式与原来的同名函数一样,除了原来的函数使用参数 char *,而统一码版本的函数参数为 jschar *。

操作 JS 数据类型

JavaScript 定义了他自己的数据类型。其中一部分直接对应 C 中的副本。其他 的,诸如 JSObject,jsdouble, 和 JSString,对 JavaScript 有特殊意义。

一 般而言,你在应用程序中声明和使用 JS 数据类型就和使用标准 C 数据类型一 样。然而,JS 引擎对 JS 数据类型,也就是需要超过一个字空间的变量变量 JSObject,jsdouble, 和 JSString 有不同的跟踪。引擎周期性地检查这些变量, 察看他们是否还在使用中。如果不再使用了,就收集他们,释放存储空间来重新 使用。 垃圾收集可以有效重复利用堆的资源, 但是过分频繁的垃圾收集也会对性能造成 影响。你可以根据 JS 运行时控制垃圾收集的频率,根据你给程序分配的 JS 运行 时的大小和你应用程序使用的 JS 变量和对象的数量之间的关系。如果你的程序 要创建和使用很多 JS 对象和变量,你可能就要分配足够大的运行时来减少垃圾 收集的可能频率。 注意你的应用程序要在任何时候调用同样能 JS_GC 或者 JS_MaybeGC 来强制进行 垃圾收集。 JS_GC 将强制进行垃圾收集。 JS_MaybeGC 则会根据条件进行垃圾收集, 如果你调用这个函数时,初始化时分配的空间的特定比例已经被使用的话,就进 行垃圾收集。

操作 JS 值

除了 JS 数据类型之外,JS 引擎也使用 JS 值,称之为 jsval。一个 jsval 本质上 是一个指向任意 JS 数据类型(除了整型)的一个指针。对于整型,jsval 直接 包含了他自身的整数值。在其他的情况下,指针还会被编码,添加关于它所指的 数据的类型的额外信息。使用可以提高引擎的效率,同时也可以让很多 API 函数 来处理不同类型的数据。 引擎 API 包含了一组用来测试 JS 值中的 JS 数据类型的宏。有:

JSVAL_IS_OBJECT JSVAL_IS_NUMBER JSVAL_IS_INT JSVAL_IS_DOUBLE JSVAL_IS_STRING JSVAL_IS_BOOLEAN

Besides testing ajsval,你也可以检测他是否属于一个基本 JS 数据类型 (JSVAL_IS_PRIMITIVE)。基本类型包括未定义(undefined)、空(null)、 布 尔(boolean)、数值(numeric)和字符串(string)类型。 你可以测试 jsval 所指的值是否为 NULL(JSVAL_IS_NULL) 或者 void(JSVAL_IS_VOID)。 如果 jsval 指向了一个 JS 数据类型是 JSObject,jsdouble, 或者 jsstr, 你可以 将 jsval 转换成他的内在的类型,只要相应使用 JSVAL_TO_OBJECT,JSVAL_TO_DOUBLE 和 JSVAL_TO_STRING。在某些情况下,你的

应用程序或者 JS 引擎调用要求使用一个特定的数据类型的变量或者参数而非一 个 jsval 时,就很有用了。类似地,你可以使用 OBJECT_TO_JSVAL,DOUBLE_TO_JSVAL, 和 STRING_TO_JSVAL, 把 JSObject,jsdouble, 和 jsstr 相应地转换成 jsval。

操作 JS 字符串

在 JavaScript 中你的很多工作都回涉及字符串。JS 引擎实现了一个 JS 字符串 类型,JSString,一个指向 JS 字符—jschar—数组的指针,用来处理支持统一 码的字符串。引擎也实现了一系列丰富的通用和统一码字符串管理程序。最后, JS 引擎提供了对限定字符串的支持,这可以将两个或多个相同的字符串创建时 在内存中共享一个单独的实例。对于 JSString 类型的字符串,引擎会跟踪和管 理字符串资源。 通常情况下,当你在处理 JS 引擎使用的字符串时,你应该使用 JS API 中的字符 串处理函数来创建和复制字符串。 还有创建以空字符结尾的和特定长度的字符串 的例程,以及获取字符串长度和比较字符串。

统一码字符串支持

使 用统一码(Unicode)的 API 字符串函数的名称和标准的引擎 API 字符串行数 是一一对应的,规则如下:如果标准函数名是 JS_NewStringCopyN,相应的统一 码版本就是 JS_NewUCStringCopyN。同样有针对限定字符串的支持统一码的 API 字符串函数。

限定字符串支持

为了节省存储空间,JS 引擎提供了对共享一个单独的字符串实例支持,这些字 符串属于一些独立的不可变化的文字。这种被共享的字符串被称为“限定字符 串”(interned string)。当你觉得某个特定的文本会被创建并且反复在程序 中使用多次的话,那可以使用限定字符串。 引擎的 API 提供了几种工作于限定字符串的函数调用:

JS_InternString, 用来创建或者复用一个 JSString. JS_InternUCString, 用来创建或者复用一个统一码的 JSString. JS_InternUCStringN, 用以创建或者复用一个固定长度的统一码 JSString。

管理安全性

现在使用 JavaScript 1.3,JS 引擎加入了安全性增强 API 函数来编译和执行传 送给引擎的脚本和函数。JS 安全模型是基于 Java 的基本安全模型的。该模型提 供了一个公共安全接口,但是实际的安全控制由你去实现。 在使用 JavaScript 的应用中使用安全管理的一个常用的方法是比较脚本的来源 和限制脚本的交互。例如,你可能会比较两个或多个脚本的代码源并且只允许来 自相同的代码源的脚本修改共享代码源的脚本的属性。 如要实现安全 JS,请按照以下几步: 1. 在代码中声明一个或多个 JSPrincipals 类型的结构体(struct)。 2. 把实现了安全信息的函数列表添加到数组中。 这些包括了为程序提供原则 数组的函数,和使用给定原则的 JS 对象的引用计数增减机制。 3. 把 JSPrincipals 结构和你的安全信息组装起来。这个信息可以包括一般 代码源信息。 4. 在运行时,使用一些特定的 JS API 调用来编译和执行所有要应用安全性 的脚本和函数,他们将要求传递一个 JSPrincipals 结构。下面的表格列 出了这些 API 函数和他们的作用: 函数 JS_CompileScriptForPrincipals JS_CompileUCScriptForPrincipals JS_CompileFunctionForPrincipals JS_CompileUCFunctionForPrincipals JS_EvaluateScriptForPrincipals JS_EvaluateUCScriptForPrincipals 目的 编译(但是不执行)一个启用安 全控制的脚本。 编译(但不执行)一个启用安全 控制、统一码编码的脚本。 从一个文本串创建一个启用安全 控制的 JS 函数。 从一个统一码编码的字符串中创 建一个带安全信息的 JS 函数。 编译和执行一个启用安全控制的 脚本。 编译并执行一个启用安全控制且 用统一码编码的脚本。

This entry was posted on 星期日, 四月 2nd, 2006 at 4:29 pm and is filed under JavaScript, C. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

3 Responses to “JavaScript-C 引擎嵌入开发指南”

1. liaoyan Says:

五月 28th, 2006 at 2:32 pm

ok, thx. 2. billconan Says:

九月 15th, 2006 at 1:23 am

这 个貌似是 firefox 的 js 引擎 spider monkey。我的那个 3d 建模工具本 来要搞个脚本语言的, 看过一些这个东西。 不过现在要先实现基本的功能, 这个以后再考虑。不过很可能以后用 Python 了。 3. ShiningRay Says:

九月 15th, 2006 at 2:14 pm

@Billconan 就是 Spider Monkey 其原名 JavaScript-C 其实 Lua 的性能比 Python 更好一些,不过 Python 的应用更多

How to start up the VM and Execute a Script

Without any error checking for: null returns from JS_ functions that return pointers false returns from JS_ functions that return booleans (errors are conventionally saved in a JSBool variable named ok).

JSRuntime *rt; JSContext *cx; JSObject *global; JSClass global_class = { "global",0, JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub, JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub };

/* * You always need: * a runtime per process, * a context per thread, * a global object per context, * standard classes (e.g. Date). */

rt = JS_NewRuntime(0x100000);

cx = JS_NewContext(rt, 0x1000); global = JS_NewObject(cx, &global_class, NULL, NULL); JS_InitStandardClasses(cx, global);

/* * Now suppose script contains some JS to evaluate, say "22/7" as a * bad approximation for Math.PI, or something longer, such as this: * "(function fact(n){if (n <= 1) return 1; return n * fact(n-1)})(5)" * to compute 5! */

char *script = "..."; jsval rval; JSString *str; JSBool ok; ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, &rval); str = JS_ValueToString(cx, rval); printf("script result: %s\n", JS_GetStringBytes(str));

How to call C functions from JavaScript

Say the C function is named doit and it would like at least two actual parameters when called (if the caller supplies fewer, the JS engine should ensure that undefined is passed for the missing ones):

#define DOIT_MINARGS 2 static JSBool doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {

/* * Look in argv for argc actual parameters, set *rval to return a * value to the caller. */

...

}

Then to wire it up to JS, you could write:

ok = JS_DefineFunction(cx, global, "doit", doit, DOIT_MINARGS, 0);

Or, if you had a bunch of native functions to define, you would probably put them in a table:

static JSFunctionSpec my_functions[] = { {"doit", doit, DOIT_MINARGS, 0, 0}, etc...

{0,0,0,0,0}, };

(the final, all-zeroes function specifier terminates the table) and say:

ok = JS_DefineFunctions(cx, global, my_functions);

How to call JavaScript functions from C (such as "onClick")

Say the click event is for the top-most or focused UI element at position (x, y):

JSObject *target, *event; jsval argv[1], rval;

/* * Find event target and make event object to represent this click. * Pass cx to NewEventObject so JS_NewObject can be called. */

target = FindEventTargetAt(cx, global, x, y); argv[0] = OBJECT_TO_JSVAL(event); event = NewEventObject(cx, "click", x, y);

/* To emulate the DOM, you might want to try "onclick" too. */

ok = JS_CallFunctionName(cx, target, "onClick", 1, argv, &rval);

/* Now test rval to see whether we should cancel the event. */

if (JSVAL_IS_BOOLEAN(rval) && !JSVAL_TO_BOOLEAN(rval)) CancelEvent(event);

Again, I've elided error checking (such as testing for !ok after the call), and I've faked up some C event management routines that emulate the DOM's convention of canceling an event if its handler returns false.

功能强大的 JavaScript 引擎--SpiderMonkey JavaScript 在浏览器中的应用几乎是尽人皆知的。实际上,JavaScript 技术也可以使用在非浏

览器应用程序当中,从而让应用程序具有自动的脚本功能。本文介绍了一种功能非常强大的

JavaScript 引擎 SpiderMonkey。这个引擎是 Mozilla 浏览器的 JavaScript 引擎。该引擎接

口定义清晰,模块化好。本文简要介绍了 SpiderMonkey 的基本结构,并讲解了如何在自己的 应用程序中使用该引擎,最后给出了一个样例程序。该程序能够解释执行 JavaScript 脚本完成 简单的脚本功能。

JavaScript 是由 Netscape 开发的对象脚本语言,其特点是开发简单、功能灵活,目前已广泛 应用于 WEB 页面及服务器应用程序中。 HTML 本身是静态的、 不允许用户干预, 但用 JavaScript 编写的脚本程序就可以在用户的浏览器端运行,可以同用户进行交互,从而实现动态页面。可以 将 JavaScript 与嵌入 WEB 的大多数对象的事件(如鼠标点击、移动等)相关联,然后用自己 的方式处理这些事件。JavaScript 提供了丰富的内置函数及命令,能在浏览器中显示 HTML、 数值计算、多媒体播放、超级链接以及简单的交互窗口等,还可以使在浏览器中运行的小 Java 应用程序的性质改变从而很容易地改变控件或其它对象的行为而不必深入研究其本身的结构。 JavaScript 虽然是为 Internet 而开发的,但它的应用却不仅仅局限于 Internet,事实上由于 其面向对象的特性使得其适用范围非常广泛, 只要我们的应用程序具有良好的对象机制, 我们就 可以借用 JavaScript,从而实现很好的交互功能。 SpiderMonkey 是由 C 语言操作的 JavaScript 引擎,它支持 JS1.4 和 ECMAScript-262 规 范。该引擎分析、编译和执行脚本,根据 JS 数据类型和对象的需要进行内存分配及释放操作。 利用该引擎可以让你的应用程序具有解释 JavaScript 脚本的能力,目前已有若干个项目都采用 了 SpiderMonkey 引擎,像 K-3D、WebCrossing、WebMerger 等。K-3D 是用 C++实现 的 3D 建模与仿真系统,该系统内嵌 SpiderMonkey 引擎来提供自定义脚本(用户创建脚本生 成像齿轮一样具有重复特性的复杂形体),也可用来驱动交互式的教学系统(用户可以使用一段 JS 脚本程序记录其交互过程,如移动鼠标、选择菜单、点击鼠标等)。WebCrossing 利用 SpiderMonkey 实现了服务器端的脚本环境,提供了完全的 Web-server 脚本环境,服务器端 的实现允许你在内置的、 面

三亿文库包含各类专业文献、专业论文、文学作品欣赏、中学教育、生活休闲娱乐、行业资料、应用写作文书、58JavaScript-C引擎嵌入开发指南等内容。

12345

 




 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多