babel-plugin-trace-execution

0.2.0 • Public • Published

babel-plugin-trace-execution

Trace execution context of JS functions

Turns

export default function binarySearch(list, item) {
  let low = 0;
  let high = list.length - 1;
 
  while (low <= high) {
    const mid = Math.round((low + high) / 2);
    const guess = list[mid];
 
    if (guess === item) {
      return mid;
    }
    if (guess > item) {
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
 
  return null;
}
 

into

const cloneDeep = require('lodash.clonedeep');
 
let __steps;
 
let __parentStepId;
 
let __lastStepId;
 
function __enterCall() {
  __parentStepId = __lastStepId;
}
 
function __leaveCall() {
  if (__parentStepId) {
    __lastStepId = __parentStepId;
    __parentStepId = __steps[__parentStepId].parentStepId;
  }
}
 
function __trace({
  step,
  enterCall,
  leaveCall
}) {
  if (enterCall) {
    __enterCall();
  }
 
  __steps.push({
    parentStepId: __parentStepId,
    ...step
  });
 
  __lastStepId = __steps.length - 1;
 
  if (leaveCall) {
    __leaveCall();
  }
}
 
function binarySearch(list, item) {
  __trace({
    step: {
      highlight: {
        start: 9,
        end: 33
      },
      bindings: {
        list: cloneDeep(list),
        item: cloneDeep(item)
      }
    },
    enterCall: true
  });
 
  let low = 0;
 
  __trace({
    step: {
      highlight: {
        start: 38,
        end: 50
      },
      bindings: {
        list: cloneDeep(list),
        item: cloneDeep(item),
        low: cloneDeep(low)
      }
    }
  });
 
  let high = list.length - 1;
 
  __trace({
    step: {
      highlight: {
        start: 53,
        end: 80
      },
      bindings: {
        list: cloneDeep(list),
        item: cloneDeep(item),
        low: cloneDeep(low),
        high: cloneDeep(high)
      }
    }
  });
 
  while ((() => {
    __trace({
      step: {
        highlight: {
          start: 91,
          end: 102
        },
        bindings: {
          list: cloneDeep(list),
          item: cloneDeep(item),
          low: cloneDeep(low),
          high: cloneDeep(high)
        },
        compared: ["low", "high"]
      }
    });
 
    return low <= high;
  })()) {
    const mid = Math.round((low + high) / 2);
 
    __trace({
      step: {
        highlight: {
          start: 110,
          end: 151
        },
        bindings: {
          list: cloneDeep(list),
          item: cloneDeep(item),
          low: cloneDeep(low),
          high: cloneDeep(high),
          mid: cloneDeep(mid)
        }
      }
    });
 
    const guess = list[mid];
 
    __trace({
      step: {
        highlight: {
          start: 156,
          end: 180
        },
        bindings: {
          list: cloneDeep(list),
          item: cloneDeep(item),
          low: cloneDeep(low),
          high: cloneDeep(high),
          mid: cloneDeep(mid),
          guess: cloneDeep(guess)
        }
      }
    });
 
    if ((() => {
      __trace({
        step: {
          highlight: {
            start: 190,
            end: 204
          },
          bindings: {
            list: cloneDeep(list),
            item: cloneDeep(item),
            low: cloneDeep(low),
            high: cloneDeep(high),
            mid: cloneDeep(mid),
            guess: cloneDeep(guess)
          },
          compared: ["guess", "item"]
        }
      });
 
      return guess === item;
    })()) {
      return (() => {
        const _uid = mid;
 
        __trace({
          step: {
            highlight: {
              start: 214,
              end: 225
            },
            bindings: {
              list: cloneDeep(list),
              item: cloneDeep(item),
              low: cloneDeep(low),
              high: cloneDeep(high),
              mid: cloneDeep(mid),
              guess: cloneDeep(guess)
            },
            returnValue: _uid
          },
          leaveCall: true
        });
 
        return _uid;
      })();
    }
    if ((() => {
      __trace({
        step: {
          highlight: {
            start: 240,
            end: 252
          },
          bindings: {
            list: cloneDeep(list),
            item: cloneDeep(item),
            low: cloneDeep(low),
            high: cloneDeep(high),
            mid: cloneDeep(mid),
            guess: cloneDeep(guess)
          },
          compared: ["guess", "item"]
        }
      });
 
      return guess > item;
    })()) {
      high = mid - 1;
 
      __trace({
        step: {
          highlight: {
            start: 262,
            end: 276
          },
          bindings: {
            list: cloneDeep(list),
            item: cloneDeep(item),
            low: cloneDeep(low),
            high: cloneDeep(high),
            mid: cloneDeep(mid),
            guess: cloneDeep(guess)
          }
        }
      });
    } else {
      low = mid + 1;
 
      __trace({
        step: {
          highlight: {
            start: 297,
            end: 310
          },
          bindings: {
            list: cloneDeep(list),
            item: cloneDeep(item),
            low: cloneDeep(low),
            high: cloneDeep(high),
            mid: cloneDeep(mid),
            guess: cloneDeep(guess)
          }
        }
      });
    }
  }
 
  return (() => {
    const _uid2 = null;
 
    __trace({
      step: {
        highlight: {
          start: 325,
          end: 337
        },
        bindings: {
          list: cloneDeep(list),
          item: cloneDeep(item),
          low: cloneDeep(low),
          high: cloneDeep(high)
        },
        returnValue: _uid2
      },
      leaveCall: true
    });
 
    return _uid2;
  })();
}
 
function __traceWrapper(...args) {
  __steps = [];
  __parentStepId = undefined;
  __lastStepId = undefined;
  const returnValue = binarySearch(...args);
  return {
    steps: __steps,
    returnValue: returnValue
  };
}
 
;
__traceWrapper.code = "function binarySearch(list, item) {\n  let low = 0;\n  let high = list.length - 1;\n\n  while (low <= high) {\n    const mid = Math.round((low + high) / 2);\n    const guess = list[mid];\n\n    if (guess === item) {\n      return mid;\n    }\n    if (guess > item) {\n      high = mid - 1;\n    } else {\n      low = mid + 1;\n    }\n  }\n\n  return null;\n}";
module.exports = __traceWrapper;

Dependencies (2)

Dev Dependencies (4)

Package Sidebar

Install

npm i babel-plugin-trace-execution

Weekly Downloads

2

Version

0.2.0

License

MIT

Last publish

Collaborators

  • skidding