Hello,
I noticed that when using a GeListHead for storing custom BaseList2D items leads to a crash when TreeViewFunctions' SetName is called.
Is this a known bug/behavior?
If not, what did I do wrong? 
Here's a minimal example. Try to rename any ListItem with Double-Click -> Freeze.
On R21 I did some more debugging and it turned out that obj in SetName() is of type long.
import c4d
from c4d import gui
from c4d import plugins
PLUGIN_ID = 1000001  # Test plugin id
PLUGIN_ID_ND = 1000002  # Test plugin id
class ListItem(plugins.NodeData):
    def Init(self, node):
        # do stuff here
        return True
class Tvf(gui.TreeViewFunctions):
    def GetFirst(self, root, userdata):
        if not root:
            return None
        return root.GetFirst()
    def GetNext(self, root, userdata, obj):
        return obj.GetNext()
    def GetName(self, root, userdata, obj):
        return obj.GetName()
    def SetName(self, root, userdata, obj, str):
        obj.SetName(str)
class TestDialog(gui.GeDialog):
    def __init__(self):
        self.items = c4d.GeListHead()
        self.treegui = None
        self.tvf = Tvf()
    def add_item(self):
        item = c4d.BaseList2D(PLUGIN_ID_ND)
        item.SetName("ListItem")
        item.InsertUnder(self.items)
    def CreateLayout(self):
        settings = c4d.BaseContainer()
        settings.SetBool(c4d.TREEVIEW_HAS_HEADER, True)
        self.treegui = self.AddCustomGui(0, c4d.CUSTOMGUI_TREEVIEW, "",
                                         c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT,
                                         300,
                                         300,
                                         settings)
        return True
    def InitValues(self):
        for x in range(5):
            self.add_item()
        layout_bc = c4d.BaseContainer()
        layout_bc.SetInt32(0, c4d.LV_TREE)
        self.treegui.SetLayout(1, layout_bc)
        self.treegui.SetHeaderText(0, "Name")
        self.treegui.Refresh()
        self.treegui.SetRoot(self.items, self.tvf, None)
        return True
class TestCommand(plugins.CommandData):
    def __init__(self):
        self.dlg = None
    def Register(self):
        return plugins.RegisterCommandPlugin(PLUGIN_ID, "Test-Plugin", 0, None, None, self)
    def Execute(self, doc):
        if self.dlg is None:
            self.dlg = TestDialog()
        return self.dlg.Open(dlgtype=c4d.DLG_TYPE_ASYNC, pluginid=PLUGIN_ID, defaulth=400, defaultw=400)
    def RestoreLayout(self, sec_ref):
        if self.dlg is None:
            self.dlg = TestDialog()
        return self.dlg.Restore(pluginid=PLUGIN_ID, secret=sec_ref)
if __name__ == '__main__':
    TestCommand().Register()
    plugins.RegisterNodePlugin(PLUGIN_ID_ND, "ListItem", c4d.PLUGINFLAG_HIDE, ListItem, None)