5 #include "src/api-inl.h" 6 #include "src/builtins/builtins-utils-inl.h" 7 #include "src/builtins/builtins.h" 8 #include "src/counters.h" 9 #include "src/json-stringifier.h" 10 #include "src/objects-inl.h" 19 #define MAX_STACK_LENGTH 100 23 explicit MaybeUtf8(Isolate* isolate, Handle<String>
string) : buf_(data_) {
24 string = String::Flatten(isolate,
string);
26 if (string->IsOneByteRepresentation()) {
31 len =
string->length();
32 AllocateSufficientSpace(len);
37 DisallowHeapAllocation no_gc;
38 memcpy(buf_, Handle<SeqOneByteString>::cast(
string)->GetChars(), len);
41 Local<v8::String> local = Utils::ToLocal(
string);
42 auto* v8_isolate =
reinterpret_cast<v8::Isolate*
>(isolate);
43 len = local->Utf8Length(v8_isolate);
44 AllocateSufficientSpace(len);
46 local->WriteUtf8(v8_isolate, reinterpret_cast<char*>(buf_));
51 const char* operator*()
const {
return reinterpret_cast<const char*
>(buf_); }
54 void AllocateSufficientSpace(
int len) {
55 if (len + 1 > MAX_STACK_LENGTH) {
56 allocated_.reset(
new uint8_t[len + 1]);
57 buf_ = allocated_.get();
66 uint8_t data_[MAX_STACK_LENGTH];
67 std::unique_ptr<uint8_t> allocated_;
70 class JsonTraceValue :
public ConvertableToTraceFormat {
72 explicit JsonTraceValue(Isolate* isolate, Handle<String>
object) {
77 MaybeUtf8 data(isolate,
object);
81 void AppendAsTraceFormat(std::string* out)
const override { *out += data_; }
87 const uint8_t* GetCategoryGroupEnabled(Isolate* isolate,
88 Handle<String>
string) {
89 MaybeUtf8 category(isolate,
string);
90 return TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(*category);
93 #undef MAX_STACK_LENGTH 98 BUILTIN(IsTraceCategoryEnabled) {
99 HandleScope scope(isolate);
100 Handle<Object> category = args.atOrUndefined(isolate, 1);
101 if (!category->IsString()) {
102 THROW_NEW_ERROR_RETURN_FAILURE(
103 isolate, NewTypeError(MessageTemplate::kTraceEventCategoryError));
105 return isolate->heap()->ToBoolean(
106 *GetCategoryGroupEnabled(isolate, Handle<String>::cast(category)));
111 HandleScope handle_scope(isolate);
113 Handle<Object> phase_arg = args.atOrUndefined(isolate, 1);
114 Handle<Object> category = args.atOrUndefined(isolate, 2);
115 Handle<Object> name_arg = args.atOrUndefined(isolate, 3);
116 Handle<Object> id_arg = args.atOrUndefined(isolate, 4);
117 Handle<Object> data_arg = args.atOrUndefined(isolate, 5);
119 const uint8_t* category_group_enabled =
120 GetCategoryGroupEnabled(isolate, Handle<String>::cast(category));
123 if (!*category_group_enabled) {
124 return ReadOnlyRoots(isolate).false_value();
127 if (!phase_arg->IsNumber()) {
128 THROW_NEW_ERROR_RETURN_FAILURE(
129 isolate, NewTypeError(MessageTemplate::kTraceEventPhaseError));
131 if (!category->IsString()) {
132 THROW_NEW_ERROR_RETURN_FAILURE(
133 isolate, NewTypeError(MessageTemplate::kTraceEventCategoryError));
135 if (!name_arg->IsString()) {
136 THROW_NEW_ERROR_RETURN_FAILURE(
137 isolate, NewTypeError(MessageTemplate::kTraceEventNameError));
140 uint32_t flags = TRACE_EVENT_FLAG_COPY;
142 if (!id_arg->IsNullOrUndefined(isolate)) {
143 if (!id_arg->IsNumber()) {
144 THROW_NEW_ERROR_RETURN_FAILURE(
145 isolate, NewTypeError(MessageTemplate::kTraceEventIDError));
147 flags |= TRACE_EVENT_FLAG_HAS_ID;
148 id = DoubleToInt32(id_arg->Number());
151 Handle<String> name_str = Handle<String>::cast(name_arg);
152 if (name_str->length() == 0) {
153 THROW_NEW_ERROR_RETURN_FAILURE(
154 isolate, NewTypeError(MessageTemplate::kTraceEventNameLengthError));
156 MaybeUtf8 name(isolate, name_str);
160 static const char* arg_name =
"data";
161 int32_t num_args = 0;
165 if (!data_arg->IsUndefined(isolate)) {
171 Handle<Object> result;
172 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
174 JsonStringify(isolate, data_arg, isolate->factory()->undefined_value(),
175 isolate->factory()->undefined_value()));
176 std::unique_ptr<JsonTraceValue> traced_value;
178 new JsonTraceValue(isolate, Handle<String>::cast(result)));
179 tracing::SetTraceValue(std::move(traced_value), &arg_type, &arg_value);
183 TRACE_EVENT_API_ADD_TRACE_EVENT(
184 static_cast<char>(DoubleToInt32(phase_arg->Number())),
185 category_group_enabled, *name, tracing::kGlobalScope, id, tracing::kNoId,
186 num_args, &arg_name, &arg_type, &arg_value, flags);
188 return ReadOnlyRoots(isolate).true_value();