Skip to content

Commit 470e1de

Browse files
authored
Improve global value metadata accessors. (#513)
1 parent 0fb87a9 commit 470e1de

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/core/metadata.jl

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,9 @@ metadata(::Union{Instruction, GlobalObject})
250250
MD_section_prefix = 20,
251251
MD_absolute_symbol = 21,
252252
MD_associated = 22)
253-
MDKind(name::String) = API.LLVMGetMDKindIDInContext(context(), name, length(name))
253+
MDKind(name::String) = MDKind(API.LLVMGetMDKindIDInContext(context(), name, length(name)))
254254
MDKind(kind::MDKind) = kind
255255

256-
# XXX: automatically converting string keys to MDKind is too automagical
257-
258256
# instructions (using MetadataAsValue values)
259257

260258
# TODO: doesn't actually iterate, since we can't list the available keys
@@ -325,6 +323,23 @@ end
325323
Base.setindex!(md::GlobalMetadataDict, node::Metadata, key) =
326324
API.LLVMGlobalSetMetadata(md.val, MDKind(key), node)
327325

326+
Base.get(md::GlobalMetadataDict, key, default) = get(md, MDKind(key), default)
327+
function Base.get(md::GlobalMetadataDict, key::MDKind, default)
328+
for (k, v) in md
329+
if k == key
330+
return v
331+
end
332+
end
333+
return default
334+
end
335+
336+
Base.haskey(md::GlobalMetadataDict, key) = get(md, key, nothing) !== nothing
337+
function Base.getindex(md::GlobalMetadataDict, key)
338+
val = get(md, key, nothing)
339+
val === nothing && throw(KeyError(key))
340+
return val
341+
end
342+
328343
Base.delete!(md::GlobalMetadataDict, key) =
329344
API.LLVMGlobalEraseMetadata(md.val, MDKind(key))
330345

test/core_tests.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -797,13 +797,20 @@ end
797797
alignment!(fn, 4)
798798
@test alignment(fn) == 4
799799

800-
@test isempty(metadata(fn))
801800
str = MDString("bar")
802801
md = MDNode([str])
802+
@test isempty(metadata(fn))
803+
@test !haskey(metadata(fn), "foo")
804+
@test_throws KeyError metadata(fn)["foo"]
803805
metadata(fn)["foo"] = md
804806
@test !isempty(metadata(fn))
805-
# XXX: keyset contains raw MDKinds
807+
@test haskey(metadata(fn), "foo")
808+
@test metadata(fn)["foo"] == md
806809
@test collect(values(metadata(fn))) == [md]
810+
delete!(metadata(fn), "foo")
811+
@test isempty(metadata(fn))
812+
metadata(fn)["foo"] = md
813+
@test !isempty(metadata(fn))
807814
empty!(metadata(fn))
808815
@test isempty(metadata(fn))
809816
end

0 commit comments

Comments
 (0)