aluateUCScriptForPrincip;
處理統(tǒng)一碼的函數(shù)工作方式與原來的同名函數(shù)一樣,除;操作JS數(shù)據(jù)類型;JavaScript定義了他自己的數(shù)據(jù)類型;一般而言,你在應(yīng)用程序中聲明和使
用JS數(shù)據(jù)類型就;操作JS值;除了JS數(shù)據(jù)類型之外,JS引擎也使用JS值,稱
之;??????;JSVAL_IS_OBJECTJSVAL_IS_;Besidestest
aluateUCScriptForPrincipals JS_NewUCString JS_NewUCStringCopyN JS_NewUCStringCopyZ JS_InternUCString JS_InternUCStringN處理統(tǒng)一碼的函數(shù)工作方式與原來的同名函數(shù)一樣,除了原來的函數(shù)使用參數(shù) char *,而統(tǒng)一碼版本的函數(shù)參數(shù)為 jschar *。
操作 JS 數(shù)據(jù)類型
JavaScript 定義了他自己的數(shù)據(jù)類型。其中一部分直接對應(yīng) C 中的副本。其他 的,諸如 JSObject,jsdouble, 和 JSString,對 JavaScript 有特殊意義。
一
般而言,你在應(yīng)用程序中聲明和使用 JS 數(shù)據(jù)類型就和使用標(biāo)準(zhǔn) C 數(shù)據(jù)類型一 樣。然而,JS 引擎對 JS
數(shù)據(jù)類型,也就是需要超過一個字空間的變量變量 JSObject,jsdouble, 和 JSString
有不同的跟蹤。引擎周期性地檢查這些變量, 察看他們是否還在使用中。如果不再使用了,就收集他們,釋放存儲空間來重新 使用。
垃圾收集可以有效重復(fù)利用堆的資源, 但是過分頻繁的垃圾收集也會對性能造成 影響。你可以根據(jù) JS 運行時控制垃圾收集的頻率,根據(jù)你給程序分配的
JS 運行 時的大小和你應(yīng)用程序使用的 JS 變量和對象的數(shù)量之間的關(guān)系。如果你的程序 要創(chuàng)建和使用很多 JS
對象和變量,你可能就要分配足夠大的運行時來減少垃圾 收集的可能頻率。 注意你的應(yīng)用程序要在任何時候調(diào)用同樣能 JS_GC 或者
JS_MaybeGC 來強(qiáng)制進(jìn)行 垃圾收集。 JS_GC 將強(qiáng)制進(jìn)行垃圾收集。 JS_MaybeGC 則會根據(jù)條件進(jìn)行垃圾收集,
如果你調(diào)用這個函數(shù)時,初始化時分配的空間的特定比例已經(jīng)被使用的話,就進(jìn) 行垃圾收集。
操作 JS 值
除了 JS
數(shù)據(jù)類型之外,JS 引擎也使用 JS 值,稱之為 jsval。一個 jsval 本質(zhì)上 是一個指向任意 JS
數(shù)據(jù)類型(除了整型)的一個指針。對于整型,jsval 直接 包含了他自身的整數(shù)值。在其他的情況下,指針還會被編碼,添加關(guān)于它所指的
數(shù)據(jù)的類型的額外信息。使用可以提高引擎的效率,同時也可以讓很多 API 函數(shù) 來處理不同類型的數(shù)據(jù)。 引擎 API 包含了一組用來測試 JS
值中的 JS 數(shù)據(jù)類型的宏。有:
JSVAL_IS_OBJECT JSVAL_IS_NUMBER JSVAL_IS_INT JSVAL_IS_DOUBLE JSVAL_IS_STRING JSVAL_IS_BOOLEAN
Besides
testing ajsval,你也可以檢測他是否屬于一個基本 JS 數(shù)據(jù)類型
(JSVAL_IS_PRIMITIVE)?;绢愋桶ㄎ炊x(undefined)、空(null)、 布
爾(boolean)、數(shù)值(numeric)和字符串(string)類型。 你可以測試 jsval 所指的值是否為
NULL(JSVAL_IS_NULL) 或者 void(JSVAL_IS_VOID)。 如果 jsval 指向了一個 JS 數(shù)據(jù)類型是
JSObject,jsdouble, 或者 jsstr, 你可以 將 jsval 轉(zhuǎn)換成他的內(nèi)在的類型,只要相應(yīng)使用
JSVAL_TO_OBJECT,JSVAL_TO_DOUBLE 和 JSVAL_TO_STRING。在某些情況下,你的
應(yīng)用程序或者
JS 引擎調(diào)用要求使用一個特定的數(shù)據(jù)類型的變量或者參數(shù)而非一 個 jsval 時,就很有用了。類似地,你可以使用
OBJECT_TO_JSVAL,DOUBLE_TO_JSVAL, 和 STRING_TO_JSVAL, 把 JSObject,jsdouble,
和 jsstr 相應(yīng)地轉(zhuǎn)換成 jsval。
操作 JS 字符串
在 JavaScript
中你的很多工作都回涉及字符串。JS 引擎實現(xiàn)了一個 JS 字符串 類型,JSString,一個指向 JS
字符—jschar—數(shù)組的指針,用來處理支持統(tǒng)一 碼的字符串。引擎也實現(xiàn)了一系列豐富的通用和統(tǒng)一碼字符串管理程序。最后, JS
引擎提供了對限定字符串的支持,這可以將兩個或多個相同的字符串創(chuàng)建時 在內(nèi)存中共享一個單獨的實例。對于 JSString
類型的字符串,引擎會跟蹤和管 理字符串資源。 通常情況下,當(dāng)你在處理 JS 引擎使用的字符串時,你應(yīng)該使用 JS API 中的字符
串處理函數(shù)來創(chuàng)建和復(fù)制字符串。 還有創(chuàng)建以空字符結(jié)尾的和特定長度的字符串 的例程,以及獲取字符串長度和比較字符串。
統(tǒng)一碼字符串支持
使
用統(tǒng)一碼(Unicode)的 API 字符串函數(shù)的名稱和標(biāo)準(zhǔn)的引擎 API 字符串行數(shù) 是一一對應(yīng)的,規(guī)則如下:如果標(biāo)準(zhǔn)函數(shù)名是
JS_NewStringCopyN,相應(yīng)的統(tǒng)一 碼版本就是 JS_NewUCStringCopyN。同樣有針對限定字符串的支持統(tǒng)一碼的 API
字符串函數(shù)。
限定字符串支持
為了節(jié)省存儲空間,JS 引擎提供了對共享一個單獨的字符串實例支持,這些字
符串屬于一些獨立的不可變化的文字。這種被共享的字符串被稱為“限定字符 串”(interned
string)。當(dāng)你覺得某個特定的文本會被創(chuàng)建并且反復(fù)在程序 中使用多次的話,那可以使用限定字符串。 引擎的 API
提供了幾種工作于限定字符串的函數(shù)調(diào)用:
JS_InternString, 用來創(chuàng)建或者復(fù)用一個
JSString. JS_InternUCString, 用來創(chuàng)建或者復(fù)用一個統(tǒng)一碼的 JSString.
JS_InternUCStringN, 用以創(chuàng)建或者復(fù)用一個固定長度的統(tǒng)一碼 JSString。
管理安全性
現(xiàn)在使用
JavaScript 1.3,JS 引擎加入了安全性增強(qiáng) API 函數(shù)來編譯和執(zhí)行傳 送給引擎的腳本和函數(shù)。JS 安全模型是基于 Java
的基本安全模型的。該模型提 供了一個公共安全接口,但是實際的安全控制由你去實現(xiàn)。 在使用 JavaScript
的應(yīng)用中使用安全管理的一個常用的方法是比較腳本的來源 和限制腳本的交互。例如,你可能會比較兩個或多個腳本的代碼源并且只允許來
自相同的代碼源的腳本修改共享代碼源的腳本的屬性。 如要實現(xiàn)安全 JS,請按照以下幾步: 1. 在代碼中聲明一個或多個 JSPrincipals
類型的結(jié)構(gòu)體(struct)。 2. 把實現(xiàn)了安全信息的函數(shù)列表添加到數(shù)組中。 這些包括了為程序提供原則 數(shù)組的函數(shù),和使用給定原則的 JS
對象的引用計數(shù)增減機(jī)制。 3. 把 JSPrincipals 結(jié)構(gòu)和你的安全信息組裝起來。這個信息可以包括一般 代碼源信息。 4.
在運行時,使用一些特定的 JS API 調(diào)用來編譯和執(zhí)行所有要應(yīng)用安全性 的腳本和函數(shù),他們將要求傳遞一個 JSPrincipals
結(jié)構(gòu)。下面的表格列 出了這些 API 函數(shù)和他們的作用: 函數(shù) JS_CompileScriptForPrincipals
JS_CompileUCScriptForPrincipals JS_CompileFunctionForPrincipals
JS_CompileUCFunctionForPrincipals JS_EvaluateScriptForPrincipals
JS_EvaluateUCScriptForPrincipals 目的 編譯(但是不執(zhí)行)一個啟用安 全控制的腳本。
編譯(但不執(zhí)行)一個啟用安全 控制、統(tǒng)一碼編碼的腳本。 從一個文本串創(chuàng)建一個啟用安全 控制的 JS 函數(shù)。 從一個統(tǒng)一碼編碼的字符串中創(chuàng)
建一個帶安全信息的 JS 函數(shù)。 編譯和執(zhí)行一個啟用安全控制的 腳本。 編譯并執(zhí)行一個啟用安全控制且 用統(tǒng)一碼編碼的腳本。
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 引擎嵌入開發(fā)指南”
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 建模工具本 來要搞個腳本語言的, 看過一些這個東西。
不過現(xiàn)在要先實現(xiàn)基本的功能, 這個以后再考慮。不過很可能以后用 Python 了。 3. ShiningRay Says:
九月 15th, 2006 at 2:14 pm
@Billconan 就是 Spider Monkey 其原名 JavaScript-C 其實 Lua 的性能比 Python 更好一些,不過 Python 的應(yīng)用更多
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.
功能強(qiáng)大的 JavaScript 引擎--SpiderMonkey JavaScript 在瀏覽器中的應(yīng)用幾乎是盡人皆知的。實際上,JavaScript 技術(shù)也可以使用在非瀏
覽器應(yīng)用程序當(dāng)中,從而讓應(yīng)用程序具有自動的腳本功能。本文介紹了一種功能非常強(qiáng)大的
JavaScript 引擎 SpiderMonkey。這個引擎是 Mozilla 瀏覽器的 JavaScript 引擎。該引擎接
口定義清晰,模塊化好。本文簡要介紹了 SpiderMonkey 的基本結(jié)構(gòu),并講解了如何在自己的 應(yīng)用程序中使用該引擎,最后給出了一個樣例程序。該程序能夠解釋執(zhí)行 JavaScript 腳本完成 簡單的腳本功能。
JavaScript
是由 Netscape 開發(fā)的對象腳本語言,其特點是開發(fā)簡單、功能靈活,目前已廣泛 應(yīng)用于 WEB 頁面及服務(wù)器應(yīng)用程序中。 HTML
本身是靜態(tài)的、 不允許用戶干預(yù), 但用 JavaScript
編寫的腳本程序就可以在用戶的瀏覽器端運行,可以同用戶進(jìn)行交互,從而實現(xiàn)動態(tài)頁面??梢?將 JavaScript 與嵌入 WEB
的大多數(shù)對象的事件(如鼠標(biāo)點擊、移動等)相關(guān)聯(lián),然后用自己 的方式處理這些事件。JavaScript
提供了豐富的內(nèi)置函數(shù)及命令,能在瀏覽器中顯示 HTML、 數(shù)值計算、多媒體播放、超級鏈接以及簡單的交互窗口等,還可以使在瀏覽器中運行的小
Java 應(yīng)用程序的性質(zhì)改變從而很容易地改變控件或其它對象的行為而不必深入研究其本身的結(jié)構(gòu)。 JavaScript 雖然是為 Internet
而開發(fā)的,但它的應(yīng)用卻不僅僅局限于 Internet,事實上由于 其面向?qū)ο蟮奶匦允沟闷溥m用范圍非常廣泛,
只要我們的應(yīng)用程序具有良好的對象機(jī)制, 我們就 可以借用 JavaScript,從而實現(xiàn)很好的交互功能。 SpiderMonkey 是由 C
語言操作的 JavaScript 引擎,它支持 JS1.4 和 ECMAScript-262 規(guī) 范。該引擎分析、編譯和執(zhí)行腳本,根據(jù) JS
數(shù)據(jù)類型和對象的需要進(jìn)行內(nèi)存分配及釋放操作。 利用該引擎可以讓你的應(yīng)用程序具有解釋 JavaScript 腳本的能力,目前已有若干個項目都采用 了
SpiderMonkey 引擎,像 K-3D、WebCrossing、WebMerger 等。K-3D 是用 C++實現(xiàn) 的 3D
建模與仿真系統(tǒng),該系統(tǒng)內(nèi)嵌 SpiderMonkey 引擎來提供自定義腳本(用戶創(chuàng)建腳本生
成像齒輪一樣具有重復(fù)特性的復(fù)雜形體),也可用來驅(qū)動交互式的教學(xué)系統(tǒng)(用戶可以使用一段 JS
腳本程序記錄其交互過程,如移動鼠標(biāo)、選擇菜單、點擊鼠標(biāo)等)。WebCrossing 利用 SpiderMonkey
實現(xiàn)了服務(wù)器端的腳本環(huán)境,提供了完全的 Web-server 腳本環(huán)境,服務(wù)器端 的實現(xiàn)允許你在內(nèi)置的、 面
三億文庫包含各類專業(yè)文獻(xiàn)、專業(yè)論文、文學(xué)作品欣賞、中學(xué)教育、生活休閑娛樂、行業(yè)資料、應(yīng)用寫作文書、58JavaScript-C引擎嵌入開發(fā)指南等內(nèi)容。
12345