型検査7

解析後の動作を関数化して渡す版。これで作ったbefore()をwrap()に渡せば少し軽くなる。

var makeBefore = function(original){
 var re = /function(?:\s+[a-z$_]+)?\s*\(\s*((?:[a-z$_]+\s*)(,\s*[a-z$_]+\s*)*)?\)/i;
 var str = original.toString().match(re)[1];//引数名を取り出す
 var types = [];
//
 if(str) {
  var argStrs = str.split(",");
  for(var i=0; i<argStrs.length; i++){
   var index = argStrs[i].indexOf("$");
   if(index>=0){
    types[types.length] = argStrs[i].substring(index+1,argStrs[i].length);//型を切り出す。
   } else {
    types[types.length] = null;//型がない場合はnull
   }
  }
 }
//
 return function(orig,args){
  for(var i=0; i<args.length; i++){
   if(types[i]!=null){
   var type = typeof(args[i]);
    if(type=='object'){
     if(! args[i] instanceof eval(types[i])){//型名と型の対応は実行時に付ける。
      throw "TypeError";
     }
    } else if(type==types[i]){
     throw "TypeError";
    }
   }
  }
  return;
 };
}