blob: d329cd322de4b01e0bf108fe51bd73fad08fa015 [file] [log] [blame]
# File src/library/methods/R/zzz.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2019 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
## Initial version of .onLoad
...onLoad <-
## Initialize the methods package.
function(libname, pkgname)
{
where <- environment(sys.function()) # the namespace
initMethodDispatch(where)
## temporary empty reference to the package's own namespace
assign(".methodsNamespace", new.env(), envir = where)
.Call(C_R_set_method_dispatch, TRUE)
cat("initializing class and method definitions ...")
op <- options(error = quote({ ## allow *some* debugging
utils::dump.frames("onLoad_init", to.file = TRUE, include.GlobalEnv=TRUE)
if(!interactive()) q(status = 1)
}))
on.exit(options(op))
## set up default prototype (uses .Call so has be at load time)
assign(".defaultPrototype", .Call(C_Rf_allocS4Object), envir = where)
assign(".SealedClasses", character(), envir = where)
.InitClassDefinition(where)
assign("possibleExtends", .possibleExtends, envir = where)
.InitBasicClasses(where)
.initClassSupport(where)
.InitMethodsListClass(where)
.setCoerceGeneric(where)
## now install the non-dummy versions of some functions
assign(".classEnv", ..classEnv, envir = where)
assign("makeGeneric", .makeGeneric, envir = where)
assign("newClassRepresentation", .newClassRepresentation, envir = where)
assign("classGeneratorFunction", .classGeneratorFunction, envir = where)
assign(".mergeClassDefSlots", ..mergeClassDefSlots, envir = where)
assign(".addToMetaTable", ..addToMetaTable, envir = where)
assign(".extendsForS3", ..extendsForS3, envir = where)
.makeBasicFuns(where)
rm(.makeGeneric, .newClassRepresentation, .possibleExtends,
..mergeClassDefSlots, .classGeneratorFunction, ..classEnv,
..addToMetaTable, ..extendsForS3,
.InitClassDefinition, .InitBasicClasses, .initClassSupport,
.InitMethodsListClass, .setCoerceGeneric, .makeBasicFuns,
envir = where)
.InitMethodDefinitions(where)
.InitShowMethods(where)
assign(".isPrototype", ..isPrototype, envir = where)
.InitClassUnion(where)
.InitS3Classes(where)
.InitSpecialTypesAndClasses(where)
.InitTraceFunctions(where)
.InitRefClasses(where)
## now seal the classes defined in the package
for(cl in get(".SealedClasses", where))
sealClass(cl, where)
assign("isSealedMethod", .isSealedMethod, envir = where)
assign(".requirePackage", ..requirePackage, envir = where)
## initialize implicit generics for base package
## Note that this is done before making a non-vacuous implicitGeneric()
## so that non-default signatures are allowed in setGeneric()
.initImplicitGenerics(where)
assign("implicitGeneric", .implicitGeneric, envir = where)
cacheMetaData(where, TRUE, searchWhere = .GlobalEnv, FALSE)
assign(".checkRequiredGenerics", ..checkRequiredGenerics, envir = where)
assign(".methodPackageSlots", ..methodPackageSlots, envir = where)
rm(..isPrototype, .isSealedMethod, ..requirePackage, .implicitGeneric,
..checkRequiredGenerics, ..methodPackageSlots, .envRefMethods,
.InitBasicClassMethods, .InitExtensions, .InitStructureMethods,
.InitMethodDefinitions, .InitShowMethods, .InitClassUnion,
.InitS3Classes, .InitSpecialTypesAndClasses, .InitTraceFunctions,
.InitRefClasses, .initImplicitGenerics,
envir = where)
## unlock some bindings that must be modifiable
unlockBinding(".BasicFunsList", where)
assign(".saveImage", TRUE, envir = where)
cat(" done\n")
assign("envRefMethodNames",
names(getClassDef("envRefClass")@refMethods), envir = where)
assign(".onLoad", ..onLoad, envir = where)
if(isTRUE(as.logical(Sys.getenv("_R_METHODS_DONT_CHECKSUBCLASSES", "false"))))
## change to a no-op -- later giving partly broken class hierarchies,
## e.g. in tests/reg-packages.R inherits(dd, "mM") became FALSE
assign(".checkSubclasses", function(...){}, envir = where)
rm(...onLoad, ..onLoad, envir = where)
dbbase <- file.path(libname, pkgname, "R", pkgname)
ns <- asNamespace(pkgname)
## we need to exclude the registration vars
vars <- grep("^C_", names(ns), invert = TRUE, value = TRUE)
tools:::makeLazyLoadDB(ns, dbbase, variables = vars)
}
## avoid warnings from static analysis code by extra call
.onLoad <- function(libname, pkgname) ...onLoad(libname, pkgname)
## .onLoad for routine use, installed by ...onLoad
..onLoad <- function(libname, pkgname)
{
where <- environment(sys.function()) # the namespace
initMethodDispatch(where)
.Call(C_R_set_method_dispatch, TRUE)
## initialize generics cache more thoroughly:
setPrimitiveMethods("$", `$`, code="reset", generic = getGeneric("$"), mlist = NULL)
assign(".methodsNamespace", where, where)
## assign to baseenv also, signalling methods loaded
assign(".methodsNamespace", where, baseenv())
## if(Sys.getenv("R_S4_BIND") == "active")
## bind_activation(TRUE)
}
.onUnload <- function(libpath)
{
message("unloading 'methods' package ...") # see when this is called
.isMethodsDispatchOn(FALSE)
## bind_activation(FALSE)
library.dynam.unload("methods", libpath)
}
.onAttach <- function(libname, pkgname)
{
env <- environment(sys.function())
## unlock some bindings that must be modifiable
unlockBinding(".BasicFunsList", env)
if(.hasS4MetaData(.GlobalEnv)) {
result <- try(cacheMetaData(.GlobalEnv, TRUE))
## still attach methods package if global env has bad objets
if(inherits(result, "try-error"))
warning("apparently bad method or class metadata in saved environment;\n",
"move the file or remove the class/method")
}
}
## Q: Why don't we unload "methods" on detach() ?
## A: Because the user chooses detach(*, unload= .), so detach() will unload if ..
## .onDetach <- function(libpath) { <nothing> }
## used for .methodsIsLoaded
.saveImage <- FALSE
## cheap dQuote(): want ASCII quotes, not fancy nor translated ones
.dQ <- function (x) paste0('"', x, '"')