static JSBool getSource_func(JSContext *context, unsigned argc, jsval *vp) { JS::CallReceiver rec = JS::CallReceiverFromVp(vp); JSObject *obj = JSVAL_TO_OBJECT(rec.thisv()); cairo_t *cr; cairo_pattern_t *pattern; JSObject *pattern_wrapper; if (argc > 0) { gjs_throw(context, "Context.getSource() takes no arguments"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); pattern = cairo_get_source(cr); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; /* pattern belongs to the context, so keep the reference */ pattern_wrapper = gjs_cairo_pattern_from_pattern(context, pattern); if (!pattern_wrapper) { gjs_throw(context, "failed to create pattern"); return JS_FALSE; } rec.rval().set(OBJECT_TO_JSVAL(pattern_wrapper)); return JS_TRUE; }
static GIFieldInfo * get_field_info (JSContext *context, Boxed *priv, jsid id) { int field_index; jsval id_val; if (!JS_IdToValue(context, id, &id_val)) return JS_FALSE; if (!JSVAL_IS_INT (id_val)) { gjs_throw(context, "Field index for %s is not an integer", g_base_info_get_name ((GIBaseInfo *)priv->info)); return NULL; } field_index = JSVAL_TO_INT(id_val); if (field_index < 0 || field_index >= g_struct_info_get_n_fields (priv->info)) { gjs_throw(context, "Bad field index %d for %s", field_index, g_base_info_get_name ((GIBaseInfo *)priv->info)); return NULL; } return g_struct_info_get_field (priv->info, field_index); }
/** * gjs_string_from_ucs4: * @cx: a #JSContext * @ucs4_string: string of #gunichar * @n_chars: number of characters in @ucs4_string or -1 for zero-terminated * @value_p: JS::Value that will be filled with a string * * Returns: true on success, false otherwise in which case a JS error is thrown */ bool gjs_string_from_ucs4(JSContext *cx, const gunichar *ucs4_string, ssize_t n_chars, JS::MutableHandleValue value_p) { long u16_string_length; GError *error = NULL; char16_t *u16_string = reinterpret_cast<char16_t *>(g_ucs4_to_utf16(ucs4_string, n_chars, NULL, &u16_string_length, &error)); if (!u16_string) { gjs_throw(cx, "Failed to convert UCS-4 string to UTF-16: %s", error->message); g_error_free(error); return false; } JSAutoRequest ar(cx); /* Avoid a copy - assumes that g_malloc == js_malloc == malloc */ JS::RootedString str(cx, JS_NewUCString(cx, u16_string, u16_string_length)); if (!str) { gjs_throw(cx, "Failed to convert UCS-4 string to UTF-16"); return false; } value_p.setString(str); return true; }
static bool getSource_func(JSContext *context, unsigned argc, JS::Value *vp) { GJS_GET_PRIV(context, argc, vp, rec, obj, GjsCairoContext, priv); cairo_t *cr = priv ? priv->cr : NULL; cairo_pattern_t *pattern; JSObject *pattern_wrapper; if (argc > 0) { gjs_throw(context, "Context.getSource() takes no arguments"); return false; } pattern = cairo_get_source(cr); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return false; /* pattern belongs to the context, so keep the reference */ pattern_wrapper = gjs_cairo_pattern_from_pattern(context, pattern); if (!pattern_wrapper) { gjs_throw(context, "failed to create pattern"); return false; } rec.rval().setObject(*pattern_wrapper); return true; }
void* gjs_g_fundamental_from_object(JSContext *context, JSObject *obj) { FundamentalInstance *priv; if (obj == NULL) return NULL; priv = priv_from_js(context, obj); if (priv == NULL) { gjs_throw(context, "No introspection information for %p", obj); return NULL; } if (priv->gfundamental == NULL) { gjs_throw(context, "Object is %s.%s.prototype, not an object instance - cannot convert to a fundamental instance", g_base_info_get_namespace((GIBaseInfo *) priv->prototype->info), g_base_info_get_name((GIBaseInfo *) priv->prototype->info)); return NULL; } return priv->gfundamental; }
static JSBool getSource_func(JSContext *context, uintN argc, jsval *vp) { JSObject *obj = JS_THIS_OBJECT(context, vp); cairo_t *cr; cairo_pattern_t *pattern; JSObject *pattern_wrapper; if (argc > 0) { gjs_throw(context, "Context.getSource() takes no arguments"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); pattern = cairo_get_source(cr); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; /* pattern belongs to the context, so keep the reference */ pattern_wrapper = gjs_cairo_pattern_from_pattern(context, pattern); if (!pattern_wrapper) { gjs_throw(context, "failed to create pattern"); return JS_FALSE; } JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(pattern_wrapper)); return JS_TRUE; }
static JSBool gjs_gtkbuilder_connect_signals (JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV (context, vp); JSObject *obj = JS_THIS_OBJECT (context, vp); GtkBuilder *builder; builder_ud ud; builder = GTK_BUILDER (gjs_g_object_from_object (context, obj)); if (NULL == builder) { gjs_throw (context, "Gtk.Builder.connect_signals () invalid this"); return JS_FALSE; } if (argc < 1) { gjs_throw (context, "Gtk.Builder.connect_signals () takes arguments"); return JS_FALSE; } ud.ctx = context; ud.obj = JSVAL_TO_OBJECT (argv[0]); gtk_builder_connect_signals_full (builder, _gjs_builder_connect_func, &ud); JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
JSObject* gjs_construct_object_dynamic(JSContext *context, JSObject *proto, uintN argc, jsval *argv) { RuntimeData *rd; JSClass *proto_class; JSContext *load_context; JSObject *result; JS_BeginRequest(context); /* We replace the passed-in context and global object with our * runtime-global permanent load context. Otherwise, JS_ConstructObject * can't find the constructor in whatever random global object is set * on the passed-in context. */ load_context = gjs_runtime_get_load_context(JS_GetRuntime(context)); JS_BeginRequest(load_context); proto_class = JS_GET_CLASS(load_context, proto); rd = get_data_from_context(load_context); /* Check that it's safe to cast to DynamicJSClass */ if (g_hash_table_lookup(rd->dynamic_classes, proto_class) == NULL) { gjs_throw(load_context, "Prototype is not for a dynamically-registered class"); goto error; } gjs_debug_lifecycle(GJS_DEBUG_GREPO, "Constructing instance of dynamic class %s %p from proto %p", proto_class->name, proto_class, proto); if (argc > 0) result = JS_ConstructObjectWithArguments(load_context, proto_class, proto, NULL, argc, argv); else result = JS_ConstructObject(load_context, proto_class, proto, NULL); if (!result) goto error; JS_EndRequest(load_context); JS_EndRequest(context); return result; error: /* Move the exception to the calling context from load context. */ if (!gjs_move_exception(load_context, context)) { /* set an exception since none was set */ gjs_throw(context, "No exception was set, but object construction failed somehow"); } JS_EndRequest(load_context); JS_EndRequest(context); return NULL; }
static bool setDash_func(JSContext *context, unsigned argc, JS::Value *vp) { GJS_GET_PRIV(context, argc, vp, argv, obj, GjsCairoContext, priv); guint i; cairo_t *cr = priv ? priv->cr : NULL; JS::RootedObject dashes(context); double offset; guint len; if (!gjs_parse_call_args(context, "setDash", argv, "of", "dashes", &dashes, "offset", &offset)) return false; if (!JS_IsArrayObject(context, dashes)) { gjs_throw(context, "dashes must be an array"); return false; } if (!JS_GetArrayLength(context, dashes, &len)) { gjs_throw(context, "Can't get length of dashes"); return false; } std::vector<double> dashes_c; dashes_c.reserve(len); JS::RootedValue elem(context); for (i = 0; i < len; ++i) { double b; elem.setUndefined(); if (!JS_GetElement(context, dashes, i, &elem)) { return false; } if (elem.isUndefined()) continue; if (!JS::ToNumber(context, elem, &b)) return false; if (b <= 0) { gjs_throw(context, "Dash value must be positive"); return false; } dashes_c.push_back(b); } cairo_set_dash(cr, &dashes_c[0], dashes_c.size(), offset); argv.rval().setUndefined(); return true; }
static JSBool getGroupTarget_func(JSContext *context, unsigned argc, jsval *vp) { JS::CallReceiver rec = JS::CallReceiverFromVp(vp); JSObject *obj = JSVAL_TO_OBJECT(rec.thisv()); cairo_t *cr; cairo_surface_t *surface; JSObject *surface_wrapper; if (argc > 0) { gjs_throw(context, "Context.getGroupTarget() takes no arguments"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); surface = cairo_get_group_target(cr); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; /* surface belongs to the context, so keep the reference */ surface_wrapper = gjs_cairo_surface_from_surface(context, surface); if (!surface_wrapper) { /* exception already set */ return JS_FALSE; } rec.rval().set(OBJECT_TO_JSVAL(surface_wrapper)); return JS_TRUE; }
static JSBool get_version_for_ns (JSContext *context, JSObject *repo_obj, jsid ns_id, char **version) { jsid versions_name; jsval versions_val; JSObject *versions; jsval version_val; versions_name = gjs_context_get_const_string(context, GJS_STRING_GI_VERSIONS); if (!gjs_object_require_property(context, repo_obj, "GI repository object", versions_name, &versions_val) || !JSVAL_IS_OBJECT(versions_val)) { gjs_throw(context, "No 'versions' property in GI repository object"); return JS_FALSE; } versions = JSVAL_TO_OBJECT(versions_val); *version = NULL; if (JS_GetPropertyById(context, versions, ns_id, &version_val) && JSVAL_IS_STRING(version_val)) { gjs_string_to_utf8(context, version_val, version); } return JS_TRUE; }
static JSBool setSource_func(JSContext *context, unsigned argc, jsval *vp) { JS::CallArgs argv = JS::CallArgsFromVp (argc, vp); JSObject *obj = JSVAL_TO_OBJECT(argv.thisv()); JSObject *pattern_wrapper; cairo_pattern_t *pattern; cairo_t *cr; if (!gjs_parse_call_args(context, "setSource", "o", argv, "pattern", &pattern_wrapper)) return JS_FALSE; pattern = gjs_cairo_pattern_get_pattern(context, pattern_wrapper); if (!pattern) { gjs_throw(context, "first argument to setSource() should be a pattern"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_set_source(cr, pattern); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; argv.rval().set(JSVAL_VOID); return JS_TRUE; }
GError* gjs_gerror_from_error(JSContext *context, JSObject *obj) { Error *priv; if (obj == NULL) return NULL; /* If this is a plain GBoxed (i.e. a GError without metadata), delegate marshalling. */ if (gjs_typecheck_boxed (context, obj, NULL, G_TYPE_ERROR, JS_FALSE)) return gjs_c_struct_from_boxed (context, obj); priv = priv_from_js(context, obj); if (priv == NULL) return NULL; if (priv->gerror == NULL) { gjs_throw(context, "Object is %s.%s.prototype, not an object instance - cannot convert to a boxed instance", g_base_info_get_namespace( (GIBaseInfo*) priv->info), g_base_info_get_name( (GIBaseInfo*) priv->info)); return NULL; } return priv->gerror; }
/** * gjs_cairo_path_from_path: * @context: the context * @path: cairo_path_t to attach to the object * * Constructs a pattern wrapper given cairo pattern. * NOTE: This function takes ownership of the path. */ JSObject * gjs_cairo_path_from_path(JSContext *context, cairo_path_t *path) { JSObject *object; GjsCairoPath *priv; g_return_val_if_fail(context != NULL, NULL); g_return_val_if_fail(path != NULL, NULL); object = JS_NewObject(context, &gjs_cairo_path_class, NULL, NULL); if (!object) { gjs_throw(context, "failed to create path"); return NULL; } priv = g_slice_new0(GjsCairoPath); g_assert(priv_from_js(context, object) == NULL); JS_SetPrivate(context, object, priv); priv->context = context; priv->object = object; priv->path = path; return object; }
static JSBool setSourceSurface_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); JSObject *surface_wrapper; double x, y; cairo_surface_t *surface; cairo_t *cr; if (!gjs_parse_args(context, "setSourceSurface", "off", argc, argv, "surface", &surface_wrapper, "x", &x, "y", &y)) return JS_FALSE; surface = gjs_cairo_surface_get_surface(context, surface_wrapper); if (!surface) { gjs_throw(context, "first argument to setSourceSurface() should be a surface"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_set_source_surface(cr, surface, x, y); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
/** * gjs_cairo_surface_from_surface: * @context: the context * @surface: cairo_surface to attach to the object * * Constructs a surface wrapper given cairo surface. * A reference to @surface will be taken. * */ JSObject * gjs_cairo_surface_from_surface(JSContext *context, cairo_surface_t *surface) { g_return_val_if_fail(context != NULL, NULL); g_return_val_if_fail(surface != NULL, NULL); cairo_surface_type_t type = cairo_surface_get_type(surface); if (type == CAIRO_SURFACE_TYPE_IMAGE) return gjs_cairo_image_surface_from_surface(context, surface); if (type == CAIRO_SURFACE_TYPE_PDF) return gjs_cairo_pdf_surface_from_surface(context, surface); if (type == CAIRO_SURFACE_TYPE_PS) return gjs_cairo_ps_surface_from_surface(context, surface); if (type == CAIRO_SURFACE_TYPE_SVG) return gjs_cairo_svg_surface_from_surface(context, surface); JS::RootedObject proto(context, gjs_cairo_surface_get_proto(context)); JS::RootedObject object(context, JS_NewObjectWithGivenProto(context, &gjs_cairo_surface_class, proto)); if (!object) { gjs_throw(context, "failed to create surface"); return NULL; } gjs_cairo_surface_construct(context, object, surface); return object; }
static bool getGroupTarget_func(JSContext *context, unsigned argc, JS::Value *vp) { GJS_GET_PRIV(context, argc, vp, rec, obj, GjsCairoContext, priv); cairo_t *cr = priv ? priv->cr : NULL; cairo_surface_t *surface; JSObject *surface_wrapper; if (argc > 0) { gjs_throw(context, "Context.getGroupTarget() takes no arguments"); return false; } surface = cairo_get_group_target(cr); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return false; /* surface belongs to the context, so keep the reference */ surface_wrapper = gjs_cairo_surface_from_surface(context, surface); if (!surface_wrapper) { /* exception already set */ return false; } rec.rval().setObject(*surface_wrapper); return true; }
static GjsForeignInfo * gjs_struct_foreign_lookup(JSContext *context, GIBaseInfo *interface_info) { GjsForeignInfo *retval = NULL; GHashTable *hash_table; char *key; key = g_strdup_printf("%s.%s", g_base_info_get_namespace(interface_info), g_base_info_get_name(interface_info)); hash_table = get_foreign_structs(); retval = (GjsForeignInfo*)g_hash_table_lookup(hash_table, key); if (!retval) { if (gjs_foreign_load_foreign_module(context, g_base_info_get_namespace(interface_info))) { retval = (GjsForeignInfo*)g_hash_table_lookup(hash_table, key); } } if (!retval) { gjs_throw(context, "Unable to find module implementing foreign type %s.%s", g_base_info_get_namespace(interface_info), g_base_info_get_name(interface_info)); } g_free(key); return retval; }
static bool setSource_func(JSContext *context, unsigned argc, JS::Value *vp) { GJS_GET_PRIV(context, argc, vp, argv, obj, GjsCairoContext, priv); JS::RootedObject pattern_wrapper(context); cairo_pattern_t *pattern; cairo_t *cr = priv ? priv->cr : NULL; if (!gjs_parse_call_args(context, "setSource", argv, "o", "pattern", &pattern_wrapper)) return false; pattern = gjs_cairo_pattern_get_pattern(context, pattern_wrapper); if (!pattern) { gjs_throw(context, "first argument to setSource() should be a pattern"); return false; } cairo_set_source(cr, pattern); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return false; argv.rval().setUndefined(); return true; }
static JSBool createFromPNG_func(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *filename; cairo_surface_t *surface; JSObject *surface_wrapper; if (!gjs_parse_args(context, "createFromPNG", "s", argc, argv, "filename", &filename)) return JS_FALSE; surface = cairo_image_surface_create_from_png(filename); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) return JS_FALSE; surface_wrapper = JS_NewObject(context, &gjs_cairo_image_surface_class, NULL, NULL); if (!surface_wrapper) { gjs_throw(context, "failed to create surface"); return JS_FALSE; } gjs_cairo_surface_construct(context, surface_wrapper, surface); cairo_surface_destroy(surface); *retval = OBJECT_TO_JSVAL(surface_wrapper); return JS_TRUE; }
static JSBool getGroupTarget_func(JSContext *context, uintN argc, jsval *vp) { JSObject *obj = JS_THIS_OBJECT(context, vp); cairo_t *cr; cairo_surface_t *surface; JSObject *surface_wrapper; if (argc > 0) { gjs_throw(context, "Context.getGroupTarget() takes no arguments"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); surface = cairo_get_group_target(cr); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; /* surface belongs to the context, so keep the reference */ surface_wrapper = gjs_cairo_surface_from_surface(context, surface); if (!surface_wrapper) { /* exception already set */ return JS_FALSE; } JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(surface_wrapper)); return JS_TRUE; }
static JSBool appendPath_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); JSObject *path_wrapper; cairo_path_t *path; cairo_t *cr; if (!gjs_parse_args(context, "path", "o", argc, argv, "path", &path_wrapper)) return JS_FALSE; path = gjs_cairo_path_get_path(context, path_wrapper); if (!path) { gjs_throw(context, "first argument to appendPath() should be a path"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_append_path(cr, path); JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool boxed_field_setter (JSContext *context, JSObject *obj, jsid id, JSBool strict, jsval *value) { Boxed *priv; GIFieldInfo *field_info; gboolean success = FALSE; priv = priv_from_js(context, obj); if (!priv) return JS_FALSE; field_info = get_field_info(context, priv, id); if (!field_info) return JS_FALSE; if (priv->gboxed == NULL) { /* direct access to proto field */ gjs_throw(context, "Can't set field %s.%s on prototype", g_base_info_get_name ((GIBaseInfo *)priv->info), g_base_info_get_name ((GIBaseInfo *)field_info)); goto out; } success = boxed_set_field_from_value (context, priv, field_info, *value); out: g_base_info_unref ((GIBaseInfo *)field_info); return success; }
static JSBool gjs_importer_add_subimporter(JSContext *context, unsigned argc, jsval *vp) { if (argc != 2) { gjs_throw(context, "Must pass two arguments to addSubImporter()"); return JS_FALSE; } JSObject *importer; jsval *argv = JS_ARGV(context, vp); char *name; char *path; char *search_path[2] = { 0, 0 }; JS_BeginRequest(context); importer = JS_THIS_OBJECT(context, vp); gjs_string_to_utf8(context, argv[0], &name); gjs_string_to_utf8(context, argv[1], &path); search_path[0] = path; gjs_define_importer(context, importer, name, (const char **)search_path, FALSE); JS_EndRequest(context); JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
/** * gjs_cairo_surface_from_surface: * @context: the context * @surface: cairo_surface to attach to the object * * Constructs a surface wrapper given cairo surface. * A reference to @surface will be taken. * */ JSObject * gjs_cairo_surface_from_surface(JSContext *context, cairo_surface_t *surface) { JSObject *object; g_return_val_if_fail(context != NULL, NULL); g_return_val_if_fail(surface != NULL, NULL); switch (cairo_surface_get_type(surface)) { case CAIRO_SURFACE_TYPE_IMAGE: return gjs_cairo_image_surface_from_surface(context, surface); case CAIRO_SURFACE_TYPE_PDF: return gjs_cairo_pdf_surface_from_surface(context, surface); /* case CAIRO_SURFACE_TYPE_PS: return gjs_cairo_ps_surface_from_surface(context, surface); */ case CAIRO_SURFACE_TYPE_SVG: return gjs_cairo_svg_surface_from_surface(context, surface); default: break; } object = JS_NewObject(context, &gjs_cairo_surface_class, NULL, NULL); if (!object) { gjs_throw(context, "failed to create surface"); return NULL; } gjs_cairo_surface_construct(context, object, surface); return object; }
static JSBool appendPath_func(JSContext *context, unsigned argc, jsval *vp) { JS::CallArgs argv = JS::CallArgsFromVp (argc, vp); JSObject *obj = JSVAL_TO_OBJECT(argv.thisv()); JSObject *path_wrapper; cairo_path_t *path; cairo_t *cr; if (!gjs_parse_call_args(context, "path", "o", argv, "path", &path_wrapper)) return JS_FALSE; path = gjs_cairo_path_get_path(context, path_wrapper); if (!path) { gjs_throw(context, "first argument to appendPath() should be a path"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_append_path(cr, path); argv.rval().set(JSVAL_VOID); return JS_TRUE; }
static bool setSourceSurface_func(JSContext *context, unsigned argc, JS::Value *vp) { GJS_GET_PRIV(context, argc, vp, argv, obj, GjsCairoContext, priv); JS::RootedObject surface_wrapper(context); double x, y; cairo_surface_t *surface; cairo_t *cr = priv ? priv->cr : NULL; if (!gjs_parse_call_args(context, "setSourceSurface", argv, "off", "surface", &surface_wrapper, "x", &x, "y", &y)) return false; surface = gjs_cairo_surface_get_surface(context, surface_wrapper); if (!surface) { gjs_throw(context, "first argument to setSourceSurface() should be a surface"); return false; } cairo_set_source_surface(cr, surface, x, y); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return false; argv.rval().setUndefined(); return true; }
static JSBool maskSurface_func(JSContext *context, unsigned argc, jsval *vp) { JS::CallArgs argv = JS::CallArgsFromVp (argc, vp); JSObject *obj = JSVAL_TO_OBJECT(argv.thisv()); JSObject *surface_wrapper; double x, y; cairo_surface_t *surface; cairo_t *cr; if (!gjs_parse_call_args(context, "maskSurface", "off", argv, "surface", &surface_wrapper, "x", &x, "y", &y)) return JS_FALSE; surface = gjs_cairo_surface_get_surface(context, surface_wrapper); if (!surface) { gjs_throw(context, "first argument to maskSurface() should be a surface"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_mask_surface(cr, surface, x, y); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; argv.rval().set(JSVAL_VOID); return JS_TRUE; }
bool gjs_lookup_interface_constructor(JSContext *context, GType gtype, JS::MutableHandleValue value_p) { JSObject *constructor; GIBaseInfo *interface_info; interface_info = g_irepository_find_by_gtype(NULL, gtype); if (interface_info == NULL) { gjs_throw(context, "Cannot expose non introspectable interface %s", g_type_name(gtype)); return false; } g_assert(g_base_info_get_type(interface_info) == GI_INFO_TYPE_INTERFACE); constructor = gjs_lookup_generic_constructor(context, interface_info); if (G_UNLIKELY (constructor == NULL)) return false; g_base_info_unref(interface_info); value_p.setObject(*constructor); return true; }
static JSBool setSource_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); JSObject *pattern_wrapper; cairo_pattern_t *pattern; cairo_t *cr; if (!gjs_parse_args(context, "setSource", "o", argc, argv, "pattern", &pattern_wrapper)) return JS_FALSE; pattern = gjs_cairo_pattern_get_pattern(context, pattern_wrapper); if (!pattern) { gjs_throw(context, "first argument to setSource() should be a pattern"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_set_source(cr, pattern); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }