/*beginとend属性を考慮に入れないで、活動継続時間を求める*/\r
var s = ( this.$activate = this.$activate.up() );\r
/*$endオブジェクトに付属している$listプロパティを更新したものと一致させておく*/\r
- s.end && (s.end.$list = this.$list);\r
+ s.end__ && (s.end__.$list = this.$list);\r
this.activeTime = this.$list.activeTime = s.call() || Number.MAX_VALUE;\r
this.simpleDuration = s.simpleDur;\r
return this;\r
} ).toThrow("No arguments error");\r
} );\r
});\r
- \r
- describe("an 'call' method", function() {\r
+ describe("a 'call' method", function() {\r
it("limit value analysis", function() {\r
expect(typeof base("$bfp").call).toBe("function");\r
expect(base("$bfp").call()).toBe(base("$bfp"));\r
expect(base("$cfp").up("$bfp").of({a:base("$bfp")}).call()).toBe(base("$cfp").$bfp);\r
\r
/*循環参照は防ぐようにする*/\r
- expect(base("$bfp").$b.up().of( {b: base("$bfp").$b.$1} ).call()).toBe(base("$bfp").$b.$1);\r
+ expect(base("$bfp").$b.up().of( {b: base("$bfp").$b.$1} ).call()).toBe(15);\r
\r
/*ofメソッドで指定されたfuncメソッドなどは、callメソッドで呼び出し時に実行される(thisはcallメソッドのレシーバ)*/\r
expect( base("$cfp").up("$a").of( {\r
}).toThrow();\r
} );\r
});\r
-\r
+ \r
+ describe("an 'initToEval' method", function() {\r
+ it("limit value analysis", function() {\r
+ base("$ifp").of(\r
+ {a: function(){return 1;}, b: base("$ifp"),\r
+ call: function() {return 2;}\r
+ }\r
+ ).initToEval();\r
+ expect(base("$ifp").a).toBeUndefined();\r
+ expect(base("$ifp").b).toBeUndefined();\r
+ expect(base("$ifp").b__).toBe(base("$ifp"));\r
+ base("$ifp").call();\r
+ expect(base("$ifp").a).toBe(1);\r
+ expect(base("$ifp").b).toBe(2);\r
+ expect(base("$ifp").b__).toBe(base("$ifp"));\r
+ base("$ifp").initToEval().mix( {a__: function(){return 2;}} );\r
+ expect(base("$ifp").a).toBe(1);\r
+ base("$ifp").call();\r
+ expect(base("$ifp").a).toBe(2);\r
+ expect(base("$ifp").b).toBe(2);\r
+ expect(base("$ifp").b__).toBe(base("$ifp"));\r
+ \r
+ } );\r
+ } );\r
+ \r
it("should occur an error, if no arguments", function(){\r
var message = "No arguments error";\r
expect(function(){\r
act.repeatDur = null;\r
act.end__ = act.$begin.$end;\r
act.simpleDur__ = base("$frame").$begin.$activate.simpleDur__;\r
+ act.initToEval();\r
} );\r
/*境界条件を調べておく (limit value analysis)*/\r
it("should be this for the value (limit value analysis)", function() {\r
repeatCount: null,\r
repeatDur: null\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(10000*act.fpms));\r
expect(act.$c.call()).toBe(act.$c.simpleDur);\r
act.$c.mix( {\r
repeatCount: null,\r
repeatDur: null\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(15000*act.fpms));\r
\r
/*AD = repeatCount*dur*/\r
repeatCount: 2,\r
repeatDur: null\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
act.$c.call();\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
act.$c.mix( {\r
repeatCount: 1,\r
repeatDur: null\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(10000*act.fpms));\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
\r
repeatCount: 2,\r
repeatDur: "15"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
act.$c.call();\r
expect(act.$c.simpleDur).toBeNull();\r
act.$c.mix( {\r
repeatCount: 2,\r
repeatDur: "10"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(10000*act.fpms));\r
expect(act.$c.simpleDur).toBeNull();\r
act.$c.mix( {\r
repeatCount: null,\r
repeatDur: "15"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
act.$c.call();\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
act.$c.mix( {\r
repeatCount: null,\r
repeatDur: "11"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(11000*act.fpms));\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
\r
repeatCount: 2,\r
repeatDur: "15"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
act.$c.call();\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
act.$c.mix( {\r
repeatCount: 1,\r
repeatDur: "15"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(10000*act.fpms));\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
act.$c.mix( {\r
repeatCount: 1,\r
repeatDur: "9"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(9000*act.fpms));\r
expect(act.$c.simpleDur).toBe(Math.floor(11000*act.fpms));\r
\r
repeatCount: null,\r
repeatDur: "15"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(15000*act.fpms));\r
expect(act.$c.simpleDur).toBe(Math.floor(10000*act.fpms));\r
act.$c.mix( {\r
repeatCount: 2,\r
repeatDur: "10"\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$c.initToEval();\r
expect(act.$c.call()).toBe(Math.floor(10000*act.fpms));\r
expect(act.$c.simpleDur).toBeNull();\r
\r
end: act.end,\r
repeatCount: 2\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$cd.initToEval();\r
expect(act.$cd.call()).toBe(Math.floor(10000*act.fpms) * 2);\r
\r
act.$cd.end__ = act.end__;\r
act.$cd.repeatCount = null;\r
act.$cd.repeatDur = "12";\r
- delete act.$c.end;\r
+ act.$cd.initToEval();\r
expect(act.$cd.call()).toBe(Math.floor(12000*act.fpms));\r
\r
act.up("$d").mix( {\r
dur: "1",\r
simpleDur__: act.simpleDur__\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$d.initToEval();\r
expect(act.$d.call()).toBe(Math.floor(2000*act.fpms));\r
act.up("$d").mix( {\r
min: "1",\r
dur: "12",\r
simpleDur__: act.simpleDur__\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$d.initToEval();\r
expect(act.$d.call()).toBe(Math.floor(2000*act.fpms));\r
\r
/*endで0が指定されている場合*/\r
dur: "1",\r
simpleDur__: act.simpleDur__\r
} );\r
- delete act.$c.simpleDur;\r
+ act.$d.initToEval();\r
expect(act.$d.call()).toBe(Math.floor(1000*act.fpms));\r
\r
act.repeatDur = null;\r
},\r
\r
/*__argsと__appプロパティは後のofメソッドで使う*/\r
- __args: null,\r
+ __args: [],\r
__app: null,\r
\r
/*ofメソッド\r
/*再代入禁止*/\r
throw new Error("Reset error");\r
}\r
- /*__appと__argsプロパティに、指定されたプロパティを記録しておく*/\r
- var args = this.__args || [];\r
+ /*__argsプロパティを新しい配列に再構成*/\r
+ var args = [].concat(this.__args || []);\r
var name;\r
for (var i in obj) {\r
if(obj.hasOwnProperty(i) && (i !== "call")) {\r
/*callメソッドを持っている場合は、obj.methodではなく、\r
* obj.method__に登録させる*/\r
name = i+ "__";\r
+ /*一度登録されたプロパティは二度書きしないようにする*/\r
+ args[i] || args.push(i);\r
+\r
} else {\r
name = i;\r
}\r
- /*一度登録されたプロパティは二度書きしないようにする*/\r
- args[i] || args.push(i);\r
args[i] = this[name] = obj[i];\r
}\r
}\r
return this;\r
},\r
\r
+ /*callメソッドが呼び出されたかどうか*/\r
+ __isCallByBASE: false,\r
+ \r
/*callメソッド\r
* ofメソッドで指定されているオブジェクトのcallメソッドを実行できるメソッド\r
* そのさい、オブジェクトのプロパティとメソッドは、自動で実行展開される\r
call: function() {\r
if (!this.__app) { //ofメソッドが呼び出されていないか、callメソッドが一度も設定されていない場合\r
return this;\r
+ } else if (this.hasOwnProperty("__isCallByBASE")) {\r
+ return this.__app.call.apply(this, arguments);\r
}\r
- var args = this.__args,\r
- call = this.call; //callメソッドの一時的なキャッシュ\r
- /*循環参照を避けるためcallメソッドの入れ替え*/\r
- this.call = this.callFunc;\r
+ this.__isCallByBASE = true;\r
+ var args = this.__args\r
for (var i=0, ali=args.length;i<ali;++i) {\r
/*callメソッドがあるオブジェクトは展開\r
* ただし、二度は展開しない*/\r
var ai = args[i];\r
- if (!this.hasOwnProperty(ai)) {\r
- var argi = this[ai+ "__"];\r
- if (argi && argi.call) {\r
- this[ai] = argi.call(this);\r
- }\r
- }\r
+ this[ai] = this[ai+ "__"].call(this);\r
}\r
- this.call = call;\r
- args = ai = argi = call = void 0;\r
+ args = ai = argi = void 0;\r
return this.__app.call.apply(this, arguments);\r
},\r
- callFunc: function() { return this; }\r
- },\r
+ callFunc: function() { return this; },\r
+ \r
+ /*評価の初期化。callメソッドを使うときに再評価ができる*/\r
+ initToEval: function() {\r
+ delete this.__isCallByBASE;\r
+ return this;\r
+ }\r
+ }\r
};\r
-\r
/*base関数でキャッシュとして使うオブジェクト*/\r
var baseCache = {};\r
\r