Skip to content

Commit

Permalink
Fix getproperty invalidation in ray_julia_jll (#132)
Browse files Browse the repository at this point in the history
* Fix `getproperty` invalidation in ray_julia_jll

* Add comment explaining how generated code can be used
  • Loading branch information
omus committed Sep 20, 2023
1 parent e8eda3b commit 9a12fed
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 28 deletions.
28 changes: 12 additions & 16 deletions ray_julia_jll/src/expr.jl
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
function _enum_getproperty_expr(base_type::Type, members)
body = Expr(:if, :(field === $(QuoteNode(members[1]))), members[1], nothing)
function _enum_symbol_constructor_expr(base_type::Type, members)
base_type_sym = nameof(base_type)
body = Expr(:if, :(member === $(QuoteNode(members[1]))), members[1], nothing)
ex = body
for member in members[2:end]
ex.args[3] = Expr(:elseif, :(field === $(QuoteNode(member))), member, nothing)
ex.args[3] = Expr(:elseif, :(member === $(QuoteNode(member))), member, nothing)
ex = ex.args[3]
end
ex.args[3] = :(Base.getfield($(nameof(base_type)), field))
ex.args[3] = :(throw(ArgumentError("$($base_type_sym) has no member named: $member")))


return quote
function Base.getproperty(::Type{$(nameof(base_type))}, field::Symbol)
function $base_type_sym(member::Symbol)
$body
end
end
end

function _enum_propertynames_expr(base_type::Type, members)
public_properties = Expr(:tuple, QuoteNode.(members)...)
private_properties = Expr(:tuple,
QuoteNode.(members)...,
QuoteNode.(fieldnames(typeof(base_type)))...)
function _enum_instances_expr(base_type::Type, members)
base_type_sym = nameof(base_type)
members_tuple = Expr(:tuple, members...)

return quote
function Base.propertynames(::Type{$(nameof(base_type))}, private::Bool=false)
if private
$private_properties
else
$public_properties
end
function Base.instances(::Type{$base_type})
return $members_tuple
end
end
end
Expand Down
22 changes: 10 additions & 12 deletions ray_julia_jll/src/wrappers/any.jl
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,21 @@ const STATUS_CODE_SYMBOLS = (:OK,
:OutOfResource,
:ObjectRefEndOfStream)

@eval begin
$(_enum_getproperty_expr(StatusCode, STATUS_CODE_SYMBOLS))
$(_enum_propertynames_expr(StatusCode, STATUS_CODE_SYMBOLS))
end

const LANGUAGE_SYMBOLS = (:PYTHON, :JAVA, :CPP, :JULIA)
const WORKER_TYPE_SYMBOLS = (:WORKER, :DRIVER, :SPILL_WORKER, :RESTORE_WORKER)

# Generate the following methods for our wrapped enum types:
# - A constructor allowing you to create a value via a `Symbol` (e.g. `StatusCode(:OK)`).
# - A `instances` method allowing you to get a list of all enum values (e.g. `instances(StatusCode)`)
@eval begin
$(_enum_getproperty_expr(Language, LANGUAGE_SYMBOLS))
$(_enum_propertynames_expr(Language, LANGUAGE_SYMBOLS))
end
$(_enum_symbol_constructor_expr(StatusCode, STATUS_CODE_SYMBOLS))
$(_enum_instances_expr(StatusCode, STATUS_CODE_SYMBOLS))

const WORKER_TYPE_SYMBOLS = (:WORKER, :DRIVER, :SPILL_WORKER, :RESTORE_WORKER)
$(_enum_symbol_constructor_expr(Language, LANGUAGE_SYMBOLS))
$(_enum_instances_expr(Language, LANGUAGE_SYMBOLS))

@eval begin
$(_enum_getproperty_expr(WorkerType, WORKER_TYPE_SYMBOLS))
$(_enum_propertynames_expr(WorkerType, WORKER_TYPE_SYMBOLS))
$(_enum_symbol_constructor_expr(WorkerType, WORKER_TYPE_SYMBOLS))
$(_enum_instances_expr(WorkerType, WORKER_TYPE_SYMBOLS))
end

function check_status(status::Status)
Expand Down

0 comments on commit 9a12fed

Please sign in to comment.