''评估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)