mirror of https://github.com/nodejs/node.git
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 alignedpull/5010/head
parent
1bd711c8a0
commit
34b0a36120
2
node.gyp
2
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',
|
||||
|
|
|
@ -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<Object> process_l) {
|
||||
HandleScope handle_scope(node_isolate);
|
||||
|
||||
process_symbol = String::New("process");
|
||||
domain_symbol = String::New("domain");
|
||||
|
||||
|
@ -2420,8 +2421,7 @@ void Load(Handle<Object> process_l) {
|
|||
// are not safe to ignore.
|
||||
try_catch.SetVerbose(false);
|
||||
|
||||
Local<Value> f_value = ExecuteString(MainSource(),
|
||||
IMMUTABLE_STRING("node.js"));
|
||||
Local<Value> f_value = ExecuteString(MainSource(), String::New("node.js"));
|
||||
if (try_catch.HasCaught()) {
|
||||
ReportException(try_catch);
|
||||
exit(10);
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include "v8.h"
|
||||
#include "node.h"
|
||||
#include "node_natives.h"
|
||||
#include "node_string.h"
|
||||
|
||||
#include <string.h>
|
||||
#if !defined(_MSC_VER)
|
||||
#include <strings.h>
|
||||
|
@ -33,7 +33,7 @@ using namespace v8;
|
|||
namespace node {
|
||||
|
||||
Handle<String> MainSource() {
|
||||
return BUILTIN_ASCII_ARRAY(node_native, sizeof(node_native)-1);
|
||||
return String::New(node_native, sizeof(node_native) - 1);
|
||||
}
|
||||
|
||||
void DefineJavaScript(v8::Handle<v8::Object> target) {
|
||||
|
@ -42,7 +42,8 @@ void DefineJavaScript(v8::Handle<v8::Object> target) {
|
|||
for (int i = 0; natives[i].name; i++) {
|
||||
if (natives[i].source != node_native) {
|
||||
Local<String> name = String::New(natives[i].name);
|
||||
Handle<String> source = BUILTIN_ASCII_ARRAY(natives[i].source, natives[i].source_len);
|
||||
Handle<String> source = String::New(natives[i].source,
|
||||
natives[i].source_len);
|
||||
target->Set(name, source);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<String> ImmutableAsciiSource::CreateFromLiteral(
|
||||
const char *string_literal,
|
||||
size_t length) {
|
||||
HandleScope scope(node_isolate);
|
||||
|
||||
Local<String> ret = String::NewExternal(new ImmutableAsciiSource(
|
||||
string_literal,
|
||||
length));
|
||||
return scope.Close(ret);
|
||||
}
|
||||
|
||||
}
|
|
@ -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<v8::String> 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_
|
Loading…
Reference in New Issue