SpiderMonkey
 
可嵌入的JavaScript引擎。

网址:http://www.mozilla.org/js/spidermonkey/
支持平台:Win32,Linux
标题包括:spidermonkey / jsapi.bi
标题版本:2006年

例子

''评估JavaScript代码
#include once "spidermonkey/jsapi.bi"

Dim Shared As JSClass global_class = _
( _
    @"全球", 0, _
    @JS_PropertyStub, @JS_PropertyStub, @JS_PropertyStub, @JS_PropertyStub, _
    @JS_EnumerateStub, @JS_ResolveStub, @JS_ConvertStub, @JS_FinalizeStub _
)

Dim As JSRuntime Ptr rt = JS_NewRuntime(1048576 /'memory limit'/)
Dim As JSContext Ptr cx = JS_NewContext(rt, 4096 /'stack size'/)
Dim As JSObject Ptr global = JS_NewObject(cx, @global_class, NULL, NULL) 

JS_InitStandardClasses(cx, global)

''这个字符串也可以从文件中读取,也可以作为HTTP数据的一部分。
Const TEST_SCRIPT = _
    !"功能事实(n)\\ n" + _
    !"{ \n" + _
    !"if(n <= 1)\\ n" + _
    !"返回1; \\ n" + _
    !"\n" + _
    !"返回n * fact(n-1); \\ n" + _
    !"} \n" + _
    !"\n" + _
    !"事实(5)\\ n"

Dim As jsval rval
If (JS_EvaluateScript(cx, global, TEST_SCRIPT, Len(TEST_SCRIPT), "本地主机", 1, @rval) = 0) Then
    Print "JS_EvaluateScript失败"
    Sleep
    End 1
End If

Print "结果:" & *JS_GetStringBytes(JS_ValueToString(cx, rval))

JS_DestroyContext(cx)
JS_DestroyRuntime(rt)


''回调示例:JavaScript代码使用的函数,
''但是在FB中实现。
#include once "spidermonkey/jsapi.bi"

Dim Shared As JSClass global_class = _
( _
    @"全球", 0, _
    @JS_PropertyStub, @JS_PropertyStub, @JS_PropertyStub, @JS_PropertyStub, _
    @JS_EnumerateStub, @JS_ResolveStub, @JS_ConvertStub, @JS_FinalizeStub _
)

Private Function print_callback cdecl _
    ( _
        ByVal cx As JSContext Ptr, _
        ByVal obj As JSObject Ptr, _
        ByVal argc As uintN, _
        ByVal argv As jsval Ptr, _
        ByVal rval As jsval Ptr _
    ) As JSBool

    If (argc < 1) Then
        Return 0
    End If

    Print *JS_GetStringBytes(JS_ValueToString(cx, argv[0]))

    Return 1
End Function

Private Function ucase_callback cdecl _
    ( _
        ByVal cx As JSContext Ptr, _
        ByVal obj As JSObject Ptr, _
        ByVal argc As uintN, _
        ByVal argv As jsval Ptr, _
        ByVal rval As jsval Ptr _
    ) As JSBool
    
    If (argc < 1) Then
        Return 0
    End If
    
    ''获得第一个参数
    Dim As ZString Ptr arg1 = JS_GetStringBytes(JS_ValueToString(cx, argv[0]))
   
    ''获取结果字符串的缓冲区
    Dim As ZString Ptr result = JS_malloc(cx, Len(*arg1) + 1)

    ''做工作
    *result = UCase(*arg1)

    ''返回撕毁它
    *rval = STRING_TO_JSVAL(JS_NewString(cx, result, Len(*result)))

    Return 1
End Function

    Dim As JSRuntime Ptr rt = JS_NewRuntime(1048576 /'memory limit'/)
    Dim As JSContext Ptr cx = JS_NewContext(rt, 4096 /'stack size'/)
    Dim As JSObject Ptr global = JS_NewObject(cx, @global_class, NULL, NULL) 

    JS_InitStandardClasses(cx, global)

    JS_DefineFunction(cx, global, "打印", @print_callback, 1, 0) 
    JS_DefineFunction(cx, global, "UCASE", @ucase_callback, 1, 0) 

    Const TEST_SCRIPT = "打印(UCASE( '你好'));" 

    Dim As jsval rval
    If (JS_EvaluateScript(cx, global, TEST_SCRIPT, Len(TEST_SCRIPT), "本地主机", 1, @rval) = 0) Then
        Print "JS_EvaluateScript失败"
        Sleep
        End 1
    End If

    JS_DestroyContext(cx)
    JS_DestroyRuntime(rt)