define properties that JS Error exposes, such as fileName, lineNumber and stack
| 272 | // define properties that JS Error exposes, such as fileName, lineNumber and |
| 273 | // stack |
| 274 | GJS_JSAPI_RETURN_CONVENTION |
| 275 | bool gjs_define_error_properties(JSContext* cx, JS::HandleObject obj) { |
| 276 | JS::RootedObject frame(cx); |
| 277 | JS::RootedString stack(cx); |
| 278 | JS::RootedString source(cx); |
| 279 | uint32_t line; |
| 280 | JS::TaggedColumnNumberOneOrigin tagged_column; |
| 281 | |
| 282 | if (!JS::CaptureCurrentStack(cx, &frame) || |
| 283 | !JS::BuildStackString(cx, nullptr, frame, &stack)) |
| 284 | return false; |
| 285 | |
| 286 | auto ok = JS::SavedFrameResult::Ok; |
| 287 | if (JS::GetSavedFrameSource(cx, nullptr, frame, &source) != ok || |
| 288 | JS::GetSavedFrameLine(cx, nullptr, frame, &line) != ok || |
| 289 | JS::GetSavedFrameColumn(cx, nullptr, frame, &tagged_column) != ok) { |
| 290 | gjs_throw(cx, "Error getting saved frame information"); |
| 291 | return false; |
| 292 | } |
| 293 | |
| 294 | const GjsAtoms& atoms = GjsContextPrivate::atoms(cx); |
| 295 | return JS_DefinePropertyById(cx, obj, atoms.stack(), stack, |
| 296 | JSPROP_ENUMERATE) && |
| 297 | JS_DefinePropertyById(cx, obj, atoms.file_name(), source, |
| 298 | JSPROP_ENUMERATE) && |
| 299 | JS_DefinePropertyById(cx, obj, atoms.line_number(), line, |
| 300 | JSPROP_ENUMERATE) && |
| 301 | JS_DefinePropertyById(cx, obj, atoms.column_number(), |
| 302 | tagged_column.oneOriginValue(), |
| 303 | JSPROP_ENUMERATE); |
| 304 | } |
| 305 | |
| 306 | [[nodiscard]] |
| 307 | static JSProtoKey proto_key_from_error_enum(int val) { |
no test coverage detected