46 , fTargetType(targetType) {}
68 int rows()
const override {
69 return fTargetType.
rows();
145 using INHERITED =
Type;
147 const Type& fTargetType;
190 return fComponentType;
212 return fCount * fComponentType.
slotCount();
221 using INHERITED =
Type;
223 const Type& fComponentType;
241 return SkSpan(fCoercibleTypes, fNumTypes);
249 using INHERITED =
Type;
251 const Type* fCoercibleTypes[9];
252 const Type* fSlotType;
262 , fScalarType(scalarType)
315 using INHERITED =
Type;
317 const Type& fScalarType;
385 : short_limits::lowest();
392 return float_limits::lowest();
414 using INHERITED =
Type;
439 using INHERITED =
Type;
457 return fComponentType;
477 return fColumns == fRows;
481 return fColumns * fRows;
486 return fComponentType;
490 using INHERITED =
Type;
506 , fIsArrayed(isArrayed)
523 return fIsMultisampled;
527 return fTextureAccess;
536 using INHERITED =
Type;
541 bool fIsMultisampled;
588 using INHERITED =
Type;
601 , fNestingDepth(nestingDepth)
602 , fInterfaceBlock(interfaceBlock)
604 for (
const Field&
f : fFields) {
605 fContainsArray = fContainsArray ||
f.fType->isOrContainsArray();
606 fContainsUnsizedArray = fContainsUnsizedArray ||
f.fType->isOrContainsUnsizedArray();
607 fContainsAtomic = fContainsAtomic ||
f.fType->isOrContainsAtomic();
608 fIsAllowedInES2 = fIsAllowedInES2 &&
f.fType->isAllowedInES2();
610 for (
const Field&
f : fFields) {
612 if (!
f.fType->isAllowedInUniform(&errorPosition)) {
613 fUniformErrorPosition = errorPosition;
617 if (!fContainsUnsizedArray) {
618 for (
const Field&
f : fFields) {
619 fSlotCount +=
f.fType->slotCount();
633 return fInterfaceBlock;
641 return fIsAllowedInES2;
645 if (errorPosition !=
nullptr) {
646 *errorPosition = fUniformErrorPosition;
648 return !fUniformErrorPosition.
valid();
652 return fContainsArray;
656 return fContainsUnsizedArray;
660 return fContainsAtomic;
669 return fNestingDepth;
673 for (
const Field& field : fFields) {
674 size_t fieldSlots = field.fType->
slotCount();
675 if (n < fieldSlots) {
676 return field.fType->slotType(n);
686 using INHERITED =
Type;
689 size_t fSlotCount = 0;
690 int fNestingDepth = 0;
691 Position fUniformErrorPosition = {};
692 bool fInterfaceBlock =
false;
693 bool fContainsArray =
false;
694 bool fContainsUnsizedArray =
false;
695 bool fContainsAtomic =
false;
696 bool fIsBuiltin =
false;
697 bool fIsAllowedInES2 =
true;
713 return fComponentType;
746 return fComponentType;
750 using INHERITED =
Type;
757 std::string_view
name = this->
name();
765 return std::make_unique<AliasType>(std::move(
name), targetType);
769 std::string_view
name,
770 const Type& componentType,
778 const Type* slotType) {
779 return std::make_unique<GenericType>(
name, types,
slotType);
784 return std::make_unique<LiteralType>(
name, scalarType,
priority);
788 const Type& componentType,
int columns, int8_t rows) {
808 return std::make_unique<AtomicType>(
name, abbrev);
813 std::string_view
name,
815 bool interfaceBlock) {
816 const char*
const structOrIB = interfaceBlock ?
"interface block" :
"struct";
817 const char*
const aStructOrIB = interfaceBlock ?
"an interface block" :
"a struct";
820 context.fErrors->error(
pos, std::string(structOrIB) +
" '" + std::string(
name) +
821 "' must contain at least one field");
826 for (
const Field& field :
fields) {
828 int numFieldNames = fieldNames.
count();
829 fieldNames.
add(field.fName);
830 if (fieldNames.
count() == numFieldNames) {
831 context.fErrors->error(field.fPosition,
"field '" + std::string(field.fName) +
832 "' was already defined in the same " +
833 std::string(structOrIB) +
" ('" +
834 std::string(
name) +
"')");
837 std::string
desc = field.fModifierFlags.description();
838 context.fErrors->error(field.fPosition,
"modifier '" +
desc +
"' is not permitted on " +
839 std::string(aStructOrIB) +
" field");
842 context.fErrors->error(field.fPosition,
"layout qualifier 'binding' is not permitted "
843 "on " + std::string(aStructOrIB) +
" field");
846 context.fErrors->error(field.fPosition,
"layout qualifier 'set' is not permitted on " +
847 std::string(aStructOrIB) +
" field");
850 if (field.fType->isVoid()) {
851 context.fErrors->error(field.fPosition,
"type 'void' is not permitted in " +
852 std::string(aStructOrIB));
854 if (field.fType->isOpaque() && !field.fType->isAtomic()) {
855 context.fErrors->error(field.fPosition,
"opaque type '" + field.fType->displayName() +
856 "' is not permitted in " +
857 std::string(aStructOrIB));
859 if (field.fType->isOrContainsUnsizedArray()) {
860 if (!interfaceBlock) {
862 context.fErrors->error(field.fPosition,
"unsized arrays are not permitted here");
870 context.fErrors->error(
pos, std::string(structOrIB) +
" is too large");
875 int nestingDepth = 0;
876 for (
const Field& field :
fields) {
877 nestingDepth =
std::max(nestingDepth, field.fType->structNestingDepth());
880 context.fErrors->error(
pos, std::string(structOrIB) +
" '" + std::string(
name) +
881 "' is too deeply nested");
883 return std::make_unique<StructType>(
pos,
name, std::move(
fields), nestingDepth + 1,
884 interfaceBlock, context.fConfig->fIsBuiltinCode);
888 bool isArrayedTexture,
bool isMultisampled,
889 TextureAccess textureAccess) {
895 const Type& componentType,
int columns) {
903 if (this->
typeKind() == other.typeKind() &&
904 (this->isVector() || this->isMatrix() || this->isArray())) {
906 if (this->
isMatrix() && (this->
rows() != other.rows())) {
909 if (this->
columns() != other.columns()) {
914 if (this->
isNumber() && other.isNumber()) {
917 }
else if (this->
numberKind() != other.numberKind()) {
919 }
else if (other.priority() >= this->priority()) {
927 for (
size_t i = 0;
i < types.
size();
i++) {
937 ModifierFlags* modifierFlags,
938 Position
pos)
const {
946 ModifierFlags* modifierFlags,
947 Position
pos)
const {
959 context.fErrors->error(
pos,
"precision qualifiers are not allowed");
960 return context.fTypes.fPoison.get();
963 if (
SkPopCount(precisionQualifiers.value()) > 1) {
964 context.fErrors->error(
pos,
"only one precision qualifier can be used");
965 return context.fTypes.fPoison.get();
974 if (component.highPrecision()) {
982 const Type* mediumpType;
983 switch (component.numberKind()) {
985 mediumpType = context.fTypes.fHalf.get();
989 mediumpType = context.fTypes.fShort.get();
993 mediumpType = context.fTypes.fUShort.get();
997 mediumpType = context.fTypes.fPoison.get();
1004 ? context.fSymbolTable->addArrayDimension(context, mediumpType, this->
columns())
1005 : &mediumpType->toCompound(context, this->
columns(), this->
rows());
1010 "' does not support precision qualifiers");
1011 return context.fTypes.fPoison.get();
1015 ModifierFlags* modifierFlags,
1016 Position
pos)
const {
1024 if (this->
matches(*context.fTypes.fTexture2D)) {
1028 return context.fTypes.fReadOnlyTexture2D.get();
1031 return context.fTypes.fWriteOnlyTexture2D.get();
1033 context.fErrors->error(
1036 ?
"'readonly' and 'writeonly' qualifiers cannot be combined"
1037 :
"'texture2D' requires a 'readonly' or 'writeonly' access qualifier");
1041 if (accessQualifiers) {
1042 context.fErrors->error(
pos,
"type '" + this->
displayName() +
"' does not support "
1043 "qualifier '" + accessQualifiers.description() +
"'");
1051 if (columns == 1 &&
rows == 1) {
1054 if (this->
matches(*context.fTypes.fFloat) || this->matches(*context.fTypes.fFloatLiteral)) {
1058 case 1:
return *context.fTypes.fFloat;
1059 case 2:
return *context.fTypes.fFloat2;
1060 case 3:
return *context.fTypes.fFloat3;
1061 case 4:
return *context.fTypes.fFloat4;
1066 case 2:
return *context.fTypes.fFloat2x2;
1067 case 3:
return *context.fTypes.fFloat3x2;
1068 case 4:
return *context.fTypes.fFloat4x2;
1073 case 2:
return *context.fTypes.fFloat2x3;
1074 case 3:
return *context.fTypes.fFloat3x3;
1075 case 4:
return *context.fTypes.fFloat4x3;
1080 case 2:
return *context.fTypes.fFloat2x4;
1081 case 3:
return *context.fTypes.fFloat3x4;
1082 case 4:
return *context.fTypes.fFloat4x4;
1087 }
else if (this->
matches(*context.fTypes.fHalf)) {
1091 case 1:
return *context.fTypes.fHalf;
1092 case 2:
return *context.fTypes.fHalf2;
1093 case 3:
return *context.fTypes.fHalf3;
1094 case 4:
return *context.fTypes.fHalf4;
1099 case 2:
return *context.fTypes.fHalf2x2;
1100 case 3:
return *context.fTypes.fHalf3x2;
1101 case 4:
return *context.fTypes.fHalf4x2;
1106 case 2:
return *context.fTypes.fHalf2x3;
1107 case 3:
return *context.fTypes.fHalf3x3;
1108 case 4:
return *context.fTypes.fHalf4x3;
1113 case 2:
return *context.fTypes.fHalf2x4;
1114 case 3:
return *context.fTypes.fHalf3x4;
1115 case 4:
return *context.fTypes.fHalf4x4;
1120 }
else if (this->
matches(*context.fTypes.fInt) || this->matches(*context.fTypes.fIntLiteral)) {
1124 case 1:
return *context.fTypes.fInt;
1125 case 2:
return *context.fTypes.fInt2;
1126 case 3:
return *context.fTypes.fInt3;
1127 case 4:
return *context.fTypes.fInt4;
1132 }
else if (this->
matches(*context.fTypes.fShort)) {
1136 case 1:
return *context.fTypes.fShort;
1137 case 2:
return *context.fTypes.fShort2;
1138 case 3:
return *context.fTypes.fShort3;
1139 case 4:
return *context.fTypes.fShort4;
1144 }
else if (this->
matches(*context.fTypes.fUInt)) {
1148 case 1:
return *context.fTypes.fUInt;
1149 case 2:
return *context.fTypes.fUInt2;
1150 case 3:
return *context.fTypes.fUInt3;
1151 case 4:
return *context.fTypes.fUInt4;
1156 }
else if (this->
matches(*context.fTypes.fUShort)) {
1160 case 1:
return *context.fTypes.fUShort;
1161 case 2:
return *context.fTypes.fUShort2;
1162 case 3:
return *context.fTypes.fUShort3;
1163 case 4:
return *context.fTypes.fUShort4;
1168 }
else if (this->
matches(*context.fTypes.fBool)) {
1172 case 1:
return *context.fTypes.fBool;
1173 case 2:
return *context.fTypes.fBool2;
1174 case 3:
return *context.fTypes.fBool3;
1175 case 4:
return *context.fTypes.fBool4;
1182 return *context.fTypes.fVoid;
1185const Type*
Type::clone(
const Context& context, SymbolTable* symbolTable)
const {
1193 if (!context.fConfig->fIsBuiltinCode && this->isBuiltin()) {
1197 const Symbol* existingSymbol = symbolTable->find(this->
name());
1198 if (existingSymbol !=
nullptr) {
1199 const Type* existingType = &existingSymbol->as<
Type>();
1200 SkASSERT(existingType->typeKind() == this->typeKind());
1201 return existingType;
1211 const std::string*
name = symbolTable->takeOwnershipOfString(std::string(this->
name()));
1213 return symbolTable->add(
1215 std::make_unique<StructType>(this->
fPosition,
1218 this->structNestingDepth(),
1219 this->isInterfaceBlock(),
1220 context.fConfig->fIsBuiltinCode));
1229 const Context& context)
const {
1230 if (!expr || expr->isIncomplete(context)) {
1233 if (expr->type().matches(*
this)) {
1237 const Position
pos = expr->fPosition;
1238 const ProgramSettings&
settings = context.fConfig->fSettings;
1239 if (!expr->coercionCost(*this).isPossible(
settings.fAllowNarrowingConversions)) {
1240 context.fErrors->error(
pos,
"expected '" + this->
displayName() +
"', but found '" +
1241 expr->type().displayName() +
"'");
1254 context.fErrors->error(
pos,
"cannot construct '" + this->
displayName() +
"'");
1259 return !context.fConfig->strictES2Mode() || this->
isAllowedInES2();
1263 bool foundError =
false;
1265 if (baseType.isNumber()) {
1268 if (valueExpr->supportsConstantValues()) {
1270 int numSlots = valueExpr->type().slotCount();
1271 for (
int slot = 0; slot < numSlots; ++slot) {
1272 std::optional<double> slotVal = valueExpr->getConstantValue(slot);
1274 if (slotVal.has_value() &&
1275 baseType.checkForOutOfRangeLiteral(context, *slotVal, valueExpr->fPosition)) {
1303 context.fErrors->error(arrayPos,
"multi-dimensional arrays are not supported");
1307 context.fErrors->error(arrayPos,
"type 'void' may not be used in an array");
1311 context.fErrors->error(arrayPos,
"opaque type '" + std::string(this->
name()) +
1312 "' may not be used in an array");
1320 std::unique_ptr<Expression>
size)
const {
1321 size = context.fTypes.fInt->coerceExpression(std::move(
size), context);
1327 context.fErrors->error(
size->fPosition,
"array size must be an integer");
1342 context.fErrors->error(sizePos,
"array size must be positive");
1350 context.fErrors->error(sizePos,
"array size is too large");
1359 ' ' + std::string(
fName) +
';';
#define SkDEBUGFAIL(message)
#define SK_ABORT(message,...)
#define SkDEBUGFAILF(fmt,...)
static int SkPopCount(uint32_t n)
SkSpan(Container &&) -> SkSpan< std::remove_pointer_t< decltype(std::data(std::declval< Container >()))> >
static void copy(void *dst, const uint8_t *src, int width, int bpp, int deltaSrc, int offset, const SkPMColor ctable[])
constexpr size_t SkToSizeT(S x)
size_t slotCount() const override
SpvDim_ dimensions() const override
bool isStruct() const override
int bitWidth() const override
bool isArrayedTexture() const override
bool isDepth() const override
bool isVector() const override
bool isMultisampled() const override
int columns() const override
const Type & slotType(size_t n) const override
int rows() const override
bool isScalar() const override
bool isUnsizedArray() const override
int priority() const override
TextureAccess textureAccess() const override
bool isMatrix() const override
const Type & componentType() const override
bool isInterfaceBlock() const override
SkSpan< const Type *const > coercibleTypes() const override
bool isAllowedInES2() const override
bool isLiteral() const override
NumberKind numberKind() const override
bool isArray() const override
AliasType(std::string_view name, const Type &targetType)
const Type & resolve() const override
int columns() const override
bool isArray() const override
const Type & componentType() const override
bool isOrContainsAtomic() const override
bool isOrContainsArray() const override
bool isBuiltin() const override
bool isUnsizedArray() const override
bool isAllowedInES2() const override
const Type & slotType(size_t n) const override
bool isOrContainsUnsizedArray() const override
int bitWidth() const override
size_t slotCount() const override
static constexpr TypeKind kTypeKind
ArrayType(std::string_view name, const char *abbrev, const Type &componentType, int count, bool isBuiltin)
bool isAllowedInUniform(Position *errorPosition) const override
bool isAllowedInUniform(Position *) const override
const Type & slotType(size_t n) const override
AtomicType(std::string_view name, const char *abbrev)
bool isOrContainsAtomic() const override
static constexpr TypeKind kTypeKind
bool isAllowedInES2() const override
static bool GetConstantInt(const Expression &value, SKSL_INT *out)
static const Expression * GetConstantValueForVariable(const Expression &value)
static std::unique_ptr< Expression > Make(const Context &context, Position pos, const Type &type, std::unique_ptr< Expression > arg)
static std::unique_ptr< Expression > Make(const Context &context, Position pos, const Type &type, std::unique_ptr< Expression > arg)
static std::unique_ptr< Expression > Make(const Context &context, Position pos, const Type &type, std::unique_ptr< Expression > arg)
SkSpan< const Type *const > coercibleTypes() const override
static constexpr TypeKind kTypeKind
const Type & slotType(size_t) const override
GenericType(const char *name, SkSpan< const Type *const > coercibleTypes, const Type *slotType)
bool isScalar() const override
const Type & slotType(size_t n) const override
int priority() const override
LiteralType(const char *name, const Type &scalarType, int8_t priority)
double minimumValue() const override
double maximumValue() const override
const Type & scalarTypeForLiteral() const override
NumberKind numberKind() const override
int bitWidth() const override
bool isLiteral() const override
size_t slotCount() const override
int rows() const override
static constexpr TypeKind kTypeKind
int columns() const override
int rows() const override
int bitWidth() const override
MatrixType(std::string_view name, const char *abbrev, const Type &componentType, int8_t columns, int8_t rows)
int columns() const override
bool isAllowedInES2() const override
static constexpr TypeKind kTypeKind
bool isMatrix() const override
const Type & slotType(size_t n) const override
const ScalarType & componentType() const override
size_t slotCount() const override
std::string paddedDescription() const
const TextureType & textureType() const override
TextureAccess textureAccess() const override
bool isDepth() const override
static constexpr TypeKind kTypeKind
SamplerType(const char *name, const Type &textureType)
const Type & slotType(size_t n) const override
SpvDim_ dimensions() const override
bool isMultisampled() const override
bool isArrayedTexture() const override
bool isAllowedInUniform(Position *) const override
ScalarType(std::string_view name, const char *abbrev, NumberKind numberKind, int8_t priority, int8_t bitWidth)
int bitWidth() const override
std::numeric_limits< float > float_limits
bool isScalar() const override
size_t slotCount() const override
std::numeric_limits< uint16_t > ushort_limits
int priority() const override
double minimumValue() const override
static constexpr TypeKind kTypeKind
NumberKind numberKind() const override
int columns() const override
std::numeric_limits< int32_t > int_limits
const Type & slotType(size_t n) const override
std::numeric_limits< uint32_t > uint_limits
std::numeric_limits< int16_t > short_limits
bool isAllowedInES2() const override
double maximumValue() const override
int rows() const override
bool isInterfaceBlock() const override
const Type & slotType(size_t n) const override
int structNestingDepth() const override
size_t slotCount() const override
bool isOrContainsAtomic() const override
SkSpan< const Field > fields() const override
StructType(Position pos, std::string_view name, TArray< Field > fields, int nestingDepth, bool interfaceBlock, bool isBuiltin)
bool isOrContainsArray() const override
bool isOrContainsUnsizedArray() const override
bool isAllowedInUniform(Position *errorPosition) const override
bool isStruct() const override
bool isAllowedInES2() const override
static constexpr TypeKind kTypeKind
bool isBuiltin() const override
std::string_view name() const
Symbol(Position pos, Kind kind, std::string_view name, const Type *type=nullptr)
const Type & type() const
static constexpr TypeKind kTypeKind
SpvDim_ dimensions() const override
const Type & slotType(size_t n) const override
bool isDepth() const override
bool isArrayedTexture() const override
TextureAccess textureAccess() const override
TextureType(const char *name, SpvDim_ dimensions, bool isDepth, bool isArrayed, bool isMultisampled, TextureAccess textureAccess)
bool isMultisampled() const override
virtual const Type & slotType(size_t) const
virtual bool isArray() const
Type(const Type &other)=delete
static std::unique_ptr< Type > MakeTextureType(const char *name, SpvDim_ dimensions, bool isDepth, bool isArrayedTexture, bool isMultisampled, TextureAccess textureAccess)
const Type * applyPrecisionQualifiers(const Context &context, ModifierFlags *modifierFlags, Position pos) const
bool isInRootSymbolTable() const
virtual int bitWidth() const
bool highPrecision() const
virtual bool isVector() const
CoercionCost coercionCost(const Type &other) const
static std::unique_ptr< Type > MakeArrayType(const Context &context, std::string_view name, const Type &componentType, int columns)
virtual int priority() const
bool isAllowedInES2(const Context &context) const
std::unique_ptr< Expression > coerceExpression(std::unique_ptr< Expression > expr, const Context &context) const
virtual const Type & componentType() const
static std::unique_ptr< Type > MakeSpecialType(const char *name, const char *abbrev, Type::TypeKind typeKind)
virtual bool isInterfaceBlock() const
static std::unique_ptr< Type > MakeScalarType(std::string_view name, const char *abbrev, Type::NumberKind numberKind, int8_t priority, int8_t bitWidth)
SKSL_INT convertArraySize(const Context &context, Position arrayPos, std::unique_ptr< Expression > size) const
const char * abbreviatedName() const
virtual SkSpan< const Field > fields() const
static std::unique_ptr< Type > MakeGenericType(const char *name, SkSpan< const Type *const > types, const Type *slotType)
bool matches(const Type &other) const
virtual bool isMatrix() const
virtual bool isDepth() const
static std::unique_ptr< Type > MakeLiteralType(const char *name, const Type &scalarType, int8_t priority)
virtual bool isLiteral() const
virtual TextureAccess textureAccess() const
bool checkIfUsableInArray(const Context &context, Position arrayPos) const
static std::unique_ptr< Type > MakeMatrixType(std::string_view name, const char *abbrev, const Type &componentType, int columns, int8_t rows)
virtual const Type & textureType() const
virtual int columns() const
virtual size_t slotCount() const
static constexpr int kUnsizedArray
virtual bool isScalar() const
virtual NumberKind numberKind() const
virtual bool isAllowedInES2() const
virtual bool isUnsizedArray() const
virtual bool isAllowedInUniform(Position *errorPosition=nullptr) const
static std::unique_ptr< Type > MakeAtomicType(std::string_view name, const char *abbrev)
std::string description() const override
const Type * applyAccessQualifiers(const Context &context, ModifierFlags *modifierFlags, Position pos) const
virtual double maximumValue() const
std::string getArrayName(int arraySize) const
virtual bool isOrContainsAtomic() const
virtual bool isMultisampled() const
static std::unique_ptr< Type > MakeStructType(const Context &context, Position pos, std::string_view name, skia_private::TArray< Field > fields, bool interfaceBlock=false)
virtual SkSpan< const Type *const > coercibleTypes() const
virtual bool isArrayedTexture() const
bool checkForOutOfRangeLiteral(const Context &context, const Expression &expr) const
std::string displayName() const
const Type & toCompound(const Context &context, int columns, int rows) const
TypeKind typeKind() const
virtual bool isStruct() const
const Type * clone(const Context &context, SymbolTable *symbolTable) const
virtual SpvDim_ dimensions() const
static std::unique_ptr< Type > MakeVectorType(std::string_view name, const char *abbrev, const Type &componentType, int columns)
static std::unique_ptr< Type > MakeSamplerType(const char *name, const Type &textureType)
virtual double minimumValue() const
static std::unique_ptr< Type > MakeAliasType(std::string_view name, const Type &targetType)
virtual bool isOrContainsUnsizedArray() const
const Type * applyQualifiers(const Context &context, ModifierFlags *modifierFlags, Position pos) const
bool isAllowedInUniform(Position *errorPosition) const override
VectorType(std::string_view name, const char *abbrev, const Type &componentType, int8_t columns)
const ScalarType & componentType() const override
const Type & slotType(size_t n) const override
bool isVector() const override
size_t slotCount() const override
bool isAllowedInES2() const override
int bitWidth() const override
int columns() const override
int rows() const override
static constexpr TypeKind kTypeKind
static size_t Add(size_t x, size_t y)
static size_t Mul(size_t x, size_t y)
constexpr T * data() const
constexpr size_t size() const
static float max(float r, float g, float b)
std::string printf(const char *fmt,...) SK_PRINTF_LIKE(1
static constexpr int kMaxStructDepth
static constexpr int kVariableSlotLimit
DEF_SWITCHES_START aot vmservice shared library name
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
static CoercionCost Impossible()
static CoercionCost Narrowing(int cost)
static CoercionCost Free()
static CoercionCost Normal(int cost)
std::string description() const
ModifierFlags fModifierFlags
std::string paddedDescription() const
static bool IsRuntimeEffect(ProgramKind kind)