Commit 1e744a30 authored by antonm@chromium.org's avatar antonm@chromium.org

Turn some usages of NewArray with DeleteArray in the same scope into ScopedVector or SmartPointer.

That makes it easier to maintain the code---one should care less
about releasing the memory as smart pointers would take care of
this.

Switch to ScopedVector instead Vector for the same semantics in
src/builtins.cc

Review URL: http://codereview.chromium.org/1737023

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4593 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 92a9e30c
...@@ -2185,10 +2185,10 @@ Local<String> v8::Object::ObjectProtoToString() { ...@@ -2185,10 +2185,10 @@ Local<String> v8::Object::ObjectProtoToString() {
int postfix_len = i::StrLength(postfix); int postfix_len = i::StrLength(postfix);
int buf_len = prefix_len + str_len + postfix_len; int buf_len = prefix_len + str_len + postfix_len;
char* buf = i::NewArray<char>(buf_len); i::ScopedVector<char> buf(buf_len);
// Write prefix. // Write prefix.
char* ptr = buf; char* ptr = buf.start();
memcpy(ptr, prefix, prefix_len * v8::internal::kCharSize); memcpy(ptr, prefix, prefix_len * v8::internal::kCharSize);
ptr += prefix_len; ptr += prefix_len;
...@@ -2200,8 +2200,7 @@ Local<String> v8::Object::ObjectProtoToString() { ...@@ -2200,8 +2200,7 @@ Local<String> v8::Object::ObjectProtoToString() {
memcpy(ptr, postfix, postfix_len * v8::internal::kCharSize); memcpy(ptr, postfix, postfix_len * v8::internal::kCharSize);
// Copy the buffer into a heap-allocated string and return it. // Copy the buffer into a heap-allocated string and return it.
Local<String> result = v8::String::New(buf, buf_len); Local<String> result = v8::String::New(buf.start(), buf_len);
i::DeleteArray(buf);
return result; return result;
} }
} }
......
...@@ -377,7 +377,7 @@ static Object* CallJsBuiltin(const char* name, ...@@ -377,7 +377,7 @@ static Object* CallJsBuiltin(const char* name,
name); name);
ASSERT(js_builtin->IsJSFunction()); ASSERT(js_builtin->IsJSFunction());
Handle<JSFunction> function(Handle<JSFunction>::cast(js_builtin)); Handle<JSFunction> function(Handle<JSFunction>::cast(js_builtin));
Vector<Object**> argv(Vector<Object**>::New(args.length() - 1)); ScopedVector<Object**> argv(args.length() - 1);
int n_args = args.length() - 1; int n_args = args.length() - 1;
for (int i = 0; i < n_args; i++) { for (int i = 0; i < n_args; i++) {
argv[i] = args.at<Object>(i + 1).location(); argv[i] = args.at<Object>(i + 1).location();
...@@ -388,7 +388,6 @@ static Object* CallJsBuiltin(const char* name, ...@@ -388,7 +388,6 @@ static Object* CallJsBuiltin(const char* name,
n_args, n_args,
argv.start(), argv.start(),
&pending_exception); &pending_exception);
argv.Dispose();
if (pending_exception) return Failure::Exception(); if (pending_exception) return Failure::Exception();
return *result; return *result;
} }
......
...@@ -181,15 +181,15 @@ void DebuggerAgentSession::Run() { ...@@ -181,15 +181,15 @@ void DebuggerAgentSession::Run() {
buf.GetNext(); buf.GetNext();
len++; len++;
} }
int16_t* temp = NewArray<int16_t>(len + 1); ScopedVector<int16_t> temp(len + 1);
buf.Reset(*message, StrLength(*message)); buf.Reset(*message, StrLength(*message));
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
temp[i] = buf.GetNext(); temp[i] = buf.GetNext();
} }
// Send the request received to the debugger. // Send the request received to the debugger.
v8::Debug::SendCommand(reinterpret_cast<const uint16_t *>(temp), len); v8::Debug::SendCommand(reinterpret_cast<const uint16_t *>(temp.start()),
DeleteArray(temp); len);
} }
} }
......
...@@ -52,14 +52,13 @@ namespace internal { ...@@ -52,14 +52,13 @@ namespace internal {
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
static void PrintLn(v8::Local<v8::Value> value) { static void PrintLn(v8::Local<v8::Value> value) {
v8::Local<v8::String> s = value->ToString(); v8::Local<v8::String> s = value->ToString();
char* data = NewArray<char>(s->Length() + 1); ScopedVector<char> data(s->Length() + 1);
if (data == NULL) { if (data.start() == NULL) {
V8::FatalProcessOutOfMemory("PrintLn"); V8::FatalProcessOutOfMemory("PrintLn");
return; return;
} }
s->WriteAscii(data); s->WriteAscii(data.start());
PrintF("%s\n", data); PrintF("%s\n", data.start());
DeleteArray(data);
} }
......
...@@ -470,12 +470,12 @@ static char* SkipBlackSpace(char* p) { ...@@ -470,12 +470,12 @@ static char* SkipBlackSpace(char* p) {
// static // static
int FlagList::SetFlagsFromString(const char* str, int len) { int FlagList::SetFlagsFromString(const char* str, int len) {
// make a 0-terminated copy of str // make a 0-terminated copy of str
char* copy0 = NewArray<char>(len + 1); ScopedVector<char> copy0(len + 1);
memcpy(copy0, str, len); memcpy(copy0.start(), str, len);
copy0[len] = '\0'; copy0[len] = '\0';
// strip leading white space // strip leading white space
char* copy = SkipWhiteSpace(copy0); char* copy = SkipWhiteSpace(copy0.start());
// count the number of 'arguments' // count the number of 'arguments'
int argc = 1; // be compatible with SetFlagsFromCommandLine() int argc = 1; // be compatible with SetFlagsFromCommandLine()
...@@ -485,7 +485,7 @@ int FlagList::SetFlagsFromString(const char* str, int len) { ...@@ -485,7 +485,7 @@ int FlagList::SetFlagsFromString(const char* str, int len) {
} }
// allocate argument array // allocate argument array
char** argv = NewArray<char*>(argc); ScopedVector<char*> argv(argc);
// split the flags string into arguments // split the flags string into arguments
argc = 1; // be compatible with SetFlagsFromCommandLine() argc = 1; // be compatible with SetFlagsFromCommandLine()
...@@ -497,11 +497,7 @@ int FlagList::SetFlagsFromString(const char* str, int len) { ...@@ -497,11 +497,7 @@ int FlagList::SetFlagsFromString(const char* str, int len) {
} }
// set the flags // set the flags
int result = SetFlagsFromCommandLine(&argc, argv, false); int result = SetFlagsFromCommandLine(&argc, argv.start(), false);
// cleanup
DeleteArray(argv);
DeleteArray(copy0);
return result; return result;
} }
......
...@@ -1313,9 +1313,8 @@ void Logger::LogCodeObjects() { ...@@ -1313,9 +1313,8 @@ void Logger::LogCodeObjects() {
void Logger::LogCompiledFunctions() { void Logger::LogCompiledFunctions() {
HandleScope scope; HandleScope scope;
const int compiled_funcs_count = EnumerateCompiledFunctions(NULL); const int compiled_funcs_count = EnumerateCompiledFunctions(NULL);
Handle<SharedFunctionInfo>* sfis = ScopedVector< Handle<SharedFunctionInfo> > sfis(compiled_funcs_count);
NewArray< Handle<SharedFunctionInfo> >(compiled_funcs_count); EnumerateCompiledFunctions(sfis.start());
EnumerateCompiledFunctions(sfis);
// During iteration, there can be heap allocation due to // During iteration, there can be heap allocation due to
// GetScriptLineNumber call. // GetScriptLineNumber call.
...@@ -1360,8 +1359,6 @@ void Logger::LogCompiledFunctions() { ...@@ -1360,8 +1359,6 @@ void Logger::LogCompiledFunctions() {
Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); Logger::LAZY_COMPILE_TAG, shared->code(), *func_name));
} }
} }
DeleteArray(sfis);
} }
......
...@@ -682,11 +682,11 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) { ...@@ -682,11 +682,11 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) {
if (FLAG_enable_slow_asserts) { if (FLAG_enable_slow_asserts) {
// Assert that the resource and the string are equivalent. // Assert that the resource and the string are equivalent.
ASSERT(static_cast<size_t>(this->length()) == resource->length()); ASSERT(static_cast<size_t>(this->length()) == resource->length());
SmartPointer<uc16> smart_chars(NewArray<uc16>(this->length())); ScopedVector<uc16> smart_chars(this->length());
String::WriteToFlat(this, *smart_chars, 0, this->length()); String::WriteToFlat(this, smart_chars.start(), 0, this->length());
ASSERT(memcmp(*smart_chars, ASSERT(memcmp(smart_chars.start(),
resource->data(), resource->data(),
resource->length() * sizeof(**smart_chars)) == 0); resource->length() * sizeof(smart_chars[0])) == 0);
} }
#endif // DEBUG #endif // DEBUG
...@@ -728,11 +728,11 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) { ...@@ -728,11 +728,11 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) {
if (FLAG_enable_slow_asserts) { if (FLAG_enable_slow_asserts) {
// Assert that the resource and the string are equivalent. // Assert that the resource and the string are equivalent.
ASSERT(static_cast<size_t>(this->length()) == resource->length()); ASSERT(static_cast<size_t>(this->length()) == resource->length());
SmartPointer<char> smart_chars(NewArray<char>(this->length())); ScopedVector<char> smart_chars(this->length());
String::WriteToFlat(this, *smart_chars, 0, this->length()); String::WriteToFlat(this, smart_chars.start(), 0, this->length());
ASSERT(memcmp(*smart_chars, ASSERT(memcmp(smart_chars.start(),
resource->data(), resource->data(),
resource->length()*sizeof(**smart_chars)) == 0); resource->length() * sizeof(smart_chars[0])) == 0);
} }
#endif // DEBUG #endif // DEBUG
......
...@@ -286,14 +286,12 @@ void OS::LogSharedLibraryAddresses() { ...@@ -286,14 +286,12 @@ void OS::LogSharedLibraryAddresses() {
int OS::StackWalk(Vector<OS::StackFrame> frames) { int OS::StackWalk(Vector<OS::StackFrame> frames) {
int frames_size = frames.length(); int frames_size = frames.length();
void** addresses = NewArray<void*>(frames_size); ScopedVector<void*> addresses(frames_size);
int frames_count = backtrace(addresses, frames_size); int frames_count = backtrace(addresses.start(), frames_size);
char** symbols; char** symbols = backtrace_symbols(addresses, frames_count);
symbols = backtrace_symbols(addresses, frames_count);
if (symbols == NULL) { if (symbols == NULL) {
DeleteArray(addresses);
return kStackWalkError; return kStackWalkError;
} }
...@@ -308,7 +306,6 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) { ...@@ -308,7 +306,6 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
frames[i].text[kStackWalkMaxTextLen - 1] = '\0'; frames[i].text[kStackWalkMaxTextLen - 1] = '\0';
} }
DeleteArray(addresses);
free(symbols); free(symbols);
return frames_count; return frames_count;
......
...@@ -376,14 +376,12 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) { ...@@ -376,14 +376,12 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
// backtrace is a glibc extension. // backtrace is a glibc extension.
#ifdef __GLIBC__ #ifdef __GLIBC__
int frames_size = frames.length(); int frames_size = frames.length();
void** addresses = NewArray<void*>(frames_size); ScopedVector<void*> addresses(frames_size);
int frames_count = backtrace(addresses, frames_size); int frames_count = backtrace(addresses.start(), frames_size);
char** symbols; char** symbols = backtrace_symbols(addresses.start(), frames_count);
symbols = backtrace_symbols(addresses, frames_count);
if (symbols == NULL) { if (symbols == NULL) {
DeleteArray(addresses);
return kStackWalkError; return kStackWalkError;
} }
...@@ -398,7 +396,6 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) { ...@@ -398,7 +396,6 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
frames[i].text[kStackWalkMaxTextLen - 1] = '\0'; frames[i].text[kStackWalkMaxTextLen - 1] = '\0';
} }
DeleteArray(addresses);
free(symbols); free(symbols);
return frames_count; return frames_count;
......
...@@ -283,13 +283,12 @@ int OS::StackWalk(Vector<StackFrame> frames) { ...@@ -283,13 +283,12 @@ int OS::StackWalk(Vector<StackFrame> frames) {
return 0; return 0;
int frames_size = frames.length(); int frames_size = frames.length();
void** addresses = NewArray<void*>(frames_size); ScopedVector<void*> addresses(frames_size);
int frames_count = backtrace(addresses, frames_size);
char** symbols; int frames_count = backtrace(addresses.start(), frames_size.start());
symbols = backtrace_symbols(addresses, frames_count);
char** symbols = backtrace_symbols(addresses.start(), frames_count);
if (symbols == NULL) { if (symbols == NULL) {
DeleteArray(addresses);
return kStackWalkError; return kStackWalkError;
} }
...@@ -305,7 +304,6 @@ int OS::StackWalk(Vector<StackFrame> frames) { ...@@ -305,7 +304,6 @@ int OS::StackWalk(Vector<StackFrame> frames) {
frames[i].text[kStackWalkMaxTextLen - 1] = '\0'; frames[i].text[kStackWalkMaxTextLen - 1] = '\0';
} }
DeleteArray(addresses);
free(symbols); free(symbols);
return frames_count; return frames_count;
......
...@@ -233,14 +233,12 @@ void OS::LogSharedLibraryAddresses() { ...@@ -233,14 +233,12 @@ void OS::LogSharedLibraryAddresses() {
int OS::StackWalk(Vector<OS::StackFrame> frames) { int OS::StackWalk(Vector<OS::StackFrame> frames) {
int frames_size = frames.length(); int frames_size = frames.length();
void** addresses = NewArray<void*>(frames_size); ScopedVector<void*> addresses(frames_size);
int frames_count = backtrace(addresses, frames_size); int frames_count = backtrace(addresses.start(), frames_size);
char** symbols; char** symbols = backtrace_symbols(addresses.start(), frames_count);
symbols = backtrace_symbols(addresses, frames_count);
if (symbols == NULL) { if (symbols == NULL) {
DeleteArray(addresses);
return kStackWalkError; return kStackWalkError;
} }
...@@ -255,7 +253,6 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) { ...@@ -255,7 +253,6 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
frames[i].text[kStackWalkMaxTextLen - 1] = '\0'; frames[i].text[kStackWalkMaxTextLen - 1] = '\0';
} }
DeleteArray(addresses);
free(symbols); free(symbols);
return frames_count; return frames_count;
......
...@@ -1249,16 +1249,16 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) { ...@@ -1249,16 +1249,16 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
// Try to locate a symbol for this frame. // Try to locate a symbol for this frame.
DWORD64 symbol_displacement; DWORD64 symbol_displacement;
IMAGEHLP_SYMBOL64* symbol = NULL; SmartPointer<IMAGEHLP_SYMBOL64> symbol(
symbol = NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen); NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen));
if (!symbol) return kStackWalkError; // Out of memory. if (!symbol) return kStackWalkError; // Out of memory.
memset(symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen); memset(*symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen);
symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
symbol->MaxNameLength = kStackWalkMaxNameLen; symbol->MaxNameLength = kStackWalkMaxNameLen;
ok = _SymGetSymFromAddr64(process_handle, // hProcess ok = _SymGetSymFromAddr64(process_handle, // hProcess
stack_frame.AddrPC.Offset, // Address stack_frame.AddrPC.Offset, // Address
&symbol_displacement, // Displacement &symbol_displacement, // Displacement
symbol); // Symbol *symbol); // Symbol
if (ok) { if (ok) {
// Try to locate more source information for the symbol. // Try to locate more source information for the symbol.
IMAGEHLP_LINE64 Line; IMAGEHLP_LINE64 Line;
...@@ -1294,11 +1294,9 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) { ...@@ -1294,11 +1294,9 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
// module will never be found). // module will never be found).
int err = GetLastError(); int err = GetLastError();
if (err != ERROR_MOD_NOT_FOUND) { if (err != ERROR_MOD_NOT_FOUND) {
DeleteArray(symbol);
break; break;
} }
} }
DeleteArray(symbol);
frames_count++; frames_count++;
} }
......
...@@ -412,6 +412,9 @@ class ScopedVector : public Vector<T> { ...@@ -412,6 +412,9 @@ class ScopedVector : public Vector<T> {
~ScopedVector() { ~ScopedVector() {
DeleteArray(this->start()); DeleteArray(this->start());
} }
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedVector);
}; };
......
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