Skip to content

Commit d3e97e4

Browse files
committed
Fix some dead marking and detection
1 parent 5d0239e commit d3e97e4

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

lib/graphql/execution/interpreter/runtime.rb

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,20 @@ def evaluate_selection_with_args(kwarg_arguments, field_defn, next_path, ast_nod
321321
end
322322
end
323323

324+
def dead_result?(selection_result)
325+
r = selection_result
326+
while r
327+
if r.graphql_dead
328+
return true
329+
else
330+
r = r.graphql_parent
331+
end
332+
end
333+
false
334+
end
335+
324336
def set_result(selection_result, result_name, value)
325-
if !selection_result.graphql_dead
337+
if !dead_result?(selection_result)
326338
if value.nil? &&
327339
(nn = selection_result.graphql_non_null) &&
328340
(nn == true || nn.include?(result_name))
@@ -333,6 +345,9 @@ def set_result(selection_result, result_name, value)
333345
@response = nil
334346
else
335347
set_result(parent, name_in_parent, nil)
348+
# This is odd, but it's how it used to work. Even if `parent` _would_ accept
349+
# a `nil`, it's marked dead. TODO: check the spec, is there a reason for this?
350+
parent.graphql_dead = true
336351
end
337352
else
338353
selection_result[result_name] = value
@@ -346,7 +361,7 @@ def continue_value(path, value, parent_type, field, is_non_null, ast_node, resul
346361
when nil
347362
if is_non_null
348363
err = parent_type::InvalidNullError.new(parent_type, field, value)
349-
if !selection_result.graphql_dead
364+
if !dead_result?(selection_result)
350365
schema.type_error(err, context)
351366
set_result(selection_result, result_name, nil)
352367
selection_result.graphql_dead = true
@@ -360,11 +375,12 @@ def continue_value(path, value, parent_type, field, is_non_null, ast_node, resul
360375
# to avoid the overhead of checking three different classes
361376
# every time.
362377
if value.is_a?(GraphQL::ExecutionError)
363-
if !selection_result.graphql_dead
378+
if !dead_result?(selection_result)
364379
value.path ||= path
365380
value.ast_node ||= ast_node
366381
context.errors << value
367382
set_result(selection_result, result_name, nil)
383+
selection_result.graphql_dead = true
368384
end
369385
HALT
370386
elsif value.is_a?(GraphQL::UnauthorizedError)
@@ -376,7 +392,6 @@ def continue_value(path, value, parent_type, field, is_non_null, ast_node, resul
376392
err
377393
end
378394
continue_value(path, next_value, parent_type, field, is_non_null, ast_node, result_name, selection_result)
379-
HALT
380395
elsif GraphQL::Execution::Execute::SKIP == value
381396
HALT
382397
else
@@ -387,7 +402,7 @@ def continue_value(path, value, parent_type, field, is_non_null, ast_node, resul
387402
when Array
388403
# It's an array full of execution errors; add them all.
389404
if value.any? && value.all? { |v| v.is_a?(GraphQL::ExecutionError) }
390-
if !selection_result.graphql_dead
405+
if !dead_result?(selection_result)
391406
value.each_with_index do |error, index|
392407
error.ast_node ||= ast_node
393408
error.path ||= path + (field.type.list? ? [index] : [])

0 commit comments

Comments
 (0)