| 2142 | } |
| 2143 | |
| 2144 | txID fxResolveSpecifier(txMachine* the, txSlot* realm, txID moduleID, txSlot* name) |
| 2145 | { |
| 2146 | if (moduleID == XS_NO_ID) { |
| 2147 | if (realm == mxModuleInstanceInternal(mxProgram.value.reference)->value.module.realm) { |
| 2148 | moduleID = fxFindModule(the, realm, XS_NO_ID, name); |
| 2149 | if (moduleID == XS_NO_ID) { |
| 2150 | fxToStringBuffer(the, name, the->nameBuffer, sizeof(the->nameBuffer)); |
| 2151 | mxReferenceError("module \"%s\" not found", the->nameBuffer); |
| 2152 | } |
| 2153 | } |
| 2154 | else { |
| 2155 | if (name->kind == XS_STRING_X_KIND) |
| 2156 | moduleID = fxNewNameX(the, name->value.string); |
| 2157 | else |
| 2158 | moduleID = fxNewName(the, name); |
| 2159 | } |
| 2160 | } |
| 2161 | else { |
| 2162 | txSlot* resolveHook = mxResolveHook(realm); |
| 2163 | while (mxIsUndefined(resolveHook)) { |
| 2164 | txSlot* parent = mxRealmParent(realm); |
| 2165 | if (mxIsReference(parent)) { |
| 2166 | realm = parent->value.reference; |
| 2167 | resolveHook = mxResolveHook(realm); |
| 2168 | } |
| 2169 | else |
| 2170 | break; |
| 2171 | } |
| 2172 | if (mxIsUndefined(resolveHook)) { |
| 2173 | mxCheck(the, realm == mxModuleInstanceInternal(mxProgram.value.reference)->value.module.realm); |
| 2174 | moduleID = fxFindModule(the, realm, moduleID, name); |
| 2175 | if (moduleID == XS_NO_ID) { |
| 2176 | fxToStringBuffer(the, name, the->nameBuffer, sizeof(the->nameBuffer)); |
| 2177 | mxReferenceError("module \"%s\" not found", the->nameBuffer); |
| 2178 | } |
| 2179 | } |
| 2180 | else { |
| 2181 | mxPushUndefined(); |
| 2182 | mxPushSlot(resolveHook); |
| 2183 | mxCall(); |
| 2184 | mxPushSlot(name); |
| 2185 | fxPushKeyString(the, moduleID, C_NULL); |
| 2186 | mxRunCount(2); |
| 2187 | moduleID = fxToID(the, the->stack); |
| 2188 | mxPop(); |
| 2189 | } |
| 2190 | } |
| 2191 | name->kind = XS_SYMBOL_KIND; |
| 2192 | name->value.symbol = moduleID; |
| 2193 | return moduleID; |
| 2194 | } |
| 2195 | |
| 2196 | void fxImport(txMachine* the) |
| 2197 | { |
no test coverage detected