diff --git a/src/ecmascript/quickjs.h b/src/ecmascript/quickjs.h index 98e000add..1286e08ff 100644 --- a/src/ecmascript/quickjs.h +++ b/src/ecmascript/quickjs.h @@ -13,9 +13,17 @@ } \ return obj +#define REF_JS(obj) \ + fprintf(stderr, "%s:%d obj=%p\n", __FILE__, __LINE__, JS_VALUE_GET_PTR(obj)); \ + if (JS_VALUE_HAS_REF_COUNT(obj)) { \ + JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(obj); \ + fprintf(stderr, "ref_count=%d\n", p->ref_count); \ + } + #else #define RETURN_JS(obj) return obj +#define REF_JS(obj) #endif diff --git a/src/ecmascript/quickjs/attr.cpp b/src/ecmascript/quickjs/attr.cpp index 8c9d542fe..4656326e1 100644 --- a/src/ecmascript/quickjs/attr.cpp +++ b/src/ecmascript/quickjs/attr.cpp @@ -62,6 +62,9 @@ js_attr_get_property_name(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -91,6 +94,7 @@ js_attr_get_property_value(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -120,6 +124,7 @@ js_attr_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); return JS_NewString(ctx, "[attr object]"); } @@ -134,6 +139,7 @@ static std::map<void *, JSValueConst> map_attrs; static void js_attr_finalizer(JSRuntime *rt, JSValue val) { + REF_JS(val); void *node = JS_GetOpaque(val, js_attr_class_id); map_attrs.erase(node); @@ -162,6 +168,7 @@ getAttr(JSContext *ctx, void *node) if (node_find != map_attrs.end()) { JSValue r = JS_DupValue(ctx, node_find->second); + RETURN_JS(r); } @@ -174,5 +181,6 @@ getAttr(JSContext *ctx, void *node) map_attrs[node] = attr_obj; JSValue rr = JS_DupValue(ctx, attr_obj); + RETURN_JS(rr); } diff --git a/src/ecmascript/quickjs/attributes.cpp b/src/ecmascript/quickjs/attributes.cpp index 36a0e068d..dbe287336 100644 --- a/src/ecmascript/quickjs/attributes.cpp +++ b/src/ecmascript/quickjs/attributes.cpp @@ -61,12 +61,16 @@ static std::map<JSValueConst, void *> map_rev_attributes; static void * js_attributes_GetOpaque(JSValueConst this_val) { + REF_JS(this_val); + return map_rev_attributes[this_val]; } static void js_attributes_SetOpaque(JSValueConst this_val, void *node) { + REF_JS(this_val); + if (!node) { map_rev_attributes.erase(this_val); } else { @@ -80,6 +84,8 @@ js_attributes_set_items(JSContext *ctx, JSValue this_val, void *node) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); @@ -101,6 +107,9 @@ js_attributes_set_items(JSContext *ctx, JSValue this_val, void *node) } JSValue obj = getAttr(ctx, attr); + + REF_JS(obj); + JS_SetPropertyUint32(ctx, this_val, i, obj); xmlpp::ustring name = attr->get_name(); @@ -117,6 +126,8 @@ js_attributes_get_property_length(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -142,6 +153,8 @@ js_attributes_item2(JSContext *ctx, JSValueConst this_val, int idx) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element::AttributeList *al = static_cast<xmlpp::Element::AttributeList *>(js_attributes_GetOpaque(this_val)); if (!al) { @@ -170,6 +183,8 @@ js_attributes_item(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -186,6 +201,8 @@ js_attributes_namedItem2(JSContext *ctx, JSValueConst this_val, const char *str) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element::AttributeList *al = static_cast<xmlpp::Element::AttributeList *>(js_attributes_GetOpaque(this_val)); if (!al) { @@ -206,6 +223,7 @@ js_attributes_namedItem2(JSContext *ctx, JSValueConst this_val, const char *str) if (name == attr->get_name()) { JSValue obj = getAttr(ctx, attr); + RETURN_JS(obj); } } @@ -219,6 +237,8 @@ js_attributes_getNamedItem(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -244,6 +264,8 @@ js_attributes_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[attributes object]"); } @@ -281,6 +303,7 @@ getAttributes(JSContext *ctx, void *node) if (node_find != map_attributes.end()) { JSValue r = JS_DupValue(ctx, node_find->second); + RETURN_JS(r); } JSValue attributes_obj = JS_NewArray(ctx); @@ -291,5 +314,6 @@ getAttributes(JSContext *ctx, void *node) map_attributes[node] = attributes_obj; JSValue rr = JS_DupValue(ctx, attributes_obj); + RETURN_JS(rr); } diff --git a/src/ecmascript/quickjs/collection.cpp b/src/ecmascript/quickjs/collection.cpp index b12a7fb83..dd53a07de 100644 --- a/src/ecmascript/quickjs/collection.cpp +++ b/src/ecmascript/quickjs/collection.cpp @@ -62,12 +62,16 @@ static std::map<JSValueConst, void *> map_rev_collections; static void * js_htmlCollection_GetOpaque(JSValueConst this_val) { + REF_JS(this_val); + return map_rev_collections[this_val]; } static void js_htmlCollection_SetOpaque(JSValueConst this_val, void *node) { + REF_JS(this_val); + if (!node) { map_rev_collections.erase(this_val); } else { @@ -81,6 +85,8 @@ js_htmlCollection_get_property_length(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node::NodeSet *ns = static_cast<xmlpp::Node::NodeSet *>(js_htmlCollection_GetOpaque(this_val)); if (!ns) { @@ -96,6 +102,8 @@ js_htmlCollection_item2(JSContext *ctx, JSValueConst this_val, int idx) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node::NodeSet *ns = static_cast<xmlpp::Node::NodeSet *>(js_htmlCollection_GetOpaque(this_val)); if (!ns) { @@ -121,6 +129,8 @@ js_htmlCollection_item(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -137,6 +147,8 @@ js_htmlCollection_namedItem2(JSContext *ctx, JSValueConst this_val, const char * #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node::NodeSet *ns = static_cast<xmlpp::Node::NodeSet *>(js_htmlCollection_GetOpaque(this_val)); if (!ns) { @@ -170,6 +182,8 @@ js_htmlCollection_namedItem(JSContext *ctx, JSValueConst this_val, int argc, JSV #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -195,6 +209,8 @@ js_htmlCollection_set_items(JSContext *ctx, JSValue this_val, void *node) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + int counter = 0; xmlpp::Node::NodeSet *ns = static_cast<xmlpp::Node::NodeSet *>(js_htmlCollection_GetOpaque(this_val)); @@ -215,6 +231,9 @@ js_htmlCollection_set_items(JSContext *ctx, JSValue this_val, void *node) } JSValue obj = getElement(ctx, element); + + REF_JS(obj); + JS_SetPropertyUint32(ctx, this_val, counter, obj); xmlpp::ustring name = element->get_attribute_value("id"); @@ -234,6 +253,8 @@ js_htmlCollection_toString(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[htmlCollection object]"); } @@ -248,6 +269,8 @@ static const JSCFunctionListEntry js_htmlCollection_proto_funcs[] = { static void js_htmlCollection_finalizer(JSRuntime *rt, JSValue val) { + REF_JS(val); + void *node = js_htmlCollection_GetOpaque(val); js_htmlCollection_SetOpaque(val, nullptr); @@ -289,6 +312,8 @@ fail: int js_htmlCollection_init(JSContext *ctx, JSValue global_obj) { + REF_JS(global_obj); + JSValue htmlCollection_proto, htmlCollection_class; /* create the htmlCollection class */ @@ -296,9 +321,15 @@ js_htmlCollection_init(JSContext *ctx, JSValue global_obj) JS_NewClass(JS_GetRuntime(ctx), js_htmlCollection_class_id, &js_htmlCollection_class); htmlCollection_proto = JS_NewObject(ctx); + + REF_JS(htmlCollection_proto); + JS_SetPropertyFunctionList(ctx, htmlCollection_proto, js_htmlCollection_proto_funcs, countof(js_htmlCollection_proto_funcs)); htmlCollection_class = JS_NewCFunction2(ctx, js_htmlCollection_ctor, "htmlCollection", 0, JS_CFUNC_constructor, 0); + + REF_JS(htmlCollection_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, htmlCollection_class, htmlCollection_proto); JS_SetClassProto(ctx, js_htmlCollection_class_id, htmlCollection_proto); @@ -319,6 +350,7 @@ getCollection(JSContext *ctx, void *node) if (node_find != map_collections.end()) { JSValue r = JS_DupValue(ctx, node_find->second); + RETURN_JS(r); } JSValue htmlCollection_obj = JS_NewArray(ctx); @@ -329,5 +361,6 @@ getCollection(JSContext *ctx, void *node) map_collections[node] = htmlCollection_obj; JSValue rr = JS_DupValue(ctx, htmlCollection_obj); + RETURN_JS(rr); } diff --git a/src/ecmascript/quickjs/console.cpp b/src/ecmascript/quickjs/console.cpp index 75e623b29..a7b760c57 100644 --- a/src/ecmascript/quickjs/console.cpp +++ b/src/ecmascript/quickjs/console.cpp @@ -39,6 +39,8 @@ static JSClassID js_console_class_id; static JSValue js_console_log_common(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, const char *log_filename) { + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); @@ -75,6 +77,8 @@ js_console_log(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return js_console_log_common(ctx, this_val, argc, argv, console_log_filename); } @@ -84,6 +88,8 @@ js_console_error(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return js_console_log_common(ctx, this_val, argc, argv, console_error_filename); } @@ -93,6 +99,8 @@ js_console_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[console object]"); } @@ -109,6 +117,8 @@ static JSClassDef js_console_class = { static JSValue js_console_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the @@ -124,6 +134,7 @@ js_console_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst if (JS_IsException(obj)) { goto fail; } + RETURN_JS(obj); fail: @@ -141,11 +152,16 @@ js_console_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_console_class_id, &js_console_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); console_proto = JS_NewObject(ctx); + REF_JS(console_proto); + JS_SetPropertyFunctionList(ctx, console_proto, js_console_funcs, countof(js_console_funcs)); console_class = JS_NewCFunction2(ctx, js_console_ctor, "console", 0, JS_CFUNC_constructor, 0); + REF_JS(console_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, console_class, console_proto); JS_SetClassProto(ctx, js_console_class_id, console_proto); diff --git a/src/ecmascript/quickjs/document.cpp b/src/ecmascript/quickjs/document.cpp index 406c33ed7..b1d33e6a4 100644 --- a/src/ecmascript/quickjs/document.cpp +++ b/src/ecmascript/quickjs/document.cpp @@ -74,6 +74,8 @@ js_document_get_property_anchors(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -111,6 +113,8 @@ js_document_get_property_baseURI(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); vs = interpreter->vs; @@ -143,6 +147,8 @@ js_document_get_property_body(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -176,6 +182,8 @@ js_document_set_property_body(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); // TODO return JS_UNDEFINED; } @@ -187,6 +195,8 @@ js_document_get_property_cookie(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct string *cookies; @@ -207,9 +217,11 @@ js_document_get_property_cookie(JSContext *ctx, JSValueConst this_val) done_string(cookies); JSValue r = JS_NewString(ctx, cookiestr); + RETURN_JS(r); } else { JSValue rr = JS_NewStringLen(ctx, "", 0); + RETURN_JS(rr); } } @@ -220,6 +232,9 @@ js_document_set_property_cookie(JSContext *ctx, JSValueConst this_val, JSValue v #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; vs = interpreter->vs; @@ -256,6 +271,8 @@ js_document_get_property_charset(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -276,6 +293,7 @@ js_document_get_property_charset(JSContext *ctx, JSValueConst this_val) } JSValue r = JS_NewStringLen(ctx, encoding.c_str(), encoding.length()); + RETURN_JS(r); } @@ -285,6 +303,8 @@ js_document_get_property_childNodes(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -332,6 +352,8 @@ js_document_get_property_doctype(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -360,6 +382,8 @@ js_document_get_property_documentElement(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -393,6 +417,8 @@ js_document_get_property_documentURI(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); vs = interpreter->vs; @@ -422,6 +448,8 @@ js_document_get_property_domain(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); vs = interpreter->vs; @@ -454,6 +482,8 @@ js_document_get_property_forms(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -493,6 +523,8 @@ js_document_get_property_head(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -525,6 +557,8 @@ js_document_get_property_images(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -561,6 +595,8 @@ js_document_get_property_implementation(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -582,6 +618,8 @@ js_document_get_property_links(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -618,6 +656,8 @@ js_document_get_property_location(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); RETURN_JS(interpreter->location_obj); @@ -629,6 +669,8 @@ js_document_get_property_nodeType(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewInt32(ctx, 9); } @@ -638,6 +680,9 @@ js_document_set_property_location(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct document_view *doc_view; @@ -671,6 +716,8 @@ js_document_get_property_referrer(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct document_view *doc_view; @@ -735,6 +782,8 @@ js_document_get_property_scripts(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document = doc_view->document; @@ -772,6 +821,8 @@ js_document_get_property_title(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct document_view *doc_view; @@ -797,6 +848,9 @@ js_document_set_property_title(JSContext *ctx, JSValueConst this_val, JSValue va #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct document_view *doc_view; @@ -837,6 +891,8 @@ js_document_get_property_url(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct document_view *doc_view; @@ -869,6 +925,9 @@ js_document_set_property_url(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs; struct document_view *doc_view; @@ -902,6 +961,8 @@ js_document_write_do(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); if (argc >= 1) { @@ -952,6 +1013,7 @@ js_document_write(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); return js_document_write_do(ctx, this_val, argc, argv, 0); } @@ -963,6 +1025,8 @@ js_document_writeln(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return js_document_write_do(ctx, this_val, argc, argv, 1); } @@ -973,6 +1037,8 @@ js_document_replace(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct document_view *doc_view = interpreter->vs->doc_view; struct document *document; @@ -1048,6 +1114,8 @@ js_document_createComment(JSContext *ctx, JSValueConst this_val, int argc, JSVal #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1087,6 +1155,8 @@ js_document_createDocumentFragment(JSContext *ctx, JSValueConst this_val, int ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 0) { return JS_FALSE; } @@ -1125,6 +1195,8 @@ js_document_createElement(JSContext *ctx, JSValueConst this_val, int argc, JSVal #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1164,6 +1236,8 @@ js_document_createTextNode(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1203,6 +1277,8 @@ js_document_getElementById(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1251,6 +1327,8 @@ js_document_getElementsByClassName(JSContext *ctx, JSValueConst this_val, int ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1300,6 +1378,8 @@ js_document_getElementsByName(JSContext *ctx, JSValueConst this_val, int argc, J #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1350,6 +1430,8 @@ js_document_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1397,6 +1479,8 @@ js_document_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSVal #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1449,6 +1533,8 @@ js_document_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JS #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1505,6 +1591,8 @@ js_doctype_get_property_name(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Dtd *dtd = static_cast<xmlpp::Dtd *>(JS_GetOpaque(this_val, js_doctype_class_id)); if (!dtd) { @@ -1521,6 +1609,8 @@ js_doctype_get_property_publicId(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Dtd *dtd = static_cast<xmlpp::Dtd *>(JS_GetOpaque(this_val, js_doctype_class_id)); if (!dtd) { @@ -1538,6 +1628,8 @@ js_doctype_get_property_systemId(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Dtd *dtd = static_cast<xmlpp::Dtd *>(JS_GetOpaque(this_val, js_doctype_class_id)); if (!dtd) { @@ -1555,6 +1647,8 @@ js_document_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[document object]"); } @@ -1609,11 +1703,14 @@ static JSClassDef js_document_class = { static JSValue js_document_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -1641,11 +1738,16 @@ js_document_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_document_class_id, &js_document_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); document_proto = JS_NewObject(ctx); + REF_JS(document_proto); + JS_SetPropertyFunctionList(ctx, document_proto, js_document_proto_funcs, countof(js_document_proto_funcs)); document_class = JS_NewCFunction2(ctx, js_document_ctor, "document", 0, JS_CFUNC_constructor, 0); + REF_JS(document_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, document_class, document_proto); JS_SetClassProto(ctx, js_document_class_id, document_proto); @@ -1663,6 +1765,8 @@ js_doctype_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[doctype object]"); } @@ -1678,8 +1782,9 @@ static std::map<void *, JSValueConst> map_doctypes; static void js_doctype_finalizer(JSRuntime *rt, JSValue val) { - void *node = JS_GetOpaque(val, js_doctype_class_id); + REF_JS(val); + void *node = JS_GetOpaque(val, js_doctype_class_id); map_doctypes.erase(node); } @@ -1691,11 +1796,13 @@ static JSClassDef js_doctype_class = { static JSValue js_doctype_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -1723,11 +1830,16 @@ js_doctype_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_doctype_class_id, &js_doctype_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); doctype_proto = JS_NewObject(ctx); + REF_JS(doctype_proto); + JS_SetPropertyFunctionList(ctx, doctype_proto, js_doctype_proto_funcs, countof(js_doctype_proto_funcs)); doctype_class = JS_NewCFunction2(ctx, js_doctype_ctor, "doctype", 0, JS_CFUNC_constructor, 0); + REF_JS(doctype_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, doctype_class, doctype_proto); JS_SetClassProto(ctx, js_doctype_class_id, doctype_proto); diff --git a/src/ecmascript/quickjs/element.cpp b/src/ecmascript/quickjs/element.cpp index f31d918ec..e37c009b4 100644 --- a/src/ecmascript/quickjs/element.cpp +++ b/src/ecmascript/quickjs/element.cpp @@ -81,6 +81,8 @@ struct js_element_private { static void * js_getopaque(JSValueConst obj, JSClassID class_id) { + REF_JS(obj); + struct js_element_private *res = (struct js_element_private *)JS_GetOpaque(obj, class_id); if (!res) { @@ -95,6 +97,8 @@ js_element_get_property_attributes(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -118,6 +122,8 @@ js_element_get_property_children(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -160,6 +166,8 @@ js_element_get_property_childElementCount(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -177,6 +185,8 @@ js_element_get_property_childNodes(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -204,6 +214,8 @@ js_element_get_property_className(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -221,6 +233,8 @@ js_element_get_property_dir(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -242,6 +256,8 @@ js_element_get_property_firstChild(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -263,6 +279,8 @@ js_element_get_property_firstElementChild(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -293,6 +311,8 @@ js_element_get_property_id(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -310,6 +330,8 @@ js_element_get_property_lang(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -327,6 +349,8 @@ js_element_get_property_lastChild(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -347,6 +371,8 @@ js_element_get_property_lastElementChild(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -378,6 +404,8 @@ js_element_get_property_nextElementSibling(JSContext *ctx, JSValueConst this_val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -407,6 +435,8 @@ js_element_get_property_nodeName(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node *node = static_cast<xmlpp::Node *>(js_getopaque(this_val, js_element_class_id)); xmlpp::ustring v; @@ -441,6 +471,8 @@ js_element_get_property_nodeType(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node *node = static_cast<xmlpp::Node *>(js_getopaque(this_val, js_element_class_id)); if (!node) { @@ -467,6 +499,8 @@ js_element_get_property_nodeValue(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node *node = static_cast<xmlpp::Node *>(js_getopaque(this_val, js_element_class_id)); if (!node) { @@ -513,6 +547,8 @@ js_element_get_property_nextSibling(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -534,6 +570,8 @@ js_element_get_property_ownerDocument(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); JSValue r = JS_DupValue(ctx, interpreter->document_obj); @@ -546,6 +584,8 @@ js_element_get_property_parentElement(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -567,6 +607,8 @@ js_element_get_property_parentNode(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -587,6 +629,8 @@ js_element_get_property_previousElementSibling(JSContext *ctx, JSValueConst this #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -616,6 +660,8 @@ js_element_get_property_previousSibling(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -636,6 +682,8 @@ js_element_get_property_tagName(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -654,6 +702,8 @@ js_element_get_property_title(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -754,6 +804,8 @@ js_element_get_property_innerHtml(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -776,6 +828,8 @@ js_element_get_property_outerHtml(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -798,6 +852,8 @@ js_element_get_property_textContent(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); if (!el) { @@ -820,6 +876,9 @@ js_element_set_property_className(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -847,6 +906,9 @@ js_element_set_property_dir(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -877,6 +939,9 @@ js_element_set_property_id(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -904,6 +969,9 @@ js_element_set_property_innerHtml(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -951,6 +1019,9 @@ js_element_set_property_innerText(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -983,6 +1054,9 @@ js_element_set_property_lang(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -1009,6 +1083,9 @@ js_element_set_property_title(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -1069,6 +1146,8 @@ js_element_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSV #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct js_element_private *el_private = (struct js_element_private *)(JS_GetOpaque(this_val, js_element_class_id)); @@ -1121,6 +1200,8 @@ js_element_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct js_element_private *el_private = (struct js_element_private *)(JS_GetOpaque(this_val, js_element_class_id)); @@ -1170,6 +1251,8 @@ js_element_appendChild(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); xmlpp::Element *el = static_cast<xmlpp::Element *>(js_getopaque(this_val, js_element_class_id)); @@ -1193,6 +1276,8 @@ js_element_cloneNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1253,6 +1338,8 @@ js_element_closest(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -1305,6 +1392,8 @@ js_element_contains(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1336,6 +1425,8 @@ js_element_getAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1372,6 +1463,8 @@ js_element_getAttributeNode(JSContext *ctx, JSValueConst this_val, int argc, JSV #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1402,6 +1495,8 @@ js_element_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc, #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1441,6 +1536,8 @@ js_element_hasAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1471,6 +1568,8 @@ js_element_hasAttributes(JSContext *ctx, JSValueConst this_val, int argc, JSValu #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 0) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1493,6 +1592,8 @@ js_element_hasChildNodes(JSContext *ctx, JSValueConst this_val, int argc, JSValu #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 0) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1515,6 +1616,8 @@ js_element_insertBefore(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 2) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1552,6 +1655,8 @@ js_element_isEqualNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1595,6 +1700,8 @@ js_element_isSameNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1618,6 +1725,8 @@ js_element_matches(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -1654,13 +1763,14 @@ js_element_matches(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst return JS_FALSE; } - static JSValue js_element_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -1705,6 +1815,8 @@ js_element_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JSV #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_FALSE; } @@ -1751,6 +1863,8 @@ js_element_remove(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 0) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1776,6 +1890,8 @@ js_element_removeChild(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1812,6 +1928,8 @@ js_element_replaceWith(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc < 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1840,6 +1958,8 @@ js_element_setAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 2) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -1883,6 +2003,8 @@ js_element_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[element object]"); } @@ -1946,6 +2068,11 @@ static std::map<void *, JSValueConst> map_elements; static void js_element_finalizer(JSRuntime *rt, JSValue val) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(val); + struct js_element_private *el_private = (struct js_element_private *)JS_GetOpaque(val, js_element_class_id); if (el_private) { @@ -1969,11 +2096,17 @@ static JSClassDef js_element_class = { static JSValue js_element_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -2001,11 +2134,16 @@ js_element_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_element_class_id, &js_element_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); element_proto = JS_NewObject(ctx); + REF_JS(element_proto); + JS_SetPropertyFunctionList(ctx, element_proto, js_element_proto_funcs, countof(js_element_proto_funcs)); element_class = JS_NewCFunction2(ctx, js_element_ctor, "Element", 0, JS_CFUNC_constructor, 0); + REF_JS(element_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, element_class, element_proto); JS_SetClassProto(ctx, js_element_class_id, element_proto); @@ -2051,6 +2189,7 @@ getElement(JSContext *ctx, void *node) el_private->interpreter = interpreter; JSValue element_obj = JS_NewObjectClass(ctx, js_element_class_id); + REF_JS(element_obj); JS_SetPropertyFunctionList(ctx, element_obj, js_element_proto_funcs, countof(js_element_proto_funcs)); JS_SetClassProto(ctx, js_element_class_id, element_obj); diff --git a/src/ecmascript/quickjs/form.cpp b/src/ecmascript/quickjs/form.cpp index 5c09a187a..4d65e8eb0 100644 --- a/src/ecmascript/quickjs/form.cpp +++ b/src/ecmascript/quickjs/form.cpp @@ -64,12 +64,22 @@ JSValue getForm(JSContext *ctx, struct form *form); static struct form_view * getOpaque(JSValueConst this_val) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(this_val); + return (struct form_view *)JS_GetOpaque(this_val, js_form_elements_class_id); } static void setOpaque(JSValueConst this_val, struct form_view *fv) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(this_val); + if (!fv) { map_elements_form.erase(this_val); } else { @@ -81,12 +91,22 @@ setOpaque(JSValueConst this_val, struct form_view *fv) static struct form * form_GetOpaque(JSValueConst this_val) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(this_val); + return map_rev_form[this_val]; } static void form_SetOpaque(JSValueConst this_val, struct form *form) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(this_val); + if (!form) { map_rev_form.erase(this_val); } else { @@ -131,6 +151,8 @@ js_form_set_items(JSContext *ctx, JSValueConst this_val, void *node) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -161,6 +183,8 @@ js_form_set_items(JSContext *ctx, JSValueConst this_val, void *node) } JSValue obj = js_get_form_control_object(ctx, fc->type, fs); + REF_JS(obj); + JS_SetPropertyUint32(ctx, this_val, counter, JS_DupValue(ctx, obj)); if (fc->id) { @@ -182,6 +206,8 @@ js_form_set_items2(JSContext *ctx, JSValueConst this_val, void *node) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct form *form; @@ -200,6 +226,8 @@ js_form_set_items2(JSContext *ctx, JSValueConst this_val, void *node) } JSValue obj = js_get_form_control_object(ctx, fc->type, fs); + REF_JS(obj); + JS_SetPropertyUint32(ctx, this_val, counter, obj); if (fc->id) { @@ -221,6 +249,8 @@ js_form_elements_get_property_length(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -257,6 +287,8 @@ js_form_elements_item2(JSContext *ctx, JSValueConst this_val, int index) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -299,6 +331,8 @@ js_form_elements_item(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_NULL; } @@ -318,6 +352,8 @@ js_form_elements_namedItem2(JSContext *ctx, JSValueConst this_val, const char *s #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -363,6 +399,8 @@ js_form_elements_namedItem(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_NULL; } @@ -386,6 +424,8 @@ js_form_elements_toString(JSContext *ctx, JSValueConst this_val, int argc, JSVal #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[form elements object]"); } @@ -396,6 +436,8 @@ js_form_get_form_view(JSContext *ctx, JSValueConst this_val, JSValueConst *argv) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct form_view *fv = getOpaque(this_val); return fv; @@ -408,6 +450,8 @@ js_form_get_property_action(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -432,6 +476,9 @@ js_form_set_property_action(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -495,6 +542,8 @@ void js_elements_finalizer(JSRuntime *rt, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(val); + struct form_view *fv = getOpaque(val); setOpaque(val, nullptr); @@ -539,6 +588,8 @@ js_form_get_property_elements(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -571,6 +622,8 @@ js_form_get_property_encoding(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -609,6 +662,9 @@ js_form_set_property_encoding(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -649,6 +705,8 @@ js_form_get_property_length(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -672,6 +730,8 @@ js_form_get_property_method(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -710,6 +770,9 @@ js_form_set_property_method(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -748,6 +811,8 @@ js_form_get_property_name(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -773,6 +838,9 @@ js_form_set_property_name(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -806,6 +874,8 @@ js_form_get_property_target(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -830,6 +900,9 @@ js_form_set_property_target(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct form *form; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -864,6 +937,8 @@ js_form_reset(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *arg #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct form *form; @@ -886,6 +961,8 @@ js_form_submit(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct session *ses; @@ -908,6 +985,8 @@ js_form_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[form object]"); } @@ -917,6 +996,8 @@ js_get_form_object(JSContext *ctx, JSValueConst jsdoc, struct form *form) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(jsdoc); + return getForm(ctx, form); } @@ -985,6 +1066,8 @@ static const JSCFunctionListEntry js_form_proto_funcs[] = { static void js_form_finalizer(JSRuntime *rt, JSValue val) { + REF_JS(val); + struct form *form = form_GetOpaque(val); form_SetOpaque(val, nullptr); diff --git a/src/ecmascript/quickjs/forms.cpp b/src/ecmascript/quickjs/forms.cpp index 90a1b6d89..5bc38590d 100644 --- a/src/ecmascript/quickjs/forms.cpp +++ b/src/ecmascript/quickjs/forms.cpp @@ -65,6 +65,8 @@ forms_GetOpaque(JSValueConst this_val) static void forms_SetOpaque(JSValueConst this_val, void *node) { + REF_JS(this_val); + if (!node) { map_rev_forms.erase(this_val); } else { @@ -102,6 +104,7 @@ js_forms_set_items(JSContext *ctx, JSValueConst this_val, void *node) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); struct view_state *vs; struct document_view *doc_view; @@ -133,6 +136,8 @@ js_forms_get_property_length(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -154,6 +159,8 @@ js_forms_item2(JSContext *ctx, JSValueConst this_val, int index) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct form_view *fv; int counter = -1; @@ -183,6 +190,8 @@ js_forms_item(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *arg #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -202,6 +211,8 @@ js_forms_namedItem(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -259,6 +270,8 @@ js_forms_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[forms object]"); } diff --git a/src/ecmascript/quickjs/history.cpp b/src/ecmascript/quickjs/history.cpp index d647a4de6..59dfdf895 100644 --- a/src/ecmascript/quickjs/history.cpp +++ b/src/ecmascript/quickjs/history.cpp @@ -54,6 +54,8 @@ js_history_back(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *a #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); struct document_view *doc_view = interpreter->vs->doc_view; @@ -75,6 +77,8 @@ js_history_forward(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); struct document_view *doc_view = interpreter->vs->doc_view; @@ -92,6 +96,8 @@ js_history_go(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *arg #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); struct document_view *doc_view = interpreter->vs->doc_view; @@ -127,6 +133,8 @@ js_history_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[history object]"); } @@ -144,11 +152,14 @@ static JSClassDef js_history_class = { static JSValue js_history_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -176,11 +187,16 @@ js_history_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_history_class_id, &js_history_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); history_proto = JS_NewObject(ctx); + REF_JS(history_proto); + JS_SetPropertyFunctionList(ctx, history_proto, js_history_funcs, countof(js_history_funcs)); history_class = JS_NewCFunction2(ctx, js_history_ctor, "history", 0, JS_CFUNC_constructor, 0); + REF_JS(history_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, history_class, history_proto); JS_SetClassProto(ctx, js_history_class_id, history_proto); diff --git a/src/ecmascript/quickjs/implementation.cpp b/src/ecmascript/quickjs/implementation.cpp index 093c483f9..7aab92cdb 100644 --- a/src/ecmascript/quickjs/implementation.cpp +++ b/src/ecmascript/quickjs/implementation.cpp @@ -29,6 +29,8 @@ js_implementation_createHTMLDocument(JSContext *ctx, JSValueConst this_val, int #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); @@ -69,6 +71,8 @@ js_implementation_toString(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[implementation object]"); } @@ -84,11 +88,14 @@ static JSClassDef js_implementation_class = { static JSValue js_implementation_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -109,6 +116,8 @@ fail: int js_implementation_init(JSContext *ctx, JSValue global_obj) { + REF_JS(global_obj); + JSValue implementation_proto, implementation_class; /* create the implementation class */ @@ -116,9 +125,13 @@ js_implementation_init(JSContext *ctx, JSValue global_obj) JS_NewClass(JS_GetRuntime(ctx), js_implementation_class_id, &js_implementation_class); implementation_proto = JS_NewObject(ctx); + REF_JS(implementation_proto); + JS_SetPropertyFunctionList(ctx, implementation_proto, js_implementation_proto_funcs, countof(js_implementation_proto_funcs)); implementation_class = JS_NewCFunction2(ctx, js_implementation_ctor, "implementation", 0, JS_CFUNC_constructor, 0); + REF_JS(implementation_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, implementation_class, implementation_proto); JS_SetClassProto(ctx, js_implementation_class_id, implementation_proto); diff --git a/src/ecmascript/quickjs/input.cpp b/src/ecmascript/quickjs/input.cpp index 8d257cb79..19ac96927 100644 --- a/src/ecmascript/quickjs/input.cpp +++ b/src/ecmascript/quickjs/input.cpp @@ -92,6 +92,8 @@ unicode_to_value(JSContext *ctx, unicode_val_T u) fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif JSValue str = JS_NewStringLen(ctx, " ", 8); + REF_JS(str); + JSString *p = JS_VALUE_GET_STRING(str); p->is_wide_char = 1; @@ -125,6 +127,8 @@ js_value_to_accesskey(JSValueConst val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(val); + JSString *p = JS_VALUE_GET_STRING(val); size_t len; @@ -156,6 +160,8 @@ js_input_get_property_accessKey(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -210,6 +216,8 @@ js_input_set_property_accessKey(JSContext *ctx, JSValueConst this_val, JSValue v #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -266,6 +274,8 @@ js_input_get_property_alt(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -304,6 +314,8 @@ js_input_set_property_alt(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -352,6 +364,8 @@ js_input_get_property_checked(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct form_state *fs; fs = js_input_get_form_state(ctx, this_val); if (!fs) { @@ -370,6 +384,8 @@ js_input_set_property_checked(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -413,6 +429,8 @@ js_input_get_property_defaultChecked(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -450,6 +468,8 @@ js_input_get_property_defaultValue(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -487,6 +507,8 @@ js_input_get_property_disabled(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -526,6 +548,9 @@ js_input_set_property_disabled(JSContext *ctx, JSValueConst this_val, JSValue va #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -569,6 +594,8 @@ js_input_get_property_form(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + #if 0 JS::CallArgs args = CallArgsFromVp(argc, vp); JS::RootedObject hobj(ctx, &args.thisv().toObject()); @@ -594,6 +621,8 @@ js_input_get_property_maxLength(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -632,6 +661,9 @@ js_input_set_property_maxLength(JSContext *ctx, JSValueConst this_val, JSValue v #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -672,6 +704,8 @@ js_input_get_property_name(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -712,6 +746,9 @@ js_input_set_property_name(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -760,6 +797,8 @@ js_input_get_property_readonly(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -800,6 +839,9 @@ js_input_set_property_readonly(JSContext *ctx, JSValueConst this_val, JSValue va #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -843,6 +885,8 @@ js_input_get_property_selectedIndex(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -886,6 +930,9 @@ js_input_set_property_selectedIndex(JSContext *ctx, JSValueConst this_val, JSVal #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -935,6 +982,8 @@ js_input_get_property_size(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -973,6 +1022,8 @@ js_input_get_property_src(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1021,6 +1072,9 @@ js_input_set_property_src(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1078,6 +1132,8 @@ js_input_get_property_tabIndex(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1127,6 +1183,8 @@ js_input_get_property_type(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1182,6 +1240,8 @@ js_input_get_property_value(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct form_state *fs; fs = js_input_get_form_state(ctx, this_val); @@ -1202,6 +1262,9 @@ js_input_set_property_value(JSContext *ctx, JSValueConst this_val, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1260,6 +1323,8 @@ js_input_get_form_state(JSContext *ctx, JSValueConst jsinput) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(jsinput); + struct form_state *fs = (struct form_state *)JS_GetOpaque(jsinput, js_input_class_id); return fs; @@ -1272,6 +1337,8 @@ js_input_blur(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *arg #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + /* We are a text-mode browser and there *always* has to be something * selected. So we do nothing for now. (That was easy.) */ return JS_UNDEFINED; @@ -1284,6 +1351,8 @@ js_input_click(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1333,6 +1402,8 @@ js_input_focus(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct document *document; @@ -1376,6 +1447,8 @@ js_input_select(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *a #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + /* We support no text selecting yet. So we do nothing for now. * (That was easy, too.) */ return JS_UNDEFINED; @@ -1396,6 +1469,8 @@ js_input_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[input object]"); } @@ -1446,6 +1521,7 @@ quickjs_moved_form_state(struct form_state *fs) fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif JSValue jsinput = fs->ecmascript_obj; + REF_JS(jsinput); if (!JS_IsNull(jsinput)) { map_inputs.erase(fs); @@ -1473,11 +1549,14 @@ static JSClassDef js_input_class = { static JSValue js_input_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -1498,6 +1577,8 @@ fail: int js_input_init(JSContext *ctx, JSValue global_obj) { + REF_JS(global_obj); + JSValue input_proto, input_class; /* create the input class */ @@ -1505,9 +1586,13 @@ js_input_init(JSContext *ctx, JSValue global_obj) JS_NewClass(JS_GetRuntime(ctx), js_input_class_id, &js_input_class); input_proto = JS_NewObject(ctx); + REF_JS(input_proto); + JS_SetPropertyFunctionList(ctx, input_proto, js_input_proto_funcs, countof(js_input_proto_funcs)); input_class = JS_NewCFunction2(ctx, js_input_ctor, "input", 0, JS_CFUNC_constructor, 0); + REF_JS(input_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, input_class, input_proto); JS_SetClassProto(ctx, js_input_class_id, input_proto); diff --git a/src/ecmascript/quickjs/keyboard.cpp b/src/ecmascript/quickjs/keyboard.cpp index dbf858202..b4cf07ff5 100644 --- a/src/ecmascript/quickjs/keyboard.cpp +++ b/src/ecmascript/quickjs/keyboard.cpp @@ -70,6 +70,8 @@ struct keyboard { static void js_keyboardEvent_finalizer(JSRuntime *rt, JSValue val) { + REF_JS(val); + struct keyboard *keyb = JS_GetOpaque(val, js_keyboardEvent_class_id); if (keyb) { @@ -85,6 +87,8 @@ static JSClassDef js_keyboardEvent_class = { static JSValue js_keyboardEvent_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; @@ -97,6 +101,7 @@ js_keyboardEvent_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValue /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -129,6 +134,8 @@ js_keyboardEvent_get_property_key(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct keyboard *keyb = static_cast<struct keyboard *>(JS_GetOpaque(this_val, js_keyboardEvent_class_id)); if (!keyb) { @@ -148,6 +155,8 @@ js_keyboardEvent_get_property_keyCode(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct keyboard *keyb = static_cast<struct keyboard *>(JS_GetOpaque(this_val, js_keyboardEvent_class_id)); if (!keyb) { diff --git a/src/ecmascript/quickjs/localstorage.cpp b/src/ecmascript/quickjs/localstorage.cpp index 9428263a9..fc2be3184 100644 --- a/src/ecmascript/quickjs/localstorage.cpp +++ b/src/ecmascript/quickjs/localstorage.cpp @@ -57,7 +57,6 @@ static JSClassID js_localstorage_class_id; static char * readFromStorage(const char *key) { - char *val; if (local_storage_ready==0) @@ -111,6 +110,8 @@ js_localstorage_getitem(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; @@ -143,6 +144,8 @@ js_localstorage_removeitem(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; @@ -170,6 +173,7 @@ js_localstorage_setitem(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); @@ -210,6 +214,8 @@ js_localstorage_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValu #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[localstorage object]"); } @@ -240,8 +246,11 @@ js_localstorage_init(JSContext *ctx) } JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); JSValue localstorage_obj = JS_NewObjectClass(ctx, js_localstorage_class_id); + REF_JS(localstorage_obj); + JS_SetPropertyFunctionList(ctx, localstorage_obj, js_localstorage_proto_funcs, countof(js_localstorage_proto_funcs)); JS_SetClassProto(ctx, js_localstorage_class_id, localstorage_obj); diff --git a/src/ecmascript/quickjs/location.cpp b/src/ecmascript/quickjs/location.cpp index 199ebcb3f..decaf1aac 100644 --- a/src/ecmascript/quickjs/location.cpp +++ b/src/ecmascript/quickjs/location.cpp @@ -53,6 +53,8 @@ js_location_get_property_hash(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -84,6 +86,8 @@ js_location_get_property_host(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -115,6 +119,8 @@ js_location_get_property_hostname(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -146,6 +152,8 @@ js_location_get_property_href(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -177,6 +185,8 @@ js_location_get_property_origin(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -208,6 +218,8 @@ js_location_get_property_pathname(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -240,6 +252,8 @@ js_location_get_property_port(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -270,6 +284,8 @@ js_location_get_property_protocol(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -305,6 +321,8 @@ js_location_get_property_search(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -338,6 +356,8 @@ js_location_set_property_hash(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -367,6 +387,9 @@ js_location_set_property_host(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -395,6 +418,9 @@ js_location_set_property_hostname(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -423,6 +449,9 @@ js_location_set_property_href(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -451,6 +480,9 @@ js_location_set_property_pathname(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -479,6 +511,9 @@ js_location_set_property_port(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -507,6 +542,9 @@ js_location_set_property_protocol(JSContext *ctx, JSValueConst this_val, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -535,6 +573,9 @@ js_location_set_property_search(JSContext *ctx, JSValueConst this_val, JSValue v #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -563,6 +604,8 @@ js_location_reload(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -584,6 +627,8 @@ js_location_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return js_location_get_property_href(ctx, this_val); } @@ -609,11 +654,14 @@ static JSClassDef js_location_class = { static JSValue js_location_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -641,11 +689,16 @@ js_location_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_location_class_id, &js_location_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); location_proto = JS_NewObject(ctx); + REF_JS(location_proto); + JS_SetPropertyFunctionList(ctx, location_proto, js_location_proto_funcs, countof(js_location_proto_funcs)); location_class = JS_NewCFunction2(ctx, js_location_ctor, "location", 0, JS_CFUNC_constructor, 0); + REF_JS(location_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, location_class, location_proto); JS_SetClassProto(ctx, js_location_class_id, location_proto); diff --git a/src/ecmascript/quickjs/message.cpp b/src/ecmascript/quickjs/message.cpp index a52233c40..d140cb8d0 100644 --- a/src/ecmascript/quickjs/message.cpp +++ b/src/ecmascript/quickjs/message.cpp @@ -76,6 +76,8 @@ void js_messageEvent_finalizer(JSRuntime *rt, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(val); + struct message_event *event = (struct message_event *)JS_GetOpaque(val, js_messageEvent_class_id); if (event) { @@ -98,6 +100,8 @@ js_messageEvent_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; @@ -110,6 +114,7 @@ js_messageEvent_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueC /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -143,6 +148,8 @@ js_messageEvent_get_property_data(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct message_event *event = static_cast<struct message_event *>(JS_GetOpaque(this_val, js_messageEvent_class_id)); if (!event || !event->data) { @@ -159,6 +166,8 @@ js_messageEvent_get_property_lastEventId(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct message_event *event = static_cast<struct message_event *>(JS_GetOpaque(this_val, js_messageEvent_class_id)); if (!event || !event->lastEventId) { @@ -175,6 +184,8 @@ js_messageEvent_get_property_origin(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct message_event *event = static_cast<struct message_event *>(JS_GetOpaque(this_val, js_messageEvent_class_id)); if (!event || !event->origin) { @@ -191,6 +202,8 @@ js_messageEvent_get_property_source(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct message_event *event = static_cast<struct message_event *>(JS_GetOpaque(this_val, js_messageEvent_class_id)); if (!event || !event->source) { diff --git a/src/ecmascript/quickjs/navigator.cpp b/src/ecmascript/quickjs/navigator.cpp index 15213af5d..03f0c1ad6 100644 --- a/src/ecmascript/quickjs/navigator.cpp +++ b/src/ecmascript/quickjs/navigator.cpp @@ -54,6 +54,8 @@ js_navigator_get_property_appCodeName(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + JSValue r = JS_NewString(ctx, "Mozilla"); /* More like a constant nowadays. */ RETURN_JS(r); } @@ -64,6 +66,8 @@ js_navigator_get_property_appName(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + JSValue r = JS_NewString(ctx, "ELinks (roughly compatible with Netscape Navigator, Mozilla and Microsoft Internet Explorer)"); RETURN_JS(r); } @@ -74,6 +78,8 @@ js_navigator_get_property_appVersion(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + JSValue r = JS_NewString(ctx, VERSION); RETURN_JS(r); } @@ -84,6 +90,8 @@ js_navigator_get_property_language(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + #ifdef CONFIG_NLS if (get_opt_bool("protocol.http.accept_ui_language", NULL)) { JSValue r = JS_NewString(ctx, language_to_iso639(current_language)); @@ -99,6 +107,8 @@ js_navigator_get_property_platform(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + JSValue r = JS_NewString(ctx, system_name); RETURN_JS(r); } @@ -109,9 +119,9 @@ js_navigator_get_property_userAgent(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif - char *optstr; + REF_JS(this_val); - optstr = get_opt_str("protocol.http.user_agent", NULL); + char *optstr = get_opt_str("protocol.http.user_agent", NULL); if (*optstr && strcmp(optstr, " ")) { char *ustr, ts[64] = ""; @@ -147,6 +157,8 @@ js_navigator_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[navigator object]"); } @@ -167,11 +179,14 @@ static JSClassDef js_navigator_class = { static JSValue js_navigator_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -199,11 +214,16 @@ js_navigator_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_navigator_class_id, &js_navigator_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); navigator_proto = JS_NewObject(ctx); + REF_JS(navigator_proto); + JS_SetPropertyFunctionList(ctx, navigator_proto, js_navigator_proto_funcs, countof(js_navigator_proto_funcs)); navigator_class = JS_NewCFunction2(ctx, js_navigator_ctor, "navigator", 0, JS_CFUNC_constructor, 0); + REF_JS(navigator_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, navigator_class, navigator_proto); JS_SetClassProto(ctx, js_navigator_class_id, navigator_proto); diff --git a/src/ecmascript/quickjs/nodelist.cpp b/src/ecmascript/quickjs/nodelist.cpp index 60befe492..65f611b2f 100644 --- a/src/ecmascript/quickjs/nodelist.cpp +++ b/src/ecmascript/quickjs/nodelist.cpp @@ -62,12 +62,16 @@ static std::map<JSValueConst, void *> map_rev_nodelist; static void * js_nodeList_GetOpaque(JSValueConst this_val) { + REF_JS(this_val); + return map_rev_nodelist[this_val]; } static void js_nodeList_SetOpaque(JSValueConst this_val, void *node) { + REF_JS(this_val); + if (!node) { map_rev_nodelist.erase(this_val); } else { @@ -98,6 +102,8 @@ js_nodeList_item2(JSContext *ctx, JSValueConst this_val, int idx) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + xmlpp::Node::NodeList *nl = static_cast<xmlpp::Node::NodeList *>(js_nodeList_GetOpaque(this_val)); if (!nl) { @@ -128,6 +134,8 @@ js_nodeList_item(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + if (argc != 1) { return JS_UNDEFINED; } @@ -144,6 +152,7 @@ js_nodeList_set_items(JSContext *ctx, JSValue this_val, void *node) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); xmlpp::Node::NodeList *nl = static_cast<xmlpp::Node::NodeList *>(node); @@ -170,6 +179,8 @@ js_nodeList_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[nodeList object]"); } @@ -183,6 +194,8 @@ static const JSCFunctionListEntry js_nodeList_proto_funcs[] = { static void js_nodeList_finalizer(JSRuntime *rt, JSValue val) { + REF_JS(val); + void *node = js_nodeList_GetOpaque(val); js_nodeList_SetOpaque(val, nullptr); diff --git a/src/ecmascript/quickjs/screen.cpp b/src/ecmascript/quickjs/screen.cpp index 7f4c07f2f..9107f6b01 100644 --- a/src/ecmascript/quickjs/screen.cpp +++ b/src/ecmascript/quickjs/screen.cpp @@ -53,6 +53,8 @@ js_screen_get_property_availHeight(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; struct document_view *doc_view = vs->doc_view; @@ -70,6 +72,8 @@ js_screen_get_property_availWidth(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; struct document_view *doc_view = vs->doc_view; @@ -87,6 +91,8 @@ js_screen_get_property_height(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; struct document_view *doc_view = vs->doc_view; @@ -113,6 +119,8 @@ js_screen_get_property_width(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; struct document_view *doc_view = vs->doc_view; @@ -139,6 +147,8 @@ js_screen_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[screen object]"); } @@ -157,11 +167,14 @@ static JSClassDef js_screen_class = { static JSValue js_screen_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -190,11 +203,16 @@ js_screen_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_screen_class_id, &js_screen_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); screen_proto = JS_NewObject(ctx); + REF_JS(screen_proto); + JS_SetPropertyFunctionList(ctx, screen_proto, js_screen_proto_funcs, countof(js_screen_proto_funcs)); screen_class = JS_NewCFunction2(ctx, js_screen_ctor, "screen", 2, JS_CFUNC_constructor, 0); + REF_JS(screen_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, screen_class, screen_proto); JS_SetClassProto(ctx, js_screen_class_id, screen_proto); diff --git a/src/ecmascript/quickjs/unibar.cpp b/src/ecmascript/quickjs/unibar.cpp index f6570f631..41564fd3e 100644 --- a/src/ecmascript/quickjs/unibar.cpp +++ b/src/ecmascript/quickjs/unibar.cpp @@ -54,6 +54,8 @@ js_unibar_get_property_visible(JSContext *ctx, JSValueConst this_val, int magic) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; struct document_view *doc_view = vs->doc_view; @@ -85,6 +87,9 @@ js_unibar_set_property_visible(JSContext *ctx, JSValueConst this_val, JSValue va #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; struct document_view *doc_view = vs->doc_view; @@ -116,6 +121,8 @@ js_menubar_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[menubar object]"); } @@ -125,6 +132,8 @@ js_statusbar_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[statusbar object]"); } @@ -149,11 +158,14 @@ static JSClassDef js_statusbar_class = { static JSValue js_menubar_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -174,11 +186,14 @@ fail: static JSValue js_statusbar_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) { + REF_JS(new_target); + JSValue obj = JS_UNDEFINED; JSValue proto; /* using new_target to get the prototype is necessary when the class is extended. */ proto = JS_GetPropertyStr(ctx, new_target, "prototype"); + REF_JS(proto); if (JS_IsException(proto)) { goto fail; @@ -207,10 +222,15 @@ js_unibar_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_menubar_class_id, &js_menubar_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); menubar_proto = JS_NewObject(ctx); + REF_JS(menubar_proto); + JS_SetPropertyFunctionList(ctx, menubar_proto, js_menubar_proto_funcs, countof(js_menubar_proto_funcs)); menubar_class = JS_NewCFunction2(ctx, js_menubar_ctor, "menubar", 2, JS_CFUNC_constructor, 0); + REF_JS(menubar_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, menubar_class, menubar_proto); JS_SetClassProto(ctx, js_menubar_class_id, menubar_proto); @@ -221,8 +241,12 @@ js_unibar_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_statusbar_class_id, &js_statusbar_class); statusbar_proto = JS_NewObject(ctx); + REF_JS(statusbar_proto); + JS_SetPropertyFunctionList(ctx, statusbar_proto, js_statusbar_proto_funcs, countof(js_statusbar_proto_funcs)); statusbar_class = JS_NewCFunction2(ctx, js_statusbar_ctor, "statusbar", 2, JS_CFUNC_constructor, 0); + REF_JS(statusbar_class); + /* set proto.constructor and ctor.prototype */ JS_SetConstructor(ctx, statusbar_class, statusbar_proto); JS_SetClassProto(ctx, js_statusbar_class_id, statusbar_proto); diff --git a/src/ecmascript/quickjs/window.cpp b/src/ecmascript/quickjs/window.cpp index 5c72fbf37..cbf45f8d5 100644 --- a/src/ecmascript/quickjs/window.cpp +++ b/src/ecmascript/quickjs/window.cpp @@ -74,6 +74,8 @@ js_window_finalize(JSRuntime *rt, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(val); + struct el_window *elwin = (struct el_window *)JS_GetOpaque(val, js_window_class_id); if (elwin) { @@ -94,6 +96,8 @@ js_window_open(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *ar #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct view_state *vs; struct document_view *doc_view; struct session *ses; @@ -223,6 +227,8 @@ js_window_setTimeout(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); int64_t timeout = 0; JSValueConst func; @@ -273,6 +279,8 @@ js_window_clearTimeout(JSContext *ctx, JSValueConst this_val, int argc, JSValueC #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); if (argc != 1) { @@ -304,6 +312,8 @@ js_window_get_property_closed(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_FALSE; } @@ -313,6 +323,8 @@ js_window_get_property_parent(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + /* XXX: It would be nice if the following worked, yes. * The problem is that we get called at the point where * document.frame properties are going to be mostly NULL. @@ -333,7 +345,10 @@ js_window_get_property_self(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + JSValue r = JS_DupValue(ctx, this_val); + RETURN_JS(r); } @@ -343,6 +358,8 @@ js_window_get_property_status(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_UNDEFINED; } @@ -352,6 +369,9 @@ js_window_set_property_status(JSContext *ctx, JSValueConst this_val, JSValue val #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct view_state *vs = interpreter->vs; @@ -379,6 +399,8 @@ js_window_get_property_top(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct document_view *doc_view; struct document_view *top_view; JSValue newjsframe; @@ -424,6 +446,8 @@ js_window_alert(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *a #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); assert(interpreter); @@ -458,6 +482,8 @@ js_window_toString(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_NewString(ctx, "[window object]"); } @@ -467,6 +493,8 @@ js_window_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSVa #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct el_window *elwin = (struct el_window *)(JS_GetOpaque(this_val, js_window_class_id)); @@ -527,6 +555,8 @@ js_window_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, J #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct el_window *elwin = (struct el_window *)(JS_GetOpaque(this_val, js_window_class_id)); @@ -618,6 +648,8 @@ js_window_postMessage(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx); struct el_window *elwin = (struct el_window *)(JS_GetOpaque(this_val, js_window_class_id)); @@ -693,6 +725,8 @@ js_window_init(JSContext *ctx) JS_NewClass(JS_GetRuntime(ctx), js_window_class_id, &js_window_class); JSValue global_obj = JS_GetGlobalObject(ctx); + REF_JS(global_obj); + JS_SetPropertyFunctionList(ctx, global_obj, js_window_proto_funcs, countof(js_window_proto_funcs)); JS_SetPropertyStr(ctx, global_obj, "window", global_obj); diff --git a/src/ecmascript/quickjs/xhr.cpp b/src/ecmascript/quickjs/xhr.cpp index d25e79e35..8d74838b5 100644 --- a/src/ecmascript/quickjs/xhr.cpp +++ b/src/ecmascript/quickjs/xhr.cpp @@ -404,6 +404,8 @@ xhr_finalizer(JSRuntime *rt, JSValue val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(val); + Xhr *x = (Xhr *)JS_GetOpaque(val, xhr_class_id); if (x) { @@ -439,6 +441,8 @@ xhr_mark(JSRuntime *rt, JSValueConst val, JS_MarkFunc *mark_func) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(val); + Xhr *x = (Xhr *)JS_GetOpaque(val, xhr_class_id); if (x) { @@ -460,6 +464,8 @@ static JSClassDef xhr_class = { static Xhr * xhr_get(JSContext *ctx, JSValueConst obj) { + REF_JS(obj); + return (Xhr *)JS_GetOpaque2(ctx, obj, xhr_class_id); } @@ -595,7 +601,10 @@ xhr_constructor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(new_target); + JSValue obj = JS_NewObjectClass(ctx, xhr_class_id); + REF_JS(obj); if (JS_IsException(obj)) { return obj; @@ -636,6 +645,8 @@ xhr_event_get(JSContext *ctx, JSValueConst this_val, int magic) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -651,6 +662,9 @@ xhr_event_set(JSContext *ctx, JSValueConst this_val, JSValueConst value, int mag #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(value); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -670,6 +684,8 @@ xhr_readystate_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -685,6 +701,8 @@ xhr_response_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -724,6 +742,8 @@ xhr_responsetext_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -746,6 +766,8 @@ xhr_responsetype_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -772,6 +794,9 @@ xhr_responsetype_set(JSContext *ctx, JSValueConst this_val, JSValueConst value) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(value); + static const char array_buffer[] = "arraybuffer"; static const char json[] = "json"; static const char text[] = "text"; @@ -810,6 +835,8 @@ xhr_responseurl_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -825,6 +852,8 @@ xhr_status_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -840,6 +869,8 @@ xhr_statustext_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -855,6 +886,8 @@ xhr_timeout_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -870,6 +903,9 @@ xhr_timeout_set(JSContext *ctx, JSValueConst this_val, JSValueConst value) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(value); + Xhr *x = xhr_get(ctx, this_val); if (!x || !x->async) { @@ -895,6 +931,8 @@ xhr_upload_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + // TODO. return JS_UNDEFINED; } @@ -905,6 +943,7 @@ xhr_withcredentials_get(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); // TODO. return JS_UNDEFINED; } @@ -915,6 +954,8 @@ xhr_withcredentials_set(JSContext *ctx, JSValueConst this_val, JSValueConst valu #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + REF_JS(value); // TODO. return JS_UNDEFINED; } @@ -925,6 +966,8 @@ xhr_abort(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -947,6 +990,8 @@ xhr_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -997,6 +1042,8 @@ xhr_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSValue #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -1046,6 +1093,8 @@ xhr_getallresponseheaders(JSContext *ctx, JSValueConst this_val, int argc, JSVal #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -1065,6 +1114,8 @@ xhr_getresponseheader(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -1094,6 +1145,8 @@ xhr_open(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + static const char head_method[] = "HEAD"; Xhr *x = xhr_get(ctx, this_val); @@ -1247,6 +1300,8 @@ xhr_overridemimetype(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + return JS_ThrowTypeError(ctx, "unsupported"); } @@ -1256,6 +1311,8 @@ xhr_send(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -1325,6 +1382,8 @@ xhr_setrequestheader(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif + REF_JS(this_val); + Xhr *x = xhr_get(ctx, this_val); if (!x) { @@ -1429,6 +1488,9 @@ static const JSCFunctionListEntry xhr_proto_funcs[] = { static void JS_NewGlobalCConstructor2(JSContext *ctx, JSValue func_obj, const char *name, JSValueConst proto) { + REF_JS(func_obj); + REF_JS(proto); + JS_DefinePropertyValueStr(ctx, JS_GetGlobalObject(ctx), name, JS_DupValue(ctx, func_obj), JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); JS_SetConstructor(ctx, func_obj, proto); @@ -1440,6 +1502,9 @@ JS_NewGlobalCConstructor(JSContext *ctx, const char *name, JSCFunction *func, in { JSValue func_obj; func_obj = JS_NewCFunction2(ctx, func, name, length, JS_CFUNC_constructor_or_func, 0); + REF_JS(func_obj); + REF_JS(proto); + JS_NewGlobalCConstructor2(ctx, func_obj, name, proto); return func_obj; @@ -1457,11 +1522,15 @@ js_xhr_init(JSContext *ctx) JS_NewClassID(&xhr_class_id); JS_NewClass(JS_GetRuntime(ctx), xhr_class_id, &xhr_class); proto = JS_NewObject(ctx); + REF_JS(proto); + JS_SetPropertyFunctionList(ctx, proto, xhr_proto_funcs, countof(xhr_proto_funcs)); JS_SetClassProto(ctx, xhr_class_id, proto); /* XHR object */ obj = JS_NewGlobalCConstructor(ctx, "XMLHttpRequest", xhr_constructor, 1, proto); + REF_JS(obj); + JS_SetPropertyFunctionList(ctx, obj, xhr_class_funcs, countof(xhr_class_funcs)); return 0;