44fe02ced6
This reverts commit d1b27019d3
.
Reason for revert: Broke vtune build, tsan build and possibly others
Original change's description:
> [include] Split out v8.h
>
> This moves every single class/function out of include/v8.h into a
> separate header in include/, which v8.h then includes so that
> externally nothing appears to have changed.
>
> Every include of v8.h from inside v8 has been changed to a more
> fine-grained include.
>
> Previously inline functions defined at the bottom of v8.h would call
> private non-inline functions in the V8 class. Since that class is now
> in v8-initialization.h and is rarely included (as that would create
> dependency cycles), this is not possible and so those methods have been
> moved out of the V8 class into the namespace v8::api_internal.
>
> None of the previous files in include/ now #include v8.h, which means
> if embedders were relying on this transitive dependency then it will
> give compile failures.
>
> v8-inspector.h does depend on v8-scripts.h for the time being to ensure
> that Chrome continue to compile but that change will be reverted once
> those transitive #includes in chrome are changed to include it directly.
>
> Full design:
> https://docs.google.com/document/d/1rTD--I8hCAr-Rho1WTumZzFKaDpEp0IJ8ejZtk4nJdA/edit?usp=sharing
>
> Bug: v8:11965
> Change-Id: I53b84b29581632710edc80eb11f819c2097a2877
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3097448
> Reviewed-by: Yang Guo <yangguo@chromium.org>
> Reviewed-by: Camillo Bruni <cbruni@chromium.org>
> Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
> Reviewed-by: Leszek Swirski <leszeks@chromium.org>
> Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
> Commit-Queue: Dan Elphick <delphick@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#76424}
Bug: v8:11965
Change-Id: Id57313ae992e720c8b19abc975cd69729e1344aa
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3113627
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Owners-Override: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#76428}
178 lines
6.3 KiB
C++
178 lines
6.3 KiB
C++
// Copyright 2015 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef V8_TEST_CCTEST_INTERPRETER_INTERPRETER_TESTER_H_
|
|
#define V8_TEST_CCTEST_INTERPRETER_INTERPRETER_TESTER_H_
|
|
|
|
#include "src/init/v8.h"
|
|
|
|
#include "src/api/api.h"
|
|
#include "src/execution/execution.h"
|
|
#include "src/handles/handles.h"
|
|
#include "src/interpreter/bytecode-array-builder.h"
|
|
#include "src/interpreter/interpreter.h"
|
|
#include "src/objects/feedback-cell.h"
|
|
#include "test/cctest/cctest.h"
|
|
#include "test/cctest/test-feedback-vector.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
namespace interpreter {
|
|
|
|
template <class... A>
|
|
static MaybeHandle<Object> CallInterpreter(Isolate* isolate,
|
|
Handle<JSFunction> function,
|
|
Handle<Object> receiver, A... args) {
|
|
// Pad the array with an empty handle to ensure that argv size is at least 1.
|
|
// It avoids MSVC error C2466.
|
|
Handle<Object> argv[] = {args..., Handle<Object>()};
|
|
return Execution::Call(isolate, function, receiver, sizeof...(args), argv);
|
|
}
|
|
|
|
template <class... A>
|
|
class InterpreterCallable {
|
|
public:
|
|
virtual ~InterpreterCallable() = default;
|
|
|
|
FeedbackVector vector() const { return function_->feedback_vector(); }
|
|
|
|
protected:
|
|
InterpreterCallable(Isolate* isolate, Handle<JSFunction> function)
|
|
: isolate_(isolate), function_(function) {}
|
|
|
|
Isolate* isolate_;
|
|
Handle<JSFunction> function_;
|
|
};
|
|
|
|
template <class... A>
|
|
class InterpreterCallableUndefinedReceiver : public InterpreterCallable<A...> {
|
|
public:
|
|
InterpreterCallableUndefinedReceiver(Isolate* isolate,
|
|
Handle<JSFunction> function)
|
|
: InterpreterCallable<A...>(isolate, function) {}
|
|
|
|
MaybeHandle<Object> operator()(A... args) {
|
|
return CallInterpreter(this->isolate_, this->function_,
|
|
this->isolate_->factory()->undefined_value(),
|
|
args...);
|
|
}
|
|
};
|
|
|
|
template <class... A>
|
|
class InterpreterCallableWithReceiver : public InterpreterCallable<A...> {
|
|
public:
|
|
InterpreterCallableWithReceiver(Isolate* isolate, Handle<JSFunction> function)
|
|
: InterpreterCallable<A...>(isolate, function) {}
|
|
|
|
MaybeHandle<Object> operator()(Handle<Object> receiver, A... args) {
|
|
return CallInterpreter(this->isolate_, this->function_, receiver, args...);
|
|
}
|
|
};
|
|
|
|
class InterpreterTester {
|
|
public:
|
|
InterpreterTester(Isolate* isolate, const char* source,
|
|
MaybeHandle<BytecodeArray> bytecode,
|
|
MaybeHandle<FeedbackMetadata> feedback_metadata,
|
|
const char* filter);
|
|
|
|
InterpreterTester(Isolate* isolate, Handle<BytecodeArray> bytecode,
|
|
MaybeHandle<FeedbackMetadata> feedback_metadata =
|
|
MaybeHandle<FeedbackMetadata>(),
|
|
const char* filter = kFunctionName);
|
|
|
|
InterpreterTester(Isolate* isolate, const char* source,
|
|
const char* filter = kFunctionName);
|
|
|
|
virtual ~InterpreterTester();
|
|
InterpreterTester(const InterpreterTester&) = delete;
|
|
InterpreterTester& operator=(const InterpreterTester&) = delete;
|
|
|
|
template <class... A>
|
|
InterpreterCallableUndefinedReceiver<A...> GetCallable() {
|
|
return InterpreterCallableUndefinedReceiver<A...>(
|
|
isolate_, GetBytecodeFunction<A...>());
|
|
}
|
|
|
|
template <class... A>
|
|
InterpreterCallableWithReceiver<A...> GetCallableWithReceiver() {
|
|
return InterpreterCallableWithReceiver<A...>(isolate_,
|
|
GetBytecodeFunction<A...>());
|
|
}
|
|
|
|
Local<Message> CheckThrowsReturnMessage();
|
|
|
|
static Handle<Object> NewObject(const char* script);
|
|
|
|
static Handle<String> GetName(Isolate* isolate, const char* name);
|
|
|
|
static std::string SourceForBody(const char* body);
|
|
|
|
static std::string function_name();
|
|
|
|
static const char kFunctionName[];
|
|
|
|
// Expose raw RegisterList construction to tests.
|
|
static RegisterList NewRegisterList(int first_reg_index, int register_count) {
|
|
return RegisterList(first_reg_index, register_count);
|
|
}
|
|
|
|
inline bool HasFeedbackMetadata() { return !feedback_metadata_.is_null(); }
|
|
|
|
private:
|
|
Isolate* isolate_;
|
|
const char* source_;
|
|
MaybeHandle<BytecodeArray> bytecode_;
|
|
MaybeHandle<FeedbackMetadata> feedback_metadata_;
|
|
|
|
template <class... A>
|
|
Handle<JSFunction> GetBytecodeFunction() {
|
|
Handle<JSFunction> function;
|
|
IsCompiledScope is_compiled_scope;
|
|
if (source_) {
|
|
CompileRun(source_);
|
|
v8::Local<v8::Context> context =
|
|
v8::Isolate::GetCurrent()->GetCurrentContext();
|
|
Local<Function> api_function =
|
|
Local<Function>::Cast(CcTest::global()
|
|
->Get(context, v8_str(kFunctionName))
|
|
.ToLocalChecked());
|
|
function = Handle<JSFunction>::cast(v8::Utils::OpenHandle(*api_function));
|
|
is_compiled_scope = function->shared().is_compiled_scope(isolate_);
|
|
} else {
|
|
int arg_count = sizeof...(A);
|
|
std::string source("(function " + function_name() + "(");
|
|
for (int i = 0; i < arg_count; i++) {
|
|
source += i == 0 ? "a" : ", a";
|
|
}
|
|
source += "){})";
|
|
function = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
|
|
*v8::Local<v8::Function>::Cast(CompileRun(source.c_str()))));
|
|
function->set_code(*BUILTIN_CODE(isolate_, InterpreterEntryTrampoline));
|
|
is_compiled_scope = function->shared().is_compiled_scope(isolate_);
|
|
}
|
|
|
|
if (!bytecode_.is_null()) {
|
|
function->shared().set_function_data(*bytecode_.ToHandleChecked(),
|
|
kReleaseStore);
|
|
is_compiled_scope = function->shared().is_compiled_scope(isolate_);
|
|
}
|
|
if (HasFeedbackMetadata()) {
|
|
function->set_raw_feedback_cell(isolate_->heap()->many_closures_cell());
|
|
// Set the raw feedback metadata to circumvent checks that we are not
|
|
// overwriting existing metadata.
|
|
function->shared().set_raw_outer_scope_info_or_feedback_metadata(
|
|
*feedback_metadata_.ToHandleChecked());
|
|
JSFunction::EnsureFeedbackVector(function, &is_compiled_scope);
|
|
}
|
|
return function;
|
|
}
|
|
};
|
|
|
|
} // namespace interpreter
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // V8_TEST_CCTEST_INTERPRETER_INTERPRETER_TESTER_H_
|