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;