Skip to content

Commit 87838e7

Browse files
author
Nako Sung
committed
Merge branch 'master' of https://github.com/ncsoft/Unreal.js
2 parents 4428210 + af04cbb commit 87838e7

File tree

7 files changed

+259
-24
lines changed

7 files changed

+259
-24
lines changed

Plugins/UnrealJS/Source/V8/Private/Delegates.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "JavascriptDelegate.h"
33
#include "Translator.h"
44
#include "Delegates.h"
5+
#include "JavascriptStats.h"
56

67
using namespace v8;
78

@@ -282,6 +283,8 @@ class FJavascriptDelegate
282283

283284
void Fire(void* Parms, UJavascriptDelegate* Delegate)
284285
{
286+
SCOPE_CYCLE_COUNTER(STAT_JavascriptDelegate);
287+
285288
auto Buffer = reinterpret_cast<uint8*>(Parms);
286289

287290
auto it = functions.Find(Delegate->UniqueId);

Plugins/UnrealJS/Source/V8/Private/Exception.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,23 @@ struct FV8Exception
1616
}
1717
else
1818
{
19-
auto filename = StringFromV8(message->GetScriptResourceName());
20-
auto linenum = message->GetLineNumber();
21-
auto line = StringFromV8(message->GetSourceLine());
19+
if (!exception.IsEmpty())
20+
{
21+
auto filename = StringFromV8(message->GetScriptResourceName());
22+
auto linenum = message->GetLineNumber();
23+
auto line = StringFromV8(message->GetSourceLine());
2224

23-
UE_LOG(Javascript, Error, TEXT("%s:%d: %s"), *filename, linenum, *exception);
25+
UE_LOG(Javascript, Error, TEXT("%s:%d: %s"), *filename, linenum, *exception);
2426

25-
auto stack_trace = StringFromV8(try_catch.StackTrace());
26-
if (stack_trace.Len() > 0)
27-
{
28-
TArray<FString> Lines;
29-
stack_trace.ParseIntoArrayLines(Lines);
30-
for (const auto& line : Lines)
27+
auto stack_trace = StringFromV8(try_catch.StackTrace());
28+
if (stack_trace.Len() > 0)
3129
{
32-
UE_LOG(Javascript, Error, TEXT("%s"), *line);
30+
TArray<FString> Lines;
31+
stack_trace.ParseIntoArrayLines(Lines);
32+
for (const auto& line : Lines)
33+
{
34+
UE_LOG(Javascript, Error, TEXT("%s"), *line);
35+
}
3336
}
3437
}
3538
}

Plugins/UnrealJS/Source/V8/Private/JavascriptContext_Private.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "JavascriptGeneratedFunction.h"
2222
#include "StructMemoryInstance.h"
2323

24+
#include "JavascriptStats.h"
25+
2426
using namespace v8;
2527

2628
static const int kContextEmbedderDataIndex = 1;
@@ -1664,6 +1666,8 @@ class FJavascriptContextImplementation : public FJavascriptContext
16641666

16651667
bool CallProxyFunction(UObject* Holder, UObject* This, UFunction* FunctionToCall, void* Parms)
16661668
{
1669+
SCOPE_CYCLE_COUNTER(STAT_JavascriptProxy);
1670+
16671671
Isolate::Scope isolate_scope(isolate());
16681672
HandleScope handle_scope(isolate());
16691673

Plugins/UnrealJS/Source/V8/Private/JavascriptIsolate_Private.cpp

Lines changed: 196 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,7 @@
1616
#if WITH_EDITOR
1717
#include "ScopedTransaction.h"
1818
#endif
19-
20-
DECLARE_STATS_GROUP(TEXT("Javascript"), STATGROUP_Javascript, STATCAT_Advanced);
21-
22-
DECLARE_CYCLE_STAT(TEXT("Scavenge"), STAT_Scavenge, STATGROUP_Javascript);
23-
DECLARE_CYCLE_STAT(TEXT("MarkSweepCompact"), STAT_MarkSweepCompact, STATGROUP_Javascript);
24-
DECLARE_CYCLE_STAT(TEXT("IncrementalMarking"), STAT_IncrementalMarking, STATGROUP_Javascript);
25-
DECLARE_CYCLE_STAT(TEXT("ProcessWeakCallbacks"), STAT_ProcessWeakCallbacks, STATGROUP_Javascript);
26-
27-
DECLARE_MEMORY_STAT(TEXT("NewSpace"), STAT_NewSpace, STATGROUP_Javascript);
28-
DECLARE_MEMORY_STAT(TEXT("OldSpace"), STAT_OldSpace, STATGROUP_Javascript);
29-
DECLARE_MEMORY_STAT(TEXT("CodeSpace"), STAT_CodeSpace, STATGROUP_Javascript);
30-
DECLARE_MEMORY_STAT(TEXT("MapSpace"), STAT_MapSpace, STATGROUP_Javascript);
31-
DECLARE_MEMORY_STAT(TEXT("LoSpace"), STAT_LoSpace, STATGROUP_Javascript);
19+
#include "JavascriptStats.h"
3220

3321
using namespace v8;
3422

@@ -98,6 +86,10 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
9886

9987
if (IsValid(Object))
10088
{
89+
FScopeCycleCounterUObject ContextScope(Object);
90+
FScopeCycleCounterUObject PropertyScope(Property);
91+
SCOPE_CYCLE_COUNTER(STAT_JavascriptPropertyGet);
92+
10193
if (auto p = Cast<UMulticastDelegateProperty>(Property))
10294
{
10395
return GetSelf(isolate)->Delegates->GetProxy(self, Object, p);
@@ -168,6 +160,10 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
168160

169161
if (IsValid(Object))
170162
{
163+
FScopeCycleCounterUObject ContextScope(Object);
164+
FScopeCycleCounterUObject PropertyScope(Property);
165+
SCOPE_CYCLE_COUNTER(STAT_JavascriptPropertySet);
166+
171167
// Multicast delegate
172168
if (auto p = Cast<UMulticastDelegateProperty>(Property))
173169
{
@@ -342,6 +338,8 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
342338
ExportMemory(ObjectTemplate);
343339

344340
ExportMisc(ObjectTemplate);
341+
342+
ExportProfiler(ObjectTemplate);
345343
}
346344

347345
~FJavascriptIsolateImplementation()
@@ -555,8 +553,24 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
555553

556554
void ReadOffStruct(Local<Object> v8_obj, UStruct* Struct, uint8* struct_buffer)
557555
{
556+
SCOPE_CYCLE_COUNTER(STAT_JavascriptReadOffStruct);
557+
FScopeCycleCounterUObject StructContext(Struct);
558+
558559
FIsolateHelper I(isolate_);
559560

561+
/*
562+
MaybeLocal<Array> _arr = v8_obj->GetOwnPropertyNames();
563+
if (_arr.IsEmpty()) return;
564+
565+
auto arr = _arr.ToLocalChecked();
566+
567+
auto len = arr->Length();
568+
569+
for (decltype(len) Index = 0; Index < len; ++Index)
570+
{
571+
}
572+
*/
573+
560574
for (TFieldIterator<UProperty> PropertyIt(Struct, EFieldIteratorFlags::IncludeSuper); PropertyIt; ++PropertyIt)
561575
{
562576
auto Property = *PropertyIt;
@@ -782,6 +796,173 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
782796
ReadOnly);
783797
}
784798

799+
static Local<Object> Visit(Isolate* isolate, const v8::CpuProfileNode* node)
800+
{
801+
static TMap<const v8::CpuProfileNode*, Handle<Object>> Visited;
802+
803+
if (!isolate)
804+
{
805+
Visited.Empty();
806+
return Local<Object>();
807+
}
808+
auto Existing = Visited.Find(node);
809+
if (Existing) return *Existing;
810+
811+
FIsolateHelper I(isolate);
812+
813+
auto Out = Object::New(isolate);
814+
815+
Visited.Add(node, Out);
816+
817+
Out->Set(I.Keyword("ScriptResourceName"), node->GetScriptResourceName());
818+
Out->Set(I.Keyword("FunctionName"), node->GetFunctionName());
819+
Out->Set(I.Keyword("HitCount"), Integer::NewFromUnsigned(isolate,node->GetHitCount()));
820+
Out->Set(I.Keyword("LineNumber"), Integer::New(isolate,node->GetLineNumber()));
821+
Out->Set(I.Keyword("ColumnNumber"), Integer::New(isolate,node->GetColumnNumber()));
822+
Out->Set(I.Keyword("ScriptId"), Integer::New(isolate, node->GetScriptId()));
823+
824+
{
825+
uint32_t Num = node->GetHitLineCount();
826+
TArray<v8::CpuProfileNode::LineTick> Buffer;
827+
Buffer.AddDefaulted(Num);
828+
node->GetLineTicks(Buffer.GetData(), Num);
829+
830+
auto Arr = Array::New(isolate, Num);
831+
for (uint32_t Index = 0; Index < Num; ++Index)
832+
{
833+
const auto& info = Buffer[Index];
834+
auto item = Object::New(isolate);
835+
item->Set(I.Keyword("line"), Integer::New(isolate,info.line));
836+
item->Set(I.Keyword("hit_count"), Integer::New(isolate, info.hit_count));
837+
Arr->Set(Index, item);
838+
}
839+
Out->Set(I.Keyword("LineTicks"), Arr);
840+
}
841+
842+
auto BailOutReason = node->GetBailoutReason();
843+
if (BailOutReason)
844+
{
845+
Out->Set(I.Keyword("BailOutReason"), I.Keyword(BailOutReason));
846+
}
847+
848+
{
849+
const auto& deopt = node->GetDeoptInfos();
850+
uint32_t Num = deopt.size();
851+
if (Num)
852+
{
853+
auto Arr = Array::New(isolate, deopt.size());
854+
for (uint32_t Index = 0; Index < Num; ++Index)
855+
{
856+
const auto& info = deopt[Index];
857+
FString out;
858+
for (const auto& frame : info.stack)
859+
{
860+
out.Append(FString::Printf(TEXT("%d:%d "), (int)frame.script_id, (int)frame.position));
861+
}
862+
auto item = Object::New(isolate);
863+
item->Set(I.Keyword("reason"), I.Keyword(deopt[Index].deopt_reason));
864+
item->Set(I.Keyword("stack"), I.String(out));
865+
Arr->Set(Index, item);
866+
}
867+
Out->Set(I.Keyword("DeoptInfos"), Arr);
868+
}
869+
}
870+
871+
uint32_t Num = node->GetChildrenCount();
872+
if (Num)
873+
{
874+
auto Arr = Array::New(isolate, Num);
875+
for (uint32_t Index = 0; Index < Num; ++Index)
876+
{
877+
Arr->Set(Index, Visit(isolate, node->GetChild(Index)));
878+
}
879+
Out->Set(I.Keyword("Children"), Arr);
880+
}
881+
return Out;
882+
};
883+
884+
void ExportProfiler(Local<ObjectTemplate> global_templ)
885+
{
886+
FIsolateHelper I(isolate_);
887+
888+
Local<FunctionTemplate> Template = I.FunctionTemplate();
889+
890+
auto add_fn = [&](const char* name, FunctionCallback fn) {
891+
Template->PrototypeTemplate()->Set(I.Keyword(name), I.FunctionTemplate(fn));
892+
};
893+
894+
add_fn("SetSamplingInterval", [](const FunctionCallbackInfo<Value>& info)
895+
{
896+
FIsolateHelper I(info.GetIsolate());
897+
898+
auto profiler = info.GetIsolate()->GetCpuProfiler();
899+
900+
if (info.Length() == 1)
901+
{
902+
profiler->SetSamplingInterval(info[0]->IntegerValue());
903+
}
904+
});
905+
906+
add_fn("StartProfiling", [](const FunctionCallbackInfo<Value>& info)
907+
{
908+
FIsolateHelper I(info.GetIsolate());
909+
910+
auto profiler = info.GetIsolate()->GetCpuProfiler();
911+
912+
if (info.Length() == 2)
913+
{
914+
profiler->StartProfiling(info[0].As<String>(), info[1]->BooleanValue());
915+
info.GetReturnValue().Set(true);
916+
}
917+
});
918+
919+
add_fn("StopProfiling", [](const FunctionCallbackInfo<Value>& info)
920+
{
921+
auto isolate = info.GetIsolate();
922+
FIsolateHelper I(isolate);
923+
924+
auto profiler = isolate->GetCpuProfiler();
925+
926+
if (info.Length() == 1)
927+
{
928+
auto Profile = profiler->StopProfiling(info[0].As<String>());
929+
if (!Profile) return;
930+
931+
auto Out = Object::New(isolate);
932+
Out->Set(I.Keyword("Root"), Visit(isolate, Profile->GetTopDownRoot()));
933+
Out->Set(I.Keyword("Title"), Profile->GetTitle());
934+
935+
{
936+
uint32_t Num = Profile->GetSamplesCount();
937+
if (Num)
938+
{
939+
auto Arr = Array::New(isolate, Num);
940+
for (uint32_t Index = 0; Index < Num; ++Index)
941+
{
942+
Arr->Set(Index, Visit(isolate, Profile->GetSample(Index)));
943+
}
944+
Out->Set(I.Keyword("Samples"), Arr);
945+
}
946+
}
947+
948+
949+
// cleanup
950+
Visit(nullptr, nullptr);
951+
952+
info.GetReturnValue().Set(Out);
953+
954+
Profile->Delete();
955+
}
956+
});
957+
958+
global_templ->Set(
959+
I.Keyword("v8"),
960+
// Create an instance
961+
Template->GetFunction()->NewInstance(),
962+
// Do not modify!
963+
ReadOnly);
964+
}
965+
785966
void ExportMisc(Local<ObjectTemplate> global_templ)
786967
{
787968
FIsolateHelper I(isolate_);
@@ -961,6 +1142,8 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
9611142
template <typename Fn>
9621143
static Local<Value> CallFunction(Isolate* isolate, Local<Value> self, UFunction* Function, UObject* Object, Fn&& GetArg)
9631144
{
1145+
SCOPE_CYCLE_COUNTER(STAT_JavascriptFunctionCall);
1146+
9641147
FIsolateHelper I(isolate);
9651148

9661149
EscapableHandleScope handle_scope(isolate);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
DECLARE_STATS_GROUP(TEXT("Javascript"), STATGROUP_Javascript, STATCAT_Advanced);
4+
5+
DECLARE_CYCLE_STAT_EXTERN(TEXT("Scavenge"), STAT_Scavenge, STATGROUP_Javascript,V8_API);
6+
DECLARE_CYCLE_STAT_EXTERN(TEXT("MarkSweepCompact"), STAT_MarkSweepCompact, STATGROUP_Javascript, V8_API);
7+
DECLARE_CYCLE_STAT_EXTERN(TEXT("IncrementalMarking"), STAT_IncrementalMarking, STATGROUP_Javascript, V8_API);
8+
DECLARE_CYCLE_STAT_EXTERN(TEXT("ProcessWeakCallbacks"), STAT_ProcessWeakCallbacks, STATGROUP_Javascript, V8_API);
9+
10+
DECLARE_CYCLE_STAT_EXTERN(TEXT("Delegate"), STAT_JavascriptDelegate, STATGROUP_Javascript, V8_API);
11+
DECLARE_CYCLE_STAT_EXTERN(TEXT("Proxy"), STAT_JavascriptProxy, STATGROUP_Javascript, V8_API);
12+
DECLARE_CYCLE_STAT_EXTERN(TEXT("get"), STAT_JavascriptPropertyGet, STATGROUP_Javascript, V8_API);
13+
DECLARE_CYCLE_STAT_EXTERN(TEXT("set"), STAT_JavascriptPropertySet, STATGROUP_Javascript, V8_API);
14+
DECLARE_CYCLE_STAT_EXTERN(TEXT("call"), STAT_JavascriptFunctionCall, STATGROUP_Javascript, V8_API);
15+
16+
DECLARE_CYCLE_STAT_EXTERN(TEXT("struct(naive)"), STAT_JavascriptReadOffStruct, STATGROUP_Javascript, V8_API);
17+
18+
DECLARE_MEMORY_STAT_EXTERN(TEXT("NewSpace"), STAT_NewSpace, STATGROUP_Javascript, V8_API);
19+
DECLARE_MEMORY_STAT_EXTERN(TEXT("OldSpace"), STAT_OldSpace, STATGROUP_Javascript, V8_API);
20+
DECLARE_MEMORY_STAT_EXTERN(TEXT("CodeSpace"), STAT_CodeSpace, STATGROUP_Javascript, V8_API);
21+
DECLARE_MEMORY_STAT_EXTERN(TEXT("MapSpace"), STAT_MapSpace, STATGROUP_Javascript, V8_API);
22+
DECLARE_MEMORY_STAT_EXTERN(TEXT("LoSpace"), STAT_LoSpace, STATGROUP_Javascript, V8_API);

Plugins/UnrealJS/Source/V8/Private/V8Module.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22
#include <libplatform/libplatform.h>
33
#include "JavascriptContext.h"
44
#include "IV8.h"
5+
#include "JavascriptStats.h"
6+
7+
DEFINE_STAT(STAT_JavascriptDelegate);
8+
DEFINE_STAT(STAT_JavascriptProxy);
9+
DEFINE_STAT(STAT_Scavenge);
10+
DEFINE_STAT(STAT_MarkSweepCompact);
11+
DEFINE_STAT(STAT_IncrementalMarking);
12+
DEFINE_STAT(STAT_ProcessWeakCallbacks);
13+
14+
DEFINE_STAT(STAT_JavascriptPropertyGet);
15+
DEFINE_STAT(STAT_JavascriptPropertySet);
16+
DEFINE_STAT(STAT_JavascriptFunctionCall);
17+
DEFINE_STAT(STAT_JavascriptReadOffStruct);
18+
19+
DEFINE_STAT(STAT_NewSpace);
20+
DEFINE_STAT(STAT_OldSpace);
21+
DEFINE_STAT(STAT_CodeSpace);
22+
DEFINE_STAT(STAT_MapSpace);
23+
DEFINE_STAT(STAT_LoSpace);
524

625
using namespace v8;
726

Plugins/UnrealJS/Source/V8/Private/V8PCH.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "v8.h"
1111
#include <v8-debug.h>
12+
#include <v8-profiler.h>
1213

1314
#pragma warning( pop )
1415

0 commit comments

Comments
 (0)