精华内容
参与话题
问答
  • 参见...https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_User_Guide https://blog.csdn.net/jnstone3/article/details/3953203...

    参见https://blog.csdn.net/kaitiren/article/details/21961235
    https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_User_Guide
    https://blog.csdn.net/jnstone3/article/details/3953203?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    http://ftp.mozilla.org/pub/mozilla.org/js/js-1.60.tar.gz

    其中,dll. lib使用如下的资源:https://download.csdn.net/download/chenshuanj/2876998?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task

    https://download.csdn.net/download/ecaifu800/6042077?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158452433919726869064130%2522%252C%2522scm%2522%253A%252220140713.130062587..%2522%257D&request_id=158452433919726869064130&biz_id=1&utm_source=distribute.pc_search_result.none-task
    下面是代码的整理:

    使用示例1:

    Customer.h:

    #ifndef _Customer_H
    #define _Customer_H
    
    #include <iostream>
    class Customer
    {
    public:
    	Customer() {}
    	Customer(std::string name, int age);
    	int GetAge();
    	void SetAge(int newAge);
    	std::string GetName();
    	void SetName(std::string newName);
    private:
    	int m_age;
    	std::string m_name;
    };
    #endif

    Customer.cpp:

    #include "Customer.h"
    
    Customer::Customer(std::string name, int age) 
    { 
    	m_name = name; 
    	m_age = age; 
    }
    
    int Customer::GetAge() 
    { 
    	return m_age;
    }
    
    void Customer::SetAge(int newAge) 
    { 
    	m_age = newAge; 
    }
    
    std::string Customer::GetName() 
    { 
    	return m_name;
    }
    
    void Customer::SetName(std::string newName)
    { 
    	m_name = newName;
    }
    

    JSCustomer.h:

    #pragma once
    
    #ifndef _JSCustomer_H
    #define _JSCustomer_H
    
    #include <stdio.h>
    #include <tchar.h>
    #include <iostream>
    
    #define XP_WIN
    #include "jsapi.h"
    #include "Customer.h"
    
    class JSCustomer
    {
    public:
    	/*** Constructor*/
    	JSCustomer()
    		: m_pCustomer(NULL) {}
    	/*** Destructor*/
    	virtual ~JSCustomer()
    	{
    		delete m_pCustomer;
    		m_pCustomer = NULL;
    	}
    	/*** JSGetProperty - Callback for retrieving properties*/
    	static JSBool JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
    	/*** JSSetProperty - Callback for setting properties*/
    	static JSBool JSSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
    	/*** JSConstructor - Callback for when a wxCustomer object is created*/
    	static JSBool JSConstructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
    	/*** JSDestructor - Callback for when a wxCustomer object is destroyed*/
    	static void JSDestructor(JSContext *cx, JSObject *obj);
    	/*** JSInit - Create a prototype for wxCustomer*/
    	static JSObject* JSInit(JSContext *cx, JSObject *obj, JSObject *proto=NULL);
    	static JSBool computeReduction(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
    	static JSClass Customer_class;
    	void setCustomer(Customer *customer) { m_pCustomer = customer; }
    	Customer* getCustomer() { return m_pCustomer; }
    private:
    	Customer *m_pCustomer;
    	static JSPropertySpec Customer_properties[];
    	static JSFunctionSpec Customer_methods[];
    	enum { name_prop, age_prop };
    };
    #endif //_JSCustomer_H

    JSCustomer.cpp:

    #include "JSCustomer.h"
    
    #include <string>
    #define XP_WIN
    #include "jsapi.h"
    //#include "Customer.h"
    #include "JSCustomer.h"
    
    
    JSPropertySpec JSCustomer::Customer_properties[] = {
    	{ "name", name_prop, JSPROP_ENUMERATE },
    	{ "age", age_prop, JSPROP_ENUMERATE },
    	{ 0 }
    };
    JSFunctionSpec JSCustomer::Customer_methods[] = {
    	{ "computeReduction", computeReduction, 1, 0, 0 },
    	{ 0, 0, 0, 0, 0 }
    };
    JSClass JSCustomer::Customer_class = {
    	"Customer",
    	JSCLASS_HAS_PRIVATE,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JSCustomer::JSGetProperty,
    	JSCustomer::JSSetProperty,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JSCustomer::JSDestructor
    };
    JSBool JSCustomer::JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
    	if (JSVAL_IS_INT(id))
    	{
    		JSCustomer *p = (JSCustomer *)JS_GetPrivate(cx, obj);
    		Customer *customer = p->getCustomer();
    		switch (JSVAL_TO_INT(id))
    		{
    		case name_prop:
    		{
    			std::string name = customer->GetName();
    			JSString *str = JS_NewStringCopyN(cx, name.c_str(), name.length());
    			*vp = STRING_TO_JSVAL(str);
    			break;
    		}
    		case age_prop:
    			*vp = INT_TO_JSVAL(customer->GetAge());
    			break;
    		}
    	}
    	return JS_TRUE;
    }
    JSBool JSCustomer::JSSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
    	if (JSVAL_IS_INT(id))
    	{
    		JSCustomer *p = (JSCustomer *)JS_GetPrivate(cx, obj);
    		Customer *customer = p->getCustomer();
    		switch (JSVAL_TO_INT(id))
    		{
    		case name_prop:
    		{
    			JSString *str = JS_ValueToString(cx, *vp);
    			std::string name = JS_GetStringBytes(str);//为js中的内容 wuyifan
    			customer->SetName(name);
    			break;
    		}
    		case age_prop:
    			customer->SetAge(JSVAL_TO_INT(*vp));
    			break;
    		}
    	}
    	return JS_TRUE;
    }
    
    
    JSBool JSCustomer::JSConstructor(JSContext *cx, JSObject *obj, uintN argc,
    	jsval *argv, jsval *rval)
    {
    	JSCustomer *priv = new JSCustomer();
    	priv->setCustomer(new Customer());
    	JS_SetPrivate(cx, obj, (void *)priv);
    	return JS_TRUE;
    }
    void JSCustomer::JSDestructor(JSContext *cx, JSObject *obj)
    {
    	JSCustomer *priv = (JSCustomer*)JS_GetPrivate(cx, obj);
    	delete priv;
    	priv = NULL;
    }
    JSObject *JSCustomer::JSInit(JSContext *cx, JSObject *obj, JSObject *proto)
    {
    	JSObject *newProtoObj = JS_InitClass(cx, obj, proto,
    		&Customer_class, JSCustomer::JSConstructor,
    		0, NULL, JSCustomer::Customer_methods, NULL, NULL);
    	JS_DefineProperties(cx, newProtoObj, JSCustomer::Customer_properties);
    	return newProtoObj;
    }
    //这个是对内容进行处理
    JSBool JSCustomer::computeReduction(JSContext *cx, JSObject *obj, uintN argc,
    	jsval *argv, jsval *rval)
    {
    	JSCustomer *p = (JSCustomer*)JS_GetPrivate(cx, obj);
    	int gage = p->getCustomer()->GetAge();
    	if (gage < 25)
    		*rval = INT_TO_JSVAL(10);
    	else
    		*rval = INT_TO_JSVAL(5);
    	return JS_TRUE;
    }

    调用代码main.cpp:

    // masterTest.cpp : 定义控制台应用程序的入口点。
    //
    
    #include <string.h> //for strlen
    #include <stdio.h>
    #include "stdlib.h"
    #include "string.h"
    #define XP_WIN
    #include "jsapi.h"//参见 https://blog.csdn.net/rjs123/article/details/8995344 
    #include <string>
    #include <iostream>
    #include <fstream>
    #include "jsapi.h"
    #include "JSCustomer.h"
    
    JSClass globalClass = {
    	"Global",
    	0,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JS_FinalizeStub
    };
    
    
    void main(int argc, char *argv[])
    {
    	int a = 9;
    	/*if (argc < 2)
    	{
    		std::cout << "JSExec usage" << std::endl
    			<< "------------" << std::endl
    			<< "JSExec <fileName>" << std::endl;
    	}*/
    	std::string script;
    	std::string buffer;
    	std::ifstream istr("E:/NLP/dicGenerator/masterTest/example.js");
    	if (istr.is_open())
    	{
    		do {
    			std::getline(istr, buffer);
    			script += buffer;
    		} while (!istr.fail());
    	}
    	else
    	{
    		std::cout << "JSExec error" << std::endl
    			<< "------------" << std::endl
    			<< "Can't open scriptfile " << argv[1] << std::endl;
    		exit(0);
    	}
    	JSRuntime *rt = JS_Init(1000000L);
    	if (rt)
    	{
    		JSContext *cx = JS_NewContext(rt, 8192);
    		if (cx)
    		{
    			JSObject *globalObj = JS_NewObject(cx, &globalClass, 0, 0);
    			if (globalObj)
    			{
    				JS_InitStandardClasses(cx, globalObj);
    				// Init JSCustomer
    				//JSBool ok = JSCustomer::JSConstructor(cx, globalObj, 0, NULL, NULL);
    
    				JSObject *newProtoObj = JSCustomer::JSInit(cx, globalObj);
    				// Execute the script
    				jsval rval;
    				uintN lineno = 0;
    				JSString *str;
    				JSBool ok = JS_EvaluateScript(cx, globalObj, script.c_str(),
    					script.length(), "E:/NLP/dicGenerator/masterTest/example.js"/*argv[1]*/, lineno, &rval);
    				if (ok == JS_TRUE)
    				{
    					str = JS_ValueToString(cx, rval);
    					char *s = JS_GetStringBytes(str);
    					std::cout << "JSExec result:" << s << std::endl;
    				}
    				else
    				{
    					std::cout << "JSExec error" << std::endl;
    				}
    			}
    			else
    			{
    				std::cout << "Unable to create the global object";
    			}
    			JS_DestroyContext(cx);
    		}
    		else
    		{
    			std::cout << "Unable to create a context";
    		}
    		JS_Finish(rt);
    	}
    	else
    	{
    		std::cout << "Unable to initialize the JavaScript Engine";
    	}
    }
    
    

    example.js:

    var c = new Customer();
    c.name = "wuyifan";
    c.age = 32;
    var reduction = c.computeReduction();
    

    使用示例2:

    test4.cpp:

    // masterTest.cpp : 定义控制台应用程序的入口点。
    //
    
    #include <string.h> //for strlen
    #include <stdio.h>
    #include "stdlib.h"
    #include "string.h"
    #define XP_WIN
    #include "jsapi.h"//参见 https://blog.csdn.net/rjs123/article/details/8995344 
    #include <string>
    #include <iostream>
    #include <fstream>
    
    static JSBool PeoplePrint(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
    JSBool JsFileExecute(JSContext *ctx, const char *file);
    int usage(const char *progname);
    
    typedef struct
    {
    	char name[16];
    	char addr[64];
    	char tel[10];
    }PeopleInfo;
    static PeopleInfo pinfo = { "wuyifang", "beijing", "521521" };
    
    JSClass global_class = {
    	"global",
    	0,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JS_FinalizeStub,
    	JSCLASS_NO_OPTIONAL_MEMBERS
    };
    
    static JSClass PeopleClass = {
    	"people",
    	0,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JS_FinalizeStub,
    	JSCLASS_NO_OPTIONAL_MEMBERS
    };
    
    static JSFunctionSpec PeopleMethods[] = {
    	{ "print", PeoplePrint, 0, 0, 0 },
    	{ NULL }
    };
    int main(int argc, char **argv)
    {
    	JSRuntime *rt;
    	JSContext *cx;
    	JSObject *globalObj, *PeopleObj;
    	char *file = NULL;
    	/*if (argc < 2)
    	{
    		usage(argv[0]);
    	}
    	else
    	{
    		file = argv[1];
    	}*/
    	file = "E:/NLP/dicGenerator/masterTest/test4.js";
    
    	rt = JS_NewRuntime(1024L * 1024L);
    	if (!rt)return -1;
    	cx = JS_NewContext(rt, 8L * 1024L);
    	if (!cx)return -1;
    
    	if (!(globalObj = JS_NewObject(cx, &global_class, NULL, NULL)))return -1;
    	JS_InitStandardClasses(cx, globalObj);
    
    	PeopleObj = JS_DefineObject(cx, globalObj, "people", &PeopleClass, 0, JSPROP_ENUMERATE);
    	JS_DefineFunctions(cx, PeopleObj, PeopleMethods);
    	if (JsFileExecute(cx, file))
    	{
    		//printf("File execute successfully./n");
    	}
    	else
    	{
    		printf("File execute failed./n");
    	}
    	JS_DestroyContext(cx);
    	JS_DestroyRuntime(rt);
    	return 0;
    }
    
    static JSBool PeoplePrint(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
    {
    	fprintf(stdout, "My Name is %s./nMy Addr is %s./nMy telephone is %s/n", pinfo.name, pinfo.addr, pinfo.tel);
    	return JS_TRUE;
    }
    JSBool JsFileExecute(JSContext *ctx, const char *file)
    {
    	JSScript *script = NULL;
    	JSBool retval;
    	jsval ret;
    	JSObject *global = JS_GetGlobalObject(ctx);
    
    	script = JS_CompileFile(ctx, global, file);
    	if (script == NULL)
    	{
    		return JS_FALSE;
    	}
    	retval = JS_ExecuteScript(ctx, global, script, &ret);
    	JS_DestroyScript(ctx, script);
    	return retval;
    }
    int usage(const char *progname)
    {
    	printf("Usage: %s <file>/n", progname);
    	exit(-1);
    }
    
    
    

    test4.js:

    people.print();

    结果: 

    My Name is wuyifang./nMy Addr is beijing./nMy telephone is 521521/n

    使用示例3:

    test5.cpp:

    
    #include <string.h> //for strlen
    #include <stdio.h>
    #include "stdlib.h"
    #include "string.h"
    #define XP_WIN
    #include "jsapi.h"//参见 https://blog.csdn.net/rjs123/article/details/8995344 
    #include <string>
    #include <iostream>
    #include <fstream>
    
    
    enum PEOPLE { NAME, ADDRESS, TEL };
    static JSBool GetPeopleProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
    static JSBool SetPeopleProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
    static JSBool PeoplePrint(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
    
    
    enum UNDER { TYPE, PLACE };
    static JSBool GetUnderProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
    static JSBool SetUnderProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
    static JSBool UnderPrint(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
    
    
    static void JsErrorHandler(JSContext *ctx, const char *msg, JSErrorReport *er);
    int usage(const char *progname);
    JSBool JsFileExecute(JSContext *ctx, const char *file);
    
    typedef struct
    {
    	char name[16];
    	char addr[64];
    	char tel[10];
    }PeopleInfo;
    static PeopleInfo pinfo = { "xufeng", "Chongqing", "123456" };
    
    typedef struct
    {
    	char type[16];
    	char place[64];
    }under_struct;
    static under_struct under_1 = { "navigate", "Chongqing"};
    
    
    JSClass global_class = {
    	"global",
    	0,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JS_FinalizeStub,
    	JSCLASS_NO_OPTIONAL_MEMBERS
    };
    
    static JSClass PeopleClass = {
    	"people",
    	0,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	GetPeopleProperty,
    	SetPeopleProperty,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JS_FinalizeStub,
    	JSCLASS_NO_OPTIONAL_MEMBERS
    };
    
    static JSClass UnderClass = {
    	"under",
    	0,
    	JS_PropertyStub,
    	JS_PropertyStub,
    	GetPeopleProperty,
    	SetPeopleProperty,
    	JS_EnumerateStub,
    	JS_ResolveStub,
    	JS_ConvertStub,
    	JS_FinalizeStub,
    	JSCLASS_NO_OPTIONAL_MEMBERS
    };
    
    static JSPropertySpec PeopleProperties[] = {
    	{ "name", NAME, JSPROP_ENUMERATE },
    	{ "address", ADDRESS, JSPROP_ENUMERATE },
    	{ "tel", TEL, JSPROP_ENUMERATE },
    	{ NULL }
    };
    static JSPropertySpec UnderProperties[] = {
    	{ "type", NAME, JSPROP_ENUMERATE },
    	{ "place", ADDRESS, JSPROP_ENUMERATE },
    	{ NULL }
    };
    
    static JSFunctionSpec PeopleMethods[] = {
    	{ "print", PeoplePrint, 0, 0, 0 },
    	{ NULL }
    };
    static JSFunctionSpec UnderMethods[] = {
    	{ "Undeprint", UnderPrint, 0, 0, 0 },
    	{ NULL }
    };
    
    int main(int argc, char **argv)
    {
    	JSRuntime *rt;
    	JSContext *cx;
    	JSObject *globalObj, *PeopleObj,*UnderObj;
    	char *file = NULL;
    	/*if (argc < 2)
    	{
    		usage(argv[0]);
    	}
    	else
    	{
    		file = argv[1];
    	}*/
    	file = "E:/NLP/dicGenerator/masterTest/test5.js";
    	rt = JS_NewRuntime(1024L * 1024L);
    	if (!rt)return -1;
    	cx = JS_NewContext(rt, 8L * 1024L);
    	if (!cx)return -1;
    	JS_SetErrorReporter(cx, JsErrorHandler);
    
    	if (!(globalObj = JS_NewObject(cx, &global_class, NULL, NULL)))return -1;
    	JS_InitStandardClasses(cx, globalObj);
    
    	/*PeopleObj = JS_DefineObject(cx, globalObj, "people", &PeopleClass, 0, JSPROP_ENUMERATE);
    	JS_DefineProperties(cx, PeopleObj, PeopleProperties);
    	JS_DefineFunctions(cx, PeopleObj, PeopleMethods);*/
    	UnderObj = JS_DefineObject(cx, globalObj, "under", &UnderClass, 0, JSPROP_ENUMERATE);
    	JS_DefineProperties(cx, UnderObj, UnderProperties);
    	JS_DefineFunctions(cx, UnderObj, UnderMethods);
    
    	if (JsFileExecute(cx, file))
    	{
    		printf("File execute successfully./n");
    	}
    	else
    	{
    		printf("File execute failed./n");
    	}
    	JS_DestroyContext(cx);
    	JS_DestroyRuntime(rt);
    	return 0;
    }
    
    static void JsErrorHandler(JSContext *ctx, const char *msg, JSErrorReport *er)
    {
    	printf("JS Error: %s/nFile: %s:%u/n", msg, er->filename, er->lineno);
    }
    
    static JSBool GetPeopleProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
    	if (JSVAL_IS_INT(id)) {
    		switch (JSVAL_TO_INT(id)) {
    		case NAME:
    			*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pinfo.name));//xufeng的内容
    			break;
    		case ADDRESS:
    			*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pinfo.addr));//Chongqing的内容
    			break;
    		case TEL:
    			*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pinfo.tel));//123456的内容
    			break;
    		}
    	}
    	return JS_TRUE;
    }
    
    static JSBool GetUnderProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
    	if (JSVAL_IS_INT(id)) {
    		switch (JSVAL_TO_INT(id)) {
    		case TYPE:
    			*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, under_1.type));//xufeng的内容
    			break;
    		case PLACE:
    			*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, under_1.place));//Chongqing的内容
    			break;
    		}
    	}
    	return JS_TRUE;
    }
    
    static JSBool SetPeopleProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
    	if (JSVAL_IS_INT(id)) {
    		switch (JSVAL_TO_INT(id)) {
    		case NAME:
    			strncpy(pinfo.name, JS_GetStringBytes(JS_ValueToString(cx, *vp)), 15);//从js中取值
    			break;
    		case ADDRESS:
    			strncpy(pinfo.addr, JS_GetStringBytes(JS_ValueToString(cx, *vp)), 63);
    			break;
    		case TEL:
    			strncpy(pinfo.tel, JS_GetStringBytes(JS_ValueToString(cx, *vp)), 9);
    			break;
    		}
    	}
    	return JS_TRUE;
    }
    
    static JSBool SetUnderProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
    {
    	if (JSVAL_IS_INT(id)) {
    		switch (JSVAL_TO_INT(id)) {
    		case TYPE:
    			strncpy(under_1.type, JS_GetStringBytes(JS_ValueToString(cx, *vp)), 100);//从js中取值
    			break;
    		case PLACE:
    			strncpy(under_1.place, JS_GetStringBytes(JS_ValueToString(cx, *vp)), 100);
    			break;
    		}
    	}
    	return JS_TRUE;
    }
    
    static JSBool PeoplePrint(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
    {
    	fprintf(stdout, "[PeoplePrint] My Name is %s./nMy Addr is %s./nMy telephone is %s/n", pinfo.name, pinfo.addr, pinfo.tel);
    	return JS_TRUE;
    }
    
    static JSBool UnderPrint(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
    {
    	fprintf(stdout, "[UndePrint]  My Name is %s./nMy Addr is %s./n", under_1.type, under_1.place);
    	return JS_TRUE;
    }
    
    int usage(const char *progname)
    {
    	printf("Usage: %s <file>/n", progname);
    	exit(-1);
    }
    JSBool JsFileExecute(JSContext *ctx, const char *file)
    {
    	JSScript *script = NULL;
    	JSBool retval;
    	jsval ret;
    	JSObject *global = JS_GetGlobalObject(ctx);
    
        //test begin 换一种方法,直接读取JS文件后放入内存buf中进行分析,得到的结果是一样的,这样的话,可以动态添加js文件的内容
    	FILE* fp;
    	char buf[102400 * 5];
    	JSString* jss;
    	if (!(fp = fopen("E:/NLP/dicGenerator/masterTest/test5.js", "r"))) return 0;
    	int len = fread(buf, 1, 102400 * 5, fp);
    	fclose(fp);
    	if (len <= 0)return 0;
    
    	jsval rval;
    	JS_EvaluateScript(ctx, global, buf, len, "script", 1, &rval);
    	jss = JS_ValueToString(ctx, rval);
    	printf("The result is: %s\n", JS_GetStringBytes(jss));
    	//test end 换一种方法,直接读取JS文件后放入内存buf中进行分析,得到的结果是一样的,这样的话,可以动态添加js文件的内容
    
    	script = JS_CompileFile(ctx, global, file);
    	if (script == NULL)
    	{
    		return JS_FALSE;
    	}
    	retval = JS_ExecuteScript(ctx, global, script, &ret);
    	JSString *str = JS_ValueToString(ctx, ret);
    	char * poutStr = JS_GetStringBytes(str);
    
    	JS_DestroyScript(ctx, script);
    	return retval;
    }

    test5.js:

    //people.print();//调用的是c++中函数:people.print();输出是xufeng的信息
    //people.name = "wuyifan-js";//调用的是c++中函数:SetPeopleProperty
    //people.address = "Beijing-js";//调用的是c++中函数:SetPeopleProperty
    //people.tel = "521521";//调用的是c++中函数:SetPeopleProperty
    //people.print();//输出wuyifan-js的信息
    
    function InitParam(a, b)
    {
    	return a+b;
    }
    
    function GetEntryForm(under)
    {
    	//return "abcdefg"
    	//consolelog(under.type);
    	var result = under;
    	switch(under.type)
    	{
    		case 'test':	//导航
    			var stype = result.type ;
    			var splace = result.place ;
    			var addab = InitParam(stype, splace)
    			rts = '[Return]:{"ziduanyi":"neirongyi","again":0,"result":{"data":{"content":"' + stype + '","Con_name":"' + splace + addab+'"},"status":"success","operationType":"nihao"}}';
    			return rts;
    			break;
    		default:break;
    	}
    }
    
    under.Undeprint();
    under.type = "test";
    under.place = "shanghai";
    var retVl = GetEntryForm(under);
    GetEntryForm(under);

    结果:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • spidermonkey Mozilla已为其SpiderMonkey JavaScript运行时配备了新的正则表达式(RegExps)引擎,以使其更易于支持现代RegExps功能。 新的RegExp引擎在Firefox 78 开发人员版浏览器中首次亮相。 RegExps是用于...

    spidermonkey

    Mozilla已为其SpiderMonkey JavaScript运行时配备了新的正则表达式(RegExps)引擎,以使其更易于支持现代RegExps功能。 新的RegExp引擎在Firefox 78 开发人员版浏览器中首次亮相。

    RegExps是用于处理字符串的常用工具,它提供了丰富的语法来描述和捕获字符信息。 Mozilla在2014年用分叉的Irregexp取代了它的YARR正则表达式引擎, 后者Google V8 JavaScript引擎中使用的正则表达式引擎 Mozilla大量重写了Irregexp以使用其自己的API。 这使得使用新引擎更容易,但更难以导入新的上游功能。 随着时间的流逝,Mozilla在支持新的ES2018 RegExp功能方面落伍了。

    [ 同样在InfoWorld上:什么是Deno? 更好的Node.js ]

    Mozilla的新方法(为IrregExp新建的填充层)提供对V8功能的完全访问权限,从内存分配和代码生成到数据结构和实用程序功能。 因此,SpiderMonkey为将来的RegExp支持奠定了更坚实的基础,使SpiderMonkey团队可以更快地添加新的RegEx语法。

    Mozilla表示,这项努力已完全支持所有ECMAScript RegExp功能。 Mozilla希望在新引擎上的工作可以成为未来Firefox中RegExp的基础。 可以从mozilla.org访问Firefox开发人员版,其中包含最新的Beta开发人员工具。

    翻译自: https://www.infoworld.com/article/3561477/mozilla-revamps-regexp-support-in-spidermonkey-javascript-engine.html

    spidermonkey

    展开全文
  • 四大主流JS引擎安装教程 参考网址: ...安装步骤: ./download-engine.sh ch 1.11.5 ./download-engine.sh jsc 2.23.3 ./build-ch.sh 1.11.5 ./build-jsc.sh 2.23.3 脚本含义: ./download-engine.sh:用于下载引擎...

    四大主流JS引擎安装教程

    参考网址:

    https://github.com/sslab-gatech/DIE/tree/master/engines

    安装步骤:

    ./download-engine.sh ch 1.11.5 ./download-engine.sh jsc 2.23.3
    
    ./build-ch.sh 1.11.5 ./build-jsc.sh 2.23.3
    

    脚本含义:

    ./download-engine.sh:用于下载引擎源码,ch对应chakra引擎,1.11.5对应引擎版本。另:jsc对应javascriptcore引擎,sm对应spidermonkey引擎,v8对应v8引擎。

    ./build-ch.sh:用于编译安装chakra引擎,其他格式为./build-***.sh的脚本功能类似。

    ./build-ch-cov.sh:用于编译安装插桩的chakra引擎,可在执行JS文件时测试引擎的源码覆盖率,需要提前安装AFL工具。其他格式为./build-***-cov.sh的脚本功能类似。

    展开全文
  • SpiderMonkey

    2016-04-01 14:53:00
    SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎,另外还有一个叫做Rhino的Java版本。  为了在SpiderMonkey中运行JavaScript代码,应用程序必须有三个要素:JSRuntime,JSContext和...

      SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎,另外还有一个叫做Rhino的Java版本。

      为了在SpiderMonkey中运行JavaScript代码,应用程序必须有三个要素:JSRuntime,JSContext和全局对象。

      JSRuntime,为其中的JavaScript变量、对象、脚本和应用程序中使用的上下文分配空间。每个JSContext和脚本中的每个对象都生活在一个 JSRuntime中。他们不能转移到其他运行时上或在与其它运行时共享。一般来说大多数应用程序只需要一个运行时环境。
      JSContext,上下文就像是一台小机器,它涉及JavaScript代码和对象的很多东西。它可以编译和执行脚本、获取和设置对象属性、调用 JavaScript函数、一种类型转换为另一种JavaScript数据、创建对象,等等。几乎所有JSAPI函数都要一个JSContext*作为其第一个参数,就像<stdio.h>中的大多数函数都需要FILE*一样.
      全局对象,全局对象包含所有可以在JavaScript代码中使用的类、函数和变量。
      脚本能看到的全局属性完全由应用程序控制。应用程序首先创建一个对象并加入JavaScript标准类,如Array和Object。然后加入任何程序想加入的自定义的类、函数和变量(象这里的window)。应用程序每次运行js脚本(例如使用JS_EvaluateScript)时提供了该脚本使用的全局对象。至于脚本,它也可以创建自己全局函数和变量。所有的这些函数、类和变量都作为属性存储在全局对象中。

    转载于:https://www.cnblogs.com/BiteLu/p/5344969.html

    展开全文
  • spidermonkey

    2010-08-23 17:17:00
    http://www.mozilla.org/js/spidermonkey/<br />  http://blog.csdn.net/singlerace/archive/2006/11/06/1370215.aspx<br />  ...
  • SpiderMonkey1.7.0源码

    2009-07-13 19:14:05
    C语言编写的Firefox的Javascript引擎,Firefox3.0以前的Javascript引擎都是用SpiderMonkey的,3.1之后引入了TraceMonkey,但目前还没找到它的源码,希望找到的兄弟们发上来,谢谢。
  • JavaScript脚本引擎SpiderMonkey

    千次阅读 2017-08-21 17:25:46
    SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎,另外还有一个叫做Rhino的Java版本。SpiderMonkey is Mozilla's JavaScript engine written in C and C++. It is used in various ...
  • spidermonkey引擎 源码

    2013-08-31 09:00:05
    C++ js 互相调用 spider monkey
  • Spidermonkey tests

    2020-11-27 10:22:55
    <div><p>I don't expect this to get merged in the first go, but it's a first stab. To fix #75.</p><p>该提问来源于开源项目:higgsjs/Higgs</p></div>
  • SpiderMonkey 脚本化您的应用

    千次阅读 2014-03-19 15:37:45
    和其他的 JavaScript 引擎一样,SpiderMonkey 不直接提供像 DOM 这样的对象,而是提供解析,执行 JavaSccript 代码,垃圾回收等机制。SpidlerMonkey 是一个在 Mozilla 之下的开源项目,要使用 SpiderMonkey,需要...
  • spidermonkey学习

    千次阅读 2013-08-13 23:50:52
    本文介绍了一种功能非常强大的JavaScript引擎SpiderMonkey。这个引擎是Mozilla 浏览器的 JavaScript引擎。该引擎接口定义清晰,模块化好。本文简要介绍了 SpiderMonkey的基本结构,并讲解了如何在自己的应用
  • 学习 SpiderMonkey

    千次阅读 2015-11-11 13:45:24
    测试1 void SwimAlg::test1(){ } bool js_SwimAlg_SwimAlg_test1(JSContext *cx, uint32_t argc/*形参个数*/, jsval *vp) { //得到参数数组 JS::CallArgs args = JS::CallArgsFromVp(argc, vp);...
  • SpiderMonkey教程

    2017-02-06 13:29:00
    https://technotales.wordpress.com/2009/06/07/spidermonkey-introduction/ https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_User_Guide https://developer.mozilla.org/en-...
  • SpiderMonkey 入门

    千次阅读 2013-12-01 19:21:24
    原文地址:https://developer.mozilla.org/en-US/docs/SpiderMonkey/JSAPI_User_Guide 文章为郭胜龙所写,转载说明出处 本文是mozilla官网上关于spiderMonder的一篇用户指南,正好要用,顺带翻译了一下: JSAPI ...
  • spidermonkey编译

    2015-12-28 14:24:00
    参考如下: 最近升级了系统到Mac OS X 10.10 并且更新了XCode6.1和iOS 8.1 之前app用到的libmp3lame.a静态库,也要支持64位的模拟器(x86_64)和64位的真机(arm64)指令集。需要重新编译 查阅了下资料,按照如下...
  • spidermonkey 分析

    千次阅读 2011-11-15 09:08:47
    Slide 1 SpiderMonkey 设计和实现 Author:张平 Email:p.zhang.9.25@...简介: SpiderMonkey: JavaScript Engine: Javascript发明者Brendan Eich 在NetScape所写,后来由Mozilla F​o​u​n​d​a​t​i​o​n​所
  • 集成spiderMonkey

    2012-06-19 17:31:55
    集成spiderMonkey 文档 :https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide https://developer.mozilla.org/en/How_to_embed_the_JavaScript_engine 一、hello world基本流程: JS_...
  • javascript引擎 PK: V8 vs Spidermonkey

    千次阅读 2014-02-28 13:05:06
    一个月前心血来潮瞎折腾了下Nodejs,用ab和JMeter进行简单地压力测试后,不得不佩服它的速度与性能(备注:测试比较了几个框架后得出的结果)。Nodejs是什么,一个基于chrome的javascript V8引擎的platform,特点是...
  • spidermonkey38.rar

    2020-07-02 16:13:24
    java运行所需引擎,win10环境vs2015编译,c++用来运行java脚本,版本不同无法使用,jsc反编译也要看版本
  • spidermonkey31.2.0开发包

    2015-01-28 16:16:36
    SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎。这是编译好的,直接可以用,是截止2015/1/28最新的稳定版31.2.0。
  • 这篇教程手把手教你如何利用SpiderMonkey创建一个能执行JavaScript脚本的C++程序,并让JavaScript脚本操纵你的C++程序的内部数据、操作。从这篇教程可以看到在SpiderMonkey引擎的帮助下,让C++程序支持JavaScript...
  • JavaScript是由Netscape开发的对象脚本语言,其特点是开发简单、功能灵活,目前已广泛应用于WEB页面及服务器应用程序中。...可以将JavaScript与嵌入WEB的大多数对象的事件(如鼠标点击、移动等)相关联,然后用自己的...
  • spidermonkey在windows系统下怎么用?javascript shell是什么?windows用的spidermonkey在哪里可以下载?小白求助
  • spidermonkey_js32.zip

    2020-04-11 13:45:17
    spidermonkey 1.6,包含dll和lib,release版本。 编译mp4box可以用。
  • SpiderMonkey 入门翻译

    2016-01-13 02:38:01
    SpiderMonkey 从源码中建立 SpiderMonkeySpiderMonkey Build Documentation(https://developer.mozilla.org/En/SpiderMonkey/Build_Documentation).一些系统(例如 Debian) 提供了预设包。 代替从源码中建立...
  • 初次使用SpiderMonkey

    千次阅读 2015-03-17 18:30:42
    初次使用SpiderMonkey,对它了解并不多,所以它是什么,请自行去搜索。本文只讲述我们用SpiderMonkey能做什么,我们可以用c/c++调用SpiderMonkey的接口,去执行JavaScript代码。这听起来是不是很酷,现在一起开始吧...
  • windows-spidermonkey

    2017-08-25 13:09:00
    听过Mozilla(火狐浏览器的...本文给出Windows平台SpiderMonkey的32位和64位静态库编译方法 WINDOWS-SpiderMonkey 32 位Release 静态库,开心吧?网上2017 年以前的例子,你不一定能编译的过!哈哈本文是2017 年...
  • SpiderMonkey 基础版

    2016-01-12 11:32:20
    #include "jsapi.h" #include #include #include #include using namespace std; using namespace JS; bool jsb_applyStorePay(JSContext *cx, uint32_t argc, jsval *vp) ... JS::CallArgs args = JS::CallArgsFr

空空如也

1 2 3 4 5 ... 20
收藏数 560
精华内容 224
关键字:

SpiderMonkey