summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jsapi-libdom.c66
-rw-r--r--src/jsapi-libdom.h5
2 files changed, 61 insertions, 10 deletions
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c
index ac14f5a..9ce7e84 100644
--- a/src/jsapi-libdom.c
+++ b/src/jsapi-libdom.c
@@ -157,8 +157,9 @@ output_api_operations(struct binding *binding)
{
int res = 0;
+ /* finalise */
if (binding->has_private) {
- /* finalizer only required if there is a private to free */
+ /* finalizer with private to free */
fprintf(binding->outfile,
"static void jsclass_finalize(JSContext *cx, JSObject *obj)\n"
"{\n"
@@ -201,6 +202,27 @@ output_api_operations(struct binding *binding)
"\treturn JS_TRUE;\n"
"}\n\n");
}
+
+ if (binding->mark != NULL) {
+ /* generate trace/mark entry */
+ fprintf(binding->outfile,
+ "static JSBool jsclass_mark(JSTracer *trc, JSObject *obj)\n"
+ "{\n");
+ if(binding->has_private) {
+
+ fprintf(binding->outfile,
+ "\tstruct jsclass_private *private;\n"
+ "\n"
+ "\tprivate = JS_GetInstancePrivate(trc->context, obj, &JSClass_%s, NULL);\n",
+ binding->interface);
+ }
+
+ output_code_block(binding, genbind_node_getnode(binding->mark));
+
+ fprintf(binding->outfile,
+ "\treturn JS_TRUE;\n"
+ "}\n\n");
+ }
return res;
}
@@ -358,6 +380,11 @@ output_jsclass(struct binding *binding)
"static JSBool jsclass_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp);\n\n");
}
+ if (binding->mark != NULL) {
+ fprintf(binding->outfile,
+ "static JSBool jsclass_mark(JSTracer *trc, JSObject *obj);\n\n");
+ }
+
if (binding->has_private || (binding->finalise != NULL)) {
/* forward declare the finalizer */
@@ -382,6 +409,10 @@ output_jsclass(struct binding *binding)
fprintf(binding->outfile, " | JSCLASS_NEW_RESOLVE");
}
+ if (binding->mark != NULL) {
+ fprintf(binding->outfile, " | JSCLASS_MARK_IS_TRACE");
+ }
+
if (binding->has_private) {
fprintf(binding->outfile, " | JSCLASS_HAS_PRIVATE");
}
@@ -390,11 +421,11 @@ output_jsclass(struct binding *binding)
/* stubs */
fprintf(binding->outfile,
- "\tJS_PropertyStub,\n"
- "\tJS_PropertyStub,\n"
- "\tJS_PropertyStub,\n"
- "\tJS_StrictPropertyStub,\n"
- "\tJS_EnumerateStub,\n");
+ "\tJS_PropertyStub,\t/* addProperty */\n"
+ "\tJS_PropertyStub,\t/* delProperty */\n"
+ "\tJS_PropertyStub,\t/* getProperty */\n"
+ "\tJS_StrictPropertyStub,\t/* setProperty */\n"
+ "\tJS_EnumerateStub,\t/* enumerate */\n");
/* resolver */
if (binding->resolve != NULL) {
@@ -403,16 +434,30 @@ output_jsclass(struct binding *binding)
fprintf(binding->outfile, "\tJS_ResolveStub,\n");
}
- fprintf(binding->outfile, "\tJS_ConvertStub,\n");
+ fprintf(binding->outfile, "\tJS_ConvertStub,\t/* convert */\n");
if (binding->has_private || (binding->finalise != NULL)) {
fprintf(binding->outfile, "\tjsclass_finalize,\n");
} else {
fprintf(binding->outfile, "\tJS_FinalizeStub,\n");
}
+ fprintf(binding->outfile,
+ "\t0,\t/* reserved */\n"
+ "\tNULL,\t/* checkAccess */\n"
+ "\tNULL,\t/* call */\n"
+ "\tNULL,\t/* construct */"
+ "\tNULL,\t/* xdr Object */"
+ "\tNULL,\t/* hasInstance */");
+
+ /* trace/mark */
+ if (binding->mark != NULL) {
+ fprintf(binding->outfile, "\t(JSMarkOp)jsclass_mark,\n");
+ } else {
+ fprintf(binding->outfile, "\tNULL, /* trace/mark */\n");
+ }
fprintf(binding->outfile,
- "\tJSCLASS_NO_OPTIONAL_MEMBERS\n"
+ "\tJSCLASS_NO_INTERNAL_MEMBERS\n"
"};\n\n");
return 0;
}
@@ -596,6 +641,11 @@ binding_new(char *outfilename, struct genbind_node *genbind_ast)
NULL,
GENBIND_NODE_TYPE_API,
"finalise");
+
+ nb->mark = genbind_node_find_type_ident(genbind_ast,
+ NULL,
+ GENBIND_NODE_TYPE_API,
+ "mark");
return nb;
}
diff --git a/src/jsapi-libdom.h b/src/jsapi-libdom.h
index 8e03630..cca6b80 100644
--- a/src/jsapi-libdom.h
+++ b/src/jsapi-libdom.h
@@ -18,8 +18,9 @@ struct binding {
bool has_private; /* true if the binding requires a private structure */
bool has_global; /* true if the binding is for a global */
- struct genbind_node *resolve; /* the binding api resolve node or NULL */
- struct genbind_node *finalise; /* the binding api finalise node or NULL*/
+ struct genbind_node *resolve; /* binding api resolve node or NULL */
+ struct genbind_node *finalise; /* binding api finalise node or NULL */
+ struct genbind_node *mark; /* binding api mark node or NULL */
FILE *outfile ; /* output file */
};