| 1 | #!/usr/bin/env Rscript
 | 
| 2 | #
 | 
| 3 | # bytecode.R -- Analyze output of opyc dis-tables.
 | 
| 4 | #
 | 
| 5 | # Usage:
 | 
| 6 | #   bytecode.R ACTION IN_DIR OUT_DIR
 | 
| 7 | 
 | 
| 8 | library(dplyr)
 | 
| 9 | library(tidyr)  # spread()
 | 
| 10 | library(stringr)
 | 
| 11 | 
 | 
| 12 | source('benchmarks/common.R')
 | 
| 13 | 
 | 
| 14 | options(stringsAsFactors = F,
 | 
| 15 |         # Make the report wide.  tibble.width doesn't appear to do this?
 | 
| 16 |         width=200,
 | 
| 17 |         tibble.print_max=40
 | 
| 18 | )
 | 
| 19 | 
 | 
| 20 | Report = function(ctx) {
 | 
| 21 |   Banner('Summary of methods.tsv:')
 | 
| 22 |   ctx$methods %>% count(used) %>% arrange(desc(n)) -> f0
 | 
| 23 |   ShowFrame('Methods used:', f0)
 | 
| 24 | 
 | 
| 25 |   ctx$methods %>% filter(used == T) %>% count(file) %>% arrange(desc(n)) -> f1
 | 
| 26 |   ShowFrame('Methods by file (after filtering):', f1)
 | 
| 27 |   ShowValue('Kept %d of %d methods in %d files', sum(ctx$methods$used),
 | 
| 28 |             nrow(ctx$methods), nrow(f1))
 | 
| 29 | 
 | 
| 30 |   ctx$methods %>% count(flags) %>% arrange(desc(n)) -> f2
 | 
| 31 |   ShowFrame('Methods by flag', f2)
 | 
| 32 | 
 | 
| 33 |   # libc.c and fastlex.c are mostly implemented.  posixmodule are just
 | 
| 34 |   # bindings?
 | 
| 35 |   ctx$methods %>%
 | 
| 36 |     filter(used == T) %>%
 | 
| 37 |     mutate(basename=basename(file)) %>%
 | 
| 38 |     filter(basename != 'libc.c' & basename != 'fastlex.c' &
 | 
| 39 |            basename != 'setobject.c' & basename != 'zipimport.c') %>%
 | 
| 40 |     filter(py_method_name != '__length_hint__') %>%
 | 
| 41 |     select(c(basename, py_method_name)) %>% 
 | 
| 42 |     arrange(basename, py_method_name) -> f3
 | 
| 43 |   ShowFrame('Methods to reimplement:', f3)
 | 
| 44 |   ShowValue('Total: %d methods', nrow(f3))
 | 
| 45 | }
 | 
| 46 | 
 | 
| 47 | Load = function(in_dir) {
 | 
| 48 |   list(
 | 
| 49 |     methods = read.table(
 | 
| 50 |       file.path(in_dir, 'methods.tsv'), sep='\t', header=T)
 | 
| 51 |   )
 | 
| 52 | }
 | 
| 53 | 
 | 
| 54 | main = function(argv) {
 | 
| 55 |   action = argv[[1]]
 | 
| 56 | 
 | 
| 57 |   if (action == 'metrics') {
 | 
| 58 |     in_dir = argv[[2]]
 | 
| 59 |     ctx = Load(in_dir)
 | 
| 60 |     Report(ctx)
 | 
| 61 | 
 | 
| 62 |   } else {
 | 
| 63 |     Log("Invalid action '%s'", action)
 | 
| 64 |     quit(status = 1)
 | 
| 65 |   }
 | 
| 66 | }
 | 
| 67 | 
 | 
| 68 | if (length(sys.frames()) == 0) {
 | 
| 69 |   # increase ggplot font size globally
 | 
| 70 |   #theme_set(theme_grey(base_size = 20))
 | 
| 71 |   main(commandArgs(TRUE))
 | 
| 72 | }
 |