#include "jsapi.h"
#include <string>
#include<fstream>
#include<iomanip>
#include <iostream>
using namespace std;
using namespace JS;
bool jsb_applyStorePay(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
bool ok = true;
// js_proxy_t *proxy = jsb_get_js_proxy(obj);
// TinyJSWork* cobj = (TinyJSWork *)(proxy ? proxy->ptr : NULL);
// JSB_PRECONDITION2( cobj, cx, false, "js_TinyJSWork_TinyJSWork_isJailbrokenOrInBeiJing : Invalid Native Object");
if (argc == 1) {
int arg0;
//ok &= JSVAL_TO_INT32_IMPL(cx, args.get(0), &arg0);
int ret =args.get(0).toNumber() + 1;
jsval jsret = JSVAL_NULL;
jsret = INT_TO_JSVAL(ret);
args.rval().set(jsret);
return true;
}
JS_ReportError(cx, "js_TinyJSWork_TinyJSWork_isJailbrokenOrInBeiJing : wrong number of arguments: %d, was expecting %d", argc, 0);
return false;
}
void register_all_js_cpp_cb(JSContext* cx, JS::HandleObject global)
{
JS_DefineFunction(cx, global, "applyStorePay", jsb_applyStorePay, 4, JSPROP_ENUMERATE | JSPROP_PERMANENT);
}
// The class of the global object.
static JSClass globalClass = {
"global",
JSCLASS_GLOBAL_FLAGS,
JS_PropertyStub,
JS_DeletePropertyStub,
JS_PropertyStub,
JS_StrictPropertyStub,
JS_EnumerateStub,
JS_ResolveStub,
JS_ConvertStub,
nullptr, nullptr, nullptr, nullptr,
JS_GlobalObjectTraceHook
};
// The error reporter callback.
void reportError(JSContext *cx, const char *message, JSErrorReport *report) {
fprintf(stderr, "%s:%u:%s\n",
report->filename ? report->filename : "[no filename]",
(unsigned int) report->lineno,
message);
}
int run(JSContext *cx) {
// Enter a request before running anything in the context.
JSAutoRequest ar(cx);
// Create the global object and a new compartment.
RootedObject global(cx);
global = JS_NewGlobalObject(cx, &globalClass, nullptr,
JS::DontFireOnNewGlobalHook);
if (!global)
return 1;
// Enter the new global object's compartment.
JSAutoCompartment ac(cx, global);
// Populate the global object with the standard globals, like Object and
// Array.
if (!JS_InitStandardClasses(cx, global))
return 1;
// Your application code here. This may include JSAPI calls to create your
// own custom JS objects and run scripts.
register_all_js_cpp_cb(cx, global);
// std::string script = "applyStorePay();";
//JS::RootedValue outval(cx);
//jsval argv;
//JS_CallFunctionName(cx, global, "applyStorePay", JS::HandleValueArray::fromMarkedLocation(0, &argv), &outval);
string script;
FILE * fp;
char str1;
if((fp=fopen("MyJsFile.js","r"))==NULL)
{
printf("file cannot be opened\n");
exit(1);
}
while((str1=fgetc(fp))!=EOF){
script +=str1;
}
fclose(fp);
JS_EvaluateScript(cx, JS::RootedObject(cx, global),script.c_str(),script.length(),"",0);
return 0;
}
int main(int argc, const char *argv[]) {
// Initialize the JS engine.
if (!JS_Init())
return 1;
// Create a JS runtime.
JSRuntime *rt = JS_NewRuntime(8L * 1024L * 1024L);
if (!rt)
return 1;
// Create a context.
JSContext *cx = JS_NewContext(rt, 8192);
if (!cx)
return 1;
//JS_SetErrorReporter(rt, reportError);
int status = run(cx);
// Shut everything down.
JS_DestroyContext(cx);
JS_DestroyRuntime(rt);
JS_ShutDown();
return status;
}
SpiderMonkey 基础版
最新推荐文章于 2024-07-08 15:07:14 发布