static JSValue js_sys_crc32(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
{
	const u8 *data;
	size_t data_size;

	if (!argc) return GF_JS_EXCEPTION(ctx);
	if (JS_IsString(argv[0])) {
		u32 crc=0;
		const char *str = JS_ToCString(ctx, argv[0]);
		if (str) {
			crc = gf_crc_32(str, (u32) strlen(str) );
			JS_FreeCString(ctx, str);
		}
		return JS_NewInt32(ctx, crc );
	} else {
		data = JS_GetArrayBuffer(ctx, &data_size, argv[0] );
		if (!data) return GF_JS_EXCEPTION(ctx);
		return JS_NewInt32(ctx, gf_crc_32(data, (u32) data_size) );
	}
	return GF_JS_EXCEPTION(ctx);
}
static JSValue js_sys_crc32(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
{
	const u8 *data;
	size_t data_size;

	if (!argc) return GF_JS_EXCEPTION(ctx);
	if (JS_IsString(argv[0])) {
		u32 crc=0;
		const char *str = JS_ToCString(ctx, argv[0]);
		if (str) {
			crc = gf_crc_32(str, (u32) strlen(str) );
			JS_FreeCString(ctx, str);
		}
		return JS_NewInt32(ctx, crc );
	} else {
		data = JS_GetArrayBuffer(ctx, &data_size, argv[0] );
		if (!data) return GF_JS_EXCEPTION(ctx);
		return JS_NewInt32(ctx, gf_crc_32(data, (u32) data_size) );
	}
	return GF_JS_EXCEPTION(ctx);
}