shell-wrapper.js (6857B)
1 // |jit-test| 2 // Test shell ModuleObject wrapper's accessors and methods 3 4 load(libdir + "asserts.js"); 5 6 function testGetter(obj, name) { 7 // Check the getter is defined on the instance, instead of prototype. 8 // * raw ModuleObject's getters are defined on prototype 9 // * ModuleObject wrapper's getters are defined on instance 10 const desc = Object.getOwnPropertyDescriptor(obj, name); 11 assertEq(typeof desc.get, "function"); 12 assertEq(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), name), 13 undefined); 14 15 // Check invalid this value. 16 assertThrowsInstanceOf(() => { 17 desc.get.call({}); 18 }, Error); 19 } 20 21 // ==== namespace getter ==== 22 const a = registerModule('a', parseModule(` 23 export const v = 10; 24 `)); 25 const b = registerModule('b', parseModule(` 26 import * as ns from 'a' 27 `)); 28 moduleLink(b); 29 moduleEvaluate(b); 30 assertEq(a.namespace.v, 10); 31 testGetter(a, "namespace"); 32 33 // ==== status getter ==== 34 const c = registerModule('c', parseModule(` 35 `)); 36 assertEq(c.status, "New"); 37 moduleLink(c); 38 assertEq(c.status, "Linked"); 39 moduleEvaluate(c); 40 assertEq(c.status, "Evaluated"); 41 testGetter(c, "status"); 42 43 // ==== evaluationError getter ==== 44 const d = registerModule('d', parseModule(` 45 f(); 46 `)); 47 moduleLink(d); 48 moduleEvaluate(d).catch(e => undefined); 49 drainJobQueue(); 50 assertEq(d.evaluationError instanceof ReferenceError, true); 51 testGetter(d, "evaluationError"); 52 53 // ==== requestedModules getter ==== 54 const e = parseModule(` 55 import a from 'b'; 56 `); 57 assertEq(e.requestedModules.length, 1); 58 assertEq(e.requestedModules[0].moduleRequest.specifier, 'b'); 59 assertEq(e.requestedModules[0].moduleRequest.moduleType, 'js'); 60 assertEq(e.requestedModules[0].lineNumber, 2); 61 assertEq(e.requestedModules[0].columnNumber, 15); 62 testGetter(e, "requestedModules"); 63 testGetter(e.requestedModules[0], "moduleRequest"); 64 testGetter(e.requestedModules[0].moduleRequest, "specifier"); 65 testGetter(e.requestedModules[0].moduleRequest, "moduleType"); 66 testGetter(e.requestedModules[0], "lineNumber"); 67 testGetter(e.requestedModules[0], "columnNumber"); 68 69 const e1 = parseModule(` 70 import a from 'b' with {type: 'json'}; 71 `); 72 assertEq(e1.requestedModules.length, 1); 73 assertEq(e1.requestedModules[0].moduleRequest.specifier, 'b'); 74 assertEq(e1.requestedModules[0].moduleRequest.moduleType, 'json'); 75 assertEq(e1.requestedModules[0].moduleRequest.firstUnsupportedAttributeKey, null); 76 assertEq(e1.requestedModules[0].lineNumber, 2); 77 assertEq(e1.requestedModules[0].columnNumber, 15); 78 testGetter(e1, "requestedModules"); 79 testGetter(e1.requestedModules[0], "moduleRequest"); 80 testGetter(e1.requestedModules[0].moduleRequest, "specifier"); 81 testGetter(e1.requestedModules[0].moduleRequest, "moduleType"); 82 testGetter(e1.requestedModules[0], "lineNumber"); 83 testGetter(e1.requestedModules[0], "columnNumber"); 84 85 const e2 = parseModule(` 86 import a from 'b' with {type: 'cpp', foo: 'bar'}; 87 `); 88 assertEq(e2.requestedModules.length, 1); 89 assertEq(e2.requestedModules[0].moduleRequest.specifier, 'b'); 90 assertEq(e2.requestedModules[0].moduleRequest.moduleType, 'unknown'); 91 assertEq(e2.requestedModules[0].moduleRequest.firstUnsupportedAttributeKey, 'foo'); 92 testGetter(e2, "requestedModules"); 93 testGetter(e2.requestedModules[0], "moduleRequest"); 94 testGetter(e2.requestedModules[0].moduleRequest, "specifier"); 95 testGetter(e2.requestedModules[0].moduleRequest, "moduleType"); 96 testGetter(e2.requestedModules[0].moduleRequest, "firstUnsupportedAttributeKey"); 97 98 // ==== importEntries getter ==== 99 const f = parseModule(` 100 import {a as A} from 'b'; 101 `); 102 assertEq(f.importEntries.length, 1); 103 assertEq(f.importEntries[0].moduleRequest.specifier, 'b'); 104 assertEq(f.importEntries[0].importName, 'a'); 105 assertEq(f.importEntries[0].localName, 'A'); 106 assertEq(f.importEntries[0].lineNumber, 2); 107 assertEq(f.importEntries[0].columnNumber, 9); 108 testGetter(f, "importEntries"); 109 testGetter(f.importEntries[0], "moduleRequest"); 110 testGetter(f.importEntries[0].moduleRequest, "specifier"); 111 testGetter(f.importEntries[0], "importName"); 112 testGetter(f.importEntries[0], "localName"); 113 testGetter(f.importEntries[0], "lineNumber"); 114 testGetter(f.importEntries[0], "columnNumber"); 115 116 // ==== localExportEntries getter ==== 117 const g = parseModule(` 118 export const v = 1; 119 `); 120 assertEq(g.localExportEntries.length, 1); 121 assertEq(g.localExportEntries[0].exportName, 'v'); 122 assertEq(g.localExportEntries[0].moduleRequest, null); 123 assertEq(g.localExportEntries[0].importName, null); 124 assertEq(g.localExportEntries[0].localName, 'v'); 125 assertEq(g.localExportEntries[0].lineNumber, 0); 126 assertEq(g.localExportEntries[0].columnNumber, 1); 127 testGetter(g, "localExportEntries"); 128 testGetter(g.localExportEntries[0], "exportName"); 129 testGetter(g.localExportEntries[0], "moduleRequest"); 130 testGetter(g.localExportEntries[0], "importName"); 131 testGetter(g.localExportEntries[0], "localName"); 132 testGetter(g.localExportEntries[0], "lineNumber"); 133 testGetter(g.localExportEntries[0], "columnNumber"); 134 135 // ==== indirectExportEntries getter ==== 136 const h = parseModule(` 137 export {v} from "b"; 138 `); 139 assertEq(h.indirectExportEntries.length, 1); 140 assertEq(h.indirectExportEntries[0].exportName, 'v'); 141 assertEq(h.indirectExportEntries[0].moduleRequest.specifier, "b"); 142 assertEq(h.indirectExportEntries[0].importName, "v"); 143 assertEq(h.indirectExportEntries[0].localName, null); 144 assertEq(h.indirectExportEntries[0].lineNumber, 2); 145 assertEq(h.indirectExportEntries[0].columnNumber, 9); 146 147 // ==== starExportEntries getter ==== 148 const i = parseModule(` 149 export * from "b"; 150 `); 151 assertEq(i.starExportEntries.length, 1); 152 assertEq(i.starExportEntries[0].exportName, null); 153 assertEq(i.starExportEntries[0].moduleRequest.specifier, "b"); 154 assertEq(i.starExportEntries[0].importName, null); 155 assertEq(i.starExportEntries[0].localName, null); 156 assertEq(i.starExportEntries[0].lineNumber, 2); 157 assertEq(i.starExportEntries[0].columnNumber, 8); 158 159 // ==== dfsAncestorIndex getter ==== 160 const j = registerModule('j', parseModule(` 161 export const v1 = 10; 162 import {v2} from 'k' 163 `)); 164 const k = registerModule('k', parseModule(` 165 export const v2 = 10; 166 import {v1} from 'j' 167 `)); 168 const l = registerModule('l', parseModule(` 169 export const v3 = 10; 170 import {v2} from 'k' 171 import {v1} from 'j' 172 `)); 173 assertEq(j.dfsAncestorIndex, undefined); 174 assertEq(k.dfsAncestorIndex, undefined); 175 assertEq(l.dfsAncestorIndex, undefined); 176 moduleLink(l); 177 assertEq(j.dfsAncestorIndex, 1); 178 assertEq(k.dfsAncestorIndex, 1); 179 assertEq(l.dfsAncestorIndex, 0); 180 181 // ==== async and promises getters ==== 182 const m = parseModule(` 183 `); 184 assertEq(m.hasTopLevelAwait, false); 185 assertEq(m.topLevelCapability, undefined); 186 assertEq(m.asyncEvaluationOrder, -1); 187 assertEq(m.asyncParentModules[0], undefined); 188 assertEq(m.pendingAsyncDependencies, undefined); 189 testGetter(m, "hasTopLevelAwait"); 190 testGetter(m, "topLevelCapability"); 191 testGetter(m, "asyncEvaluationOrder"); 192 testGetter(m, "asyncParentModules"); 193 testGetter(m, "pendingAsyncDependencies");