# Copyright (C) 1995-2013 The R Core Team ## this should be kept in step with code in R/lazyload.R .Internal(eval(quote({ ..lazyLoad <- function(filebase, envir = parent.frame()) { ## ## bootstrapping definitions so we can load base ## glue <- function (..., sep = " ", collapse = NULL) .Internal(paste(list(...), sep, collapse)) readRDS <- function (file) { halt <- function (message) .Internal(stop(TRUE, message)) gzfile <- function (description, open) .Internal(gzfile(description, open, "", 6)) close <- function (con) .Internal(close(con, "rw")) if (! is.character(file)) halt("bad file name") con <- gzfile(file, "rb") on.exit(close(con)) .Internal(unserializeFromConn(con, baseenv())) } `parent.env<-` <- function (env, value) .Internal(`parent.env<-`(env, value)) existsInFrame <- function (x, env) .Internal(exists(x, env, "any", FALSE)) getFromFrame <- function (x, env) .Internal(get(x, env, "any", FALSE)) set <- function (x, value, env) .Internal(assign(x, value, env, FALSE)) environment <- function () .Internal(environment(NULL)) mkenv <- function() .Internal(new.env(TRUE, baseenv(), 29L)) ## ## main body ## mapfile <- glue(filebase, "rdx", sep = ".") datafile <- glue(filebase, "rdb", sep = ".") env <- mkenv() map <- readRDS(mapfile) vars <- names(map$variables) rvars <- names(map$references) compressed <- map$compressed for (i in seq_along(rvars)) set(rvars[i], map$references[[i]], env) envenv <- mkenv() envhook <- function(n) { if (existsInFrame(n, envenv)) getFromFrame(n, envenv) else { e <- mkenv() set(n, e, envenv) # MUST do this immediately key <- getFromFrame(n, env) data <- lazyLoadDBfetch(key, datafile, compressed, envhook) ## comment from r41494 ## modified the loading of old environments, so that those ## serialized with parent.env NULL are loaded with the ## parent.env=emptyenv(); and yes an alternative would have been ## baseenv(), but that was seldom the intention of folks that ## set the environment to NULL. if (is.null(data$enclos)) parent.env(e) <- emptyenv() else parent.env(e) <- data$enclos vars <- names(data$bindings) for (i in seq_along(vars)) set(vars[i], data$bindings[[i]], e) if (! is.null(data$attributes)) attributes(e) <-data$attributes if (! is.null(data$isS4) && data$isS4) .Call("R_setS4Object", e, TRUE, TRUE, PACKAGE = "base") if (! is.null(data$locked) && data$locked) .Internal(lockEnvironment(e, FALSE)) e } } expr <- quote(lazyLoadDBfetch(key, datafile, compressed, envhook)) this <- environment() .Internal(makeLazy(vars, map$variables, expr, this, envir)) ## reduce memory use map <- NULL vars <- NULL rvars <- NULL mapfile <- NULL readRDS <- NULL } existsInBase <- function (x) .Internal(exists(x, .BaseNamespaceEnv, "any", TRUE)) glue <- function (..., sep = " ", collapse = NULL) .Internal(paste(list(...), sep, collapse)) basedb <- glue(.Internal(R.home()), "library", "base", "R", "base", sep= .Platform$file.sep) ..lazyLoad(basedb, baseenv()) }), .Internal(new.env(FALSE, baseenv(), 29L)), baseenv())) ## keep in sync with R/zzz.R as.numeric <- as.double is.name <- is.symbol