Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

関数のtrace

http://d.hatena.ne.jp/amachang/20070517/1179427742
http://blog.livedoor.jp/dankogai/archives/50833481.html
とかスマートだなあと思いつつ。
昔なんかやったよなあとか思ったらあった。
Kumuでコメントアウトにしてる部分だね。
元々AOPみたいなの作ってたんだな。
抜粋してちょっと直すとこんな感じ。

  beginTrace = function(args, func){  
    var funcstr = func.toString();
    var ret = funcstr.match(/[0-9A-Za-z_]+\(/).toString();
    ret = ret.substring(0,ret.length-1); 
    var str = "START function : ["+ret+"] : prameter : [";
    for(var i = 0; i < args.length; i++){
      str += args[i].toString();
      str += ' : ';
    }
    str += ']';
    try {
      var br = document.createElement("br");
      var span = document.createElement("span");
      document.body.appendChild(br);
      document.body.appendChild(span.appendChild(document.createTextNode(str)));
    } catch (e) {
    }
    return args;
  }

  endTrace = function(result, args, func){
    var funcstr = func.toString();
    var ret = funcstr.match(/[0-9A-Za-z_]+\(/).toString();
    ret = ret.substring(0,ret.length-1); 
    var str = "END function : ["+ret+"] : result : ["+result+"] : prameter : [";
    for(var i = 0; i < args.length; i++){
      str += args[i].toString();
      str += ' : ';
    }
    str += ']';
    try {
      var br = document.createElement("br");
      var span = document.createElement("span");
      document.body.appendChild(br);
      document.body.appendChild(span.appendChild(document.createTextNode(str)));
    } catch (e) {
    }
    return result;
  }
  
  addBefore = function(func, before) {
    var addfunc = function() {
      return func.apply(this, before(arguments, func));
    };
    addfunc.__proto__ = func;
    addfunc.toString = function() {
      return addfunc.__proto__.toString();
    };
    return addfunc;  
  }

  addAfter = function(func, after) {
    var addfunc = function() {
      return after(func.apply(this, arguments), arguments, func);
    };
    addfunc.__proto__ = func;
    addfunc.toString = function() {
      return addfunc.__proto__.toString();
    };
    return addfunc;  
  }

  addAround = function(func, around) {
    var addfunc = function() {
      return around(arguments, func);
    };
    addfunc.__proto__ = func;
    addfunc.toString = function() {
      return addfunc.__proto__.toString();
    };
    return addfunc;  
  }
  
  trace = function(target){
    if(typeof(target) == "function" ){
        obj = this.addBefore(target, this.beginTrace);
        obj = this.addAfter(obj, this.endTrace);
        target = obj;
        return target;
    }else{
      for(var i in target){
        var obj = target[i];
        if(typeof(obj) == "function" ){
          obj = this.addBefore(obj, this.beginTrace);
          obj = this.addAfter(obj, this.endTrace);
          target[i] = obj;
        }
      }
    }
  }
  
  Function.prototype.trace = function(){
    return trace(this);
  } 

使い方は同じ

function add(x,y){ return x + y }
add = add.trace('add');
add(1,1);

実行すると以下のようなログをbodyの後ろに追加で吐き出す

START function : [関数名] : prameter : [パラメータ番号:値]
END function : [関数名] : result : [実行結果] : [パラメータ番号:値]

さらにobjectを渡すとそのfunctionに関しても一括でtraceをかけれたりする。
まあこんなの長いし誰も見ないだろう。
うくく。