Skip to content

Commit

Permalink
Merge pull request #96 from eddelbuettel/feature/update_dot_call
Browse files Browse the repository at this point in the history
Update a bazillion .Call() to use unquoted 'registered' form (closes #86)
  • Loading branch information
eddelbuettel committed Dec 9, 2023
2 parents db3c796 + 4d0d802 commit e52ec7c
Show file tree
Hide file tree
Showing 34 changed files with 266 additions and 303 deletions.
3 changes: 3 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
* .github/workflows/alpine.yaml: Add container-based continuous
integration test to permit test under newer Protocol Buffers

* R/*.R: Update numerous .Call() to switch to unquoted expression
given symbol registration of the compiled functions

2023-07-12 Matteo Gianella <matteo.gianella@polimi.it>

* src/RSourceTree.h: Code update also in case of protobuf version >= 22.x
Expand Down
71 changes: 35 additions & 36 deletions R/00classes.R
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ setClass( "ConnectionOutputStream", contains = "ZeroCopyOutputStream" )

# {{{ new
newProto <- function( descriptor, ... ){
message <- .Call( "newProtoMessage", descriptor, PACKAGE = "RProtoBuf" )
message <- .Call(newProtoMessage, descriptor)
update( message, ... )
message
}
Expand All @@ -116,14 +116,13 @@ P <- function( type, file ){
stop( "'type' should have exactly one element" )
}

desc <- .Call( "getProtobufDescriptor", type,
PACKAGE = "RProtoBuf" )
desc <- .Call(getProtobufDescriptor, type)
if( is.null( desc ) ){
# See if it is an extension
desc <- .Call("getExtensionDescriptor", type, PACKAGE="RProtoBuf")
desc <- .Call(getExtensionDescriptor, type)
if (is.null(desc)) {
# See if it is an enum
desc <- .Call("getEnumDescriptor", type, PACKAGE="RProtoBuf")
desc <- .Call(getEnumDescriptor, type)
if (is.null(desc)) {
stop( sprintf( "could not find descriptor for message type '%s' ", type ) )
}
Expand All @@ -137,7 +136,7 @@ P <- function( type, file ){
setMethod( "show", c( "Message" ), function(object){
tmp <- sprintf( "message of type '%s' with %d field%s set", object@type,
length(object), if (length(object) == 1) "" else "s" )
nexts <- .Call("Message__num_extensions", object@pointer, PACKAGE="RProtoBuf")
nexts <- .Call(Message__num_extensions, object@pointer)
if (nexts > 0) {
tmp <- paste(tmp, sprintf("and %d extension%s", nexts, if (nexts == 1) "" else "s"))
}
Expand Down Expand Up @@ -172,9 +171,9 @@ setMethod("$", "Message", function(x, name) {

switch( name,
"has" = function( ... ) has(x, ...),
"clone" = function( ... ) .Call( "Message__clone" , x@pointer, PACKAGE = "RProtoBuf"),
"isInitialized" = function() .Call( "Message__is_initialized", x@pointer, PACKAGE = "RProtoBuf"),
"descriptor" = function() .Call( "Message__descriptor" , x@pointer, PACKAGE = "RProtoBuf"),
"clone" = function( ... ) .Call(Message__clone , x@pointer),
"isInitialized" = function() .Call(Message__is_initialized, x@pointer),
"descriptor" = function() .Call(Message__descriptor , x@pointer),

"size" = function(field, ...) size(x, field, ... ),
"bytesize" = function() bytesize(x),
Expand Down Expand Up @@ -202,11 +201,11 @@ setMethod("$", "Message", function(x, name) {
"fileDescriptor" = function() fileDescriptor(x ),

# default
.Call( "getMessageField", x@pointer, name, PACKAGE = "RProtoBuf" )
.Call(getMessageField, x@pointer, name)
)
} )
setMethod("$<-", "Message", function(x, name, value) {
.Call( "setMessageField", x@pointer, name, value, PACKAGE = "RProtoBuf" )
.Call(setMessageField, x@pointer, name, value)
x
} )

Expand All @@ -233,7 +232,7 @@ setMethod("$", "Descriptor", function(x, name) {


# default
.Call( "do_dollar_Descriptor", x@pointer, name, PACKAGE="RProtoBuf")
.Call(do_dollar_Descriptor, x@pointer, name)
)
} )
setMethod( "$", "EnumDescriptor", function(x, name ){
Expand All @@ -250,7 +249,7 @@ setMethod( "$", "EnumDescriptor", function(x, name ){
"value" = function(...) value(x, ...),
"has" = function(name, ...) has(x, name, ...),
# default
.Call( "get_value_of_enum", x@pointer, name, PACKAGE = "RProtoBuf" )
.Call(get_value_of_enum, x@pointer, name)
)
} )
setMethod( "$", "FieldDescriptor", function(x, name ){
Expand Down Expand Up @@ -289,7 +288,7 @@ setMethod( "$", "ServiceDescriptor", function(x, name ){
"method_count" = function() method_count(x),
"method" = function(...) method(x, ... ),

.Call( "ServiceDescriptor__method", x@pointer, name, PACKAGE = "RProtoBuf" )
.Call(ServiceDescriptor__method, x@pointer, name)
)
} )

Expand Down Expand Up @@ -402,7 +401,7 @@ setMethod( "[[", "Message", function(x, i, j, ..., exact = TRUE){

## This works correctly by number or name. e.g. p[[1]] or p[["name"]]
if( is.character( i ) || is.numeric( i ) ){
.Call( "getMessageField", x@pointer, i, PACKAGE = "RProtoBuf" )
.Call(getMessageField, x@pointer, i)
} else {
stop( "wrong type, `i` should be a character or a number" )
}
Expand All @@ -419,7 +418,7 @@ setMethod( "[[", "Descriptor", function(x, i, j, ..., exact = TRUE){

if( is.character( i ) ) {
# gets a named field, nested type, or enum.
.Call("Descriptor_getField", x@pointer, i, PACKAGE="RProtoBuf")
.Call(Descriptor_getField, x@pointer, i)
} else if (is.numeric( i ) ) {
return(as.list(x)[[i]])
} else {
Expand Down Expand Up @@ -449,7 +448,7 @@ setMethod("[[", "ServiceDescriptor", function(x, i, j, ..., exact = TRUE){
warning( "`j` is ignored" )
}
if( is.character( i ) || is.numeric( i ) ){
.Call( "ServiceDescriptor__method", x@pointer, name, PACKAGE = "RProtoBuf" )
.Call( ServiceDescriptor__method, x@pointer, name )
} else{
stop( "wrong type, `i` should be a character or a number" )
}
Expand All @@ -473,7 +472,7 @@ function(x, i, j, ..., exact = TRUE, value ){
}

if( is.character( i ) || is.numeric( i ) ){
.Call( "setMessageField", x@pointer, i, value, PACKAGE = "RProtoBuf" )
.Call( setMessageField, x@pointer, i, value )
} else {
stop( "wrong type, `i` should be a character or a number" )
}
Expand All @@ -496,7 +495,7 @@ setMethod( "update", "Message", function( object, ... ){
if( !length( named ) ){
return( object )
}
.Call( "update_message", object@pointer, named, PACKAGE="RProtoBuf")
.Call( update_message, object@pointer, named)
object

} )
Expand All @@ -505,7 +504,7 @@ setMethod( "update", "Message", function( object, ... ){
# {{{ length
setGeneric( "length" )
setMethod( "length", "Message", function( x ){
.Call( "Message__length", x@pointer, PACKAGE = "RProtoBuf" )
.Call( Message__length, x@pointer )
} )
# Returns number of fields, enums, types in message descriptor.
# May be more than field_count which is only fields.
Expand All @@ -514,10 +513,10 @@ setMethod( "length", "Descriptor", function( x ){
length(as.list(x))
} )
setMethod( "length", "EnumDescriptor", function( x ){
.Call( "EnumDescriptor__length", x@pointer, PACKAGE = "RProtoBuf" )
.Call( EnumDescriptor__length, x@pointer )
} )
setMethod( "length", "ServiceDescriptor", function( x ){
.Call( "ServiceDescriptor_method_count", x@pointer, PACKAGE = "RProtoBuf" )
.Call( ServiceDescriptor_method_count, x@pointer )
} )
# }}}

Expand All @@ -539,31 +538,31 @@ setGeneric( "name", function(object, full = FALSE){
})
setMethod( "name", c( object = "Descriptor" ) ,
function(object, full = FALSE){
.Call( "Descriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" )
.Call( Descriptor__name, object@pointer, full )
})
setMethod( "name", c( object = "FieldDescriptor" ) ,
function(object, full = FALSE){
.Call( "FieldDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" )
.Call( FieldDescriptor__name, object@pointer, full )
})
setMethod( "name", c( object = "EnumDescriptor" ) ,
function(object, full = FALSE){
.Call( "EnumDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" )
.Call( EnumDescriptor__name, object@pointer, full )
})
setMethod( "name", c( object = "EnumValueDescriptor" ) ,
function(object, full = FALSE){
.Call( "EnumDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" )
.Call( EnumDescriptor__name, object@pointer, full )
})
setMethod( "name", c( object = "ServiceDescriptor" ) ,
function(object, full = FALSE){
.Call( "ServiceDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" )
.Call( ServiceDescriptor__name, object@pointer, full )
})
setMethod( "name", c( object = "MethodDescriptor" ) ,
function(object, full = FALSE){
.Call( "MethodDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" )
.Call( MethodDescriptor__name, object@pointer, full )
})
setMethod( "name", c( object = "FileDescriptor" ) ,
function(object, full = FALSE){
filename <- .Call( "FileDescriptor__name", object@pointer, PACKAGE = "RProtoBuf" )
filename <- .Call( FileDescriptor__name, object@pointer )
if( full ) filename else basename( filename )
})
# }}}
Expand All @@ -587,25 +586,25 @@ function(x){

# {{{ as
setAs("Descriptor", "Message", function(from){
.Call( "Descriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( Descriptor__as_Message, from@pointer )
})
setAs("FieldDescriptor", "Message", function(from){
.Call( "FieldDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( FieldDescriptor__as_Message, from@pointer )
})
setAs("EnumDescriptor", "Message", function(from){
.Call( "EnumDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( EnumDescriptor__as_Message, from@pointer )
})
setAs("ServiceDescriptor", "Message", function(from){
.Call( "ServiceDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( ServiceDescriptor__as_Message, from@pointer )
})
setAs("MethodDescriptor", "Message", function(from){
.Call( "MethodDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( MethodDescriptor__as_Message, from@pointer )
})
setAs("FileDescriptor", "Message", function(from){
.Call( "FileDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( FileDescriptor__as_Message, from@pointer )
})
setAs("EnumValueDescriptor", "Message", function(from){
.Call( "EnumValueDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" )
.Call( EnumValueDescriptor__as_Message, from@pointer )
})
asMessage <- function( x, ... ){
as( x, "Message", ... )
Expand Down
7 changes: 3 additions & 4 deletions R/add.R
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ setGeneric( "add", function(object, field, values){
standardGeneric( "add" )
} )
setMethod( "add", "Message", function( object, field, values ){

if( is( values, "Message" ) ){
values <- list( values )
}
.Call( "Message__add_values", object@pointer, field, values, PACKAGE = "RProtoBuf" )

.Call( Message__add_values, object@pointer, field, values )
invisible( object )
} )

14 changes: 7 additions & 7 deletions R/aslist.R
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
as.list.Message <- function( x, ...){
.Call( "Message__as_list", x@pointer, PACKAGE = "RProtoBuf" )
.Call(Message__as_list, x@pointer)
}
as.list.Descriptor <- function(x, ...){
# Fields, then nested types, then enum types defined in the message
# are returned in a list.
.Call( "Descriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" )
# Fields, then nested types, then enum types defined in the message
# are returned in a list.
.Call(Descriptor__as_list, x@pointer)
}
as.list.EnumDescriptor <- function( x, ...){
.Call( "EnumDescriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" )
.Call(EnumDescriptor__as_list, x@pointer)
}
as.list.FileDescriptor <- function( x, ...){
.Call( "FileDescriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" )
.Call(FileDescriptor__as_list, x@pointer)
}
as.list.ServiceDescriptor <- function( x, ...){
.Call( "ServiceDescriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" )
.Call(ServiceDescriptor__as_list, x@pointer)
}
11 changes: 5 additions & 6 deletions R/clear.R
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,26 @@ setGeneric( "clear", function(object, field, ...){
standardGeneric( "clear" )
} )
setMethod( "clear", signature( "Message", "missing" ), function(object, field, ...){
.Call( "Message__clear", object@pointer, PACKAGE = "RProtoBuf" )
.Call( Message__clear, object@pointer )
invisible( object )
} )

setMethod( "clear", signature( "Message", "character" ), function(object, field, ...){
.Call( "Message__clear_field", object@pointer, field, PACKAGE = "RProtoBuf" )
.Call( Message__clear_field, object@pointer, field )
invisible( object )
} )

setMethod( "clear", signature( "Message", "integer" ), function(object, field, ...){
.Call( "Message__clear_field", object@pointer, field, PACKAGE = "RProtoBuf" )
.Call( Message__clear_field, object@pointer, field )
invisible( object )
} )

setMethod( "clear", signature( "Message", "numeric" ), function(object, field, ...){
.Call( "Message__clear_field", object@pointer, as.integer(field), PACKAGE = "RProtoBuf" )
.Call( Message__clear_field, object@pointer, as.integer(field) )
invisible( object )
} )

setMethod( "clear", signature( "Message", "raw" ), function(object, field, ...){
.Call( "Message__clear_field", object@pointer, as.integer(field), PACKAGE = "RProtoBuf" )
.Call( Message__clear_field, object@pointer, as.integer(field) )
invisible( object )
} )

3 changes: 1 addition & 2 deletions R/clone.R
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ setGeneric( "clone", function( object, ... ){
standardGeneric( "clone" )
} )
._clone.message <- function( object, ... ){
message <- .Call( "Message__clone", object@pointer, PACKAGE="RProtoBuf")
message <- .Call(Message__clone, object@pointer)
update( message, ... )
message
}
setMethod( "clone", "Message", ._clone.message )

0 comments on commit e52ec7c

Please sign in to comment.