diff --git a/app/win/atom.rc b/app/win/atom.rc index 0d19056930c6..3a946e9494ae 100644 --- a/app/win/atom.rc +++ b/app/win/atom.rc @@ -50,8 +50,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,8,5,0 - PRODUCTVERSION 0,8,5,0 + FILEVERSION 0,8,7,0 + PRODUCTVERSION 0,8,7,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -68,12 +68,12 @@ BEGIN BEGIN VALUE "CompanyName", "GitHub, Inc." VALUE "FileDescription", "Atom-Shell" - VALUE "FileVersion", "0.8.5" + VALUE "FileVersion", "0.8.7" VALUE "InternalName", "atom.exe" VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved." VALUE "OriginalFilename", "atom.exe" VALUE "ProductName", "Atom-Shell" - VALUE "ProductVersion", "0.8.5" + VALUE "ProductVersion", "0.8.7" END END BLOCK "VarFileInfo" diff --git a/browser/api/atom_api_app.cc b/browser/api/atom_api_app.cc index dc51711fcdfd..f2b021c0d685 100644 --- a/browser/api/atom_api_app.cc +++ b/browser/api/atom_api_app.cc @@ -174,8 +174,6 @@ void App::DockGetBadgeText(const v8::FunctionCallbackInfo& args) { // static void App::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); - v8::Local t = v8::FunctionTemplate::New(New); t->InstanceTemplate()->SetInternalFieldCount(1); t->SetClassName(v8::String::NewSymbol("Application")); diff --git a/browser/api/atom_api_auto_updater.cc b/browser/api/atom_api_auto_updater.cc index 5360a3151fb0..a18fdebce9d0 100644 --- a/browser/api/atom_api_auto_updater.cc +++ b/browser/api/atom_api_auto_updater.cc @@ -51,8 +51,6 @@ void AutoUpdater::OnUpdateDownloaded(const std::string& release_notes, // static void AutoUpdater::New(const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - if (!args.IsConstructCall()) return node::ThrowError("Require constructor call"); @@ -79,8 +77,6 @@ void AutoUpdater::QuitAndInstall( // static void AutoUpdater::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); - v8::Local t( v8::FunctionTemplate::New(AutoUpdater::New)); t->InstanceTemplate()->SetInternalFieldCount(1); diff --git a/browser/api/atom_api_dialog.cc b/browser/api/atom_api_dialog.cc index f42eb1b6eefa..2eb555ccd5f9 100644 --- a/browser/api/atom_api_dialog.cc +++ b/browser/api/atom_api_dialog.cc @@ -19,7 +19,9 @@ namespace { template void CallV8Function(const RefCountedV8Function& callback, T arg) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); + v8::Handle value = ToV8Value(arg); callback->NewHandle(node_isolate)->Call( v8::Context::GetCurrent()->Global(), 1, &value); @@ -34,8 +36,6 @@ void CallV8Function2(const RefCountedV8Function& callback, bool result, T arg) { } void Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - NODE_SET_METHOD(target, "showMessageBox", ShowMessageBox); NODE_SET_METHOD(target, "showOpenDialog", ShowOpenDialog); NODE_SET_METHOD(target, "showSaveDialog", ShowSaveDialog); diff --git a/browser/api/atom_api_menu.cc b/browser/api/atom_api_menu.cc index ffc9c5a26965..cc3a514d5690 100644 --- a/browser/api/atom_api_menu.cc +++ b/browser/api/atom_api_menu.cc @@ -24,6 +24,7 @@ v8::Handle CallDelegate(v8::Handle default_value, v8::Handle menu, const char* method, int command_id) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); v8::Handle delegate = menu->Get(v8::String::New("delegate")); @@ -52,6 +53,7 @@ Menu::~Menu() { } bool Menu::IsCommandIdChecked(int command_id) const { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); return CallDelegate(v8::False(), const_cast(this)->handle(), @@ -60,6 +62,7 @@ bool Menu::IsCommandIdChecked(int command_id) const { } bool Menu::IsCommandIdEnabled(int command_id) const { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); return CallDelegate(v8::True(), const_cast(this)->handle(), @@ -68,6 +71,7 @@ bool Menu::IsCommandIdEnabled(int command_id) const { } bool Menu::IsCommandIdVisible(int command_id) const { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); return CallDelegate(v8::True(), const_cast(this)->handle(), @@ -77,6 +81,7 @@ bool Menu::IsCommandIdVisible(int command_id) const { bool Menu::GetAcceleratorForCommandId(int command_id, ui::Accelerator* accelerator) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); v8::Handle shortcut = CallDelegate(v8::Undefined(), handle(), @@ -91,6 +96,7 @@ bool Menu::GetAcceleratorForCommandId(int command_id, } bool Menu::IsItemForCommandIdDynamic(int command_id) const { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); return CallDelegate(v8::False(), const_cast(this)->handle(), @@ -99,6 +105,7 @@ bool Menu::IsItemForCommandIdDynamic(int command_id) const { } string16 Menu::GetLabelForCommandId(int command_id) const { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); return FromV8Value(CallDelegate(v8::False(), const_cast(this)->handle(), @@ -107,6 +114,7 @@ string16 Menu::GetLabelForCommandId(int command_id) const { } string16 Menu::GetSublabelForCommandId(int command_id) const { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); return FromV8Value(CallDelegate(v8::False(), const_cast(this)->handle(), @@ -115,14 +123,13 @@ string16 Menu::GetSublabelForCommandId(int command_id) const { } void Menu::ExecuteCommand(int command_id, int event_flags) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); CallDelegate(v8::False(), handle(), "executeCommand", command_id); } // static void Menu::New(const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - if (!args.IsConstructCall()) return node::ThrowError("Require constructor call"); @@ -307,8 +314,6 @@ void Menu::Popup(const v8::FunctionCallbackInfo& args) { // static void Menu::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - v8::Local t(v8::FunctionTemplate::New(Menu::New)); t->InstanceTemplate()->SetInternalFieldCount(1); t->SetClassName(v8::String::NewSymbol("Menu")); diff --git a/browser/api/atom_api_menu_mac.mm b/browser/api/atom_api_menu_mac.mm index 432ddb52e19f..12e2710604b5 100644 --- a/browser/api/atom_api_menu_mac.mm +++ b/browser/api/atom_api_menu_mac.mm @@ -74,8 +74,6 @@ void MenuMac::SendActionToFirstResponder(const std::string& action) { // static void Menu::SetApplicationMenu(const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - if (!args[0]->IsObject()) return node::ThrowTypeError("Bad argument"); @@ -94,8 +92,6 @@ void Menu::SetApplicationMenu(const v8::FunctionCallbackInfo& args) { // static void Menu::SendActionToFirstResponder( const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - std::string action; if (!FromV8Arguments(args, &action)) return node::ThrowTypeError("Bad argument"); diff --git a/browser/api/atom_api_menu_win.cc b/browser/api/atom_api_menu_win.cc index c5f5522367b9..e645478ac2fc 100644 --- a/browser/api/atom_api_menu_win.cc +++ b/browser/api/atom_api_menu_win.cc @@ -31,8 +31,6 @@ void MenuWin::Popup(NativeWindow* native_window) { // static void Menu::AttachToWindow(const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - Menu* self = ObjectWrap::Unwrap(args.This()); if (self == NULL) return node::ThrowError("Menu is already destroyed"); diff --git a/browser/api/atom_api_power_monitor.cc b/browser/api/atom_api_power_monitor.cc index df1ac1f27e23..1dd362bc6b26 100644 --- a/browser/api/atom_api_power_monitor.cc +++ b/browser/api/atom_api_power_monitor.cc @@ -39,8 +39,6 @@ void PowerMonitor::OnResume() { // static void PowerMonitor::New(const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - if (!args.IsConstructCall()) return node::ThrowError("Require constructor call"); @@ -49,8 +47,6 @@ void PowerMonitor::New(const v8::FunctionCallbackInfo& args) { // static void PowerMonitor::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - #if defined(OS_MACOSX) base::PowerMonitorDeviceSource::AllocateSystemIOPorts(); #endif diff --git a/browser/api/atom_api_protocol.cc b/browser/api/atom_api_protocol.cc index 01dc0de4bac0..107477d0eb29 100644 --- a/browser/api/atom_api_protocol.cc +++ b/browser/api/atom_api_protocol.cc @@ -35,6 +35,7 @@ static const char* kEarlyUseProtocolError = "This method can only be used" // Emit an event for the protocol module. void EmitEventInUI(const std::string& event, const std::string& parameter) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); v8::Handle argv[] = { @@ -72,6 +73,7 @@ class CustomProtocolRequestJob : public AdapterRequestJob { virtual void GetJobTypeInUI() OVERRIDE { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); // Call the JS handler. diff --git a/browser/api/atom_api_window.cc b/browser/api/atom_api_window.cc index 9718629dbef6..d5b6296831a7 100644 --- a/browser/api/atom_api_window.cc +++ b/browser/api/atom_api_window.cc @@ -92,6 +92,7 @@ void Window::OnRendererCrashed() { void Window::OnCapturePageDone(const RefCountedV8Function& callback, const std::vector& data) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); v8::Local buffer = node::Buffer::New( @@ -103,8 +104,6 @@ void Window::OnCapturePageDone(const RefCountedV8Function& callback, // static void Window::New(const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - if (!args.IsConstructCall()) return node::ThrowError("Require constructor call"); @@ -625,8 +624,6 @@ void Window::ReloadIgnoringCache( // static void Window::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - v8::Local t = v8::FunctionTemplate::New(Window::New); t->InstanceTemplate()->SetInternalFieldCount(1); t->SetClassName(v8::String::NewSymbol("BrowserWindow")); diff --git a/browser/api/atom_browser_bindings.cc b/browser/api/atom_browser_bindings.cc index 4b3e79f59f32..a7753f77aea8 100644 --- a/browser/api/atom_browser_bindings.cc +++ b/browser/api/atom_browser_bindings.cc @@ -25,6 +25,7 @@ void AtomBrowserBindings::OnRendererMessage(int process_id, int routing_id, const string16& channel, const base::ListValue& args) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); scoped_ptr converter(new V8ValueConverter); @@ -58,6 +59,7 @@ void AtomBrowserBindings::OnRendererMessageSync( const base::ListValue& args, NativeWindow* sender, IPC::Message* message) { + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); scoped_ptr converter(new V8ValueConverter); diff --git a/browser/atom_browser_main_parts.cc b/browser/atom_browser_main_parts.cc index 165e76b98c4a..0cb05dd1a1eb 100644 --- a/browser/atom_browser_main_parts.cc +++ b/browser/atom_browser_main_parts.cc @@ -51,6 +51,7 @@ void AtomBrowserMainParts::PostEarlyInitialization() { v8::V8::Initialize(); // Create context. + v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); v8::Local context = v8::Context::New(node_isolate); diff --git a/browser/mac/Info.plist b/browser/mac/Info.plist index c931513b60f3..fe6a0815405e 100644 --- a/browser/mac/Info.plist +++ b/browser/mac/Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile atom.icns CFBundleVersion - 0.8.5 + 0.8.7 NSMainNibFile MainMenu NSPrincipalClass diff --git a/common/api/atom_api_clipboard.cc b/common/api/atom_api_clipboard.cc index e83b1eb5494c..d0c97d350fc9 100644 --- a/common/api/atom_api_clipboard.cc +++ b/common/api/atom_api_clipboard.cc @@ -74,8 +74,6 @@ void Clipboard::Clear(const v8::FunctionCallbackInfo& args) { // static void Clipboard::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - NODE_SET_METHOD(target, "has", Has); NODE_SET_METHOD(target, "read", Read); NODE_SET_METHOD(target, "readText", ReadText); diff --git a/common/api/atom_api_event_emitter.cc b/common/api/atom_api_event_emitter.cc index f175810ad45f..998876b05270 100644 --- a/common/api/atom_api_event_emitter.cc +++ b/common/api/atom_api_event_emitter.cc @@ -21,6 +21,11 @@ EventEmitter::EventEmitter(v8::Handle wrapper) { } EventEmitter::~EventEmitter() { + // Use Locker in browser process. + scoped_ptr locker; + if (node::g_standalone_mode) + locker.reset(new v8::Locker(node_isolate)); + // Clear the aligned pointer, it should have been done by ObjectWrap but // somehow node v0.11.x changed this behaviour. v8::HandleScope handle_scope(node_isolate); @@ -33,6 +38,11 @@ bool EventEmitter::Emit(const std::string& name) { } bool EventEmitter::Emit(const std::string& name, base::ListValue* args) { + // Use Locker in browser process. + scoped_ptr locker; + if (node::g_standalone_mode) + locker.reset(new v8::Locker(node_isolate)); + v8::HandleScope handle_scope(node_isolate); v8::Handle context = v8::Context::GetCurrent(); diff --git a/common/api/atom_api_id_weak_map.cc b/common/api/atom_api_id_weak_map.cc index 2ee2cf32913c..09abbe9017b2 100644 --- a/common/api/atom_api_id_weak_map.cc +++ b/common/api/atom_api_id_weak_map.cc @@ -122,8 +122,6 @@ void IDWeakMap::Remove(const v8::FunctionCallbackInfo& args) { // static void IDWeakMap::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - v8::Local t = v8::FunctionTemplate::New(New); t->InstanceTemplate()->SetInternalFieldCount(1); t->SetClassName(v8::String::NewSymbol("IDWeakMap")); diff --git a/common/api/atom_api_screen.cc b/common/api/atom_api_screen.cc index 329767271f08..85e1ff2a95f8 100644 --- a/common/api/atom_api_screen.cc +++ b/common/api/atom_api_screen.cc @@ -67,8 +67,6 @@ void Screen::GetPrimaryDisplay( // static void Screen::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); - v8::Local t = v8::FunctionTemplate::New(New); t->InstanceTemplate()->SetInternalFieldCount(1); t->SetClassName(v8::String::NewSymbol("Screen")); diff --git a/common/api/atom_api_shell.cc b/common/api/atom_api_shell.cc index 5f7f2d80c843..63a114b87f80 100644 --- a/common/api/atom_api_shell.cc +++ b/common/api/atom_api_shell.cc @@ -60,8 +60,6 @@ void Shell::Beep(const v8::FunctionCallbackInfo& args) { // static void Shell::Initialize(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - NODE_SET_METHOD(target, "showItemInFolder", ShowItemInFolder); NODE_SET_METHOD(target, "openItem", OpenItem); NODE_SET_METHOD(target, "openExternal", OpenExternal); diff --git a/common/api/atom_api_v8_util.cc b/common/api/atom_api_v8_util.cc index 01d779c3b984..1f3d250af6e2 100644 --- a/common/api/atom_api_v8_util.cc +++ b/common/api/atom_api_v8_util.cc @@ -46,8 +46,6 @@ void TakeHeapSnapshot(const v8::FunctionCallbackInfo& args) { } // namespace void InitializeV8Util(v8::Handle target) { - v8::HandleScope handle_scope(node_isolate); - NODE_SET_METHOD(target, "createObjectWithName", CreateObjectWithName); NODE_SET_METHOD(target, "getHiddenValue", GetHiddenValue); NODE_SET_METHOD(target, "setHiddenValue", SetHiddenValue); diff --git a/common/api/atom_bindings.cc b/common/api/atom_bindings.cc index 8dc3b85a45a1..faa139a6c610 100644 --- a/common/api/atom_bindings.cc +++ b/common/api/atom_bindings.cc @@ -53,6 +53,13 @@ void UvOnCallback(uv_async_t* handle, int status) { g_v8_callback->NewHandle()->Call(global, 0, NULL); } +// Called when there is a fatal error in V8, we just crash the process here so +// we can get the stack trace. +void FatalErrorCallback(const char* location, const char* message) { + LOG(ERROR) << "Fatal error in V8: " << location << " " << message; + static_cast(NULL)->crash = true; +} + v8::Handle DumpStackFrame(v8::Handle stack_frame) { v8::Local result = v8::Object::New(); result->Set(ToV8Value("line"), ToV8Value(stack_frame->GetLineNumber())); @@ -76,14 +83,13 @@ node::node_module_struct* GetBuiltinModule(const char *name, bool is_browser); AtomBindings::AtomBindings() { uv_async_init(uv_default_loop(), &g_next_tick_uv_handle, UvCallNextTick); uv_async_init(uv_default_loop(), &g_callback_uv_handle, UvOnCallback); + v8::V8::SetFatalErrorHandler(FatalErrorCallback); } AtomBindings::~AtomBindings() { } void AtomBindings::BindTo(v8::Handle process) { - v8::HandleScope handle_scope(node_isolate); - NODE_SET_METHOD(process, "atomBinding", Binding); NODE_SET_METHOD(process, "crash", Crash); NODE_SET_METHOD(process, "activateUvLoop", ActivateUVLoop); @@ -162,8 +168,6 @@ void AtomBindings::Log(const v8::FunctionCallbackInfo& args) { // static void AtomBindings::GetCurrentStackTrace( const v8::FunctionCallbackInfo& args) { - v8::HandleScope handle_scope(args.GetIsolate()); - int stack_limit = kMaxCallStackSize; FromV8Arguments(args, &stack_limit); diff --git a/common/atom_version.h b/common/atom_version.h index f6786ed1b944..092ed9a89b76 100644 --- a/common/atom_version.h +++ b/common/atom_version.h @@ -7,7 +7,7 @@ #define ATOM_MAJOR_VERSION 0 #define ATOM_MINOR_VERSION 8 -#define ATOM_PATCH_VERSION 5 +#define ATOM_PATCH_VERSION 7 #define ATOM_VERSION_IS_RELEASE 1 diff --git a/common/node_bindings.cc b/common/node_bindings.cc index e36ba9baff4d..3d2d5ebcc4f7 100644 --- a/common/node_bindings.cc +++ b/common/node_bindings.cc @@ -194,6 +194,11 @@ void NodeBindings::RunMessageLoop() { void NodeBindings::UvRunOnce() { DCHECK(!is_browser_ || BrowserThread::CurrentlyOn(BrowserThread::UI)); + // Use Locker in browser process. + scoped_ptr locker; + if (is_browser_) + locker.reset(new v8::Locker(node_isolate)); + v8::HandleScope handle_scope(node_isolate); // Enter node context while dealing with uv events, by default the global diff --git a/package.json b/package.json index 021684cd0b30..5d18c0a735ed 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "atom-shell", - "version": "0.8.5", + "version": "0.8.7", "devDependencies": { "coffee-script": "~1.6.3", "coffeelint": "~0.6.1", + "formidable": "~1.0.14", "mocha": "~1.13.0", "pathwatcher": "0.14.0", "q": "0.9.7", - "walkdir": "~0.0.7", "runas": "0.3.0", - "formidable": "~1.0.14", - "temp": "~0.6.0" + "temp": "~0.6.0", + "walkdir": "~0.0.7" }, "private": true, diff --git a/renderer/lib/init.coffee b/renderer/lib/init.coffee index 230529d39baa..8c061149cd46 100644 --- a/renderer/lib/init.coffee +++ b/renderer/lib/init.coffee @@ -25,11 +25,12 @@ global.module = module # Set the __filename to the path of html file if it's file:// protocol. if window.location.protocol is 'file:' - global.__filename = + pathname = if process.platform is 'win32' window.location.pathname.substr 1 else window.location.pathname + global.__filename = decodeURIComponent pathname global.__dirname = path.dirname global.__filename # Set module's filename so relative require can work as expected. diff --git a/script/bump-version.py b/script/bump-version.py index 5e4d798f9a0b..7d5f52f5d2db 100755 --- a/script/bump-version.py +++ b/script/bump-version.py @@ -5,34 +5,51 @@ import re import subprocess import sys +from lib.util import get_atom_shell_version, scoped_cwd + SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) def main(): - if len(sys.argv) != 2: - print 'Usage: bump-version.py version' + if len(sys.argv) != 2 or sys.argv[1] == '-h': + print 'Usage: bump-version.py [ | major | minor | patch]' return 1 - version = sys.argv[1] - if version[0] == 'v': - version = version[1:] - versions = parse_version(version) + option = sys.argv[1] + increments = ['major', 'minor', 'patch', 'build'] + if option in increments: + version = get_atom_shell_version() + versions = parse_version(version.split('-')[0]) + versions = increase_version(versions, increments.index(option)) + else: + versions = parse_version(option) - os.chdir(SOURCE_ROOT) - update_package_json(version) - update_win_rc(version, versions) - update_version_h(versions) - update_info_plist(version) - tag_version(version) + version = '.'.join(versions[:3]) + + with scoped_cwd(SOURCE_ROOT): + update_package_json(version) + update_win_rc(version, versions) + update_version_h(versions) + update_info_plist(version) + tag_version(version) + git_push() def parse_version(version): + if version[0] == 'v': + version = version[1:] + vs = version.split('.') if len(vs) > 4: return vs[0:4] else: - return vs + [0] * (4 - len(vs)) + return vs + ['0'] * (4 - len(vs)) + + +def increase_version(versions, index): + versions[index] = str(int(versions[index]) + 1) + return versions def update_package_json(version): @@ -112,5 +129,9 @@ def tag_version(version): subprocess.check_call(['git', 'tag', 'v{0}'.format(version)]) +def git_push(): + subprocess.check_call(['git', 'push']) + + if __name__ == '__main__': sys.exit(main()) diff --git a/vendor/node b/vendor/node index 7fa644854f91..80c5e17c09fd 160000 --- a/vendor/node +++ b/vendor/node @@ -1 +1 @@ -Subproject commit 7fa644854f91c8dd23d8cec21be1310f0b69d813 +Subproject commit 80c5e17c09fdf2fc0b74353b285bb33a6ecf5e62