Commit cbaa060d authored by mads.s.ager's avatar mads.s.ager

Improved performance of garbage collection by moving the function that updates...

Improved performance of garbage collection by moving the function that updates pointers during compacting collection into the updating visitor.  This gives the compiler a better chance to inline and avoid a function call per (potential) pointer.

Extended the shell sample with a --runtime-flags option.

Added Visual Studio project files for the shell.cc and process.cc samples.



git-svn-id: http://v8.googlecode.com/svn/trunk@14 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 31e7138e
2008-08-13: Version 0.2.2 (130807) 2008-08-14: Version 0.2.3
Improved performance of garbage collection by moving the
function that updates pointers during compacting collection
into the updating visitor. This gives the compiler a better
chance to inline and avoid a function call per (potential)
pointer.
Extended the shell sample with a --runtime-flags option.
Added Visual Studio project files for the shell.cc and
process.cc samples.
2008-08-13: Version 0.2.2
Improved performance of garbage collection by changing the way Improved performance of garbage collection by changing the way
we use the marking stack in the event of stack overflow during we use the marking stack in the event of stack overflow during
...@@ -16,7 +30,7 @@ ...@@ -16,7 +30,7 @@
Added first version of Visual Studio project files. Added first version of Visual Studio project files.
2008-08-06: Version 0.2.1 (130029) 2008-08-06: Version 0.2.1
Improved performance of unary addition by avoiding runtime calls. Improved performance of unary addition by avoiding runtime calls.
...@@ -38,7 +52,7 @@ ...@@ -38,7 +52,7 @@
implementations. implementations.
2008-07-30: Version 0.2.0 (129146) 2008-07-30: Version 0.2.0
Changed all text files to have native svn:eol-style. Changed all text files to have native svn:eol-style.
...@@ -75,7 +89,7 @@ ...@@ -75,7 +89,7 @@
Merged disassembler-{arch} files. Merged disassembler-{arch} files.
2008-07-28: Version 0.1.4 (128918) 2008-07-28: Version 0.1.4
Added support for storing JavaScript stack traces in a stack Added support for storing JavaScript stack traces in a stack
allocated buffer to make it visible in shallow core dumps. allocated buffer to make it visible in shallow core dumps.
...@@ -83,7 +97,7 @@ ...@@ -83,7 +97,7 @@
disabled by default. disabled by default.
2008-07-25: Version 0.1.3 (128832) 2008-07-25: Version 0.1.3
Fixed bug in JSObject::GetPropertyAttributePostInterceptor where Fixed bug in JSObject::GetPropertyAttributePostInterceptor where
map transitions would count as properties. map transitions would count as properties.
...@@ -103,7 +117,7 @@ ...@@ -103,7 +117,7 @@
across multiple users of V8 when linked as a shared library. across multiple users of V8 when linked as a shared library.
2008-07-16: Version 0.1.2 (127441) 2008-07-16: Version 0.1.2
Fixed building on Mac OS X by recognizing i386 and friends as Fixed building on Mac OS X by recognizing i386 and friends as
IA-32 platforms. IA-32 platforms.
...@@ -119,7 +133,7 @@ ...@@ -119,7 +133,7 @@
SetInternalFieldCount from FunctionTemplate to ObjectTemplate. SetInternalFieldCount from FunctionTemplate to ObjectTemplate.
2008-07-09: Version 0.1.1 (126448) 2008-07-09: Version 0.1.1
Fixed bug in stack overflow check code for IA-32 targets where a Fixed bug in stack overflow check code for IA-32 targets where a
non-tagged value in register eax was pushed to the stack. non-tagged value in register eax was pushed to the stack.
...@@ -135,7 +149,7 @@ ...@@ -135,7 +149,7 @@
setting break points in them. setting break points in them.
2008-07-03: Version 0.1.0 (125876) 2008-07-03: Version 0.1.0
Initial export. Initial export.
...@@ -462,17 +462,17 @@ class ScriptData { ...@@ -462,17 +462,17 @@ class ScriptData {
*/ */
class ScriptOrigin { class ScriptOrigin {
public: public:
ScriptOrigin(Handle<String> resource_name, ScriptOrigin(Handle<Value> resource_name,
Handle<Integer> resource_line_offset = Handle<Integer>(), Handle<Integer> resource_line_offset = Handle<Integer>(),
Handle<Integer> resource_column_offset = Handle<Integer>()) Handle<Integer> resource_column_offset = Handle<Integer>())
: resource_name_(resource_name), : resource_name_(resource_name),
resource_line_offset_(resource_line_offset), resource_line_offset_(resource_line_offset),
resource_column_offset_(resource_column_offset) { } resource_column_offset_(resource_column_offset) { }
inline Handle<String> ResourceName(); inline Handle<Value> ResourceName();
inline Handle<Integer> ResourceLineOffset(); inline Handle<Integer> ResourceLineOffset();
inline Handle<Integer> ResourceColumnOffset(); inline Handle<Integer> ResourceColumnOffset();
private: private:
Handle<String> resource_name_; Handle<Value> resource_name_;
Handle<Integer> resource_line_offset_; Handle<Integer> resource_line_offset_;
Handle<Integer> resource_column_offset_; Handle<Integer> resource_column_offset_;
}; };
...@@ -493,6 +493,13 @@ class Script { ...@@ -493,6 +493,13 @@ class Script {
ScriptOrigin* origin = NULL, ScriptOrigin* origin = NULL,
ScriptData* pre_data = NULL); ScriptData* pre_data = NULL);
/**
* Compiles the specified script using the specified file name
* object (typically a string) as the script's origin.
*/
static Local<Script> Compile(Handle<String> source,
Handle<Value> file_name);
Local<Value> Run(); Local<Value> Run();
}; };
...@@ -2052,7 +2059,7 @@ Local<T> HandleScope::Close(Handle<T> value) { ...@@ -2052,7 +2059,7 @@ Local<T> HandleScope::Close(Handle<T> value) {
return Local<T>(reinterpret_cast<T*>(after)); return Local<T>(reinterpret_cast<T*>(after));
} }
Handle<String> ScriptOrigin::ResourceName() { Handle<Value> ScriptOrigin::ResourceName() {
return resource_name_; return resource_name_;
} }
......
...@@ -31,12 +31,16 @@ ...@@ -31,12 +31,16 @@
void RunShell(v8::Handle<v8::Context> context); void RunShell(v8::Handle<v8::Context> context);
bool ExecuteString(v8::Handle<v8::String> source); bool ExecuteString(v8::Handle<v8::String> source,
v8::Handle<v8::Value> name,
bool print_result);
v8::Handle<v8::Value> Print(const v8::Arguments& args); v8::Handle<v8::Value> Print(const v8::Arguments& args);
v8::Handle<v8::String> ReadFile(const char* name); v8::Handle<v8::String> ReadFile(const char* name);
void ProcessRuntimeFlags(int argc, char* argv[]);
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
ProcessRuntimeFlags(argc, argv);
v8::HandleScope handle_scope; v8::HandleScope handle_scope;
// Create a template for the global object. // Create a template for the global object.
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
...@@ -51,14 +55,19 @@ int main(int argc, char* argv[]) { ...@@ -51,14 +55,19 @@ int main(int argc, char* argv[]) {
const char* str = argv[i]; const char* str = argv[i];
if (strcmp(str, "--shell") == 0) { if (strcmp(str, "--shell") == 0) {
run_shell = true; run_shell = true;
} else if (strcmp(str, "--runtime-flags") == 0) {
// Skip the --runtime-flags flag since it was processed earlier.
i++;
} else { } else {
// Use all other arguments as names of files to load and run.
v8::HandleScope handle_scope; v8::HandleScope handle_scope;
v8::Handle<v8::String> file_name = v8::String::New(str);
v8::Handle<v8::String> source = ReadFile(str); v8::Handle<v8::String> source = ReadFile(str);
if (source.IsEmpty()) { if (source.IsEmpty()) {
printf("Error reading '%s'\n", str); printf("Error reading '%s'\n", str);
return 1; return 1;
} }
if (!ExecuteString(source)) if (!ExecuteString(source, file_name, false))
return 1; return 1;
} }
} }
...@@ -116,17 +125,19 @@ void RunShell(v8::Handle<v8::Context> context) { ...@@ -116,17 +125,19 @@ void RunShell(v8::Handle<v8::Context> context) {
char* str = fgets(buffer, kBufferSize, stdin); char* str = fgets(buffer, kBufferSize, stdin);
if (str == NULL) break; if (str == NULL) break;
v8::HandleScope handle_scope; v8::HandleScope handle_scope;
ExecuteString(v8::String::New(str)); ExecuteString(v8::String::New(str), v8::Undefined(), true);
} }
printf("\n"); printf("\n");
} }
// Executes a string within the current v8 context. // Executes a string within the current v8 context.
bool ExecuteString(v8::Handle<v8::String> source) { bool ExecuteString(v8::Handle<v8::String> source,
v8::Handle<v8::Value> name,
bool print_result) {
v8::HandleScope handle_scope; v8::HandleScope handle_scope;
v8::TryCatch try_catch; v8::TryCatch try_catch;
v8::Handle<v8::Script> script = v8::Script::Compile(source); v8::Handle<v8::Script> script = v8::Script::Compile(source, name);
if (script.IsEmpty()) { if (script.IsEmpty()) {
// Print errors that happened during compilation. // Print errors that happened during compilation.
v8::String::AsciiValue error(try_catch.Exception()); v8::String::AsciiValue error(try_catch.Exception());
...@@ -140,7 +151,7 @@ bool ExecuteString(v8::Handle<v8::String> source) { ...@@ -140,7 +151,7 @@ bool ExecuteString(v8::Handle<v8::String> source) {
printf("%s\n", *error); printf("%s\n", *error);
return false; return false;
} else { } else {
if (!result->IsUndefined()) { if (print_result && !result->IsUndefined()) {
// If all went well and the result wasn't undefined then print // If all went well and the result wasn't undefined then print
// the returned value. // the returned value.
v8::String::AsciiValue str(result); v8::String::AsciiValue str(result);
...@@ -150,3 +161,14 @@ bool ExecuteString(v8::Handle<v8::String> source) { ...@@ -150,3 +161,14 @@ bool ExecuteString(v8::Handle<v8::String> source) {
} }
} }
} }
// Set the vm flags before using the vm.
void ProcessRuntimeFlags(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--runtime-flags") == 0 && i + 1 < argc) {
i++;
v8::V8::SetFlagsFromString(argv[i], strlen(argv[i]));
}
}
}
...@@ -1010,7 +1010,7 @@ Local<Script> Script::Compile(v8::Handle<String> source, ...@@ -1010,7 +1010,7 @@ Local<Script> Script::Compile(v8::Handle<String> source,
ON_BAILOUT("v8::Script::Compile()", return Local<Script>()); ON_BAILOUT("v8::Script::Compile()", return Local<Script>());
LOG_API("Script::Compile"); LOG_API("Script::Compile");
i::Handle<i::String> str = Utils::OpenHandle(*source); i::Handle<i::String> str = Utils::OpenHandle(*source);
i::Handle<i::String> name_obj; i::Handle<i::Object> name_obj;
int line_offset = 0; int line_offset = 0;
int column_offset = 0; int column_offset = 0;
if (origin != NULL) { if (origin != NULL) {
...@@ -1047,6 +1047,13 @@ Local<Script> Script::Compile(v8::Handle<String> source, ...@@ -1047,6 +1047,13 @@ Local<Script> Script::Compile(v8::Handle<String> source,
} }
Local<Script> Script::Compile(v8::Handle<String> source,
v8::Handle<Value> file_name) {
ScriptOrigin origin(file_name);
return Compile(source, &origin);
}
Local<Value> Script::Run() { Local<Value> Script::Run() {
ON_BAILOUT("v8::Script::Run()", return Local<Value>()); ON_BAILOUT("v8::Script::Run()", return Local<Value>());
LOG_API("Script::Run"); LOG_API("Script::Run");
...@@ -2091,7 +2098,7 @@ bool v8::V8::Initialize() { ...@@ -2091,7 +2098,7 @@ bool v8::V8::Initialize() {
const char* v8::V8::GetVersion() { const char* v8::V8::GetVersion() {
return "0.2.2 (130807)"; return "0.2.3";
} }
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
namespace v8 { namespace internal { namespace v8 { namespace internal {
DEFINE_string(expose_natives_as, NULL, "expose natives in global object");
DEFINE_string(expose_debug_as, NULL, "expose debug in global object");
DEFINE_string(natives_file, NULL, "alternative natives file"); // for debugging DEFINE_string(natives_file, NULL, "alternative natives file"); // for debugging
DEFINE_bool(expose_gc, false, "expose gc extension"); // for debugging DEFINE_bool(expose_gc, false, "expose gc extension"); // for debugging
...@@ -277,6 +279,7 @@ class Genesis BASE_EMBEDDED { ...@@ -277,6 +279,7 @@ class Genesis BASE_EMBEDDED {
bool InstallExtensions(v8::ExtensionConfiguration* extensions); bool InstallExtensions(v8::ExtensionConfiguration* extensions);
bool InstallExtension(const char* name); bool InstallExtension(const char* name);
bool InstallExtension(v8::RegisteredExtension* current); bool InstallExtension(v8::RegisteredExtension* current);
bool InstallSpecialObjects();
bool ConfigureGlobalObject(v8::Handle<v8::ObjectTemplate> global_template); bool ConfigureGlobalObject(v8::Handle<v8::ObjectTemplate> global_template);
// Migrates all properties from the 'from' object to the 'to' // Migrates all properties from the 'from' object to the 'to'
...@@ -997,6 +1000,42 @@ bool Genesis::InstallNatives() { ...@@ -997,6 +1000,42 @@ bool Genesis::InstallNatives() {
} }
bool Genesis::InstallSpecialObjects() {
HandleScope scope;
Handle<JSGlobalObject> global(
JSGlobalObject::cast(global_context()->global()));
// Expose the natives in global if a name for it is specified.
if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) {
Handle<String> natives_string =
Factory::LookupAsciiSymbol(FLAG_expose_natives_as);
SetProperty(global, natives_string,
Handle<JSObject>(global->builtins()), DONT_ENUM);
}
// Expose the debug global object in global if a name for it is specified.
if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
// If loading fails we just bail out without installing the
// debugger but without tanking the whole context.
if (!Debug::Load())
return true;
Handle<JSGlobalObject> debug_global =
Handle<JSGlobalObject>(
JSGlobalObject::cast(Debug::debug_context()->global()));
Handle<String> debug_string =
Factory::LookupAsciiSymbol(FLAG_expose_debug_as);
SetProperty(global, debug_string,
Handle<JSObject>(debug_global), DONT_ENUM);
// Set the security token for the debugger global object to the same as
// the shell global object to allow calling between these (otherwise
// exposing debug global object dosen't make much sense).
debug_global->set_security_token(global->security_token());
}
return true;
}
bool Genesis::InstallExtensions(v8::ExtensionConfiguration* extensions) { bool Genesis::InstallExtensions(v8::ExtensionConfiguration* extensions) {
// Clear coloring of extension list // Clear coloring of extension list
v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension(); v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension();
...@@ -1296,6 +1335,8 @@ Genesis::Genesis(Handle<Object> global_object, ...@@ -1296,6 +1335,8 @@ Genesis::Genesis(Handle<Object> global_object,
if (!InstallExtensions(extensions)) return; if (!InstallExtensions(extensions)) return;
if (!InstallSpecialObjects()) return;
result_ = global_context_; result_ = global_context_;
} }
......
...@@ -181,7 +181,7 @@ static StaticResource<SafeStringInputBuffer> safe_string_input_buffer; ...@@ -181,7 +181,7 @@ static StaticResource<SafeStringInputBuffer> safe_string_input_buffer;
Handle<JSFunction> Compiler::Compile(Handle<String> source, Handle<JSFunction> Compiler::Compile(Handle<String> source,
Handle<String> script_name, Handle<Object> script_name,
int line_offset, int column_offset, int line_offset, int column_offset,
v8::Extension* extension, v8::Extension* extension,
ScriptDataImpl* input_pre_data) { ScriptDataImpl* input_pre_data) {
......
...@@ -51,7 +51,7 @@ class Compiler : public AllStatic { ...@@ -51,7 +51,7 @@ class Compiler : public AllStatic {
// Compile a String source within a context. // Compile a String source within a context.
static Handle<JSFunction> Compile(Handle<String> source, static Handle<JSFunction> Compile(Handle<String> source,
Handle<String> script_name, Handle<Object> script_name,
int line_offset, int column_offset, int line_offset, int column_offset,
v8::Extension* extension, v8::Extension* extension,
ScriptDataImpl* script_Data); ScriptDataImpl* script_Data);
......
...@@ -406,10 +406,32 @@ Debug.breakLocations = function(f) { ...@@ -406,10 +406,32 @@ Debug.breakLocations = function(f) {
// Returns a Script object. If the parameter is a function the return value // Returns a Script object. If the parameter is a function the return value
// is the script in which the function is defined. If the parameter is a string // is the script in which the function is defined. If the parameter is a string
// the return value is the script for which the script name has that string // the return value is the script for which the script name has that string
// value. // value. If it is a regexp and there is a unique script whose name matches
// we return that, otherwise undefined.
Debug.findScript = function(func_or_script_name) { Debug.findScript = function(func_or_script_name) {
if (IS_FUNCTION(func_or_script_name)) { if (IS_FUNCTION(func_or_script_name)) {
return %FunctionGetScript(func_or_script_name); return %FunctionGetScript(func_or_script_name);
} else if (IS_REGEXP(func_or_script_name)) {
var scripts = Debug.scripts();
var last_result = null;
var result_count = 0;
for (var i in scripts) {
var script = scripts[i];
if (func_or_script_name.test(script.name)) {
last_result = script;
result_count++;
}
}
// Return the unique script matching the regexp. If there are more
// than one we don't return a value since there is no good way to
// decide which one to return. Returning a "random" one, say the
// first, would introduce nondeterminism (or something close to it)
// because the order is the heap iteration order.
if (result_count == 1) {
return last_result;
} else {
return undefined;
}
} else { } else {
return %GetScript(func_or_script_name); return %GetScript(func_or_script_name);
} }
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
namespace v8 { namespace internal { namespace v8 { namespace internal {
DEFINE_bool(remote_debugging, false, "enable remote debugging"); DEFINE_bool(remote_debugging, false, "enable remote debugging");
DEFINE_int(debug_port, 5858, "port for remote debugging");
DEFINE_bool(trace_debug_json, false, "trace debugging JSON request/response"); DEFINE_bool(trace_debug_json, false, "trace debugging JSON request/response");
DECLARE_bool(allow_natives_syntax); DECLARE_bool(allow_natives_syntax);
DECLARE_bool(log_debugger); DECLARE_bool(log_debugger);
...@@ -556,7 +555,9 @@ bool Debug::Load() { ...@@ -556,7 +555,9 @@ bool Debug::Load() {
// Bail out if we're already in the process of compiling the native // Bail out if we're already in the process of compiling the native
// JavaScript source code for the debugger. // JavaScript source code for the debugger.
if (Debugger::compiling_natives()) return false; if (Debugger::compiling_natives() || Debugger::is_loading_debugger())
return false;
Debugger::set_loading_debugger(true);
// Disable breakpoints and interrupts while compiling and running the // Disable breakpoints and interrupts while compiling and running the
// debugger scripts including the context creation code. // debugger scripts including the context creation code.
...@@ -587,6 +588,10 @@ bool Debug::Load() { ...@@ -587,6 +588,10 @@ bool Debug::Load() {
!CompileDebuggerScript(Natives::GetIndex("debug")); !CompileDebuggerScript(Natives::GetIndex("debug"));
Debugger::set_compiling_natives(false); Debugger::set_compiling_natives(false);
// Make sure we mark the debugger as not loading before we might
// return.
Debugger::set_loading_debugger(false);
// Check for caught exceptions. // Check for caught exceptions.
if (caught_exception) return false; if (caught_exception) return false;
...@@ -1295,6 +1300,7 @@ bool Debug::IsDebugGlobal(GlobalObject* global) { ...@@ -1295,6 +1300,7 @@ bool Debug::IsDebugGlobal(GlobalObject* global) {
bool Debugger::debugger_active_ = false; bool Debugger::debugger_active_ = false;
bool Debugger::compiling_natives_ = false; bool Debugger::compiling_natives_ = false;
bool Debugger::is_loading_debugger_ = false;
DebugMessageThread* Debugger::message_thread_ = NULL; DebugMessageThread* Debugger::message_thread_ = NULL;
v8::DebugMessageHandler Debugger::debug_message_handler_ = NULL; v8::DebugMessageHandler Debugger::debug_message_handler_ = NULL;
void* Debugger::debug_message_handler_data_ = NULL; void* Debugger::debug_message_handler_data_ = NULL;
......
...@@ -373,10 +373,13 @@ class Debugger { ...@@ -373,10 +373,13 @@ class Debugger {
Debugger::compiling_natives_ = compiling_natives; Debugger::compiling_natives_ = compiling_natives;
} }
static bool compiling_natives() { return Debugger::compiling_natives_; } static bool compiling_natives() { return Debugger::compiling_natives_; }
static void set_loading_debugger(bool v) { is_loading_debugger_ = v; }
static bool is_loading_debugger() { return Debugger::is_loading_debugger_; }
private: private:
static bool debugger_active_; // Are there any active debugger? static bool debugger_active_; // Are there any active debugger?
static bool compiling_natives_; // Are we compiling natives? static bool compiling_natives_; // Are we compiling natives?
static bool is_loading_debugger_; // Are we loading the debugger?
static DebugMessageThread* message_thread_; static DebugMessageThread* message_thread_;
static v8::DebugMessageHandler debug_message_handler_; static v8::DebugMessageHandler debug_message_handler_;
static void* debug_message_handler_data_; static void* debug_message_handler_data_;
......
...@@ -1240,19 +1240,80 @@ void MarkCompactCollector::VerifyPageHeaders(PagedSpace* space) { ...@@ -1240,19 +1240,80 @@ void MarkCompactCollector::VerifyPageHeaders(PagedSpace* space) {
// Helper class for updating pointers in HeapObjects. // Helper class for updating pointers in HeapObjects.
class UpdatingVisitor: public ObjectVisitor { class UpdatingVisitor: public ObjectVisitor {
public: public:
void VisitPointer(Object** p) { void VisitPointer(Object** p) {
MarkCompactCollector::UpdatePointer(p); UpdatePointer(p);
} }
void VisitPointers(Object** start, Object** end) { void VisitPointers(Object** start, Object** end) {
// Mark all HeapObject pointers in [start, end) // Mark all HeapObject pointers in [start, end)
for (Object** p = start; p < end; p++) { for (Object** p = start; p < end; p++) UpdatePointer(p);
MarkCompactCollector::UpdatePointer(p);
} }
private:
void UpdatePointer(Object** p) {
if (!(*p)->IsHeapObject()) return;
HeapObject* obj = HeapObject::cast(*p);
Address old_addr = obj->address();
Address new_addr;
ASSERT(!Heap::InFromSpace(obj));
if (Heap::new_space()->Contains(obj)) {
Address f_addr = Heap::new_space()->FromSpaceLow() +
Heap::new_space()->ToSpaceOffsetForAddress(old_addr);
new_addr = Memory::Address_at(f_addr);
#ifdef DEBUG
ASSERT(Heap::old_space()->Contains(new_addr) ||
Heap::code_space()->Contains(new_addr) ||
Heap::new_space()->FromSpaceContains(new_addr));
if (Heap::new_space()->FromSpaceContains(new_addr)) {
ASSERT(Heap::new_space()->FromSpaceOffsetForAddress(new_addr) <=
Heap::new_space()->ToSpaceOffsetForAddress(old_addr));
}
#endif
} else if (Heap::lo_space()->Contains(obj)) {
// Don't move objects in the large object space.
return;
} else {
ASSERT(Heap::old_space()->Contains(obj) ||
Heap::code_space()->Contains(obj) ||
Heap::map_space()->Contains(obj));
new_addr = MarkCompactCollector::GetForwardingAddressInOldSpace(obj);
ASSERT(Heap::old_space()->Contains(new_addr) ||
Heap::code_space()->Contains(new_addr) ||
Heap::map_space()->Contains(new_addr));
#ifdef DEBUG
if (Heap::old_space()->Contains(obj)) {
ASSERT(Heap::old_space()->MCSpaceOffsetForAddress(new_addr) <=
Heap::old_space()->MCSpaceOffsetForAddress(old_addr));
} else if (Heap::code_space()->Contains(obj)) {
ASSERT(Heap::code_space()->MCSpaceOffsetForAddress(new_addr) <=
Heap::code_space()->MCSpaceOffsetForAddress(old_addr));
} else {
ASSERT(Heap::map_space()->MCSpaceOffsetForAddress(new_addr) <=
Heap::map_space()->MCSpaceOffsetForAddress(old_addr));
}
#endif
}
*p = HeapObject::FromAddress(new_addr);
#ifdef DEBUG
if (FLAG_gc_verbose) {
PrintF("update %p : %p -> %p\n",
reinterpret_cast<Address>(p), old_addr, new_addr);
}
#endif
} }
}; };
void MarkCompactCollector::UpdatePointers() { void MarkCompactCollector::UpdatePointers() {
#ifdef DEBUG #ifdef DEBUG
ASSERT(state_ == ENCODE_FORWARDING_ADDRESSES); ASSERT(state_ == ENCODE_FORWARDING_ADDRESSES);
...@@ -1391,70 +1452,6 @@ Address MarkCompactCollector::GetForwardingAddressInOldSpace(HeapObject* obj) { ...@@ -1391,70 +1452,6 @@ Address MarkCompactCollector::GetForwardingAddressInOldSpace(HeapObject* obj) {
return next_page->OffsetToAddress(offset); return next_page->OffsetToAddress(offset);
} }
void MarkCompactCollector::UpdatePointer(Object** p) {
// We need to check if p is in to_space.
if (!(*p)->IsHeapObject()) return;
HeapObject* obj = HeapObject::cast(*p);
Address old_addr = obj->address();
Address new_addr;
ASSERT(!Heap::InFromSpace(obj));
if (Heap::new_space()->Contains(obj)) {
Address f_addr = Heap::new_space()->FromSpaceLow() +
Heap::new_space()->ToSpaceOffsetForAddress(old_addr);
new_addr = Memory::Address_at(f_addr);
#ifdef DEBUG
ASSERT(Heap::old_space()->Contains(new_addr) ||
Heap::code_space()->Contains(new_addr) ||
Heap::new_space()->FromSpaceContains(new_addr));
if (Heap::new_space()->FromSpaceContains(new_addr)) {
ASSERT(Heap::new_space()->FromSpaceOffsetForAddress(new_addr) <=
Heap::new_space()->ToSpaceOffsetForAddress(old_addr));
}
#endif
} else if (Heap::lo_space()->Contains(obj)) {
// Don't move objects in the large object space.
new_addr = obj->address();
} else {
ASSERT(Heap::old_space()->Contains(obj) ||
Heap::code_space()->Contains(obj) ||
Heap::map_space()->Contains(obj));
new_addr = GetForwardingAddressInOldSpace(obj);
ASSERT(Heap::old_space()->Contains(new_addr) ||
Heap::code_space()->Contains(new_addr) ||
Heap::map_space()->Contains(new_addr));
#ifdef DEBUG
if (Heap::old_space()->Contains(obj)) {
ASSERT(Heap::old_space()->MCSpaceOffsetForAddress(new_addr) <=
Heap::old_space()->MCSpaceOffsetForAddress(old_addr));
} else if (Heap::code_space()->Contains(obj)) {
ASSERT(Heap::code_space()->MCSpaceOffsetForAddress(new_addr) <=
Heap::code_space()->MCSpaceOffsetForAddress(old_addr));
} else {
ASSERT(Heap::map_space()->MCSpaceOffsetForAddress(new_addr) <=
Heap::map_space()->MCSpaceOffsetForAddress(old_addr));
}
#endif
}
*p = HeapObject::FromAddress(new_addr);
#ifdef DEBUG
if (FLAG_gc_verbose) {
PrintF("update %p : %p -> %p\n",
reinterpret_cast<Address>(p), old_addr, new_addr);
}
#endif
}
#ifdef DEBUG #ifdef DEBUG
void MarkCompactCollector::VerifyHeapAfterUpdatingPointers() { void MarkCompactCollector::VerifyHeapAfterUpdatingPointers() {
......
...@@ -272,9 +272,6 @@ class MarkCompactCollector : public AllStatic { ...@@ -272,9 +272,6 @@ class MarkCompactCollector : public AllStatic {
// Returns the heap size of the object. // Returns the heap size of the object.
static int UpdatePointersInOldObject(HeapObject* obj); static int UpdatePointersInOldObject(HeapObject* obj);
// Updates the pointer in a slot.
static void UpdatePointer(Object** p);
// Calculates the forwarding address of an object in an old space. // Calculates the forwarding address of an object in an old space.
static Address GetForwardingAddressInOldSpace(HeapObject* obj); static Address GetForwardingAddressInOldSpace(HeapObject* obj);
......
...@@ -94,12 +94,10 @@ static Object* IllegalOperation() { ...@@ -94,12 +94,10 @@ static Object* IllegalOperation() {
static Object* Runtime_CloneObjectLiteralBoilerplate(Arguments args) { static Object* Runtime_CloneObjectLiteralBoilerplate(Arguments args) {
CONVERT_CHECKED(JSObject, boilerplate, args[0]); CONVERT_CHECKED(JSObject, boilerplate, args[0]);
#ifdef DEBUG // Verify that the constructor of the boilerplate is equal to the
// Verify the constructor of the boilerplate is equal to the // object function in the current global context.
// object function in the CURRENT global_context. ASSERT(boilerplate->map()->constructor() ==
CHECK(boilerplate->map()->constructor() Top::context()->global_context()->object_function());
== Top::context()->global_context()->object_function());
#endif
return boilerplate->Copy(); return boilerplate->Copy();
} }
......
// Copyright 2006-2008 Google Inc. All Rights Reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/*
* This file is included in all mini jsunit test cases. The test
* framework expects lines that signal failed tests to start with
* the f-word and ignore all other lines.
*/
// Avoid writing the f-word, since some tests output parts of this code.
var the_f_word = "Fai" + "lure";
function fail(expected, found, name_opt) {
var start;
if (name_opt) {
start = the_f_word + " (" + name_opt + "): ";
} else {
start = the_f_word + ":";
}
print(start + " expected <" + expected + "> found <" + found + ">");
}
function assertEquals(expected, found, name_opt) {
if (expected != found) {
fail(expected, found, name_opt);
}
}
function assertArrayEquals(expected, found, name_opt) {
var start = "";
if (name_opt) {
start = name_opt + " - ";
}
assertEquals(expected.length, found.length, start + "array length");
if (expected.length == found.length) {
for (var i = 0; i < expected.length; ++i) {
assertEquals(expected[i], found[i], start + "array element at index " + i);
}
}
}
function assertTrue(value, name_opt) {
assertEquals(true, value, name_opt);
}
function assertFalse(value, name_opt) {
assertEquals(false, value, name_opt);
}
function assertNaN(value, name_opt) {
if (!isNaN(value)) {
fail("NaN", value, name_opt);
}
}
function assertThrows(code) {
try {
eval(code);
assertTrue(false, "did not throw exception");
} catch (e) {
// Do nothing.
}
}
function assertInstanceof(obj, type) {
if (!(obj instanceof type)) {
assertTrue(false, "Object <" + obj + "> is not an instance of <" + type + ">");
}
}
function assertDoesNotThrow(code) {
try {
eval(code);
} catch (e) {
assertTrue(false, "threw an exception");
}
}
function assertUnreachable(name_opt) {
var message = the_f_word + ": unreachable"
if (name_opt) {
message += " - " + name_opt;
}
print(message);
}
...@@ -43,6 +43,12 @@ A project which uses V8 should then depend on v8_snapshot.vcproj. ...@@ -43,6 +43,12 @@ A project which uses V8 should then depend on v8_snapshot.vcproj.
If V8 without snapshot if preferred only v8_base.vcproj and v8.vcproj are If V8 without snapshot if preferred only v8_base.vcproj and v8.vcproj are
required and a project which uses V8 should depend on v8.vcproj. required and a project which uses V8 should depend on v8.vcproj.
Two sample project files are available as well. These are v8_shell_sample.vcproj
for building the sample in samples\shell.cc and v8_process_sample.vcproj for
building the sample in samples\process.cc. Add either of these (or both) to a
solution with v8_base, v8, v8_mksnapshot and v8_snapshot set up as described
above and have them depend on v8_snapshot.
Python requirements Python requirements
------------------- -------------------
When using the Microsoft Visual Studio project files Python version 2.4 or later When using the Microsoft Visual Studio project files Python version 2.4 or later
......
...@@ -183,7 +183,7 @@ ...@@ -183,7 +183,7 @@
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
Description="Processing js files..." Description="Processing js files..."
CommandLine=".\js2c.cmd ..\..\src $(IntDir)\DerivedSources" CommandLine=".\js2c.cmd ..\..\src $(IntDir)\DerivedSources&#x0D;&#x0A;"
AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js" AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js"
Outputs="$(IntDir)\DerivedSources\natives.cc;$(IntDir)\DerivedSources\natives-empty.cc" Outputs="$(IntDir)\DerivedSources\natives.cc;$(IntDir)\DerivedSources\natives-empty.cc"
/> />
...@@ -194,7 +194,7 @@ ...@@ -194,7 +194,7 @@
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
Description="Processing js files..." Description="Processing js files..."
CommandLine=".\js2c.cmd ..\..\src $(IntDir)\DerivedSources" CommandLine=".\js2c.cmd ..\..\src $(IntDir)\DerivedSources&#x0D;&#x0A;"
AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js" AdditionalDependencies="..\..\src\macros.py;..\..\src\runtime.js;..\..\src\v8natives.js;..\..\src\array.js;..\..\src\string.js;..\..\src\uri.js;..\..\src\math.js;..\..\src\messages.js;..\..\src\apinatives.js;..\..\src\debug-delay.js;..\..\src\mirror-delay.js;..\..\src\date-delay.js;..\..\src\regexp-delay.js"
Outputs="$(IntDir)\DerivedSources\natives.cc;$(IntDir)\DerivedSources\natives-empty.cc" Outputs="$(IntDir)\DerivedSources\natives.cc;$(IntDir)\DerivedSources\natives-empty.cc"
/> />
...@@ -208,10 +208,6 @@ ...@@ -208,10 +208,6 @@
RelativePath="$(IntDir)\DerivedSources\natives.cc" RelativePath="$(IntDir)\DerivedSources\natives.cc"
> >
</File> </File>
<File
RelativePath=".\prebuild.py"
>
</File>
</Filter> </Filter>
<File <File
RelativePath="..\..\src\snapshot-empty.cc" RelativePath="..\..\src\snapshot-empty.cc"
......
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Name="v8_process_sample"
ProjectGUID="{EF019874-D38A-40E3-B17C-DB5923F0A79C}"
RootNamespace="v8_process_sample"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
ConfigurationType="1"
InheritedPropertySheets=".\common.vsprops;.\debug.vsprops"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
ConfigurationType="1"
InheritedPropertySheets=".\common.vsprops;.\release.vsprops"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath="..\..\samples\process.cc"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Name="v8_shell_sample"
ProjectGUID="{2DE20FFA-6F5E-48D9-84D8-09B044A5B119}"
RootNamespace="v8_shell_sample"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
ConfigurationType="1"
InheritedPropertySheets=".\common.vsprops;.\debug.vsprops"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
ConfigurationType="1"
InheritedPropertySheets=".\common.vsprops;.\release.vsprops"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath="..\..\samples\shell.cc"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment