Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions gems/aws-sdk-core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Unreleased Changes
------------------

* Feature - Reduce memory usage of loaded service APIs by allocating shape metadata Hashes on first write.

3.264.0 (2026-11-04)
------------------

Expand Down
12 changes: 6 additions & 6 deletions gems/aws-sdk-core/lib/seahorse/model/shapes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module Shapes
class ShapeRef

def initialize(options = {})
@metadata = {}
@metadata = nil
@required = false
@deprecated = false
@location = nil
Expand Down Expand Up @@ -84,7 +84,7 @@ def location_name= location_name

# Gets metadata for the given `key`.
def [](key)
if @metadata.key?(key.to_s)
if @metadata&.key?(key.to_s)
@metadata[key.to_s]
elsif @shape
@shape[key.to_s]
Expand All @@ -93,15 +93,15 @@ def [](key)

# Sets metadata for the given `key`.
def []=(key, value)
@metadata[key.to_s] = value
(@metadata ||= {})[key.to_s] = value
end

end

class Shape

def initialize(options = {})
@metadata = {}
@metadata = nil
options.each_pair do |key, value|
if respond_to?("#{key}=")
send("#{key}=", value)
Expand All @@ -122,12 +122,12 @@ def initialize(options = {})

# Gets metadata for the given `key`.
def [](key)
@metadata[key.to_s]
@metadata && @metadata[key.to_s]
end

# Sets metadata for the given `key`.
def []=(key, value)
@metadata[key.to_s] = value
(@metadata ||= {})[key.to_s] = value
end

end
Expand Down
6 changes: 6 additions & 0 deletions gems/aws-sdk-core/spec/seahorse/model/shapes_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ module Shapes
expect(ref['key']).to eq('value')
end

it 'returns nil for metadata that was never set' do
expect(ShapeRef.new[:key]).to be(nil)
expect(ShapeRef.new(shape: Shape.new)[:key]).to be(nil)
expect(Shape.new[:key]).to be(nil)
end

it 'can be populated via .new' do
shape = double('shape')
ref = ShapeRef.new(
Expand Down