summaryrefslogtreecommitdiff
path: root/deps/v8/src/torque/implementation-visitor.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/torque/implementation-visitor.h')
-rw-r--r--deps/v8/src/torque/implementation-visitor.h82
1 files changed, 38 insertions, 44 deletions
diff --git a/deps/v8/src/torque/implementation-visitor.h b/deps/v8/src/torque/implementation-visitor.h
index a572ebb936..eb1a6c4452 100644
--- a/deps/v8/src/torque/implementation-visitor.h
+++ b/deps/v8/src/torque/implementation-visitor.h
@@ -12,6 +12,7 @@
#include "src/torque/cfg.h"
#include "src/torque/declarations.h"
#include "src/torque/global-context.h"
+#include "src/torque/type-oracle.h"
#include "src/torque/types.h"
#include "src/torque/utils.h"
@@ -52,10 +53,20 @@ class LocationReference {
// pointer.
static LocationReference HeapReference(VisitResult heap_reference) {
LocationReference result;
- DCHECK(heap_reference.type()->IsReferenceType());
+ DCHECK(StructType::MatchUnaryGeneric(heap_reference.type(),
+ TypeOracle::GetReferenceGeneric()));
result.heap_reference_ = std::move(heap_reference);
return result;
}
+ // A reference to an array on the heap. That is, a tagged value, an offset to
+ // encode an inner pointer, and the number of elements.
+ static LocationReference HeapSlice(VisitResult heap_slice) {
+ LocationReference result;
+ DCHECK(StructType::MatchUnaryGeneric(heap_slice.type(),
+ TypeOracle::GetSliceGeneric()));
+ result.heap_slice_ = std::move(heap_slice);
+ return result;
+ }
static LocationReference ArrayAccess(VisitResult base, VisitResult offset) {
LocationReference result;
result.eval_function_ = std::string{"[]"};
@@ -69,26 +80,6 @@ class LocationReference {
result.eval_function_ = "." + fieldname;
result.assign_function_ = "." + fieldname + "=";
result.call_arguments_ = {object};
- result.index_field_ = base::nullopt;
- return result;
- }
- static LocationReference IndexedFieldIndexedAccess(
- const LocationReference& indexed_field, VisitResult index) {
- LocationReference result;
- DCHECK(indexed_field.IsIndexedFieldAccess());
- std::string fieldname = *indexed_field.index_field_;
- result.eval_function_ = "." + fieldname + "[]";
- result.assign_function_ = "." + fieldname + "[]=";
- result.call_arguments_ = indexed_field.call_arguments_;
- result.call_arguments_.push_back(index);
- result.index_field_ = fieldname;
- return result;
- }
- static LocationReference IndexedFieldAccess(VisitResult object,
- std::string fieldname) {
- LocationReference result;
- result.call_arguments_ = {object};
- result.index_field_ = fieldname;
return result;
}
@@ -109,16 +100,26 @@ class LocationReference {
DCHECK(IsHeapReference());
return *heap_reference_;
}
+ bool IsHeapSlice() const { return heap_slice_.has_value(); }
+ const VisitResult& heap_slice() const {
+ DCHECK(IsHeapSlice());
+ return *heap_slice_;
+ }
const Type* ReferencedType() const {
if (IsHeapReference()) {
- return ReferenceType::cast(heap_reference().type())->referenced_type();
+ return *StructType::MatchUnaryGeneric(heap_reference().type(),
+ TypeOracle::GetReferenceGeneric());
+ } else if (IsHeapSlice()) {
+ return *StructType::MatchUnaryGeneric(heap_slice().type(),
+ TypeOracle::GetSliceGeneric());
}
return GetVisitResult().type();
}
const VisitResult& GetVisitResult() const {
if (IsVariableAccess()) return variable();
+ if (IsHeapSlice()) return heap_slice();
DCHECK(IsTemporary());
return temporary();
}
@@ -129,13 +130,6 @@ class LocationReference {
return *temporary_description_;
}
- bool IsArrayField() const { return index_field_.has_value(); }
- bool IsIndexedFieldAccess() const {
- return IsArrayField() && !IsCallAccess();
- }
- bool IsIndexedFieldIndexedAccess() const {
- return IsArrayField() && IsCallAccess();
- }
bool IsCallAccess() const {
bool is_call_access = eval_function_.has_value();
DCHECK_EQ(is_call_access, assign_function_.has_value());
@@ -163,10 +157,10 @@ class LocationReference {
base::Optional<VisitResult> temporary_;
base::Optional<std::string> temporary_description_;
base::Optional<VisitResult> heap_reference_;
+ base::Optional<VisitResult> heap_slice_;
base::Optional<std::string> eval_function_;
base::Optional<std::string> assign_function_;
VisitResultVector call_arguments_;
- base::Optional<std::string> index_field_;
base::Optional<Binding<LocalValue>*> binding_;
LocationReference() = default;
@@ -354,6 +348,7 @@ class ImplementationVisitor {
void GenerateClassDefinitions(const std::string& output_directory);
void GenerateInstanceTypes(const std::string& output_directory);
void GenerateClassVerifiers(const std::string& output_directory);
+ void GenerateClassDebugReaders(const std::string& output_directory);
void GenerateExportedMacrosAssembler(const std::string& output_directory);
void GenerateCSATypes(const std::string& output_directory);
void GenerateCppForInternalClasses(const std::string& output_directory);
@@ -361,27 +356,26 @@ class ImplementationVisitor {
VisitResult Visit(Expression* expr);
const Type* Visit(Statement* stmt);
+ void CheckInitializersWellformed(
+ const std::string& aggregate_name,
+ const std::vector<Field>& aggregate_fields,
+ const std::vector<NameAndExpression>& initializers,
+ bool ignore_first_field = false);
+
InitializerResults VisitInitializerResults(
- const AggregateType* aggregate,
+ const ClassType* class_type,
const std::vector<NameAndExpression>& expressions);
void InitializeFieldFromSpread(VisitResult object, const Field& field,
const InitializerResults& initializer_results);
- size_t InitializeAggregateHelper(
- const AggregateType* aggregate_type, VisitResult allocate_result,
- const InitializerResults& initializer_results);
-
VisitResult AddVariableObjectSize(
VisitResult object_size, const ClassType* current_class,
const InitializerResults& initializer_results);
- void InitializeAggregate(const AggregateType* aggregate_type,
- VisitResult allocate_result,
- const InitializerResults& initializer_results);
+ void InitializeClass(const ClassType* class_type, VisitResult allocate_result,
+ const InitializerResults& initializer_results);
- VisitResult TemporaryUninitializedStruct(const StructType* struct_type,
- const std::string& reason);
VisitResult Visit(StructExpression* decl);
LocationReference GetLocationReference(Expression* location);
@@ -570,7 +564,8 @@ class ImplementationVisitor {
const Arguments& arguments,
const TypeVector& specialization_types);
- Method* LookupMethod(const std::string& name, LocationReference target,
+ Method* LookupMethod(const std::string& name,
+ const AggregateType* receiver_type,
const Arguments& arguments,
const TypeVector& specialization_types);
@@ -608,9 +603,8 @@ class ImplementationVisitor {
void GenerateBranch(const VisitResult& condition, Block* true_block,
Block* false_block);
- using VisitResultGenerator = std::function<VisitResult()>;
- void GenerateExpressionBranch(VisitResultGenerator, Block* true_block,
- Block* false_block);
+ VisitResult GenerateBoolConstant(bool constant);
+
void GenerateExpressionBranch(Expression* expression, Block* true_block,
Block* false_block);