From 34b0a36120a039968a87342b048d1596782524b0 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 29 Jul 2013 05:07:07 +0200 Subject: [PATCH] src: don't use NewExternal() with unaligned strings V8 3.20.9 enforces that external pointers are aligned on a two-byte boundary. We cannot portably guarantee that for the source code strings that tools/js2c.py generates so simply stop using String::NewExternal() altogether (and by extension String::ExternalAsciiStringResource). Fixes the following run-time assert: FATAL ERROR: v8::String::NewExternal() Pointer is not aligned --- node.gyp | 2 -- src/node.cc | 6 ++-- src/node_javascript.cc | 7 +++-- src/node_string.cc | 41 --------------------------- src/node_string.h | 63 ------------------------------------------ 5 files changed, 7 insertions(+), 112 deletions(-) delete mode 100644 src/node_string.cc delete mode 100644 src/node_string.h diff --git a/node.gyp b/node.gyp index ecf21f2f8ab8a3..1215c870050f5e 100644 --- a/node.gyp +++ b/node.gyp @@ -101,7 +101,6 @@ 'src/node_os.cc', 'src/node_script.cc', 'src/node_stat_watcher.cc', - 'src/node_string.cc', 'src/node_watchdog.cc', 'src/node_zlib.cc', 'src/pipe_wrap.cc', @@ -127,7 +126,6 @@ 'src/node_os.h', 'src/node_root_certs.h', 'src/node_script.h', - 'src/node_string.h', 'src/node_version.h', 'src/node_watchdog.h', 'src/node_wrap.h', diff --git a/src/node.cc b/src/node.cc index 98349a0c49a179..b16619e5720654 100644 --- a/src/node.cc +++ b/src/node.cc @@ -72,7 +72,6 @@ typedef int mode_t; #include "node_constants.h" #include "node_javascript.h" #include "node_version.h" -#include "node_string.h" #if HAVE_OPENSSL # include "node_crypto.h" #endif @@ -2403,6 +2402,8 @@ static void SignalExit(int signal) { void Load(Handle process_l) { + HandleScope handle_scope(node_isolate); + process_symbol = String::New("process"); domain_symbol = String::New("domain"); @@ -2420,8 +2421,7 @@ void Load(Handle process_l) { // are not safe to ignore. try_catch.SetVerbose(false); - Local f_value = ExecuteString(MainSource(), - IMMUTABLE_STRING("node.js")); + Local f_value = ExecuteString(MainSource(), String::New("node.js")); if (try_catch.HasCaught()) { ReportException(try_catch); exit(10); diff --git a/src/node_javascript.cc b/src/node_javascript.cc index 5b5a2bea7bbdbe..d9adecb70de1c4 100644 --- a/src/node_javascript.cc +++ b/src/node_javascript.cc @@ -22,7 +22,7 @@ #include "v8.h" #include "node.h" #include "node_natives.h" -#include "node_string.h" + #include #if !defined(_MSC_VER) #include @@ -33,7 +33,7 @@ using namespace v8; namespace node { Handle MainSource() { - return BUILTIN_ASCII_ARRAY(node_native, sizeof(node_native)-1); + return String::New(node_native, sizeof(node_native) - 1); } void DefineJavaScript(v8::Handle target) { @@ -42,7 +42,8 @@ void DefineJavaScript(v8::Handle target) { for (int i = 0; natives[i].name; i++) { if (natives[i].source != node_native) { Local name = String::New(natives[i].name); - Handle source = BUILTIN_ASCII_ARRAY(natives[i].source, natives[i].source_len); + Handle source = String::New(natives[i].source, + natives[i].source_len); target->Set(name, source); } } diff --git a/src/node_string.cc b/src/node_string.cc deleted file mode 100644 index 8ded75d966c954..00000000000000 --- a/src/node_string.cc +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -#include "node_string.h" - -namespace node { - -using namespace v8; - -extern Isolate* node_isolate; - -Handle ImmutableAsciiSource::CreateFromLiteral( - const char *string_literal, - size_t length) { - HandleScope scope(node_isolate); - - Local ret = String::NewExternal(new ImmutableAsciiSource( - string_literal, - length)); - return scope.Close(ret); -} - -} diff --git a/src/node_string.h b/src/node_string.h deleted file mode 100644 index b4a0a9b86a9f92..00000000000000 --- a/src/node_string.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -#ifndef SRC_NODE_STRING_H_ -#define SRC_NODE_STRING_H_ - -#include "v8.h" - -namespace node { - -#define IMMUTABLE_STRING(string_literal) \ - ::node::ImmutableAsciiSource::CreateFromLiteral( \ - string_literal "", sizeof(string_literal) - 1) -#define BUILTIN_ASCII_ARRAY(array, len) \ - ::node::ImmutableAsciiSource::CreateFromLiteral(array, len) - -class ImmutableAsciiSource : public v8::String::ExternalAsciiStringResource { - public: - static v8::Handle CreateFromLiteral(const char *string_literal, - size_t length); - - ImmutableAsciiSource(const char *src, size_t src_len) - : buffer_(src), - buf_len_(src_len) { - } - - ~ImmutableAsciiSource() { - } - - const char *data() const { - return buffer_; - } - - size_t length() const { - return buf_len_; - } - - private: - const char *buffer_; - size_t buf_len_; -}; - -} // namespace node - -#endif // SRC_NODE_STRING_H_