コード例 #1
0
ファイル: js_context.go プロジェクト: jueebushe/monkey
// Compile JavaScript
// When you need run a script many times, you can use this to avoid dynamic compile.
func (c *Context) Compile(code, filename string, lineno int) *Script {
	var result *Script

	c.rt.Use(func() {
		ccode := C.CString(code)
		defer C.free(unsafe.Pointer(ccode))

		cfilename := C.CString(filename)
		defer C.free(unsafe.Pointer(cfilename))

		var obj = C.JS_CompileScript(c.jscx, c.jsglobal, ccode, C.size_t(len(code)), cfilename, C.uintN(lineno))

		if obj != nil {
			script := &Script{c, obj, 0}

			C.JS_AddObjectRoot(c.jscx, &script.obj)

			runtime.SetFinalizer(script, func(s *Script) {
				s.Dispose()
			})

			result = script
		}
	})

	return result
}
コード例 #2
0
ファイル: gomonkey.go プロジェクト: zond/gomonkey
func NewJSObject(js *JS, object *C.JSObject) *JSObject {
	rval := &JSObject{js, object}
	C.JS_AddObjectRoot(rval.js.context, &(rval.object))
	runtime.SetFinalizer(rval, func(o *JSObject) {
		C.JS_RemoveObjectRoot(o.js.context, &(o.object))
	})
	return rval
}
コード例 #3
0
ファイル: js_array.go プロジェクト: jueebushe/monkey
// See newObject()
func newArray(cx *Context, obj *C.JSObject) *Array {
	result := &Array{cx, obj}

	C.JS_AddObjectRoot(cx.jscx, &result.obj)

	runtime.SetFinalizer(result, func(a *Array) {
		cx.rt.aryDisposeChan <- a
	})

	return result
}
コード例 #4
0
ファイル: js_object.go プロジェクト: jueebushe/monkey
// Add the JSObject to the garbage collector's root set.
// See: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS_AddRoot
func newObject(cx *Context, obj *C.JSObject, gval interface{}) *Object {
	gobj := (*Object)(C.JS_GetPrivate(cx.jscx, obj))
	if gobj != nil {
		return gobj
	}

	result := &Object{cx, obj, gval, nil, nil, nil}

	C.JS_AddObjectRoot(cx.jscx, &result.obj)

	runtime.SetFinalizer(result, func(o *Object) {
		cx.rt.objDisposeChan <- o
	})

	// User defined property and function object use this to find callback.
	C.JS_SetPrivate(cx.jscx, result.obj, unsafe.Pointer(result))

	return result
}