spidermonkey simple demo

#define STATIC_JS_API 1
#ifdef JS_THREADSAFE
#undef JS_THREADSAFE
#endif
#include <iostream>
#include "jsapi.h"

using namespace JS;

/* spidermonkey
1.runtime
2.context
3.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,
    nullptr,//JS_GlobalObjectTraceHook
};

/*/---------------
static JSFunctionSpec myjs_global_functions[] = {
    JS_FS("rand",   myjs_rand,   0, 0),
    JS_FS("srand",  myjs_srand,  0, 0),
    JS_FS("system", myjs_system, 1, 0),
    JS_FS_END
};
*///------------------------------

// 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.
#if 1
    char* script = "var today = Date(); today.toString();";
    jsval rval;
    uint lineno = 0;
    bool ok = JS_EvaluateScript(
    		cx,
            global, 		// The scope in which to execute the script. This parameter is 						// documented in detail at JS_ExecuteScript.
            script,
            strlen(script), 

            //---------------
            "script", 		// Name of file or URL containing the script. Used to report filename or 			// URL in error messages.
            lineno, 		// Line number. Used to report the offending line in the file or URL if 			// an error occurs.
            //---------------
            &rval			// Out parameter. On success, if rval is not NULL, *rval receives the 				// result value.
            );

	JSString* str = JS_ValueToSource(cx, rval);
   	size_t str_len = JS_GetStringLength(str);

    const jschar* p = JS_GetStringCharsAndLength(cx,str,&str_len);
	char*pp = JS_EncodeString(cx,str);
    fprintf(stderr,"%s\n",pp);
    JS_free(cx,pp);
#endif
    //free(pp);

            	    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,JS_USE_HELPER_THREADS);
    if (!rt)
       return 1;

    // Create a context.
    JSContext *cx = JS_NewContext(rt, 8192);
    if (!cx)
       return 1;
    JS_SetErrorReporter(cx, &reportError);

    int status = run(cx);

    // Shut everything down.
    JS_DestroyContext(cx);
    JS_DestroyRuntime(rt);
    JS_ShutDown();

    return status;
}
时间: 2024-12-27 10:17:32

spidermonkey simple demo的相关文章

FusionCharts simple demo for (html+js、APS.NET Webform、MVC)

做GIS或其他内部数据统计项目的应该对FusionCharts也不会太陌生,简单易用已无需多说什么了,只是有时候框架不同,实现起来也稍有差异 引用dll调用FusionCharts类的静态方法RenderChartHTML 返回html绑定在数据控件上更为符合webform: 使用JS代码new FusionCharts对象,调用对象的setDataXML或者setDataURL方法更为符合MVC 1.HTML+JS <!--html--> <html xmlns="http:

Step by Step Do IOS Swift CoreData Simple Demo

简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadley 的<Learning.Core.Data.for.iOS(2013.11)>, 这本书主要介绍 ObjC的 CoreData . 创建一个新 XCode 项目 创建一个新的 XCode 项目. 创建一个 Empty Application 填写项目相关信息,如设置项目名称为: SwiftCor

dwr实现用户管理demo

DWR: Direct Web Remoting 是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样. demo: pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchem

基于epoll的聊天室程序

epoll相对于poll和select这两个多路复用的I/O模型更加的高效.epoll的函数很简单,麻烦的地方在于水平触发和边沿触发. 用张图来说明下 ET(边沿)只是在状态反转时触发,比如从不可读到可读.而LT(水平)就是如果可读,就会一直触发.所以在使用ET的时候要做一些额外的处理,比如可读的,一直把缓冲区读完,进入不可读状态,下次来数据才会触发. 下面贴出代码,只是一个简单的练习的例子socketheads.h C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

浅析 Linux 初始化 init 系统,第 2 部分: UpStart

Upstart 简介 假如您使用的 Linux 发行版是 Ubuntu,很可能会发现在您的计算机上找不到/etc/inittab 文件了,这是因为 Ubuntu 使用了一种被称为 upstart 的新型 init 系统. 开发 Upstart 的缘由 大 约在 2006 年或者更早的时候, Ubuntu 开发人员试图将 Linux 安装在笔记本电脑上.在这期间技术人员发现经典的 sysvinit 存在一些问题:它不适合笔记本环境.这促使程序员 Scott James Remnant 着手开发 u

Automating CSS Regression Testing

The following is a guest post by Garris Shipon . We've touched on the four types of CSS testing here before. Regression testing is the hardest. It's the type where you're trying to test if a change you made to CSS resulted in any unexpected visual pr

手动部署Servlet

配置Tomcat环境变量 下载tomcat 的 zip,解压.例如解压到E盘根目录,E:\apache-tomcat-8.0.35 配置Tomcat环境. 新建环境变量. 变量名:    CATALINA_HOME 变量值:  E:\apache-tomcat-8.0.35 手动新建一个Web应用 在webapps下新建一个目录hand,代表web 应用的名称. 按照规范,hand应用的目录树如下,都需要手动建立 CATALINA_HOME --webapps --hand --WEB-INF

Jetty安装学习并展示

Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容器工作的

Snowman

A simple demo using deferred shading and hdr rendering. I make the scene myself using 3ds max. Here is the github link: https://github.com/league1991/Snowman Here are the results: 来自为知笔记(Wiz)