Skip to content

Commit

Permalink
Add load_all modification
Browse files Browse the repository at this point in the history
  • Loading branch information
ManuelHentschel committed Nov 10, 2020
1 parent 1274577 commit 06623a6
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 17 deletions.
2 changes: 2 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ export(.vsc.listen)
export(.vsc.listenForDAP)
export(.vsc.listenForJSON)
export(.vsc.listenOnPort)
export(.vsc.load_all)
export(.vsc.message)
export(.vsc.onError)
export(.vsc.preBreakpoint)
export(.vsc.preDebugSourceBreakpoint)
export(.vsc.print)
export(.vsc.refreshBreakpoints)
export(.vsc.str)
useDynLib(vscDebugger,c_get_ppid)
useDynLib(vscDebugger,c_is_promise)
Expand Down
9 changes: 7 additions & 2 deletions R/breakpoints.R
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ setBreakpoints <- function(
unsetBreakpoints=FALSE,
includeAllPackages=FALSE,
additionalEnvs=list(),
stackFrames=list()
stackFrames=list(),
inNormalEnvs=TRUE
){
if(includeAllPackages){
lastenv <- emptyenv()
Expand All @@ -23,7 +24,11 @@ setBreakpoints <- function(

# find line numbers in functions
# might return multiple refs
refs <- findLineNum(path, line, nameonly = FALSE, lastenv = lastenv)
if(inNormalEnvs){
refs <- findLineNum(path, line, nameonly = FALSE, lastenv = lastenv)
} else{
refs <- list()
}

# find line number in additional envs (= debugged packages)
for(env in additionalEnvs){
Expand Down
63 changes: 48 additions & 15 deletions R/breakpointsManagement.R
Original file line number Diff line number Diff line change
Expand Up @@ -28,38 +28,38 @@ setBreakpointsRequest <- function(response, args, request){
}


setStoredBreakpoints <- function(){
setStoredBreakpoints <- function(envs=NULL){
session$sourceBreakpointsList <- lapply(
session$sourceBreakpointsList,
setSourceBreakpoints
setSourceBreakpoints,
envs=envs
)
}

setSourceBreakpoints <- function(sbps, oldSbps=NULL){
setSourceBreakpoints <- function(sbps, oldSbps=NULL, envs=NULL){
if(!session$noDebug){
# get options
includeAllPackages <- session$setBreakpointsInPackages
additionalEnvs <- lapply(session$debuggedPackages, getNamespace)
tmp <- lapply(session$debuggedPackages, function(pkg) {
as.environment(paste0('package:', pkg))
})
additionalEnvs <- c(additionalEnvs, tmp)
if(getOption('vsc.setBreakpointsInStack', TRUE)){
externalFrames <- getExternalFrames()
stackFrames <- lapply(externalFrames, sys.frame)
if(is.null(envs)){
# get additional envs
inNormalEnvs <- TRUE
tmp <- getBreakpointEnvs()
additionalEnvs <- tmp$packageEnvs
stackFrames <- tmp$stackFrames
} else{
inNormalEnvs <- FALSE
additionalEnvs <- envs
stackFrames <- list()
}


# remove old bps
if(!is.null(oldSbps)){
setBreakpoints(
oldSbps,
unsetBreakpoints = TRUE,
includeAllPackages = includeAllPackages,
additionalEnvs = additionalEnvs,
stackFrames = stackFrames
stackFrames = stackFrames,
inNormalEnvs = inNormalEnvs
)
}

Expand All @@ -69,12 +69,45 @@ setSourceBreakpoints <- function(sbps, oldSbps=NULL){
unsetBreakpoints = FALSE,
includeAllPackages = includeAllPackages,
additionalEnvs = additionalEnvs,
stackFrames = stackFrames
stackFrames = stackFrames,
inNormalEnvs = inNormalEnvs
)
}
return(sbps)
}

getBreakpointEnvs <- function(){
pkgNamespaces <- lapply(session$debuggedPackages, getNamespace)
pkgExports <- lapply(session$debuggedPackages, function(pkg) {
as.environment(paste0('package:', pkg))
})
packageEnvs <- c(pkgNamespaces, pkgExports)
for(env in session$breakpointEnvironments){
# check if env is still attached?
packageEnvs <- c(packageEnvs, list(env))
}
if(getOption('vsc.setBreakpointsInStack', TRUE)){
externalFrames <- getExternalFrames()
stackFrames <- lapply(externalFrames, sys.frame)
} else{
stackFrames <- list()
}
return(list(
packageEnvs = packageEnvs,
stackFrames = stackFrames
))
}

storeBreakpointEnv <- function(...){
for(env in list(...)){
session$breakpointEnvironments <- c(
session$breakpointEnvironments,
list(env)
)
}
}


storeSourceBreakpoints <- function(sbps){
for(i in rev(seq_along(session$sourceBreakpointsList))){
oldSbps <- session$sourceBreakpointsList[[i]]
Expand Down
1 change: 1 addition & 0 deletions R/global.R
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ session <- local({
rootNode <- NULL
sourceBreakpointsList <- list()
sources <- list()
breakpointEnvironments <- list()


# lock and return the environment:
Expand Down
7 changes: 7 additions & 0 deletions R/launch.R
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,10 @@ configurationDoneRequest <- function(response, args, request){
attachList$source <- .vsc.debugSource
}

if (isInstalled('pkgload')){
attachList$load_all <- .vsc.load_all
}

# attach functions
if(length(attachList)>0){
attach(attachList, name = session$rStrings$attachName, warn.conflicts = FALSE)
Expand All @@ -282,6 +286,9 @@ configurationDoneRequest <- function(response, args, request){
onexit = TRUE
)

# disable just-in-time compilation (messes with source info etc.)
compiler::enableJIT(0)

# send response before launching main/debugSource!
ret <- sendResponse(response)

Expand Down
31 changes: 31 additions & 0 deletions R/overwrites.R
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,34 @@ printToVsc <- function(ret, skipCalls=0, category="stdout", showSource=TRUE){

sendOutputEvent(category, output = output, line=line, source=source)
}




#' Refresh Breakpoints
#'
#' Refresh breakpoints known to the debugger
#' Can be used if breakpoints were invalidated by e.g. `load_all()` or `source()`
#' @export
.vsc.refreshBreakpoints <- function(envs=NULL){
setStoredBreakpoints(envs)
}


#' Modified version of `pkgload::load_all()`
#' @export
.vsc.load_all <- function(...){
if(isInstalled('pkgload')){
ret <- pkgload::load_all(...)
ns <- ret$env
s <- format(ns)
pkgName <- substring(s, 25, nchar(s)-1)
exports <- as.environment(paste0('package:', pkgName))
storeBreakpointEnv(ns, exports)
.vsc.refreshBreakpoints(list(ns, exports))
} else{
NULL
}
}


6 changes: 6 additions & 0 deletions R/utils.R
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,9 @@ avoidLazyLoading <- function(package){
}
invisible(NULL)
}



isInstalled <- function(pkg){
pkg %in% rownames(installed.packages())
}
1 change: 1 addition & 0 deletions d.ts/global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export interface Session {
rootNode: StackTree.RootNode;
sourceBreakpointsList: Breakpoints.SourceBreakpoints[];
sources: InternalSource[];
breakpointEnvironments: REnvironment[];
}

export type BaseState = "starting"|"loadLib"|"sourceMain"|"runMain"|"runFile"|"workspace"|"quitting"|"attached"|"detached";
Expand Down
11 changes: 11 additions & 0 deletions man/dot-vsc.load_all.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions man/dot-vsc.refreshBreakpoints.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 06623a6

Please # to comment.