tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

function_subtyping.js (3176B)


      1 // Validate rules for function subtyping:
      2 // - Same number of parameters and results
      3 // - Function return types are covariant
      4 // - Function parameter types are contravariant
      5 wasmValidateText(
      6 `(module
      7    (type $A (sub (struct (field i32))))
      8    (type $B (sub $A (struct (field i32) (field i32))))
      9    (type $C (sub $B (struct (field i32) (field i32) (field i64))))
     10    (type $D (sub $B (struct (field i32) (field i32) (field f32))))
     11 
     12    ;; Same types (invariant)
     13    (type $func1 (sub (func (param (ref $A) (ref $A)) (result (ref $C)))))
     14    (type $func2 (sub $func1 (func (param (ref $A) (ref $A)) (result (ref $C)))))
     15 
     16    ;; Covariant return types are valid
     17    (type $func3 (sub (func (param (ref $A) (ref $A)) (result (ref $B)))))
     18    (type $func4 (sub $func3 (func (param (ref $A) (ref $A)) (result (ref $C)))))
     19    (type $func5 (sub (func (param (ref $A) (ref $A)) (result (ref $A) (ref $B)))))
     20    (type $func6 (sub $func5 (func (param (ref $A) (ref $A)) (result (ref $D) (ref $C)))))
     21 
     22    ;; Contravariant parameter types are valid
     23    (type $func7 (sub (func (param (ref $A) (ref $C)) (result (ref $C)))))
     24    (type $func8 (sub $func7 (func (param (ref $A) (ref $B)) (result (ref $C)))))
     25    (type $func9 (sub (func (param (ref $D) (ref $C)) (result (ref $C)))))
     26    (type $func10 (sub $func9 (func (param (ref $A) (ref $B)) (result (ref $C)))))
     27 
     28    ;; Mixing covariance and contravariance
     29    (type $func11 (sub (func (param (ref $D) (ref $C)) (result (ref $A)))))
     30    (type $func12 (sub $func11 (func (param (ref $A) (ref $B)) (result (ref $C)))))
     31 )
     32 `);
     33 
     34 // Validate that incorrect subtyping examples are failing as expected
     35 const typeError = /incompatible super type/;
     36 
     37 var code =`
     38 (module
     39    (type $A (struct (field i32)))
     40    (type $B (sub $A (struct (field i32) (field i32))))
     41    (type $C (sub $B (struct (field i32) (field i32) (field i64))))
     42    (type $D (sub $B (struct (field i32) (field i32) (field f32))))
     43 
     44    ;; Not the same number of arguments/results
     45    (type $func1 (func (param (ref $A) (ref $A)) (result (ref $C))))
     46    (type $func2 (sub $func1 (func (param (ref $A) (ref $A)) (result (ref $C) (ref $A)))))
     47 )`;
     48 
     49 wasmFailValidateText(code, typeError);
     50 
     51 code =`
     52 (module
     53    (type $A (sub (struct (field i32))))
     54    (type $B (sub $A (struct (field i32) (field i32))))
     55    (type $C (sub $B (struct (field i32) (field i32) (field i64))))
     56    (type $D (sub $B (struct (field i32) (field i32) (field f32))))
     57 
     58    ;; Contravariant result types are invalid
     59    (type $func3 (sub (func (param (ref $A) (ref $A)) (result (ref $C)))))
     60    (type $func4 (sub $func3 (func (param (ref $A) (ref $A)) (result (ref $A)))))
     61 )`;
     62 
     63 wasmFailValidateText(code, typeError);
     64 
     65 code =`
     66 (module
     67    (type $A (sub (struct (field i32))))
     68    (type $B (sub $A (struct (field i32) (field i32))))
     69    (type $C (sub $B (struct (field i32) (field i32) (field i64))))
     70    (type $D (sub $B (struct (field i32) (field i32) (field f32))))
     71 
     72    ;; Covariant parameters are invalid
     73    (type $func5 (sub (func (param (ref $A) (ref $A)) (result (ref $C)))))
     74    (type $func6 (sub $func5 (func (param (ref $B) (ref $A)) (result (ref $C)))))
     75 )`;
     76 
     77 wasmFailValidateText(code, typeError);