A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/protocolbuffers/protobuf/commit/0324f39dabc605c11e56241b374da700bc9e3d62 below:

Add clear() method to repeated fields in Python. · protocolbuffers/protobuf@0324f39 · GitHub

@@ -851,6 +851,42 @@ static PyObject* GetIntegerEnumValue(const FieldDescriptor& descriptor,

851 851

return value;

852 852

}

853 853 854 +

void DeleteLastRepeatedWithSize(CMessage* self,

855 +

const FieldDescriptor* field_descriptor,

856 +

Py_ssize_t n) {

857 +

Message* message = self->message;

858 +

const Reflection* reflection = message->GetReflection();

859 +

ABSL_DCHECK(reflection->FieldSize(*message, field_descriptor) >= n);

860 +

Arena* arena = message->GetArena();

861 +

ABSL_DCHECK_EQ(arena, nullptr)

862 +

<< "python protobuf is expected to be allocated from heap";

863 +

for (; n > 0; n--) {

864 +

// It seems that RemoveLast() is less efficient for sub-messages, and

865 +

// the memory is not completely released. Prefer ReleaseLast().

866 +

//

867 +

// To work around a debug hardening (PROTOBUF_FORCE_COPY_IN_RELEASE),

868 +

// explicitly use UnsafeArenaReleaseLast. To not break rare use cases where

869 +

// arena is used, we fallback to ReleaseLast (but ABSL_DCHECK to find/fix

870 +

// it).

871 +

//

872 +

// Note that arena is likely null and ABSL_DCHECK and ReleaseLast might be

873 +

// redundant. The current approach takes extra cautious path not to disrupt

874 +

// production.

875 +

Message* sub_message =

876 +

(arena == nullptr)

877 +

? reflection->UnsafeArenaReleaseLast(message, field_descriptor)

878 +

: reflection->ReleaseLast(message, field_descriptor);

879 +

// If there is a live weak reference to an item being removed, we "Release"

880 +

// it, and it takes ownership of the message.

881 +

if (CMessage* released = self->MaybeReleaseSubMessage(sub_message)) {

882 +

released->message = sub_message;

883 +

} else {

884 +

// sub_message was not transferred, delete it.

885 +

delete sub_message;

886 +

}

887 +

}

888 +

}

889 + 854 890

// Delete a slice from a repeated field.

855 891

// The only way to remove items in C++ protos is to delete the last one,

856 892

// so we swap items to move the deleted ones at the end, and then strip the

@@ -911,37 +947,14 @@ int DeleteRepeatedField(CMessage* self, const FieldDescriptor* field_descriptor,

911 947

}

912 948

}

913 949 914 -

Arena* arena = message->GetArena();

915 -

ABSL_DCHECK_EQ(arena, nullptr)

916 -

<< "python protobuf is expected to be allocated from heap";

917 950

// Remove items, starting from the end.

918 -

for (; length > to; length--) {

919 -

if (field_descriptor->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {

951 +

if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {

952 +

DeleteLastRepeatedWithSize(self, field_descriptor, length - to);

953 +

} else {

954 +

ABSL_DCHECK_EQ(message->GetArena(), nullptr)

955 +

<< "python protobuf is expected to be allocated from heap";

956 +

for (; length > to; length--) {

920 957

reflection->RemoveLast(message, field_descriptor);

921 -

continue;

922 -

}

923 -

// It seems that RemoveLast() is less efficient for sub-messages, and

924 -

// the memory is not completely released. Prefer ReleaseLast().

925 -

//

926 -

// To work around a debug hardening (PROTOBUF_FORCE_COPY_IN_RELEASE),

927 -

// explicitly use UnsafeArenaReleaseLast. To not break rare use cases where

928 -

// arena is used, we fallback to ReleaseLast (but ABSL_DCHECK to find/fix

929 -

// it).

930 -

//

931 -

// Note that arena is likely null and ABSL_DCHECK and ReleaseLast might be

932 -

// redundant. The current approach takes extra cautious path not to disrupt

933 -

// production.

934 -

Message* sub_message =

935 -

(arena == nullptr)

936 -

? reflection->UnsafeArenaReleaseLast(message, field_descriptor)

937 -

: reflection->ReleaseLast(message, field_descriptor);

938 -

// If there is a live weak reference to an item being removed, we "Release"

939 -

// it, and it takes ownership of the message.

940 -

if (CMessage* released = self->MaybeReleaseSubMessage(sub_message)) {

941 -

released->message = sub_message;

942 -

} else {

943 -

// sub_message was not transferred, delete it.

944 -

delete sub_message;

945 958

}

946 959

}

947 960

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4