Open3

WebGL-Native: "use strict"; 対応

okuokuokuoku

eval の挙動が変わる問題

例えば、以下のようなコードは strict の有無で挙動が変わる:

//"use strict"; // ← ★ これを付けるかどうかでこのプログラムの挙動が変わる

function run(){
    var Boo = false;

    eval("var Boo = Boo; console.log(Boo)");
}

run(); // strictの場合 "undefined" 、そうでない場合は false となる

Schemeで言うと letreclet の挙動差だな。

Emscriptenはブラウザの <script> タグで実行されることを想定しているため、グローバル変数 Module が定義されている場合とされていない場合の両方を想定したコードとなっていて、そこでこの var テクニックを使用して オプショナルな Module 変数を受けいれるようになっている。

https://github.com/okuoku/cwgl-proto/commit/677ed3f8bf18e37d5964d66f544c8101feb8fee7

こういう時は function で囲って明示的に変数を渡してしまうのが早い。Schemeで言うと letlambda に変換しているようなもんだな。

Dead code elimination 対策

同じような事が、 "eval でしか消費されない変数" にも発生する。

Rollupは eval のためだけに定義した変数は、使用されていないと見做して定義を省略してしまう。↑ のコミットはそれにも対処している。

okuokuokuoku

プリミティブにプロパティを追加するとエラーになる

これ知らなかった。。strict modeでは整数やboolean値のようなプリミティブにはプロパティを追加しようとするとエラーになる。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode

第七に、ECMAScript 2015 の Strict モードでは、プリミティブ値にプロパティを設定することが禁止されます。

今までの実装では、WebGLのTexture等に生ポインタを使用していたため、Emscriptenのコードがこれに id を付与しようとした際に暗黙に失敗していた(はず)。

というわけでWebGLのオブジェクトは一旦JavaScript的なオブジェクトでwrapすることにした。

https://github.com/okuoku/cwgl-proto/commit/39851a23d122a2885b9e486390ef221e142fdc1a

@@ -466,27 +467,28 @@ function GL(w, h, attr){
         createFramebuffer: function(){
             let ptr0 = CWGL.cwgl_createFramebuffer(ctx);
             const ptr = wrapPointer(ptr0, framebufferfree);
-            return ptr;
+            const r = {ptr: ptr};
+            return r;
         },