- Changed regexp logging to include the string being matched and to
escape commas. - Fixed issue with block-comparing unaligned strings on arm. - Added short documentation to one of the Persistent constructors. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@554 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
949729c06e
commit
85251f756c
@ -327,6 +327,10 @@ template <class T> class EXPORT_INLINE Persistent : public Handle<T> {
|
|||||||
|
|
||||||
template <class S> inline Persistent(S* that) : Handle<T>(that) { }
|
template <class S> inline Persistent(S* that) : Handle<T>(that) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Casts" a plain handle which is known to be a persistent handle
|
||||||
|
* to a persistent handle.
|
||||||
|
*/
|
||||||
template <class S> explicit inline Persistent(Handle<S> that)
|
template <class S> explicit inline Persistent(Handle<S> that)
|
||||||
: Handle<T>(*that) { }
|
: Handle<T>(*that) { }
|
||||||
|
|
||||||
@ -1056,7 +1060,7 @@ class EXPORT Object : public Value {
|
|||||||
* Turns on access check on the object if the object is an instance of
|
* Turns on access check on the object if the object is an instance of
|
||||||
* a template that has access check callbacks. If an object has no
|
* a template that has access check callbacks. If an object has no
|
||||||
* access check info, the object cannot be accessed by anyone.
|
* access check info, the object cannot be accessed by anyone.
|
||||||
*/
|
*/
|
||||||
void TurnOnAccessCheck();
|
void TurnOnAccessCheck();
|
||||||
|
|
||||||
static Local<Object> New();
|
static Local<Object> New();
|
||||||
|
@ -237,11 +237,10 @@ void Shell::Initialize() {
|
|||||||
|
|
||||||
// Install the debugger object in the utility scope
|
// Install the debugger object in the utility scope
|
||||||
i::Debug::Load();
|
i::Debug::Load();
|
||||||
i::JSObject* raw_debug = i::Debug::debug_context()->global();
|
i::Debug::debug_context()->set_security_token(i::Heap::undefined_value());
|
||||||
i::JSGlobalObject* debug = i::JSGlobalObject::cast(raw_debug);
|
i::JSObject* debug = i::Debug::debug_context()->global();
|
||||||
debug->set_security_token(i::Heap::undefined_value());
|
|
||||||
utility_context_->Global()->Set(String::New("$debug"),
|
utility_context_->Global()->Set(String::New("$debug"),
|
||||||
Utils::ToLocal(&raw_debug));
|
Utils::ToLocal(&debug));
|
||||||
|
|
||||||
// Run the d8 shell utility script in the utility context
|
// Run the d8 shell utility script in the utility context
|
||||||
int source_index = i::NativesCollection<i::D8>::GetIndex("d8");
|
int source_index = i::NativesCollection<i::D8>::GetIndex("d8");
|
||||||
|
@ -73,6 +73,9 @@ typedef byte* Address;
|
|||||||
typedef uint16_t uc16;
|
typedef uint16_t uc16;
|
||||||
typedef signed int uc32;
|
typedef signed int uc32;
|
||||||
|
|
||||||
|
#ifndef ARM
|
||||||
|
#define CAN_READ_UNALIGNED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Constants
|
// Constants
|
||||||
|
36
src/log.cc
36
src/log.cc
@ -349,6 +349,24 @@ void Logger::SharedLibraryEvent(const wchar_t* library_path,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef ENABLE_LOGGING_AND_PROFILING
|
#ifdef ENABLE_LOGGING_AND_PROFILING
|
||||||
|
void Logger::LogString(Handle<String> str) {
|
||||||
|
int len = str->length();
|
||||||
|
if (len > 256)
|
||||||
|
len = 256;
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
uc32 c = str->Get(i);
|
||||||
|
if (c < 32 || (c > 126 && c <= 255)) {
|
||||||
|
fprintf(logfile_, "\\x%02x", c);
|
||||||
|
} else if (c > 255) {
|
||||||
|
fprintf(logfile_, "\\u%04x", c);
|
||||||
|
} else if (c == ',') {
|
||||||
|
fprintf(logfile_, "\\,");
|
||||||
|
} else {
|
||||||
|
fprintf(logfile_, "%lc", c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Logger::LogRegExpSource(Handle<JSRegExp> regexp) {
|
void Logger::LogRegExpSource(Handle<JSRegExp> regexp) {
|
||||||
// Prints "/" + re.source + "/" +
|
// Prints "/" + re.source + "/" +
|
||||||
// (re.global?"g":"") + (re.ignorecase?"i":"") + (re.multiline?"m":"")
|
// (re.global?"g":"") + (re.ignorecase?"i":"") + (re.multiline?"m":"")
|
||||||
@ -358,9 +376,7 @@ void Logger::LogRegExpSource(Handle<JSRegExp> regexp) {
|
|||||||
fprintf(logfile_, "no source");
|
fprintf(logfile_, "no source");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Handle<String> source_string = Handle<String>::cast(source);
|
|
||||||
|
|
||||||
SmartPointer<uc16> cstring = source_string->ToWideCString();
|
|
||||||
if (regexp->type()->IsSmi()) {
|
if (regexp->type()->IsSmi()) {
|
||||||
switch (regexp->type_tag()) {
|
switch (regexp->type_tag()) {
|
||||||
case JSRegExp::ATOM:
|
case JSRegExp::ATOM:
|
||||||
@ -371,16 +387,7 @@ void Logger::LogRegExpSource(Handle<JSRegExp> regexp) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(logfile_, "/");
|
fprintf(logfile_, "/");
|
||||||
for (int i = 0, n = source_string->length(); i < n; i++) {
|
LogString(Handle<String>::cast(source));
|
||||||
uc16 c = cstring[i];
|
|
||||||
if (c < 32 || (c > 126 && c <= 255)) {
|
|
||||||
fprintf(logfile_, "\\x%02x", c);
|
|
||||||
} else if (c > 255) {
|
|
||||||
fprintf(logfile_, "\\u%04x", c);
|
|
||||||
} else {
|
|
||||||
fprintf(logfile_, "%lc", c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(logfile_, "/");
|
fprintf(logfile_, "/");
|
||||||
|
|
||||||
// global flag
|
// global flag
|
||||||
@ -423,8 +430,9 @@ void Logger::RegExpExecEvent(Handle<JSRegExp> regexp,
|
|||||||
|
|
||||||
fprintf(logfile_, "regexp-run,");
|
fprintf(logfile_, "regexp-run,");
|
||||||
LogRegExpSource(regexp);
|
LogRegExpSource(regexp);
|
||||||
fprintf(logfile_, ",0x%08x,%d..%d\n",
|
fprintf(logfile_, ",");
|
||||||
input_string->Hash(), start_index, input_string->length());
|
LogString(input_string);
|
||||||
|
fprintf(logfile_, ",%d..%d\n", start_index, input_string->length());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,6 +199,8 @@ class Logger {
|
|||||||
// Emits the source code of a regexp. Used by regexp events.
|
// Emits the source code of a regexp. Used by regexp events.
|
||||||
static void LogRegExpSource(Handle<JSRegExp> regexp);
|
static void LogRegExpSource(Handle<JSRegExp> regexp);
|
||||||
|
|
||||||
|
static void LogString(Handle<String> str);
|
||||||
|
|
||||||
// Emits a profiler tick event. Used by the profiler thread.
|
// Emits a profiler tick event. Used by the profiler thread.
|
||||||
static void TickEvent(TickSample* sample, bool overflow);
|
static void TickEvent(TickSample* sample, bool overflow);
|
||||||
|
|
||||||
|
@ -3727,6 +3727,19 @@ static inline bool CompareRawStringContents(Vector<Char> a, Vector<Char> b) {
|
|||||||
int endpoint = length - kStepSize;
|
int endpoint = length - kStepSize;
|
||||||
const Char* pa = a.start();
|
const Char* pa = a.start();
|
||||||
const Char* pb = b.start();
|
const Char* pb = b.start();
|
||||||
|
#ifndef CAN_READ_UNALIGNED
|
||||||
|
// If this architecture isn't comfortable reading unaligned ints
|
||||||
|
// then we have to check that the strings are alingned and fall back
|
||||||
|
// to the standard comparison if they are not.
|
||||||
|
const int kAlignmentMask = sizeof(uint32_t) - 1; // NOLINT
|
||||||
|
uint32_t pa_addr = reinterpret_cast<uint32_t>(pa);
|
||||||
|
uint32_t pb_addr = reinterpret_cast<uint32_t>(pb);
|
||||||
|
if ((pa_addr & kAlignmentMask) | (pb_addr & kAlignmentMask) != 0) {
|
||||||
|
VectorIterator<Char> ia(a);
|
||||||
|
VectorIterator<Char> ib(b);
|
||||||
|
return CompareStringContents(&ia, &ib);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
int i;
|
int i;
|
||||||
// Compare blocks until we reach near the end of the string.
|
// Compare blocks until we reach near the end of the string.
|
||||||
for (i = 0; i <= endpoint; i += kStepSize) {
|
for (i = 0; i <= endpoint; i += kStepSize) {
|
||||||
|
Loading…
Reference in New Issue
Block a user