OSDN Git Service

Modify the 'of' method on the base.js
authordhrname <dhrname@users.sourceforge.jp>
Thu, 11 May 2017 14:32:03 +0000 (23:32 +0900)
committerdhrname <dhrname@users.sourceforge.jp>
Thu, 11 May 2017 14:32:03 +0000 (23:32 +0900)
org/w3c/dom/smil.js
tool/Spec/spec/BaseJSSpec.js
tool/Spec/spec/SvgDomSpec.js
tool/funcproto/base.js

index 32368cc..7751d08 100644 (file)
@@ -502,7 +502,7 @@ base("$frame").mix ( {
       /*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
index f8064dc..c091eee 100644 (file)
@@ -420,8 +420,7 @@ describe("base.js", function() {
       } ).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
@@ -492,7 +491,7 @@ describe("base.js", function() {
       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
@@ -529,7 +528,31 @@ describe("base.js", function() {
       }).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
index 8d60316..9235fe8 100644 (file)
@@ -897,6 +897,7 @@ describe("SMIL Animation Spec", function() {
       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
@@ -931,7 +932,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -939,7 +940,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -949,7 +950,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -958,7 +959,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -969,7 +970,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -978,7 +979,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -987,7 +988,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -996,7 +997,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1007,7 +1008,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1016,7 +1017,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1025,7 +1026,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1037,7 +1038,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1046,7 +1047,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1056,13 +1057,13 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1071,7 +1072,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1079,7 +1080,7 @@ describe("SMIL Animation Spec", function() {
         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
@@ -1107,7 +1108,7 @@ describe("SMIL Animation Spec", function() {
         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
index 466b9e0..4be5ec4 100644 (file)
@@ -141,7 +141,7 @@ var _base = {
       },\r
 \r
       /*__argsと__appプロパティは後のofメソッドで使う*/\r
-      __args: null,\r
+      __args: [],\r
       __app: null,\r
 \r
       /*ofメソッド\r
@@ -155,8 +155,8 @@ var _base = {
           /*再代入禁止*/\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
@@ -164,11 +164,12 @@ var _base = {
               /*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
@@ -179,6 +180,9 @@ var _base = {
         return this;\r
        },\r
 \r
+      /*callメソッドが呼び出されたかどうか*/\r
+      __isCallByBASE: false,\r
+      \r
       /*callメソッド\r
        * ofメソッドで指定されているオブジェクトのcallメソッドを実行できるメソッド\r
        * そのさい、オブジェクトのプロパティとメソッドは、自動で実行展開される\r
@@ -186,30 +190,29 @@ var _base = {
        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