amis-rpc-design/node_modules/react-native/ReactCommon/hermes/inspector/chrome/MessageConverters.h

136 lines
3.9 KiB
C
Raw Normal View History

2023-10-07 19:42:30 +08:00
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <regex>
#include <string>
#include <vector>
#include <hermes/DebuggerAPI.h>
#include <hermes/hermes.h>
#include <hermes/inspector/chrome/MessageTypes.h>
#include <hermes/inspector/chrome/RemoteObjectsTable.h>
#include <jsi/JSIDynamic.h>
#include <jsi/jsi.h>
namespace facebook {
namespace hermes {
namespace inspector {
namespace chrome {
namespace message {
std::string stripCachePrevention(const std::string &url);
template <typename T>
void setHermesLocation(
facebook::hermes::debugger::SourceLocation &hermesLoc,
const T &chromeLoc,
const std::vector<std::string> &parsedScripts) {
hermesLoc.line = chromeLoc.lineNumber + 1;
if (chromeLoc.columnNumber.has_value()) {
if (chromeLoc.columnNumber.value() == 0) {
// TODO: When CDTP sends a column number of 0, we send Hermes a column
// number of 1. For some reason, this causes Hermes to not be
// able to resolve breakpoints.
hermesLoc.column = ::facebook::hermes::debugger::kInvalidLocation;
} else {
hermesLoc.column = chromeLoc.columnNumber.value() + 1;
}
}
if (chromeLoc.url.has_value()) {
hermesLoc.fileName = stripCachePrevention(chromeLoc.url.value());
} else if (chromeLoc.urlRegex.has_value()) {
const std::regex regex(stripCachePrevention(chromeLoc.urlRegex.value()));
auto it = parsedScripts.rbegin();
// We currently only support one physical breakpoint per location, so
// search backwards so that we find the latest matching file.
while (it != parsedScripts.rend()) {
if (std::regex_match(*it, regex)) {
hermesLoc.fileName = *it;
break;
}
it++;
}
}
}
template <typename T>
void setChromeLocation(
T &chromeLoc,
const facebook::hermes::debugger::SourceLocation &hermesLoc) {
if (hermesLoc.line != facebook::hermes::debugger::kInvalidLocation) {
chromeLoc.lineNumber = hermesLoc.line - 1;
}
if (hermesLoc.column != facebook::hermes::debugger::kInvalidLocation) {
chromeLoc.columnNumber = hermesLoc.column - 1;
}
}
/// ErrorCode magic numbers match JSC's (see InspectorBackendDispatcher.cpp)
enum class ErrorCode {
ParseError = -32700,
InvalidRequest = -32600,
MethodNotFound = -32601,
InvalidParams = -32602,
InternalError = -32603,
ServerError = -32000
};
ErrorResponse
makeErrorResponse(int id, ErrorCode code, const std::string &message);
OkResponse makeOkResponse(int id);
namespace debugger {
Location makeLocation(const facebook::hermes::debugger::SourceLocation &loc);
CallFrame makeCallFrame(
uint32_t callFrameIndex,
const facebook::hermes::debugger::CallFrameInfo &callFrameInfo,
const facebook::hermes::debugger::LexicalInfo &lexicalInfo,
facebook::hermes::inspector::chrome::RemoteObjectsTable &objTable,
jsi::Runtime &runtime,
const facebook::hermes::debugger::ProgramState &state);
std::vector<CallFrame> makeCallFrames(
const facebook::hermes::debugger::ProgramState &state,
facebook::hermes::inspector::chrome::RemoteObjectsTable &objTable,
jsi::Runtime &runtime);
} // namespace debugger
namespace runtime {
CallFrame makeCallFrame(const facebook::hermes::debugger::CallFrameInfo &info);
std::vector<CallFrame> makeCallFrames(
const facebook::hermes::debugger::StackTrace &stackTrace);
ExceptionDetails makeExceptionDetails(
const facebook::hermes::debugger::ExceptionDetails &details);
RemoteObject makeRemoteObject(
facebook::jsi::Runtime &runtime,
const facebook::jsi::Value &value,
facebook::hermes::inspector::chrome::RemoteObjectsTable &objTable,
const std::string &objectGroup,
bool byValue = false);
} // namespace runtime
} // namespace message
} // namespace chrome
} // namespace inspector
} // namespace hermes
} // namespace facebook