aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/ZigConsoleClient.cpp
blob: 466e38735174006ebaf44de91e9a610373ecb406 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "helpers.h"

#include "ZigConsoleClient.h"
#include <JavaScriptCore/ConsoleClient.h>
#include <JavaScriptCore/ConsoleMessage.h>
#include <JavaScriptCore/JSString.h>
#include <JavaScriptCore/ScriptArguments.h>
#include <wtf/text/WTFString.h>
using ScriptArguments = Inspector::ScriptArguments;
using MessageType = JSC::MessageType;
using MessageLevel = JSC::MessageLevel;
using JSGlobalObject = JSC__JSGlobalObject;

using String = WTF::String;

namespace JSC {

ALWAYS_INLINE GCDeferralContext::GCDeferralContext(VM& vm)
    : m_vm(vm)
{
}

ALWAYS_INLINE GCDeferralContext::~GCDeferralContext()
{
    if constexpr (validateDFGDoesGC)
        m_vm.verifyCanGC();

    if (UNLIKELY(m_shouldGC))
        m_vm.heap.collectIfNecessaryOrDefer();
}

} // namespace JSC

extern "C" {
JSC__JSValue Inspector__ScriptArguments__argumentAt(Inspector__ScriptArguments* arg0, size_t i)
{
    return JSC::JSValue::encode(arg0->argumentAt(i));
}
size_t Inspector__ScriptArguments__argumentCount(Inspector__ScriptArguments* arg0)
{
    return arg0->argumentCount();
}
bWTF__String
Inspector__ScriptArguments__getFirstArgumentAsString(Inspector__ScriptArguments* arg0)
{
    auto scope = DECLARE_CATCH_SCOPE(arg0->globalObject()->vm());
    JSC::JSValue val0 = arg0->argumentAt(0);
    auto type = val0.asCell()->type();
    Wrap<WTF::String, bWTF__String> wrap;
    wrap.cpp = new (wrap.alignedBuffer()) WTF::String(val0.getString(arg0->globalObject()));
    scope.clearException();
    return wrap.result;
}

bool Inspector__ScriptArguments__isEqual(Inspector__ScriptArguments* arg0,
    Inspector__ScriptArguments* arg1)
{
    return arg0->isEqual(*arg1);
}

void Inspector__ScriptArguments__release(Inspector__ScriptArguments* arg0)
{
    auto count = arg0->argumentCount();
    for (int i = 0; i < count; i++) {
        JSC::gcUnprotect(arg0->argumentAt(i));
    }
    arg0->deref();
}
}
void Zig::ConsoleClient::messageWithTypeAndLevel(MessageType type, MessageLevel level,
    JSC::JSGlobalObject* globalObject,
    Ref<ScriptArguments>&& arguments)
{
    JSC::VM& vm = globalObject->vm();
    JSC::GCDeferralContext deferralContext(vm);
    JSC::DisallowGC disallowGC;
    auto args = arguments.ptr();
    JSC__JSValue jsArgs[255];

    auto count = std::min(args->argumentCount(), (size_t)255);
    for (size_t i = 0; i < count; i++) {
        auto val = args->argumentAt(i);
        // JSC::gcProtect(val);
        jsArgs[i] = JSC::JSValue::encode(val);
    }

    auto scope = DECLARE_THROW_SCOPE(vm);
    Zig__ConsoleClient__messageWithTypeAndLevel(this->m_client, static_cast<uint32_t>(type),
        static_cast<uint32_t>(level), globalObject, jsArgs,
        count);
    scope.clearException();

    // for (size_t i = 0; i < count; i++) {
    //     JSC::gcUnprotect(JSC::JSValue::decode(jsArgs[i]));
    // }
}
void Zig::ConsoleClient::count(JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__count(this->m_client, globalObject, ptr, label.length());
}

void Zig::ConsoleClient::countReset(JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__countReset(this->m_client, globalObject, ptr, label.length());
}
void Zig::ConsoleClient::profile(JSC::JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__profile(this->m_client, globalObject, ptr, label.length());
}
void Zig::ConsoleClient::profileEnd(JSC::JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__profileEnd(this->m_client, globalObject, ptr, label.length());
}
void Zig::ConsoleClient::takeHeapSnapshot(JSC::JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__takeHeapSnapshot(this->m_client, globalObject, ptr, label.length());
}
void Zig::ConsoleClient::time(JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__time(this->m_client, globalObject, ptr, label.length());
}
void Zig::ConsoleClient::timeLog(JSGlobalObject* globalObject, const String& label,
    Ref<ScriptArguments>&& arguments)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__timeLog(this->m_client, globalObject, ptr, label.length(), arguments.ptr());
}
void Zig::ConsoleClient::timeEnd(JSGlobalObject* globalObject, const String& label)
{
    auto ptr = label.characters8();
    Zig__ConsoleClient__timeEnd(this->m_client, globalObject, ptr, label.length());
}
void Zig::ConsoleClient::timeStamp(JSGlobalObject* globalObject, Ref<ScriptArguments>&& args)
{
    Zig__ConsoleClient__timeStamp(this->m_client, globalObject, args.ptr());
}
void Zig::ConsoleClient::record(JSGlobalObject*, Ref<ScriptArguments>&&) {}
void Zig::ConsoleClient::recordEnd(JSGlobalObject*, Ref<ScriptArguments>&&) {}
void Zig::ConsoleClient::screenshot(JSGlobalObject*, Ref<ScriptArguments>&&) {}
void Zig::ConsoleClient::warnUnimplemented(const String& method) {}