WIP: Vulkan: Workbench #107886
|
@ -161,8 +161,8 @@ void add_keyframe(FCurve *fcu, float x, float y)
|
||||||
|
|
||||||
TEST(action_assets, BKE_action_has_single_frame)
|
TEST(action_assets, BKE_action_has_single_frame)
|
||||||
{
|
{
|
||||||
/* NULL action. */
|
/* Null action. */
|
||||||
EXPECT_FALSE(BKE_action_has_single_frame(nullptr)) << "NULL Action cannot have a single frame.";
|
EXPECT_FALSE(BKE_action_has_single_frame(nullptr)) << "Null Action cannot have a single frame.";
|
||||||
|
|
||||||
/* No FCurves. */
|
/* No FCurves. */
|
||||||
{
|
{
|
||||||
|
|
|
@ -4507,7 +4507,7 @@ static bool CustomData_layer_ensure_data_exists(CustomDataLayer *layer, size_t c
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Log an error so we can collect instances of bad files. */
|
/* Log an error so we can collect instances of bad files. */
|
||||||
CLOG_WARN(&LOG, "CustomDataLayer->data is NULL for type %d.", layer->type);
|
CLOG_WARN(&LOG, "CustomDataLayer->data is null for type %d.", layer->type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -750,7 +750,7 @@ void BKE_grease_pencil_data_update(struct Depsgraph * /*depsgraph*/,
|
||||||
int BKE_grease_pencil_object_material_index_get_by_name(Object *ob, const char *name)
|
int BKE_grease_pencil_object_material_index_get_by_name(Object *ob, const char *name)
|
||||||
{
|
{
|
||||||
short *totcol = BKE_object_material_len_p(ob);
|
short *totcol = BKE_object_material_len_p(ob);
|
||||||
Material *read_ma = NULL;
|
Material *read_ma = nullptr;
|
||||||
for (short i = 0; i < *totcol; i++) {
|
for (short i = 0; i < *totcol; i++) {
|
||||||
read_ma = BKE_object_material_get(ob, i + 1);
|
read_ma = BKE_object_material_get(ob, i + 1);
|
||||||
if (STREQ(name, read_ma->id.name + 2)) {
|
if (STREQ(name, read_ma->id.name + 2)) {
|
||||||
|
|
|
@ -1289,7 +1289,7 @@ static void lib_override_library_create_post_process(Main *bmain,
|
||||||
/* No instantiation in case the root override is linked data, unless it is part of the given
|
/* No instantiation in case the root override is linked data, unless it is part of the given
|
||||||
* owner library.
|
* owner library.
|
||||||
*
|
*
|
||||||
* NOTE: that last case should never happen actually in current code? Since non-NULL owner
|
* NOTE: that last case should never happen actually in current code? Since non-null owner
|
||||||
* library should only happen in case of recursive resync, which is already excluded by the
|
* library should only happen in case of recursive resync, which is already excluded by the
|
||||||
* previous condition. */
|
* previous condition. */
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ using namespace blender;
|
||||||
*/
|
*/
|
||||||
static bool id_name_final_build(char *name, char *base_name, size_t base_name_len, int number)
|
static bool id_name_final_build(char *name, char *base_name, size_t base_name_len, int number)
|
||||||
{
|
{
|
||||||
char number_str[11]; /* Dot + nine digits + NULL terminator. */
|
char number_str[11]; /* Dot + nine digits + null terminator. */
|
||||||
size_t number_str_len = SNPRINTF_RLEN(number_str, ".%.3d", number);
|
size_t number_str_len = SNPRINTF_RLEN(number_str, ".%.3d", number);
|
||||||
|
|
||||||
/* If the number would lead to an overflow of the maximum ID name length, we need to truncate
|
/* If the number would lead to an overflow of the maximum ID name length, we need to truncate
|
||||||
|
|
|
@ -1667,7 +1667,8 @@ static void sculpt_update_object(
|
||||||
|
|
||||||
BLI_assert(me_eval != nullptr);
|
BLI_assert(me_eval != nullptr);
|
||||||
|
|
||||||
/* This is for handling a newly opened file with no object visible, causing me_eval==NULL. */
|
/* This is for handling a newly opened file with no object visible,
|
||||||
|
* causing `me_eval == nullptr`. */
|
||||||
if (me_eval == nullptr) {
|
if (me_eval == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -900,7 +900,7 @@ bool BKE_volume_load(const Volume *volume, const Main *bmain)
|
||||||
CLOG_INFO(&LOG, 1, "Volume %s: %s", volume_name, grids.error_msg.c_str());
|
CLOG_INFO(&LOG, 1, "Volume %s: %s", volume_name, grids.error_msg.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add grids read from file to own vector, filtering out any NULL pointers. */
|
/* Add grids read from file to own vector, filtering out any null pointers. */
|
||||||
for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) {
|
for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) {
|
||||||
if (vdb_grid) {
|
if (vdb_grid) {
|
||||||
VolumeFileCache::Entry template_entry(filepath, vdb_grid);
|
VolumeFileCache::Entry template_entry(filepath, vdb_grid);
|
||||||
|
|
|
@ -392,7 +392,7 @@ template<typename T> std::ostream &operator<<(std::ostream &os, const SymEdge<T>
|
||||||
<< vertname(se.next->vert);
|
<< vertname(se.next->vert);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
os << vertname(se.vert) << "(" << se.vert->co << "->NULL)";
|
os << vertname(se.vert) << "(" << se.vert->co << "->null)";
|
||||||
}
|
}
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
@ -406,10 +406,10 @@ template<typename T> std::ostream &operator<<(std::ostream &os, const SymEdge<T>
|
||||||
template<typename T> std::string short_se_dump(const SymEdge<T> *se)
|
template<typename T> std::string short_se_dump(const SymEdge<T> *se)
|
||||||
{
|
{
|
||||||
if (se == nullptr) {
|
if (se == nullptr) {
|
||||||
return std::string("NULL");
|
return std::string("null");
|
||||||
}
|
}
|
||||||
return vertname(se->vert) +
|
return vertname(se->vert) +
|
||||||
(se->next == nullptr ? std::string("[NULL]") : vertname(se->next->vert));
|
(se->next == nullptr ? std::string("[null]") : vertname(se->next->vert));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> std::ostream &operator<<(std::ostream &os, const CDT_state<T> &cdt_state)
|
template<typename T> std::ostream &operator<<(std::ostream &os, const CDT_state<T> &cdt_state)
|
||||||
|
@ -431,11 +431,11 @@ template<typename T> std::ostream &operator<<(std::ostream &os, const CDT_state<
|
||||||
os << " edges out:\n";
|
os << " edges out:\n";
|
||||||
do {
|
do {
|
||||||
if (se->next == nullptr) {
|
if (se->next == nullptr) {
|
||||||
os << " [NULL] next/rot symedge, se=" << trunc_ptr(se) << "\n";
|
os << " [null] next/rot symedge, se=" << trunc_ptr(se) << "\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (se->next->next == nullptr) {
|
if (se->next->next == nullptr) {
|
||||||
os << " [NULL] next-next/rot symedge, se=" << trunc_ptr(se) << "\n";
|
os << " [null] next-next/rot symedge, se=" << trunc_ptr(se) << "\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
const CDTVert<T> *vother = sym(se)->vert;
|
const CDTVert<T> *vother = sym(se)->vert;
|
||||||
|
@ -1155,7 +1155,7 @@ template<typename T> void CDTArrangement<T>::delete_edge(SymEdge<T> *se)
|
||||||
v2->symedge = f;
|
v2->symedge = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark SymEdge as deleted by setting all its pointers to NULL. */
|
/* Mark #SymEdge as deleted by setting all its pointers to null. */
|
||||||
se->next = se->rot = nullptr;
|
se->next = se->rot = nullptr;
|
||||||
sesym->next = sesym->rot = nullptr;
|
sesym->next = sesym->rot = nullptr;
|
||||||
if (!v1_isolated && !v2_isolated && aface != bface) {
|
if (!v1_isolated && !v2_isolated && aface != bface) {
|
||||||
|
@ -1565,16 +1565,16 @@ template<typename T> inline int tri_orient(const SymEdge<T> *t)
|
||||||
* In general, lambda=0 indicates case a and lambda != 0 indicates case be.
|
* In general, lambda=0 indicates case a and lambda != 0 indicates case be.
|
||||||
* The 'in' edge gives the destination attachment point of a diagonal from the previous crossing,
|
* The 'in' edge gives the destination attachment point of a diagonal from the previous crossing,
|
||||||
* and the 'out' edge gives the origin attachment point of a diagonal to the next crossing.
|
* and the 'out' edge gives the origin attachment point of a diagonal to the next crossing.
|
||||||
* But in some cases, 'in' and 'out' are undefined or not needed, and will be NULL.
|
* But in some cases, 'in' and 'out' are undefined or not needed, and will be null.
|
||||||
*
|
*
|
||||||
* For case (a), 'vert' will be the vertex, and lambda will be 0, and 'in' will be the #SymEdge
|
* For case (a), 'vert' will be the vertex, and lambda will be 0, and 'in' will be the #SymEdge
|
||||||
* from 'vert' that has as face the one that you go through to get to this vertex. If you go
|
* from 'vert' that has as face the one that you go through to get to this vertex. If you go
|
||||||
* exactly along an edge then we set 'in' to NULL, since it won't be needed. The first crossing
|
* exactly along an edge then we set 'in' to null, since it won't be needed. The first crossing
|
||||||
* will have 'in' = NULL. We set 'out' to the #SymEdge that has the face we go through to get to
|
* will have 'in' = null. We set 'out' to the #SymEdge that has the face we go through to get to
|
||||||
* the next crossing, or, if the next crossing is a case (a), then it is the edge that goes to that
|
* the next crossing, or, if the next crossing is a case (a), then it is the edge that goes to that
|
||||||
* next vertex. 'out' will be NULL for the last one.
|
* next vertex. 'out' will be null for the last one.
|
||||||
*
|
*
|
||||||
* For case (b), vert will be NULL at first, and later filled in with the created split vertex,
|
* For case (b), vert will be null at first, and later filled in with the created split vertex,
|
||||||
* and 'in' will be the #SymEdge that we go through, and lambda will be between 0 and 1,
|
* and 'in' will be the #SymEdge that we go through, and lambda will be between 0 and 1,
|
||||||
* the fraction from in's vert to in->next's vert to put the split vertex.
|
* the fraction from in's vert to in->next's vert to put the split vertex.
|
||||||
* 'out' is not needed in this case, since the attachment point will be the sym of the first
|
* 'out' is not needed in this case, since the attachment point will be the sym of the first
|
||||||
|
@ -1632,7 +1632,7 @@ bool get_next_crossing_from_vert(CDT_state<T> *cdt_state,
|
||||||
/**
|
/**
|
||||||
* As part of finding crossings, we found a case where the next crossing goes through vert v.
|
* As part of finding crossings, we found a case where the next crossing goes through vert v.
|
||||||
* If it came from a previous vert in cd, then cd_out is the edge that leads from that to v.
|
* If it came from a previous vert in cd, then cd_out is the edge that leads from that to v.
|
||||||
* Else cd_out can be NULL, because it won't be used.
|
* Else cd_out can be null, because it won't be used.
|
||||||
* Set *cd_next to indicate this. We can set 'in' but not 'out'. We can set the 'out' of the
|
* Set *cd_next to indicate this. We can set 'in' but not 'out'. We can set the 'out' of the
|
||||||
* current cd.
|
* current cd.
|
||||||
*/
|
*/
|
||||||
|
@ -1880,7 +1880,7 @@ void dump_crossings(const Vector<CrossData<T>, inline_crossings_size> &crossings
|
||||||
* and partial overlaps with existing cdt vertices and edges.
|
* and partial overlaps with existing cdt vertices and edges.
|
||||||
* Each created #CDTEdge will have input_id added to its input_ids list.
|
* Each created #CDTEdge will have input_id added to its input_ids list.
|
||||||
*
|
*
|
||||||
* If \a r_edges is not NULL, the #CDTEdges generated or found that go from
|
* If \a r_edges is not null, the #CDTEdges generated or found that go from
|
||||||
* v1 to v2 are put into that linked list, in order.
|
* v1 to v2 are put into that linked list, in order.
|
||||||
*
|
*
|
||||||
* Assumes that #blender_constrained_delaunay_get_output has not been called yet.
|
* Assumes that #blender_constrained_delaunay_get_output has not been called yet.
|
||||||
|
|
|
@ -171,7 +171,7 @@ TEST(listbase, FromLink)
|
||||||
Link *link2 = static_cast<Link *>(MEM_callocN(sizeof(Link), "link2"));
|
Link *link2 = static_cast<Link *>(MEM_callocN(sizeof(Link), "link2"));
|
||||||
Link *link3 = static_cast<Link *>(MEM_callocN(sizeof(Link), "link3"));
|
Link *link3 = static_cast<Link *>(MEM_callocN(sizeof(Link), "link3"));
|
||||||
|
|
||||||
/* NULL safety. */
|
/* Null safety. */
|
||||||
EXPECT_EQ(lb, BLI_listbase_from_link(nullptr));
|
EXPECT_EQ(lb, BLI_listbase_from_link(nullptr));
|
||||||
|
|
||||||
/* One link. */
|
/* One link. */
|
||||||
|
|
|
@ -237,7 +237,7 @@ TEST(string, StrPartition)
|
||||||
{
|
{
|
||||||
const char *str = "";
|
const char *str = "";
|
||||||
|
|
||||||
/* "" -> "", NULL, NULL, 0 */
|
/* "" -> "", nullptr, nullptr, 0 */
|
||||||
pre_len = BLI_str_partition(str, delim, &sep, &suf);
|
pre_len = BLI_str_partition(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 0);
|
EXPECT_EQ(pre_len, 0);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -247,7 +247,7 @@ TEST(string, StrPartition)
|
||||||
{
|
{
|
||||||
const char *str = "material";
|
const char *str = "material";
|
||||||
|
|
||||||
/* "material" -> "material", NULL, NULL, 8 */
|
/* "material" -> "material", nullptr, nullptr, 8 */
|
||||||
pre_len = BLI_str_partition(str, delim, &sep, &suf);
|
pre_len = BLI_str_partition(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 8);
|
EXPECT_EQ(pre_len, 8);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -296,7 +296,7 @@ TEST(string, StrRPartition)
|
||||||
{
|
{
|
||||||
const char *str = "";
|
const char *str = "";
|
||||||
|
|
||||||
/* "" -> "", NULL, NULL, 0 */
|
/* "" -> "", nullptr, nullptr, 0 */
|
||||||
pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
|
pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 0);
|
EXPECT_EQ(pre_len, 0);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -306,7 +306,7 @@ TEST(string, StrRPartition)
|
||||||
{
|
{
|
||||||
const char *str = "material";
|
const char *str = "material";
|
||||||
|
|
||||||
/* "material" -> "material", NULL, NULL, 8 */
|
/* "material" -> "material", nullptr, nullptr, 8 */
|
||||||
pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
|
pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 8);
|
EXPECT_EQ(pre_len, 8);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -337,7 +337,7 @@ TEST(string, StrPartitionEx)
|
||||||
{
|
{
|
||||||
const char *str = "mate.rial";
|
const char *str = "mate.rial";
|
||||||
|
|
||||||
/* "mate.rial" over "mate" -> "mate.rial", NULL, NULL, 4 */
|
/* "mate.rial" over "mate" -> "mate.rial", nullptr, nullptr, 4 */
|
||||||
pre_len = BLI_str_partition_ex(str, str + 4, delim, &sep, &suf, true);
|
pre_len = BLI_str_partition_ex(str, str + 4, delim, &sep, &suf, true);
|
||||||
EXPECT_EQ(pre_len, 4);
|
EXPECT_EQ(pre_len, 4);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -386,7 +386,7 @@ TEST(string, StrPartitionUtf8)
|
||||||
{
|
{
|
||||||
const char *str = "";
|
const char *str = "";
|
||||||
|
|
||||||
/* "" -> "", NULL, NULL, 0 */
|
/* "" -> "", nullptr, nullptr, 0 */
|
||||||
pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
|
pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 0);
|
EXPECT_EQ(pre_len, 0);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -396,7 +396,7 @@ TEST(string, StrPartitionUtf8)
|
||||||
{
|
{
|
||||||
const char *str = "material";
|
const char *str = "material";
|
||||||
|
|
||||||
/* "material" -> "material", NULL, NULL, 8 */
|
/* "material" -> "material", nullptr, nullptr, 8 */
|
||||||
pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
|
pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 8);
|
EXPECT_EQ(pre_len, 8);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -445,7 +445,7 @@ TEST(string, StrRPartitionUtf8)
|
||||||
{
|
{
|
||||||
const char *str = "";
|
const char *str = "";
|
||||||
|
|
||||||
/* "" -> "", NULL, NULL, 0 */
|
/* "" -> "", nullptr, nullptr, 0 */
|
||||||
pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
|
pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 0);
|
EXPECT_EQ(pre_len, 0);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -455,7 +455,7 @@ TEST(string, StrRPartitionUtf8)
|
||||||
{
|
{
|
||||||
const char *str = "material";
|
const char *str = "material";
|
||||||
|
|
||||||
/* "material" -> "material", NULL, NULL, 8 */
|
/* "material" -> "material", nullptr, nullptr, 8 */
|
||||||
pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
|
pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
|
||||||
EXPECT_EQ(pre_len, 8);
|
EXPECT_EQ(pre_len, 8);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
@ -487,7 +487,7 @@ TEST(string, StrPartitionExUtf8)
|
||||||
{
|
{
|
||||||
const char *str = "mate\xe2\x98\xafrial";
|
const char *str = "mate\xe2\x98\xafrial";
|
||||||
|
|
||||||
/* "mate\xe2\x98\xafrial" over "mate" -> "mate\xe2\x98\xafrial", NULL, NULL, 4 */
|
/* "mate\xe2\x98\xafrial" over "mate" -> "mate\xe2\x98\xafrial", nullptr, nullptr, 4 */
|
||||||
pre_len = BLI_str_partition_ex_utf8(str, str + 4, delim, &sep, &suf, true);
|
pre_len = BLI_str_partition_ex_utf8(str, str + 4, delim, &sep, &suf, true);
|
||||||
EXPECT_EQ(pre_len, 4);
|
EXPECT_EQ(pre_len, 4);
|
||||||
EXPECT_EQ(sep, (void *)nullptr);
|
EXPECT_EQ(sep, (void *)nullptr);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
/* Breaking strings is confusing here, prefer over-long lines. */
|
/* Breaking strings is confusing here, prefer over-long lines. */
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
|
|
||||||
/* Each test is made of a 79 bytes (80 with NULL char) string to test, expected string result after
|
/* Each test is made of a 79 bytes (80 with null char) string to test, expected string result after
|
||||||
* stripping invalid utf8 bytes, and a single-byte string encoded with expected number of errors.
|
* stripping invalid utf8 bytes, and a single-byte string encoded with expected number of errors.
|
||||||
*
|
*
|
||||||
* Based on utf-8 decoder stress-test (https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt)
|
* Based on utf-8 decoder stress-test (https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt)
|
||||||
|
|
|
@ -3140,7 +3140,7 @@ static void read_libblock_undo_restore_at_old_address(FileData *fd, Main *main,
|
||||||
|
|
||||||
/* We do need remapping of internal pointers to the ID itself here.
|
/* We do need remapping of internal pointers to the ID itself here.
|
||||||
*
|
*
|
||||||
* Passing a NULL BMain means that not all potential runtime data (like collections' parent
|
* Passing a null #Main means that not all potential runtime data (like collections' parent
|
||||||
* pointers etc.) will be up-to-date. However, this should not be a problem here, since these
|
* pointers etc.) will be up-to-date. However, this should not be a problem here, since these
|
||||||
* data are re-generated later in file-read process anyway. */
|
* data are re-generated later in file-read process anyway. */
|
||||||
BKE_lib_id_swap_full(nullptr,
|
BKE_lib_id_swap_full(nullptr,
|
||||||
|
|
|
@ -176,7 +176,7 @@ bool BM_edge_uv_share_vert_check(BMEdge *e, BMLoop *l_a, BMLoop *l_b, const int
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No need for NULL checks, these will always succeed. */
|
/* No need for null checks, these will always succeed. */
|
||||||
const BMLoop *l_other_a = BM_loop_other_vert_loop_by_edge(l_a, e);
|
const BMLoop *l_other_a = BM_loop_other_vert_loop_by_edge(l_a, e);
|
||||||
const BMLoop *l_other_b = BM_loop_other_vert_loop_by_edge(l_b, e);
|
const BMLoop *l_other_b = BM_loop_other_vert_loop_by_edge(l_b, e);
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ void GPencilBackup::restore_to_gpencil(bGPdata *gpd)
|
||||||
BKE_gpencil_free_update_cache(gpd_orig);
|
BKE_gpencil_free_update_cache(gpd_orig);
|
||||||
}
|
}
|
||||||
/* Doing a copy-on-write copies the update cache pointer. Make sure to reset it
|
/* Doing a copy-on-write copies the update cache pointer. Make sure to reset it
|
||||||
* to NULL as we should never use the update cache from eval data. */
|
* to null as we should never use the update cache from eval data. */
|
||||||
gpd->runtime.update_cache = nullptr;
|
gpd->runtime.update_cache = nullptr;
|
||||||
/* Make sure to update the original runtime pointers in the eval data. */
|
/* Make sure to update the original runtime pointers in the eval data. */
|
||||||
BKE_gpencil_data_update_orig_pointers(gpd_orig, gpd);
|
BKE_gpencil_data_update_orig_pointers(gpd_orig, gpd);
|
||||||
|
|
|
@ -195,8 +195,8 @@ enum {
|
||||||
CU_DATATYPE_TEXT_SELECT = 1 << 4,
|
CU_DATATYPE_TEXT_SELECT = 1 << 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* ob_curve_cache can be NULL
|
* \param ob_curve_cache: can be null.
|
||||||
*/
|
*/
|
||||||
static CurveRenderData *curve_render_data_create(Curve *cu,
|
static CurveRenderData *curve_render_data_create(Curve *cu,
|
||||||
CurveCache *ob_curve_cache,
|
CurveCache *ob_curve_cache,
|
||||||
|
|
|
@ -243,7 +243,7 @@ void sculpt_undo_print_nodes(Object *ob, void *active)
|
||||||
|
|
||||||
UndoStack *ustack = ED_undo_stack_get();
|
UndoStack *ustack = ED_undo_stack_get();
|
||||||
UndoStep *us = ustack->steps.first;
|
UndoStep *us = ustack->steps.first;
|
||||||
if (active == NULL) {
|
if (active == nullptr) {
|
||||||
active = ustack->step_active;
|
active = ustack->step_active;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1822,7 +1822,7 @@ void SCULPT_undo_push_end_ex(Object *ob, const bool use_nested_undo)
|
||||||
ustack, BKE_UNDOSYS_TYPE_SCULPT);
|
ustack, BKE_UNDOSYS_TYPE_SCULPT);
|
||||||
|
|
||||||
sculpt_save_active_attribute(ob, &us->active_color_end);
|
sculpt_save_active_attribute(ob, &us->active_color_end);
|
||||||
sculpt_undo_print_nodes(ob, NULL);
|
sculpt_undo_print_nodes(ob, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
@ -1922,7 +1922,7 @@ static void sculpt_undosys_step_decode_undo_impl(bContext *C,
|
||||||
sculpt_undo_restore_list(C, depsgraph, &us->data.nodes);
|
sculpt_undo_restore_list(C, depsgraph, &us->data.nodes);
|
||||||
us->step.is_applied = false;
|
us->step.is_applied = false;
|
||||||
|
|
||||||
sculpt_undo_print_nodes(CTX_data_active_object(C), NULL);
|
sculpt_undo_print_nodes(CTX_data_active_object(C), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sculpt_undosys_step_decode_redo_impl(bContext *C,
|
static void sculpt_undosys_step_decode_redo_impl(bContext *C,
|
||||||
|
@ -1934,7 +1934,7 @@ static void sculpt_undosys_step_decode_redo_impl(bContext *C,
|
||||||
sculpt_undo_restore_list(C, depsgraph, &us->data.nodes);
|
sculpt_undo_restore_list(C, depsgraph, &us->data.nodes);
|
||||||
us->step.is_applied = true;
|
us->step.is_applied = true;
|
||||||
|
|
||||||
sculpt_undo_print_nodes(CTX_data_active_object(C), NULL);
|
sculpt_undo_print_nodes(CTX_data_active_object(C), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sculpt_undosys_step_decode_undo(bContext *C,
|
static void sculpt_undosys_step_decode_undo(bContext *C,
|
||||||
|
|
|
@ -1062,7 +1062,7 @@ void ED_image_undosys_type(UndoType *ut)
|
||||||
|
|
||||||
/* NOTE: this is actually a confusing case, since it expects a valid context, but only in a
|
/* NOTE: this is actually a confusing case, since it expects a valid context, but only in a
|
||||||
* specific case, see `image_undosys_step_encode` code. We cannot specify
|
* specific case, see `image_undosys_step_encode` code. We cannot specify
|
||||||
* `UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE` though, as it can be called with a NULL context by
|
* `UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE` though, as it can be called with a null context by
|
||||||
* current code. */
|
* current code. */
|
||||||
ut->flags = UNDOTYPE_FLAG_DECODE_ACTIVE_STEP;
|
ut->flags = UNDOTYPE_FLAG_DECODE_ACTIVE_STEP;
|
||||||
|
|
||||||
|
|
|
@ -243,7 +243,7 @@ static int outliner_get_insert_index(TreeElement *drag_te,
|
||||||
TreeElementInsertType insert_type,
|
TreeElementInsertType insert_type,
|
||||||
ListBase *listbase)
|
ListBase *listbase)
|
||||||
{
|
{
|
||||||
/* Find the element to insert after. NULL is the start of the list. */
|
/* Find the element to insert after. Null is the start of the list. */
|
||||||
if (drag_te->index < drop_te->index) {
|
if (drag_te->index < drop_te->index) {
|
||||||
if (insert_type == TE_INSERT_BEFORE) {
|
if (insert_type == TE_INSERT_BEFORE) {
|
||||||
drop_te = drop_te->prev;
|
drop_te = drop_te->prev;
|
||||||
|
|
|
@ -1279,7 +1279,8 @@ static int outliner_open_back(TreeElement *te)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return element representing the active base or bone in the outliner, or NULL if none exists
|
/**
|
||||||
|
* \return element representing the active base or bone in the outliner, or null if none exists
|
||||||
*/
|
*/
|
||||||
static TreeElement *outliner_show_active_get_element(bContext *C,
|
static TreeElement *outliner_show_active_get_element(bContext *C,
|
||||||
SpaceOutliner *space_outliner,
|
SpaceOutliner *space_outliner,
|
||||||
|
|
|
@ -51,7 +51,7 @@ ListBase TreeDisplayLibraries::buildTree(const TreeSourceData &source_data)
|
||||||
for (ID *id : List<ID>(source_data.bmain->libraries)) {
|
for (ID *id : List<ID>(source_data.bmain->libraries)) {
|
||||||
Library *lib = reinterpret_cast<Library *>(id);
|
Library *lib = reinterpret_cast<Library *>(id);
|
||||||
TreeElement *ten = add_library_contents(*source_data.bmain, tree, lib);
|
TreeElement *ten = add_library_contents(*source_data.bmain, tree, lib);
|
||||||
/* NULL-check matters, due to filtering there may not be a new element. */
|
/* Null-check matters, due to filtering there may not be a new element. */
|
||||||
if (ten) {
|
if (ten) {
|
||||||
lib->id.newid = (ID *)ten;
|
lib->id.newid = (ID *)ten;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ BMLoop *ED_uvedit_active_vert_loop_get(BMesh *bm)
|
||||||
if (ese && ese->prev) {
|
if (ese && ese->prev) {
|
||||||
BMEditSelection *ese_prev = ese->prev;
|
BMEditSelection *ese_prev = ese->prev;
|
||||||
if ((ese->htype == BM_VERT) && (ese_prev->htype == BM_FACE)) {
|
if ((ese->htype == BM_VERT) && (ese_prev->htype == BM_FACE)) {
|
||||||
/* May be NULL. */
|
/* May be null. */
|
||||||
return BM_face_vert_share_loop((BMFace *)ese_prev->ele, (BMVert *)ese->ele);
|
return BM_face_vert_share_loop((BMFace *)ese_prev->ele, (BMVert *)ese->ele);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +139,7 @@ BMLoop *ED_uvedit_active_edge_loop_get(BMesh *bm)
|
||||||
if (ese && ese->prev) {
|
if (ese && ese->prev) {
|
||||||
BMEditSelection *ese_prev = ese->prev;
|
BMEditSelection *ese_prev = ese->prev;
|
||||||
if ((ese->htype == BM_EDGE) && (ese_prev->htype == BM_FACE)) {
|
if ((ese->htype == BM_EDGE) && (ese_prev->htype == BM_FACE)) {
|
||||||
/* May be NULL. */
|
/* May be null. */
|
||||||
return BM_face_edge_share_loop((BMFace *)ese_prev->ele, (BMEdge *)ese->ele);
|
return BM_face_edge_share_loop((BMFace *)ese_prev->ele, (BMEdge *)ese->ele);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2541,7 +2541,7 @@ static bool uv_mouse_select_multi(bContext *C,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Vertex or island. For island (if we were using #uv_find_nearest_face_multi_ex, see above),
|
/* Vertex or island. For island (if we were using #uv_find_nearest_face_multi_ex, see above),
|
||||||
* `hit.l` is NULL, use `hit.efa` instead. */
|
* `hit.l` is null, use `hit.efa` instead. */
|
||||||
if (hit.l != nullptr) {
|
if (hit.l != nullptr) {
|
||||||
is_selected = uvedit_uv_select_test(scene, hit.l, offsets);
|
is_selected = uvedit_uv_select_test(scene, hit.l, offsets);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1166,7 +1166,7 @@ static int stitch_process_data(StitchStateContainer *ssc,
|
||||||
/* copy data from UVs to the preview display buffers */
|
/* copy data from UVs to the preview display buffers */
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
/* just to test if face was added for processing.
|
/* just to test if face was added for processing.
|
||||||
* uvs of unselected vertices will return NULL */
|
* uvs of unselected vertices will return null */
|
||||||
UvElement *element = BM_uv_element_get(state->element_map, BM_FACE_FIRST_LOOP(efa));
|
UvElement *element = BM_uv_element_get(state->element_map, BM_FACE_FIRST_LOOP(efa));
|
||||||
|
|
||||||
if (element) {
|
if (element) {
|
||||||
|
|
|
@ -3026,7 +3026,7 @@ static void p_chart_lscm_begin(PChart *chart, bool live, bool abf)
|
||||||
|
|
||||||
p_chart_boundaries(chart, &outer);
|
p_chart_boundaries(chart, &outer);
|
||||||
|
|
||||||
/* Outer can be NULL with non-finite coords. */
|
/* Outer can be null with non-finite coordinates. */
|
||||||
if (!(outer && p_chart_symmetry_pins(chart, outer, &pin1, &pin2))) {
|
if (!(outer && p_chart_symmetry_pins(chart, outer, &pin1, &pin2))) {
|
||||||
p_chart_extrema_verts(chart, &pin1, &pin2);
|
p_chart_extrema_verts(chart, &pin1, &pin2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ static void vertex_buffer_fetch_mode(ColorType color)
|
||||||
GPU_vertbuf_vert_set(vbo, i, &data[i]);
|
GPU_vertbuf_vert_set(vbo, i, &data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
GPUBatch *batch = GPU_batch_create(GPU_PRIM_TRI_FAN, vbo, NULL);
|
GPUBatch *batch = GPU_batch_create(GPU_PRIM_TRI_FAN, vbo, nullptr);
|
||||||
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_FLAT_COLOR);
|
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_FLAT_COLOR);
|
||||||
GPU_batch_draw(batch);
|
GPU_batch_draw(batch);
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ VKVertexAttributeObject::VKVertexAttributeObject()
|
||||||
void VKVertexAttributeObject::clear()
|
void VKVertexAttributeObject::clear()
|
||||||
{
|
{
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
info.pNext = NULL;
|
info.pNext = nullptr;
|
||||||
bindings.clear();
|
bindings.clear();
|
||||||
attributes.clear();
|
attributes.clear();
|
||||||
vbos.clear();
|
vbos.clear();
|
||||||
|
|
|
@ -53,7 +53,7 @@ void CustomPropertiesExporter::write(const IDProperty *id_property)
|
||||||
|
|
||||||
switch (id_property->type) {
|
switch (id_property->type) {
|
||||||
case IDP_STRING: {
|
case IDP_STRING: {
|
||||||
/* The Alembic library doesn't accept NULL-terminated character arrays. */
|
/* The Alembic library doesn't accept null-terminated character arrays. */
|
||||||
const std::string prop_value(IDP_String(id_property), id_property->len - 1);
|
const std::string prop_value(IDP_String(id_property), id_property->len - 1);
|
||||||
set_scalar_property<OStringArrayProperty, std::string>(id_property->name, prop_value);
|
set_scalar_property<OStringArrayProperty, std::string>(id_property->name, prop_value);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -230,7 +230,7 @@ bool ABC_export(Scene *scene,
|
||||||
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Fake a job context, so that we don't need NULL pointer checks while exporting. */
|
/* Fake a job context, so that we don't need null pointer checks while exporting. */
|
||||||
bool stop = false, do_update = false;
|
bool stop = false, do_update = false;
|
||||||
float progress = 0.0f;
|
float progress = 0.0f;
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@ void ABCHairWriter::write_hair_sample(const HierarchyContext &context,
|
||||||
const int num = pa->num_dmcache >= 0 ? pa->num_dmcache : pa->num;
|
const int num = pa->num_dmcache >= 0 ? pa->num_dmcache : pa->num;
|
||||||
|
|
||||||
if (num < mesh->totface) {
|
if (num < mesh->totface) {
|
||||||
/* TODO(Sybren): check whether the NULL check here and if(mface) are actually required
|
/* TODO(Sybren): check whether the null check here and if(mface) are actually required
|
||||||
*/
|
*/
|
||||||
const MFace *face = mface == nullptr ? nullptr : &mface[num];
|
const MFace *face = mface == nullptr ? nullptr : &mface[num];
|
||||||
MTFace *tface = mtface + num;
|
MTFace *tface = mtface + num;
|
||||||
|
|
|
@ -719,7 +719,7 @@ bool ABC_import(bContext *C,
|
||||||
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Fake a job context, so that we don't need NULL pointer checks while importing. */
|
/* Fake a job context, so that we don't need null pointer checks while importing. */
|
||||||
bool stop = false, do_update = false;
|
bool stop = false, do_update = false;
|
||||||
float progress = 0.0f;
|
float progress = 0.0f;
|
||||||
|
|
||||||
|
|
|
@ -383,7 +383,7 @@ static void create_temp_path_for_usdz_export(const char *filepath,
|
||||||
|
|
||||||
static void set_job_filepath(blender::io::usd::ExportJobData *job, const char *filepath)
|
static void set_job_filepath(blender::io::usd::ExportJobData *job, const char *filepath)
|
||||||
{
|
{
|
||||||
if (BLI_path_extension_check_n(filepath, ".usdz", NULL)) {
|
if (BLI_path_extension_check_n(filepath, ".usdz", nullptr)) {
|
||||||
create_temp_path_for_usdz_export(filepath, job);
|
create_temp_path_for_usdz_export(filepath, job);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -432,7 +432,7 @@ bool USD_export(bContext *C,
|
||||||
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Fake a job context, so that we don't need NULL pointer checks while exporting. */
|
/* Fake a job context, so that we don't need null pointer checks while exporting. */
|
||||||
bool stop = false, do_update = false;
|
bool stop = false, do_update = false;
|
||||||
float progress = 0.0f;
|
float progress = 0.0f;
|
||||||
|
|
||||||
|
|
|
@ -459,7 +459,7 @@ bool USD_import(struct bContext *C,
|
||||||
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
WM_jobs_start(CTX_wm_manager(C), wm_job);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Fake a job context, so that we don't need NULL pointer checks while importing. */
|
/* Fake a job context, so that we don't need null pointer checks while importing. */
|
||||||
bool stop = false, do_update = false;
|
bool stop = false, do_update = false;
|
||||||
float progress = 0.0f;
|
float progress = 0.0f;
|
||||||
|
|
||||||
|
|
|
@ -343,7 +343,7 @@ static bool rna_path_parse_array_index(const char **path,
|
||||||
* that represent the whole given \a path).
|
* that represent the whole given \a path).
|
||||||
* \param eval_pointer: If \a true, and \a path leads to a Pointer property, or an item in a
|
* \param eval_pointer: If \a true, and \a path leads to a Pointer property, or an item in a
|
||||||
* Collection property, \a r_ptr will be set to the value of that property,
|
* Collection property, \a r_ptr will be set to the value of that property,
|
||||||
* and \a r_prop will be NULL.
|
* and \a r_prop will be null.
|
||||||
* Mutually exclusive with \a r_item_ptr.
|
* Mutually exclusive with \a r_item_ptr.
|
||||||
*
|
*
|
||||||
* \return \a true on success, \a false if the path is somehow invalid.
|
* \return \a true on success, \a false if the path is somehow invalid.
|
||||||
|
@ -846,7 +846,7 @@ static char *rna_idp_path(PointerRNA *ptr,
|
||||||
if (prop->type == PROP_POINTER) {
|
if (prop->type == PROP_POINTER) {
|
||||||
PointerRNA child_ptr = RNA_property_pointer_get(ptr, prop);
|
PointerRNA child_ptr = RNA_property_pointer_get(ptr, prop);
|
||||||
if (RNA_pointer_is_null(&child_ptr)) {
|
if (RNA_pointer_is_null(&child_ptr)) {
|
||||||
/* Pointer ID prop might be a 'leaf' in the IDProp group hierarchy, in which case a NULL
|
/* Pointer ID prop might be a 'leaf' in the IDProp group hierarchy, in which case a null
|
||||||
* value is perfectly valid. Just means it won't match the searched needle. */
|
* value is perfectly valid. Just means it won't match the searched needle. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -874,7 +874,7 @@ static char *rna_idp_path(PointerRNA *ptr,
|
||||||
if (RNA_property_collection_lookup_int(ptr, prop, j, &child_ptr)) {
|
if (RNA_property_collection_lookup_int(ptr, prop, j, &child_ptr)) {
|
||||||
if (RNA_pointer_is_null(&child_ptr)) {
|
if (RNA_pointer_is_null(&child_ptr)) {
|
||||||
/* Array item ID prop might be a 'leaf' in the IDProp group hierarchy, in which case
|
/* Array item ID prop might be a 'leaf' in the IDProp group hierarchy, in which case
|
||||||
* a NULL value is perfectly valid. Just means it won't match the searched needle. */
|
* a null value is perfectly valid. Just means it won't match the searched needle. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
link.index = j;
|
link.index = j;
|
||||||
|
@ -1024,7 +1024,7 @@ char *RNA_path_from_real_ID_to_struct(Main *bmain, const PointerRNA *ptr, ID **r
|
||||||
{
|
{
|
||||||
char *path = RNA_path_from_ID_to_struct(ptr);
|
char *path = RNA_path_from_ID_to_struct(ptr);
|
||||||
|
|
||||||
/* NULL path is valid in that case, when given struct is an ID one... */
|
/* Null path is valid in that case, when given struct is an ID one. */
|
||||||
return rna_prepend_real_ID_path(bmain, ptr->owner_id, path, r_real);
|
return rna_prepend_real_ID_path(bmain, ptr->owner_id, path, r_real);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1138,7 +1138,7 @@ char *RNA_path_from_real_ID_to_property_index(Main *bmain,
|
||||||
{
|
{
|
||||||
char *path = RNA_path_from_ID_to_property_index(ptr, prop, index_dim, index);
|
char *path = RNA_path_from_ID_to_property_index(ptr, prop, index_dim, index);
|
||||||
|
|
||||||
/* NULL path is always an error here, in that case do not return the 'fake ID from real ID' part
|
/* Null path is always an error here, in that case do not return the 'fake ID from real ID' part
|
||||||
* of the path either. */
|
* of the path either. */
|
||||||
return path != nullptr ? rna_prepend_real_ID_path(bmain, ptr->owner_id, path, r_real_id) :
|
return path != nullptr ? rna_prepend_real_ID_path(bmain, ptr->owner_id, path, r_real_id) :
|
||||||
nullptr;
|
nullptr;
|
||||||
|
@ -1231,7 +1231,7 @@ char *RNA_path_full_struct_py(const PointerRNA *ptr)
|
||||||
|
|
||||||
data_path = RNA_path_from_ID_to_struct(ptr);
|
data_path = RNA_path_from_ID_to_struct(ptr);
|
||||||
|
|
||||||
/* XXX data_path may be NULL (see #36788),
|
/* XXX data_path may be null (see #36788),
|
||||||
* do we want to get the 'bpy.data.foo["bar"].(null)' stuff? */
|
* do we want to get the 'bpy.data.foo["bar"].(null)' stuff? */
|
||||||
ret = BLI_sprintfN("%s.%s", id_path, data_path);
|
ret = BLI_sprintfN("%s.%s", id_path, data_path);
|
||||||
|
|
||||||
|
|
|
@ -546,7 +546,7 @@ void WM_exit_ex(bContext *C, const bool do_python, const bool do_user_exit_actio
|
||||||
* Don't run this code when `C` is null because #pyrna_unregister_class
|
* Don't run this code when `C` is null because #pyrna_unregister_class
|
||||||
* passes in `CTX_data_main(C)` to un-registration functions.
|
* passes in `CTX_data_main(C)` to un-registration functions.
|
||||||
* Further: `addon_utils.disable_all()` may call into functions that expect a valid context,
|
* Further: `addon_utils.disable_all()` may call into functions that expect a valid context,
|
||||||
* supporting all these code-paths with a NULL context is quite involved for such a corner-case.
|
* supporting all these code-paths with a null context is quite involved for such a corner-case.
|
||||||
*/
|
*/
|
||||||
if (C) {
|
if (C) {
|
||||||
const char *imports[2] = {"addon_utils", nullptr};
|
const char *imports[2] = {"addon_utils", nullptr};
|
||||||
|
|
Loading…
Reference in New Issue