| Index: runtime/vm/object.cc
|
| ===================================================================
|
| --- runtime/vm/object.cc (revision 19105)
|
| +++ runtime/vm/object.cc (working copy)
|
| @@ -133,6 +133,7 @@
|
| V(CoreLibrary, NoSuchMethodError, _throwNew) \
|
| V(CoreLibrary, int, _throwFormatException) \
|
| V(CoreLibrary, int, _parse) \
|
| + V(CoreLibrary, StackTrace, _setupFullStackTrace) \
|
|
|
|
|
| static void MarkFunctionAsInvisible(const Library& lib,
|
| @@ -782,7 +783,7 @@
|
|
|
| cls = Class::New<Stacktrace>();
|
| object_store->set_stacktrace_class(cls);
|
| - RegisterClass(cls, Symbols::Stacktrace(), core_lib);
|
| + RegisterClass(cls, Symbols::StackTrace(), core_lib);
|
| pending_classes.Add(cls, Heap::kOld);
|
| // Super type set below, after Object is allocated.
|
|
|
| @@ -12874,6 +12875,21 @@
|
| }
|
|
|
|
|
| +void Stacktrace::set_catch_func_array(const Array& function_array) const {
|
| + StorePointer(&raw_ptr()->catch_func_array_, function_array.raw());
|
| +}
|
| +
|
| +
|
| +void Stacktrace::set_catch_code_array(const Array& code_array) const {
|
| + StorePointer(&raw_ptr()->catch_code_array_, code_array.raw());
|
| +}
|
| +
|
| +
|
| +void Stacktrace::set_catch_pc_offset_array(const Array& pc_offset_array) const {
|
| + StorePointer(&raw_ptr()->catch_pc_offset_array_, pc_offset_array.raw());
|
| +}
|
| +
|
| +
|
| RawStacktrace* Stacktrace::New(const Array& func_array,
|
| const Array& code_array,
|
| const Array& pc_offset_array,
|
| @@ -12928,7 +12944,40 @@
|
| }
|
|
|
|
|
| +void Stacktrace::SetCatchStacktrace(const Array& func_array,
|
| + const Array& code_array,
|
| + const Array& pc_offset_array) const {
|
| + StorePointer(&raw_ptr()->catch_func_array_, func_array.raw());
|
| + StorePointer(&raw_ptr()->catch_code_array_, code_array.raw());
|
| + StorePointer(&raw_ptr()->catch_pc_offset_array_, pc_offset_array.raw());
|
| +}
|
| +
|
| +
|
| +RawString* Stacktrace::FullStacktrace() const {
|
| + const Array& func_array = Array::Handle(raw_ptr()->catch_func_array_);
|
| + if (!func_array.IsNull()) {
|
| + const Array& code_array = Array::Handle(raw_ptr()->catch_code_array_);
|
| + const Array& pc_offset_array =
|
| + Array::Handle(raw_ptr()->catch_pc_offset_array_);
|
| + const Stacktrace& catch_trace = Stacktrace::Handle(
|
| + Stacktrace::New(func_array, code_array, pc_offset_array));
|
| + const String& trace =
|
| + String::Handle(String::New(catch_trace.ToCStringInternal()));
|
| + const String& throw_trace =
|
| + String::Handle(String::New(ToCStringInternal()));
|
| + return String::Concat(throw_trace, trace);
|
| + }
|
| + return String::New(ToCStringInternal());
|
| +}
|
| +
|
| +
|
| const char* Stacktrace::ToCString() const {
|
| + const String& trace = String::Handle(FullStacktrace());
|
| + return trace.ToCString();
|
| +}
|
| +
|
| +
|
| +const char* Stacktrace::ToCStringInternal() const {
|
| Isolate* isolate = Isolate::Current();
|
| Function& function = Function::Handle();
|
| Code& code = Code::Handle();
|
|
|