prof.js
ECMAScript 262-5th based JavaScript
       Dynamic TypeSystem.
 with Trace and Profiling functions
function mm_each(data, // @arg Object/Function/Array/Hash: data
                 fn) { // @arg Function: callback function
                       // @help: mm.each
                       // @desc: each object
//{@debug
    mm.allow(data, "Object/Function/Array/Hash");
    mm.allow(fn,   "Function");
//}@debug

    typeof data.each === "function" ? data.each(fn)
                                    : Object_each(data, fn);
}
function mm_each(data, // @arg Object/Function/Array/Hash: data
                 fn) { // @arg Function: callback function
                       // @help: mm.each
                       // @desc: each object
//{@debug
// mm.allow(data, "Object/Function/Array/Hash");
// mm.allow(fn,    "Function");
//}@debug

    typeof data.each === "function" ? data.each(fn)
                                    : Object_each(data, fn);
}




//{@debug
prof.add(
    "mm.each(data:Object/Function/Array/Hash, fn:Function"
);
//}@debug
Aspect-Oriented Programming)
•
    –
    –
    –
    –
        •
        •
•
    –
•
    –
mm.each = function() {
    switch (引数の数) {
    case 3: mm.allow(arguments[2], "2番目の引数の型");
    case 2: mm.allow(arguments[1], "1番目の引数の型");
    case 1: mm.allow(arguments[0], "0番目の引数の型");
    }
    console.group("関数名");

     var now = Date.now();
     var rv = org_mm_each.apply(mm, arguments);
     _tm[path].time += (Date.now() - now);
     _tm[path].count++;

     console.groupEnd();
     mm.allow(rv, "戻り値の型");
     return rv;
};
mm.each = function() {
    switch (引数の数) {
    case 3: mm.allow(arguments[2], "2番目の引数の型");
    case 2: mm.allow(arguments[1], "1番目の引数の型");
    case 1: mm.allow(arguments[0], "0番目の引数の型");
    }
    console.group("関数名");

     var now = Date.now();
     var rv = org_mm_each.apply(mm, arguments);
     _tm[path].time += (Date.now() - now);
     _tm[path].count++;

     console.groupEnd();
     mm.allow(rv, "戻り値の型");
     return rv;
};
mm.each = function() {
    switch (引数の数) {
    case 3: mm.allow(arguments[2], "2番目の引数の型");
    case 2: mm.allow(arguments[1], "1番目の引数の型");
    case 1: mm.allow(arguments[0], "0番目の引数の型");
    }
    console.group("関数名");

     var now = Date.now();
     var rv = org_mm_each.apply(mm, arguments);
     _tm[path].time += (Date.now() - now);
     _tm[path].count++;

     console.groupEnd();
     mm.allow(rv, "戻り値の型");
     return rv;
};
mm.each = function() {
    switch (引数の数) {
    case 3: mm.allow(arguments[2], "2番目の引数の型");
    case 2: mm.allow(arguments[1], "1番目の引数の型");
    case 1: mm.allow(arguments[0], "0番目の引数の型");
    }
    console.group("関数名");

     var now = Date.now();
     var rv = org_mm_each.apply(mm, arguments);
     _tm[path].time += (Date.now() - now);
     _tm[path].count++;

     console.groupEnd();
     mm.allow(rv, "戻り値の型");
     return rv;
};
•
    –
    –
•
      –
      –

// ライブラリ(lib)のAPIの型情報を登録
prof.add(
    'lib.fn1()',
    'lib.fn2(a:Integer/String = ",", b:Object):Object',
    'lib.fn3(...:Mix):Array',
    'lib.fn4(a:Mix):Boolean'
);
// ネイティブオブジェクトの動的な型チェックも可能
prof.add(
    'String#hoge(a:Mix,b:Mix,c:Mix):String'
);
<script src="debug/prof.js"></script>
<script src="mm.js"></script>
<!-- mm.js は
  mm.allow で動的な型チェックを使う場合に必要 -->

<script>
prof.add("…");
</script>
• mofmof.js
   – http://code.google.com/p/mofmof-js/


• prof.js
   – http://code.google.com/p/mofmof-
     js/source/browse/trunk/js_src/debug/prof.js

Prof.js

  • 1.
    prof.js ECMAScript 262-5th basedJavaScript Dynamic TypeSystem. with Trace and Profiling functions
  • 11.
    function mm_each(data, //@arg Object/Function/Array/Hash: data fn) { // @arg Function: callback function // @help: mm.each // @desc: each object //{@debug mm.allow(data, "Object/Function/Array/Hash"); mm.allow(fn, "Function"); //}@debug typeof data.each === "function" ? data.each(fn) : Object_each(data, fn); }
  • 13.
    function mm_each(data, //@arg Object/Function/Array/Hash: data fn) { // @arg Function: callback function // @help: mm.each // @desc: each object //{@debug // mm.allow(data, "Object/Function/Array/Hash"); // mm.allow(fn, "Function"); //}@debug typeof data.each === "function" ? data.each(fn) : Object_each(data, fn); } //{@debug prof.add( "mm.each(data:Object/Function/Array/Hash, fn:Function" ); //}@debug
  • 15.
  • 17.
    – – – – • • • – • –
  • 18.
    mm.each = function(){ switch (引数の数) { case 3: mm.allow(arguments[2], "2番目の引数の型"); case 2: mm.allow(arguments[1], "1番目の引数の型"); case 1: mm.allow(arguments[0], "0番目の引数の型"); } console.group("関数名"); var now = Date.now(); var rv = org_mm_each.apply(mm, arguments); _tm[path].time += (Date.now() - now); _tm[path].count++; console.groupEnd(); mm.allow(rv, "戻り値の型"); return rv; };
  • 19.
    mm.each = function(){ switch (引数の数) { case 3: mm.allow(arguments[2], "2番目の引数の型"); case 2: mm.allow(arguments[1], "1番目の引数の型"); case 1: mm.allow(arguments[0], "0番目の引数の型"); } console.group("関数名"); var now = Date.now(); var rv = org_mm_each.apply(mm, arguments); _tm[path].time += (Date.now() - now); _tm[path].count++; console.groupEnd(); mm.allow(rv, "戻り値の型"); return rv; };
  • 20.
    mm.each = function(){ switch (引数の数) { case 3: mm.allow(arguments[2], "2番目の引数の型"); case 2: mm.allow(arguments[1], "1番目の引数の型"); case 1: mm.allow(arguments[0], "0番目の引数の型"); } console.group("関数名"); var now = Date.now(); var rv = org_mm_each.apply(mm, arguments); _tm[path].time += (Date.now() - now); _tm[path].count++; console.groupEnd(); mm.allow(rv, "戻り値の型"); return rv; };
  • 21.
    mm.each = function(){ switch (引数の数) { case 3: mm.allow(arguments[2], "2番目の引数の型"); case 2: mm.allow(arguments[1], "1番目の引数の型"); case 1: mm.allow(arguments[0], "0番目の引数の型"); } console.group("関数名"); var now = Date.now(); var rv = org_mm_each.apply(mm, arguments); _tm[path].time += (Date.now() - now); _tm[path].count++; console.groupEnd(); mm.allow(rv, "戻り値の型"); return rv; };
  • 22.
    – –
  • 23.
    – – // ライブラリ(lib)のAPIの型情報を登録 prof.add( 'lib.fn1()', 'lib.fn2(a:Integer/String = ",", b:Object):Object', 'lib.fn3(...:Mix):Array', 'lib.fn4(a:Mix):Boolean' ); // ネイティブオブジェクトの動的な型チェックも可能 prof.add( 'String#hoge(a:Mix,b:Mix,c:Mix):String' );
  • 24.
    <script src="debug/prof.js"></script> <script src="mm.js"></script> <!--mm.js は mm.allow で動的な型チェックを使う場合に必要 --> <script> prof.add("…"); </script>
  • 25.
    • mofmof.js – http://code.google.com/p/mofmof-js/ • prof.js – http://code.google.com/p/mofmof- js/source/browse/trunk/js_src/debug/prof.js