| function CanBeConstructed(f) { |
| var caught = false; |
| try { |
| new f; |
| } catch (e) { |
| caught = true; |
| } |
| return !caught; |
| } |
| |
| function IsConstructedFunction(f) { |
| return f.hasOwnProperty('length') |
| && f.hasOwnProperty('name') |
| && f.hasOwnProperty('prototype') |
| && f.prototype.hasOwnProperty('constructor') |
| && f.prototype.constructor === f; |
| } |
| |
| function IsntConstructedFunction(f) { |
| return !f.hasOwnProperty('length') |
| && !f.hasOwnProperty('name') |
| && !f.hasOwnProperty('prototype') |
| } |
| |
| var m = function() { |
| "use asm" |
| function g(){} |
| return g; |
| }; |
| assertEq(CanBeConstructed(m), true, "asm.js modules can't be constructed"); |
| |
| var objM = new m; |
| assertEq(IsConstructedFunction(objM), true); |
| |
| var g = m(); |
| assertEq(CanBeConstructed(g), true, "asm.js functions can't be constructed"); |
| // g is a ctor returning an primitive value, thus an empty object |
| assertEq(Object.getOwnPropertyNames(new g).length, 0); |
| |
| var n = function() { |
| "use asm" |
| function g(){return 42.0} |
| function h(){return 42} |
| return { |
| g: g, |
| h: h |
| }; |
| }; |
| assertEq(CanBeConstructed(n), true, "asm.js modules can't be constructed"); |
| |
| var objN = new n; |
| // objN is an object with attributes g and h |
| assertEq(IsntConstructedFunction(objN), true); |
| assertEq(objN.hasOwnProperty('g'), true); |
| assertEq(objN.hasOwnProperty('h'), true); |
| |
| assertEq(IsConstructedFunction(objN.g), true); |
| assertEq(IsConstructedFunction(objN.h), true); |
| |
| var h = n().h; |
| assertEq(CanBeConstructed(h), true, "asm.js functions can't be constructed"); |
| // h is a ctor returning an primitive value, thus an empty object |
| assertEq(Object.getOwnPropertyNames(new h).length, 0); |
| |
| assertEq(typeof(function() {"use asm"; return {}}.prototype) !== 'undefined', true); |