@@ -24,47 +24,72 @@ setClassUnion("refGenerator", c("refObjectGenerator", "refClassGeneratorFunction
2424# # Stands in for a reference class with those fields.
2525setClass ( "Module ", contains = "environment" )
2626
27- setRefClass( " C++Field" ,
28- fields = list (
29- pointer = " externalptr" ,
30- cpp_class = " character" ,
31- read_only = " logical" ,
32- class_pointer = " externalptr" ,
27+ # # Plain S4 classes describing the fields, methods and constructors that a
28+ # # C++ class exposes. These used to be reference classes; creating one
29+ # # reference-class object per exposed method (via new()) dominated the
30+ # # time spent loading a module. A "$" method is provided below so that
31+ # # existing code using field-style access (x$pointer, x$info()) keeps working.
32+ setClass( " C++Field" ,
33+ representation(
34+ pointer = " externalptr" ,
35+ cpp_class = " character" ,
36+ read_only = " logical" ,
37+ class_pointer = " externalptr" ,
3338 docstring = " character"
3439 )
3540)
3641
37- setRefClass ( " C++OverloadedMethods" ,
38- fields = list (
39- pointer = " externalptr" ,
40- class_pointer = " externalptr" ,
41- size = " integer" ,
42+ setClass ( " C++OverloadedMethods" ,
43+ representation(
44+ pointer = " externalptr" ,
45+ class_pointer = " externalptr" ,
46+ size = " integer" ,
4247 void = " logical" ,
43- const = " logical" ,
44- docstrings = " character" ,
45- signatures = " character" ,
48+ const = " logical" ,
49+ docstrings = " character" ,
50+ signatures = " character" ,
4651 nargs = " integer"
47- ),
48- methods = list (
49- info = function (prefix = " " ){
50- paste(
51- paste( prefix , signatures , ifelse(const , " const" , " " ), " \n " , prefix , prefix ,
52- ifelse( nchar(docstrings ), paste( " docstring :" , docstrings ) , " " )
53- ) , collapse = " \n " )
54- }
5552 )
5653)
5754
58- setRefClass ( " C++Constructor" ,
59- fields = list (
60- pointer = " externalptr" ,
61- class_pointer = " externalptr" ,
62- nargs = " integer" ,
63- signature = " character" ,
55+ setClass ( " C++Constructor" ,
56+ representation(
57+ pointer = " externalptr" ,
58+ class_pointer = " externalptr" ,
59+ nargs = " integer" ,
60+ signature = " character" ,
6461 docstring = " character"
6562 )
6663)
6764
65+ # # formerly the 'info' reference method of C++OverloadedMethods
66+ .cpp_methods_info <- function ( x , prefix = " " ){
67+ paste(
68+ paste( prefix , x @ signatures , ifelse(x @ const , " const" , " " ), " \n " , prefix , prefix ,
69+ ifelse( nchar(x @ docstrings ), paste( " docstring :" , x @ docstrings ) , " " )
70+ ) , collapse = " \n " )
71+ }
72+
73+ # # backwards compatible field-style access
74+ setMethod ( "$ ", "C++OverloadedMethods", function(x, name){
75+ if ( identical( name , " info" ) )
76+ function ( prefix = " " ) .cpp_methods_info( x , prefix )
77+ else
78+ methods :: slot( x , name )
79+ } )
80+ setMethod ( "$ ", "C++Field", function(x, name) methods::slot( x, name ) )
81+ setMethod ( "$ ", "C++Constructor", function(x, name) methods::slot( x, name ) )
82+
83+ # # packages compiled against earlier versions of the Rcpp headers populate
84+ # # these objects with `$<-` (FieldProxy); keep those binaries loadable
85+ .slot_dollar_assign <- function (x , name , value ) {
86+ methods :: slot( x , name ) <- value
87+ x
88+ }
89+ setReplaceMethod ( "$ ", "C++OverloadedMethods", .slot_dollar_assign )
90+ setReplaceMethod ( "$ ", "C++Field", .slot_dollar_assign )
91+ setReplaceMethod ( "$ ", "C++Constructor", .slot_dollar_assign )
92+
6893setClass( " C++Class" ,
6994 representation(
7095 pointer = " externalptr" ,
0 commit comments