[stack-trace] Remove JSArray wrapper for simple stack traces
This CL changes the Symbol "stack_trace_symbol" to directly hold a
FrameArray instead of wrapping it with a JSArray first.
Bug: v8:9115
Change-Id: I2ac0b1fb380211568abdc6d9f50431c405349dec
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1564060
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Simon Zünd <szuend@chromium.org>
Cr-Commit-Position: refs/heads/master@{#60801}
diff --git a/src/isolate.cc b/src/isolate.cc
index 9e52f93..070bef3 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -1111,7 +1111,7 @@
// TODO(yangguo): Queue this structured stack trace for preprocessing on GC.
if (options.capture_result == CaptureStackTraceOptions::RAW_FRAME_ARRAY) {
- return isolate->factory()->NewJSArrayWithElements(builder.GetElements());
+ return builder.GetElements();
}
return builder.GetElementsAsStackTraceFrameArray();
}
@@ -2110,11 +2110,9 @@
Handle<Name> key = factory()->stack_trace_symbol();
Handle<Object> property =
JSReceiver::GetDataProperty(Handle<JSObject>::cast(exception), key);
- if (!property->IsJSArray()) return false;
- Handle<JSArray> simple_stack_trace = Handle<JSArray>::cast(property);
+ if (!property->IsFixedArray()) return false;
- Handle<FrameArray> elements(FrameArray::cast(simple_stack_trace->elements()),
- this);
+ Handle<FrameArray> elements = Handle<FrameArray>::cast(property);
const int frame_count = elements->FrameCount();
for (int i = 0; i < frame_count; i++) {
diff --git a/src/messages.cc b/src/messages.cc
index 8fd0975..0860fb2 100644
--- a/src/messages.cc
+++ b/src/messages.cc
@@ -974,12 +974,8 @@
MaybeHandle<Object> ErrorUtils::FormatStackTrace(Isolate* isolate,
Handle<JSObject> error,
Handle<Object> raw_stack) {
- DCHECK(raw_stack->IsJSArray());
- Handle<JSArray> raw_stack_array = Handle<JSArray>::cast(raw_stack);
-
- DCHECK(raw_stack_array->elements()->IsFixedArray());
- Handle<FrameArray> elems(FrameArray::cast(raw_stack_array->elements()),
- isolate);
+ DCHECK(raw_stack->IsFixedArray());
+ Handle<FrameArray> elems = Handle<FrameArray>::cast(raw_stack);
const bool in_recursion = isolate->formatting_stack_trace();
if (!in_recursion) {
diff --git a/test/cctest/heap/test-heap.cc b/test/cctest/heap/test-heap.cc
index 5a92a90..50ac47a 100644
--- a/test/cctest/heap/test-heap.cc
+++ b/test/cctest/heap/test-heap.cc
@@ -3553,12 +3553,8 @@
Isolate* isolate = CcTest::i_isolate();
Handle<Name> key = isolate->factory()->stack_trace_symbol();
- Handle<FrameArray> stack_trace(
- FrameArray::cast(
- Handle<JSArray>::cast(
- Object::GetProperty(isolate, exception, key).ToHandleChecked())
- ->elements()),
- isolate);
+ Handle<FrameArray> stack_trace(Handle<FrameArray>::cast(
+ Object::GetProperty(isolate, exception, key).ToHandleChecked()));
test(stack_trace);
}
@@ -5150,8 +5146,8 @@
Object::GetElement(isolate, stack_trace, 3).ToHandleChecked();
CHECK(pos->IsSmi());
- Handle<JSArray> stack_trace_array = Handle<JSArray>::cast(stack_trace);
- int array_length = Smi::ToInt(stack_trace_array->length());
+ Handle<FrameArray> frame_array = Handle<FrameArray>::cast(stack_trace);
+ int array_length = frame_array->FrameCount();
for (int i = 0; i < array_length; i++) {
Handle<Object> element =
Object::GetElement(isolate, stack_trace, i).ToHandleChecked();