Skip to content

Commit 85b8018

Browse files
committed
Stable object shape
1 parent 14bcb5e commit 85b8018

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

lib/graphql/schema/field.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -811,8 +811,16 @@ def assert_satisfactory_implementation(receiver, method_name, ruby_kwargs)
811811
end
812812

813813
class ExtendedState
814+
def initialize(args, object)
815+
@arguments = args
816+
@object = object
817+
@memos = nil
818+
@added_extras = nil
819+
end
820+
814821
attr_accessor :arguments, :object, :memos, :added_extras
815822
end
823+
816824
# Wrap execution with hooks.
817825
# Written iteratively to avoid big stack traces.
818826
# @return [Object] Whatever the
@@ -823,9 +831,7 @@ def with_extensions(obj, args, ctx)
823831
# This is a hack to get the _last_ value for extended obj and args,
824832
# in case one of the extensions doesn't `yield`.
825833
# (There's another implementation that uses multiple-return, but I'm wary of the perf cost of the extra arrays)
826-
extended = ExtendedState.new
827-
extended.arguments = args # rubocop:disable Development/ContextIsPassedCop
828-
extended.object = obj
834+
extended = ExtendedState.new(args, obj)
829835
value = run_extensions_before_resolve(obj, args, ctx, extended) do |obj, args|
830836
if (added_extras = extended.added_extras)
831837
args = args.dup
@@ -835,7 +841,7 @@ def with_extensions(obj, args, ctx)
835841
end
836842

837843
extended_obj = extended.object
838-
extended_args = extended.arguments
844+
extended_args = extended.arguments # rubocop:disable Development/ContextIsPassedCop
839845
memos = extended.memos || EMPTY_HASH
840846

841847
ctx.schema.after_lazy(value) do |resolved_value|

0 commit comments

Comments
 (0)