}
-// hack for require.resolve("./relative") to work properly.
-module.filename = path.resolve('repl');
+try {
+ // hack for require.resolve("./relative") to work properly.
+ module.filename = path.resolve('repl');
+} catch (e) {
+ // path.resolve('repl') fails when the current working directory has been
+ // deleted. Fall back to the directory name of the (absolute) executable
+ // path. It's not really correct but what are the alternatives?
+ const dirname = path.dirname(process.execPath);
+ module.filename = path.resolve(dirname, 'repl');
+}
// hack for repl require to work properly with node_modules folders
module.paths = require('module')._nodeModulePaths(module.filename);
--- /dev/null
+var common = require('../common');
+var assert = require('assert');
+var fs = require('fs');
+var spawn = require('child_process').spawn;
+
+// Fails with EINVAL on SmartOS, EBUSY on Windows.
+if (process.platform === 'sunos' || process.platform === 'win32') {
+ console.log('1..0 # Skipped: cannot rmdir current working directory');
+ return;
+}
+
+var dirname = common.tmpDir + '/cwd-does-not-exist-' + process.pid;
+fs.mkdirSync(dirname);
+process.chdir(dirname);
+fs.rmdirSync(dirname);
+
+var proc = spawn(process.execPath, ['--interactive']);
+proc.stdout.pipe(process.stdout);
+proc.stderr.pipe(process.stderr);
+proc.stdin.write('require("path");\n');
+proc.stdin.write('process.exit(42);\n');
+
+proc.once('exit', common.mustCall(function(exitCode, signalCode) {
+ assert.equal(exitCode, 42);
+ assert.equal(signalCode, null);
+}));