google-cloud-debugger 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +8 -0
- data/LICENSE +201 -0
- data/README.md +56 -0
- data/ext/google/cloud/debugger/debugger_c/debugger.c +31 -0
- data/ext/google/cloud/debugger/debugger_c/debugger.h +26 -0
- data/ext/google/cloud/debugger/debugger_c/evaluator.c +78 -0
- data/ext/google/cloud/debugger/debugger_c/evaluator.h +25 -0
- data/ext/google/cloud/debugger/debugger_c/extconf.rb +22 -0
- data/ext/google/cloud/debugger/debugger_c/tracer.c +478 -0
- data/ext/google/cloud/debugger/debugger_c/tracer.h +31 -0
- data/lib/google-cloud-debugger.rb +121 -0
- data/lib/google/cloud/debugger.rb +379 -0
- data/lib/google/cloud/debugger/agent.rb +204 -0
- data/lib/google/cloud/debugger/async_actor.rb +290 -0
- data/lib/google/cloud/debugger/breakpoint.rb +382 -0
- data/lib/google/cloud/debugger/breakpoint/evaluator.rb +1113 -0
- data/lib/google/cloud/debugger/breakpoint/source_location.rb +75 -0
- data/lib/google/cloud/debugger/breakpoint/stack_frame.rb +109 -0
- data/lib/google/cloud/debugger/breakpoint/variable.rb +304 -0
- data/lib/google/cloud/debugger/breakpoint_manager.rb +217 -0
- data/lib/google/cloud/debugger/credentials.rb +41 -0
- data/lib/google/cloud/debugger/debuggee.rb +204 -0
- data/lib/google/cloud/debugger/debuggee/app_uniquifier_generator.rb +78 -0
- data/lib/google/cloud/debugger/middleware.rb +77 -0
- data/lib/google/cloud/debugger/project.rb +135 -0
- data/lib/google/cloud/debugger/rails.rb +141 -0
- data/lib/google/cloud/debugger/service.rb +130 -0
- data/lib/google/cloud/debugger/tracer.rb +165 -0
- data/lib/google/cloud/debugger/transmitter.rb +129 -0
- data/lib/google/cloud/debugger/v2.rb +15 -0
- data/lib/google/cloud/debugger/v2/controller2_client.rb +299 -0
- data/lib/google/cloud/debugger/v2/controller2_client_config.json +43 -0
- data/lib/google/cloud/debugger/v2/debugger2_client.rb +378 -0
- data/lib/google/cloud/debugger/v2/debugger2_client_config.json +53 -0
- data/lib/google/cloud/debugger/v2/doc/google/devtools/clouddebugger/v2/data.rb +441 -0
- data/lib/google/cloud/debugger/v2/doc/google/devtools/clouddebugger/v2/debugger.rb +151 -0
- data/lib/google/cloud/debugger/v2/doc/google/devtools/source/v1/source_context.rb +161 -0
- data/lib/google/cloud/debugger/v2/doc/google/protobuf/timestamp.rb +81 -0
- data/lib/google/cloud/debugger/version.rb +22 -0
- data/lib/google/devtools/clouddebugger/v2/controller_pb.rb +47 -0
- data/lib/google/devtools/clouddebugger/v2/controller_services_pb.rb +97 -0
- data/lib/google/devtools/clouddebugger/v2/data_pb.rb +105 -0
- data/lib/google/devtools/clouddebugger/v2/debugger_pb.rb +74 -0
- data/lib/google/devtools/clouddebugger/v2/debugger_services_pb.rb +64 -0
- data/lib/google/devtools/source/v1/source_context_pb.rb +89 -0
- metadata +300 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright 2017 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
module Google
|
17
|
+
module Cloud
|
18
|
+
module Debugger
|
19
|
+
class Breakpoint
|
20
|
+
##
|
21
|
+
# # SourceLocation
|
22
|
+
#
|
23
|
+
# Additional information about the source code location that's
|
24
|
+
# associated with the breakpoint.
|
25
|
+
#
|
26
|
+
# See also {Breakpoint#location}.
|
27
|
+
#
|
28
|
+
class SourceLocation
|
29
|
+
##
|
30
|
+
# Path to the source file within the source context of the target
|
31
|
+
# binary.
|
32
|
+
attr_accessor :path
|
33
|
+
|
34
|
+
##
|
35
|
+
# Line inside the file. The first line in the file has the value 1.
|
36
|
+
attr_accessor :line
|
37
|
+
|
38
|
+
##
|
39
|
+
# @private Create an empty SourceLocation object.
|
40
|
+
def initialize
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# @private New Google::Cloud::Debugger::Breakpoint::SourceLocation
|
45
|
+
# from a Google::Devtools::Clouddebugger::V2::SourceLocation object.
|
46
|
+
def self.from_grpc grpc
|
47
|
+
return new if grpc.nil?
|
48
|
+
new.tap do |o|
|
49
|
+
o.path = grpc.path
|
50
|
+
o.line = grpc.line
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# @private Determines if the SourceLocation has any data.
|
56
|
+
def empty?
|
57
|
+
path.nil? &&
|
58
|
+
line.nil?
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# @private Exports the SourceLocation to a
|
63
|
+
# Google::Devtools::Clouddebugger::V2::SourceLocation object.
|
64
|
+
def to_grpc
|
65
|
+
return nil if empty?
|
66
|
+
Google::Devtools::Clouddebugger::V2::SourceLocation.new(
|
67
|
+
path: path.to_s,
|
68
|
+
line: line
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# Copyright 2017 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "google/cloud/debugger/breakpoint/source_location"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Debugger
|
21
|
+
class Breakpoint
|
22
|
+
##
|
23
|
+
# # StackFrame
|
24
|
+
#
|
25
|
+
# Represents a stack frame context.
|
26
|
+
#
|
27
|
+
# See also {Breakpoint#stack_frames}.
|
28
|
+
#
|
29
|
+
class StackFrame
|
30
|
+
##
|
31
|
+
# Demangled function name at the call site.
|
32
|
+
attr_accessor :function
|
33
|
+
|
34
|
+
##
|
35
|
+
# Source location of the call site.
|
36
|
+
attr_accessor :location
|
37
|
+
|
38
|
+
##
|
39
|
+
# Set of arguments passed to this function. Note that this might not
|
40
|
+
# be populated for all stack frames.
|
41
|
+
attr_accessor :arguments
|
42
|
+
|
43
|
+
##
|
44
|
+
# Set of local variables at the stack frame location. Note that this
|
45
|
+
# might not be populated for all stack frames.
|
46
|
+
attr_accessor :locals
|
47
|
+
|
48
|
+
##
|
49
|
+
# @private Create an empty StackFrame object.
|
50
|
+
def initialize
|
51
|
+
@location = SourceLocation.new
|
52
|
+
@arguments = []
|
53
|
+
@locals = []
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# @private New Google::Cloud::Debugger::Breakpoint::SourceLocation
|
58
|
+
# from a Google::Devtools::Clouddebugger::V2::SourceLocation object.
|
59
|
+
def self.from_grpc grpc
|
60
|
+
new.tap do |o|
|
61
|
+
o.function = grpc.function
|
62
|
+
o.location = SourceLocation.from_grpc grpc.location
|
63
|
+
o.arguments = Variable.from_grpc_list grpc.arguments
|
64
|
+
o.locals = Variable.from_grpc_list grpc.locals
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# @private Determines if the StackFrame has any data.
|
70
|
+
def empty?
|
71
|
+
function.nil? &&
|
72
|
+
location.nil? &&
|
73
|
+
arguments.nil? &&
|
74
|
+
locals.nil?
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# @private Exports the StackFrame to a
|
79
|
+
# Google::Devtools::Clouddebugger::V2::StackFrame object.
|
80
|
+
def to_grpc
|
81
|
+
return nil if empty?
|
82
|
+
Google::Devtools::Clouddebugger::V2::StackFrame.new(
|
83
|
+
function: function.to_s,
|
84
|
+
location: location.to_grpc,
|
85
|
+
arguments: arguments_to_grpc,
|
86
|
+
locals: locals_to_grpc
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
##
|
93
|
+
# @private Exports the StackFrame arguments to an array of
|
94
|
+
# Google::Devtools::Clouddebugger::V2::Variable objects.
|
95
|
+
def arguments_to_grpc
|
96
|
+
arguments.nil? ? [] : arguments.map(&:to_grpc)
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# @private Exports the StackFrame locals to an array of
|
101
|
+
# Google::Devtools::Clouddebugger::V2::Variable objects.
|
102
|
+
def locals_to_grpc
|
103
|
+
locals.nil? ? [] : locals.map(&:to_grpc)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,304 @@
|
|
1
|
+
# Copyright 2017 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
module Google
|
17
|
+
module Cloud
|
18
|
+
module Debugger
|
19
|
+
class Breakpoint
|
20
|
+
##
|
21
|
+
# # Variable
|
22
|
+
#
|
23
|
+
# Represents a variable or an argument possibly of a compound object
|
24
|
+
# type. Note how the following variables are represented:
|
25
|
+
#
|
26
|
+
# A simple Variable:
|
27
|
+
# ```ruby
|
28
|
+
# x = 5
|
29
|
+
# # Captured variable:
|
30
|
+
# # { name: "x", value: "5", type: "Integer" }
|
31
|
+
# ```
|
32
|
+
#
|
33
|
+
# A Compound Variable:
|
34
|
+
# ```ruby
|
35
|
+
# class T
|
36
|
+
# attr_accessor :m1, :m2
|
37
|
+
# ...
|
38
|
+
# end
|
39
|
+
# v = T.new(1, "2")
|
40
|
+
# # Captured variable:
|
41
|
+
# # {
|
42
|
+
# # name: "v",
|
43
|
+
# # type: "T",
|
44
|
+
# # members: [
|
45
|
+
# # { name: "@m1", value: "1", type: "Integer" },
|
46
|
+
# # { name: "@m2", value: "2", type: "String" }
|
47
|
+
# # ]
|
48
|
+
# # }
|
49
|
+
# ```
|
50
|
+
#
|
51
|
+
# A Hash object:
|
52
|
+
# ```ruby
|
53
|
+
# hash = { a: 1, b: :two }
|
54
|
+
# # Captured variable:
|
55
|
+
# # {
|
56
|
+
# # name: "hash",
|
57
|
+
# # type: "Hash",
|
58
|
+
# # members: [
|
59
|
+
# # { name: "a", value: "1", type: "Integer" },
|
60
|
+
# # { name: "b", value: ":2", type: "Symbol" }
|
61
|
+
# # ]
|
62
|
+
# # }
|
63
|
+
# ```
|
64
|
+
#
|
65
|
+
# An Array object:
|
66
|
+
# ```ruby
|
67
|
+
# ary = [1, nil]
|
68
|
+
# # Captured variable:
|
69
|
+
# # {
|
70
|
+
# # name: "ary",
|
71
|
+
# # type: "Array",
|
72
|
+
# # members: [
|
73
|
+
# # { name: "[0]", value: "1", type: "Integer" },
|
74
|
+
# # { name: "[1]", value: "nil", type: "NilClass" }
|
75
|
+
# # ]
|
76
|
+
# # }
|
77
|
+
# ```
|
78
|
+
#
|
79
|
+
class Variable
|
80
|
+
##
|
81
|
+
# Max depth to convert on compound variables
|
82
|
+
MAX_DEPTH = 3
|
83
|
+
|
84
|
+
##
|
85
|
+
# Max number of member variables to evaluate in compound variables
|
86
|
+
MAX_MEMBERS = 10
|
87
|
+
|
88
|
+
##
|
89
|
+
# Max length on variable inspect results. Truncate extra and replace
|
90
|
+
# with ellipsis.
|
91
|
+
MAX_STRING_LENGTH = 260
|
92
|
+
|
93
|
+
##
|
94
|
+
# @private Name of the variable, if any.
|
95
|
+
# @return [String]
|
96
|
+
attr_accessor :name
|
97
|
+
|
98
|
+
##
|
99
|
+
# @private Simple value of the variable.
|
100
|
+
# @return [String]
|
101
|
+
attr_accessor :value
|
102
|
+
|
103
|
+
##
|
104
|
+
# @private Variable type (e.g. MyClass). If the variable is split with
|
105
|
+
# var_table_index, type goes next to value.
|
106
|
+
# @return [String]
|
107
|
+
attr_accessor :type
|
108
|
+
|
109
|
+
##
|
110
|
+
# @private Members contained or pointed to by the variable.
|
111
|
+
# @return [Array<Variable>]
|
112
|
+
attr_accessor :members
|
113
|
+
|
114
|
+
##
|
115
|
+
# @private Status associated with the variable. This field will
|
116
|
+
# usually stay unset. A status of a single variable only applies to
|
117
|
+
# that variable or expression. The rest of breakpoint data still
|
118
|
+
# remains valid. Variables might be reported in error state even when
|
119
|
+
# breakpoint is not in final state.
|
120
|
+
# The message may refer to variable name with refers_to set to
|
121
|
+
# VARIABLE_NAME. Alternatively refers_to will be set to
|
122
|
+
# VARIABLE_VALUE. In either case variable value and members will be
|
123
|
+
# unset.
|
124
|
+
# TODO: Implement variable status
|
125
|
+
# attr_accessor :status
|
126
|
+
|
127
|
+
##
|
128
|
+
# @private Create an empty Variable object.
|
129
|
+
def initialize
|
130
|
+
@members = []
|
131
|
+
end
|
132
|
+
|
133
|
+
##
|
134
|
+
# Convert a Ruby variable into a
|
135
|
+
# Google::Cloud::Debugger::Breakpoint::Variable object.
|
136
|
+
#
|
137
|
+
# @param [Any] source Source Ruby variable to convert from
|
138
|
+
# @param [String] name Name of the varaible
|
139
|
+
# @param [Integer] depth Number of levels to evaluate in compound
|
140
|
+
# variables. Default to
|
141
|
+
# {Google::Cloud::Debugger::Breakpoint::Variable::MAX_DEPTH}
|
142
|
+
#
|
143
|
+
# @example
|
144
|
+
# x = 3
|
145
|
+
# var = Variable.from_rb_var x, name: "x"
|
146
|
+
# var.name #=> "x"
|
147
|
+
# var.value #=> "3"
|
148
|
+
# var.type #=> "Integer"
|
149
|
+
#
|
150
|
+
# @example
|
151
|
+
# hash = {a: 1, b: :two}
|
152
|
+
# var = Variable.from_rb_var hash, name: "hash"
|
153
|
+
# var.name #=> "hash"
|
154
|
+
# var.type #=> "Hash"
|
155
|
+
# var.members[0].name #=> "a"
|
156
|
+
# var.members[0].value #=> "1"
|
157
|
+
# var.members[0].type #=> "Integer"
|
158
|
+
# var.members[1].name #=> "b"
|
159
|
+
# var.members[1].value #=> "two"
|
160
|
+
# var.members[1].type #=> "Symbol"
|
161
|
+
#
|
162
|
+
# @example
|
163
|
+
# foo = Foo.new(a: 1, b: []) #=> #<Foo:0x0000 @a: 1, @b: []>
|
164
|
+
# var = Variable.from_rb_var foo, name: "foo"
|
165
|
+
# var.name #=> "foo"
|
166
|
+
# var.type #=> "Foo"
|
167
|
+
# var.members[0].name #=> "@a"
|
168
|
+
# var.members[0].value #=> "1"
|
169
|
+
# var.members[0].type #=> "Integer"
|
170
|
+
# var.members[1].name #=> "@b"
|
171
|
+
# var.members[1].value #=> "[]"
|
172
|
+
# var.members[1].type #=> "Array"
|
173
|
+
#
|
174
|
+
# @return [Google::Cloud::Debugger::Breakpoint::Variable] Converted
|
175
|
+
# variable.
|
176
|
+
#
|
177
|
+
def self.from_rb_var source, name: nil, depth: MAX_DEPTH
|
178
|
+
return source if source.is_a? Variable
|
179
|
+
|
180
|
+
# If source is a non-empty Array or Hash, or source has instance
|
181
|
+
# variables, evaluate source as a compound variable.
|
182
|
+
if (((source.is_a?(Hash) || source.is_a?(Array)) &&
|
183
|
+
!source.empty?) || !source.instance_variables.empty?) &&
|
184
|
+
depth > 0
|
185
|
+
from_compound_var source, name: name, depth: depth
|
186
|
+
else
|
187
|
+
var = Variable.new
|
188
|
+
var.name = name.to_s if name
|
189
|
+
var.type = source.class.to_s
|
190
|
+
var.value = truncate_value(source.inspect)
|
191
|
+
|
192
|
+
var
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
##
|
197
|
+
# @private Helper method that converts compound variables.
|
198
|
+
def self.from_compound_var source, name: nil, depth: MAX_DEPTH
|
199
|
+
return source if source.is_a? Variable
|
200
|
+
var = Variable.new
|
201
|
+
var.name = name.to_s if name
|
202
|
+
var.type = source.class.to_s
|
203
|
+
|
204
|
+
case source
|
205
|
+
when Hash
|
206
|
+
add_compound_members var, source do |(k, v)|
|
207
|
+
from_rb_var(v, name: k, depth: depth - 1)
|
208
|
+
end
|
209
|
+
when Array
|
210
|
+
add_compound_members var, source do |el, i|
|
211
|
+
from_rb_var(el, name: "[#{i}]", depth: depth - 1)
|
212
|
+
end
|
213
|
+
else
|
214
|
+
add_compound_members var, source.instance_variables do |var_name|
|
215
|
+
instance_var = source.instance_variable_get var_name
|
216
|
+
from_rb_var(instance_var, name: var_name, depth: depth - 1)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
var
|
220
|
+
end
|
221
|
+
|
222
|
+
##
|
223
|
+
# @private Help interate through collection of member variables for
|
224
|
+
# compound variables.
|
225
|
+
def self.add_compound_members var, members
|
226
|
+
members.each_with_index do |el, i|
|
227
|
+
if i < MAX_MEMBERS
|
228
|
+
var.members << yield(el, i)
|
229
|
+
else
|
230
|
+
var.members << Variable.new.tap do |last_var|
|
231
|
+
last_var.value =
|
232
|
+
"(Only first #{MAX_MEMBERS} items were captured)"
|
233
|
+
end
|
234
|
+
break
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
##
|
240
|
+
# @private New Google::Cloud::Debugger::Breakpoint::Variable
|
241
|
+
# from a Google::Devtools::Clouddebugger::V2::Variable object.
|
242
|
+
def self.from_grpc grpc
|
243
|
+
return new if grpc.nil?
|
244
|
+
new.tap do |o|
|
245
|
+
o.name = grpc.name
|
246
|
+
o.value = grpc.value
|
247
|
+
o.type = grpc.type
|
248
|
+
o.members = from_grpc_list grpc.members
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
##
|
253
|
+
# @private New array of Google::Cloud::Debugger::Breakpoint::Variable
|
254
|
+
# from an array of Google::Devtools::Clouddebugger::V2::Variable
|
255
|
+
# objects.
|
256
|
+
def self.from_grpc_list grpc_list
|
257
|
+
return [] if grpc_list.nil?
|
258
|
+
grpc_list.map { |var_grpc| from_grpc var_grpc }
|
259
|
+
end
|
260
|
+
|
261
|
+
##
|
262
|
+
# @private Limit string to MAX_STRING_LENTH. Replace extra characters
|
263
|
+
# with ellipsis
|
264
|
+
def self.truncate_value str
|
265
|
+
str.gsub(/(.{#{MAX_STRING_LENGTH - 3}}).+/, '\1...')
|
266
|
+
end
|
267
|
+
private_class_method :add_compound_members, :truncate_value
|
268
|
+
|
269
|
+
##
|
270
|
+
# @private Determines if the Variable has any data.
|
271
|
+
def empty?
|
272
|
+
name.nil? &&
|
273
|
+
value.nil? &&
|
274
|
+
type.nil? &&
|
275
|
+
members.nil?
|
276
|
+
# TODO: Add status when implementing variable status
|
277
|
+
end
|
278
|
+
|
279
|
+
##
|
280
|
+
# @private Exports the Variable to a
|
281
|
+
# Google::Devtools::Clouddebugger::V2::Variable object.
|
282
|
+
def to_grpc
|
283
|
+
return nil if empty?
|
284
|
+
Google::Devtools::Clouddebugger::V2::Variable.new(
|
285
|
+
name: name.to_s,
|
286
|
+
value: value.to_s,
|
287
|
+
type: type.to_s,
|
288
|
+
members: members_to_grpc || []
|
289
|
+
)
|
290
|
+
end
|
291
|
+
|
292
|
+
private
|
293
|
+
|
294
|
+
##
|
295
|
+
# @private Exports the Variable members to an array of
|
296
|
+
# Google::Devtools::Clouddebugger::V2::Variable objects.
|
297
|
+
def members_to_grpc
|
298
|
+
members.nil? ? nil : members.map(&:to_grpc)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|