From 15700c437a524ddc59d7dcc2ec6063ef67981076 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 6 Nov 2012 17:33:46 +0000 Subject: allow mark/trace api to be implemented for garbage colelction management --- src/jsapi-libdom.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++------- src/jsapi-libdom.h | 5 +++-- 2 files changed, 61 insertions(+), 10 deletions(-) (limited to 'src') 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 */ }; -- cgit v1.2.3