1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file. 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifndef SRC_ASMJS_ASM_TYPER_H_ 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SRC_ASMJS_ASM_TYPER_H_ 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <cstdint> 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <string> 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <unordered_map> 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <unordered_set> 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/allocation.h" 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/asmjs/asm-types.h" 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast-type-bounds.h" 16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/ast/ast-types.h" 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast.h" 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/effects.h" 1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/messages.h" 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/type-info.h" 21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone-containers.h" 22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h" 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace v8 { 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace internal { 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace wasm { 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmType; 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmTyperHarnessBuilder; 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass SourceLayoutTracker; 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmTyper final { 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum StandardMember { 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kHeap = -4, 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kFFI = -3, 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kStdlib = -2, 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kModule = -1, 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kNone = 0, 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kInfinity, 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kNaN, 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAcos, 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAsin, 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAtan, 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathCos, 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSin, 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathTan, 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathExp, 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLog, 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathCeil, 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathFloor, 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSqrt, 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAbs, 54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathClz32, 55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathMin, 56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathMax, 57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAtan2, 58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathPow, 59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathImul, 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathFround, 61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathE, 62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLN10, 63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLN2, 64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLOG2E, 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLOG10E, 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathPI, 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSQRT1_2, 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSQRT2, 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~AsmTyper() = default; 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmTyper(Isolate* isolate, Zone* zone, Handle<Script> script, 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FunctionLiteral* root); 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool Validate(); 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Do asm.js validation in phases (to interleave with conversion to wasm). 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool ValidateBeforeFunctionsPhase(); 7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool ValidateInnerFunction(FunctionDeclaration* decl); 7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool ValidateAfterFunctionsPhase(); 8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void ClearFunctionNodeTypes(); 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSMessageObject> error_message() const { return error_message_; } 8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const MessageLocation* message_location() const { return &message_location_; } 8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* TriggerParsingError(); 86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* TypeOf(AstNode* node) const; 88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AsmType* TypeOf(Variable* v) const; 89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember VariableAsStandardMember(Variable* var); 90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Allow the asm-wasm-builder to trigger failures (for interleaved 9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // validating). 9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* FailWithMessage(const char* text); 9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef std::unordered_set<StandardMember, std::hash<int> > StdlibSet; 96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StdlibSet StdlibUses() const { return stdlib_uses_; } 98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Each FFI import has a usage-site signature associated with it. 100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch struct FFIUseSignature { 101f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Variable* var; 102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ZoneVector<AsmType*> arg_types_; 103f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AsmType* return_type_; 104f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch FFIUseSignature(Variable* v, Zone* zone) 105f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : var(v), arg_types_(zone), return_type_(nullptr) {} 106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch }; 107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const ZoneVector<FFIUseSignature>& FFIUseSignatures() { 109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return ffi_use_signatures_; 110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch friend class v8::internal::wasm::AsmTyperHarnessBuilder; 114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class VariableInfo : public ZoneObject { 116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum Mutability { 118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kInvalidMutability, 119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kLocal, 120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMutableGlobal, 121c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // *VIOLATION* We support const variables in asm.js, as per the 122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // https://discourse.wicg.io/t/allow-const-global-variables/684 124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Global const variables are treated as if they were numeric literals, 126c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // and can be used anywhere a literal can be used. 127c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kConstGlobal, 128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kImmutableGlobal, 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit VariableInfo(AsmType* t) : type_(t) {} 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableInfo* Clone(Zone* zone) const; 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsMutable() const { 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return mutability_ == kLocal || mutability_ == kMutableGlobal; 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsGlobal() const { 140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return mutability_ == kImmutableGlobal || mutability_ == kConstGlobal || 141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch mutability_ == kMutableGlobal; 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsStdlib() const { return standard_member_ == kStdlib; } 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsFFI() const { return standard_member_ == kFFI; } 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsHeap() const { return standard_member_ == kHeap; } 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void MarkDefined() { missing_definition_ = false; } 14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetFirstForwardUse(const MessageLocation& source_location); 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember standard_member() const { return standard_member_; } 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void set_standard_member(StandardMember standard_member) { 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch standard_member_ = standard_member; 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* type() const { return type_; } 157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void set_type(AsmType* type) { type_ = type; } 158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Mutability mutability() const { return mutability_; } 160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void set_mutability(Mutability mutability) { mutability_ = mutability; } 161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool missing_definition() const { return missing_definition_; } 163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 16462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const MessageLocation* source_location() { return &source_location_; } 165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static VariableInfo* ForSpecialSymbol(Zone* zone, 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember standard_member); 168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* type_; 171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember standard_member_ = kNone; 172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Mutability mutability_ = kInvalidMutability; 173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // missing_definition_ is set to true for forward definition - i.e., use 174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // before definition. 175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool missing_definition_ = false; 17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Used for error messages. 17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MessageLocation source_location_; 178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // RAII-style manager for the in_function_ member variable. 181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch struct FunctionScope { 182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit FunctionScope(AsmTyper* typer) : typer_(typer) { 183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(!typer_->in_function_); 184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->in_function_ = true; 185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->local_scope_.Clear(); 186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->return_type_ = AsmType::None(); 187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~FunctionScope() { 190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(typer_->in_function_); 191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->in_function_ = false; 192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmTyper* typer_; 195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // FlattenedStatements is an iterator class for ZoneList<Statement*> that 198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // flattens the Block construct in the AST. This is here because we need it in 199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // the tests. 200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class FlattenedStatements { 201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit FlattenedStatements(Zone* zone, ZoneList<Statement*>* s); 203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Statement* Next(); 204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch struct Context { 207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit Context(ZoneList<Statement*>* s) : statements_(s) {} 208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneList<Statement*>* statements_; 209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int next_index_ = 0; 210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneVector<Context> context_stack_; 213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FlattenedStatements); 215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 21762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class SourceLayoutTracker { 21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 21962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SourceLayoutTracker() = default; 22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsValid() const; 22162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddUseAsm(const AstNode& node) { use_asm_.AddNewElement(node); } 22262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddGlobal(const AstNode& node) { globals_.AddNewElement(node); } 22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddFunction(const AstNode& node) { functions_.AddNewElement(node); } 22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddTable(const AstNode& node) { tables_.AddNewElement(node); } 22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddExport(const AstNode& node) { exports_.AddNewElement(node); } 22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class Section { 22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section() = default; 23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section(const Section&) = default; 23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section& operator=(const Section&) = default; 23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddNewElement(const AstNode& node); 23562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsPrecededBy(const Section& other) const; 23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 23762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 23862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int start_ = kNoSourcePosition; 23962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int end_ = kNoSourcePosition; 24062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 24162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section use_asm_; 24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section globals_; 24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section functions_; 24562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section tables_; 24662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Section exports_; 24762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 24862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_COPY_AND_ASSIGN(SourceLayoutTracker); 24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch using ObjectTypeMap = ZoneMap<std::string, VariableInfo*>; 252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void InitializeStdlib(); 253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetTypeOf(AstNode* node, AsmType* type); 254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void AddForwardReference(VariableProxy* proxy, VariableInfo* info); 256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool AddGlobal(Variable* global, VariableInfo* info); 257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool AddLocal(Variable* global, VariableInfo* info); 258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Used for 5.5 GlobalVariableTypeAnnotations 259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableInfo* ImportLookup(Property* expr); 260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 3.3 Environment Lookup 261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOTE: In the spec, the lookup function's prototype is 262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Lookup(Delta, Gamma, x) 264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Delta is the global_scope_ member, and Gamma, local_scope_. 266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch VariableInfo* Lookup(Variable* variable) const; 267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // All of the ValidateXXX methods below return AsmType::None() in case of 269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // validation failure. 270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.1 ValidateModule 27262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* ValidateModuleBeforeFunctionsPhase(FunctionLiteral* fun); 27362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* ValidateModuleFunction(FunctionDeclaration* fun_decl); 27462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* ValidateModuleFunctions(FunctionLiteral* fun); 27562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* ValidateModuleAfterFunctionsPhase(FunctionLiteral* fun); 276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateGlobalDeclaration(Assignment* assign); 277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.2 ValidateExport 278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ExportType(VariableProxy* fun_export); 279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateExport(ReturnStatement* exports); 280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.3 ValidateFunctionTable 281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateFunctionTable(Assignment* assign); 282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.4 ValidateFunction 283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateFunction(FunctionDeclaration* fun_decl); 284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5 ValidateStatement 285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateStatement(Statement* statement); 286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.1 BlockStatement 287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBlockStatement(Block* block); 288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.2 ExpressionStatement 289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateExpressionStatement(ExpressionStatement* expr); 290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.3 EmptyStatement 291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateEmptyStatement(EmptyStatement* empty); 292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.4 IfStatement 293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateIfStatement(IfStatement* if_stmt); 294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.5 ReturnStatement 295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateReturnStatement(ReturnStatement* ret_stmt); 296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6 IterationStatement 297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6.a WhileStatement 298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateWhileStatement(WhileStatement* while_stmt); 299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6.b DoWhileStatement 300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateDoWhileStatement(DoWhileStatement* do_while); 301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6.c ForStatement 302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateForStatement(ForStatement* for_stmt); 303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.7 BreakStatement 304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBreakStatement(BreakStatement* brk_stmt); 305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.8 ContinueStatement 306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateContinueStatement(ContinueStatement* cont_stmt); 307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.9 LabelledStatement 308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOTE: we don't need to handle these: Labelled statements are 309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // BreakableStatements in our AST, but BreakableStatement is not a concrete 310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // class -- and we're handling all of BreakableStatement's subclasses. 311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.10 SwitchStatement 312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateSwitchStatement(SwitchStatement* stmt); 313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.6 ValidateCase 314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCase(CaseClause* label, int32_t* case_lbl); 315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.7 ValidateDefault 316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateDefault(CaseClause* label); 317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8 ValidateExpression 318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateExpression(Expression* expr); 319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCompareOperation(CompareOperation* cmp); 320f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBinaryOperation(BinaryOperation* binop); 321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.1 Expression 322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCommaExpression(BinaryOperation* comma); 323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.2 NumericLiteral 324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateNumericLiteral(Literal* literal); 325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.3 Identifier 326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateIdentifier(VariableProxy* proxy); 327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.4 CallExpression 328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCallExpression(Call* call); 329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.5 MemberExpression 330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateMemberExpression(Property* prop); 331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.6 AssignmentExpression 332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateAssignmentExpression(Assignment* assignment); 333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.7 UnaryExpression 334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateUnaryExpression(UnaryOperation* unop); 335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.8 MultiplicativeExpression 336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateMultiplicativeExpression(BinaryOperation* binop); 337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.9 AdditiveExpression 338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateAdditiveExpression(BinaryOperation* binop, 339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t intish_count); 340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.10 ShiftExpression 341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateShiftExpression(BinaryOperation* binop); 342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.11 RelationalExpression 343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateRelationalExpression(CompareOperation* cmpop); 344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.12 EqualityExpression 345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateEqualityExpression(CompareOperation* cmpop); 346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.13 BitwiseANDExpression 347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBitwiseANDExpression(BinaryOperation* binop); 348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.14 BitwiseXORExpression 349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBitwiseXORExpression(BinaryOperation* binop); 350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.15 BitwiseORExpression 351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBitwiseORExpression(BinaryOperation* binop); 352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.16 ConditionalExpression 353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateConditionalExpression(Conditional* cond); 354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.9 ValidateCall 355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCall(AsmType* return_type, Call* call); 356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.10 ValidateHeapAccess 357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum HeapAccessType { LoadFromHeap, StoreToHeap }; 358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateHeapAccess(Property* heap, HeapAccessType access_type); 359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.11 ValidateFloatCoercion 360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsCallToFround(Call* call); 361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateFloatCoercion(Call* call); 362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.1 ParameterTypeAnnotations 364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ParameterTypeAnnotations(Variable* parameter, 365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Expression* annotation); 366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.2 ReturnTypeAnnotations 36762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch AsmType* ReturnTypeAnnotations(Expression* ret_expr); 368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.4 VariableTypeAnnotations 369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.5 GlobalVariableTypeAnnotations 370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch AsmType* VariableTypeAnnotations( 371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Expression* initializer, 372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch VariableInfo::Mutability global = VariableInfo::kLocal); 373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ImportExpression(Property* import); 374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* NewHeapView(CallNew* new_heap_view); 375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate_; 377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Zone* zone_; 37862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Script> script_; 379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FunctionLiteral* root_; 380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool in_function_ = false; 381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* return_type_ = nullptr; 383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneVector<VariableInfo*> forward_definitions_; 385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ZoneVector<FFIUseSignature> ffi_use_signatures_; 386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ObjectTypeMap stdlib_types_; 387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ObjectTypeMap stdlib_math_types_; 388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // The ASM module name. This member is used to prevent globals from redefining 390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // the module name. 391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableInfo* module_info_; 392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<String> module_name_; 393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 3 Environments 395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneHashMap global_scope_; // 3.1 Global environment 396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneHashMap local_scope_; // 3.2 Variable environment 397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::uintptr_t stack_limit_; 399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool stack_overflow_ = false; 40062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::unordered_map<AstNode*, AsmType*> module_node_types_; 40162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::unordered_map<AstNode*, AsmType*> function_node_types_; 40262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kErrorMessageLimit = 128; 403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* fround_type_; 404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ffi_type_; 40562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSMessageObject> error_message_; 40662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MessageLocation message_location_; 407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StdlibSet stdlib_uses_; 408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 40962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SourceLayoutTracker source_layout_; 41062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ReturnStatement* module_return_; 41162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ZoneVector<Assignment*> function_pointer_tables_; 41262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AsmTyper); 414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace wasm 417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace internal 418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace v8 419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // SRC_ASMJS_ASM_TYPER_H_ 421