Skip to content

Commit

Permalink
patch 9.0.1902: Vim9: Coverity complains about dead code
Browse files Browse the repository at this point in the history
Problem:  Vim9: Coverity complains about dead code
Solution: Copy only object methods from the super class
          to a subclass when extending a class.  Fix
          Coverity warning.

closes: #13103

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
  • Loading branch information
yegappan authored and chrisbra committed Sep 16, 2023
1 parent ad29f6a commit e2deb7e
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 24 deletions.
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1902,
/**/
1901,
/**/
Expand Down
39 changes: 15 additions & 24 deletions src/vim9class.c
Original file line number Diff line number Diff line change
Expand Up @@ -1049,9 +1049,9 @@ add_default_constructor(
}

/*
* Add the class functions and object methods to the new class "cl".
* When extending a class, add the functions and methods from the parent class
* also.
* Add the class methods and object methods to the new class "cl".
* When extending a class "extends_cl", add the instance methods from the
* parent class also.
*/
static int
add_classfuncs_objmethods(
Expand Down Expand Up @@ -1095,26 +1095,19 @@ add_classfuncs_objmethods(
else
cl->class_obj_method_count_child = gap->ga_len;

int skipped = 0;
for (int i = 0; i < parent_count; ++i)
{
// Copy functions from the parent. Can't use the same
// function, because "uf_class" is different and compilation
// will have a different result.
// Put them after the functions in the current class, object
// methods may be overruled, then "super.Method()" is used to
// find a method from the parent.
// Skip "new" functions. TODO: not all of them.
if (loop == 1 && STRNCMP(
extends_cl->class_class_functions[i]->uf_name,
"new", 3) == 0)
++skipped;
else
if (loop == 2)
{
// Copy instance methods from the parent.

for (int i = 0; i < parent_count; ++i)
{
ufunc_T *pf = (loop == 1
? extends_cl->class_class_functions
: extends_cl->class_obj_methods)[i];
(*fup)[gap->ga_len + i - skipped] = copy_function(pf);
// Can't use the same parent function, because "uf_class" is
// different and compilation will have a different result.
// Put them after the functions in the current class, object
// methods may be overruled, then "super.Method()" is used to
// find a method from the parent.
ufunc_T *pf = (extends_cl->class_obj_methods)[i];
(*fup)[gap->ga_len + i] = copy_function(pf);

// If the child class overrides a function from the parent
// the signature must be equal.
Expand All @@ -1135,8 +1128,6 @@ add_classfuncs_objmethods(
}
}

*fcount -= skipped;

// Set the class pointer on all the functions and object methods.
for (int i = 0; i < *fcount; ++i)
{
Expand Down

0 comments on commit e2deb7e

Please sign in to comment.