Bytecode: make destructors of base classes protected

This prevents destruction through a base pointer, which would a memory leak
since the destructor is not virtual (and we cannot make it virtual because it
would break our crude serialization strategy).
master
Sébastien Villemot 2023-09-01 13:50:57 +02:00
parent c8cd182e98
commit 3a18707685
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
1 changed files with 62 additions and 39 deletions

View File

@ -115,6 +115,17 @@ class BytecodeWriter;
struct BytecodeInstruction
{
const Tags op_code;
explicit BytecodeInstruction(Tags op_code_arg) :
op_code {op_code_arg}
{
}
protected:
/* This is a base class, so the destructor should be either public+virtual or
protected+non-virtual. We opt for the latter, because otherwise this class
would no longer be POD; its memory representation would also include
runtime type information, and our crude serialization technique (copying the
whole object from memory) would thus not work. */
~BytecodeInstruction() = default;
};
template<typename T1>
@ -127,6 +138,9 @@ public:
arg1{arg_arg1}
{
};
protected:
// See BytecodeInstruction destructor for the rationale
~TagWithOneArgument() = default;
};
template<typename T1, typename T2>
@ -140,6 +154,9 @@ public:
BytecodeInstruction{op_code_arg}, arg1{arg_arg1}, arg2{arg_arg2}
{
};
protected:
// See BytecodeInstruction destructor for the rationale
~TagWithTwoArguments() = default;
};
template<typename T1, typename T2, typename T3>
@ -154,6 +171,9 @@ public:
BytecodeInstruction{op_code_arg}, arg1{arg_arg1}, arg2{arg_arg2}, arg3{arg_arg3}
{
};
protected:
// See BytecodeInstruction destructor for the rationale
~TagWithThreeArguments() = default;
};
template<typename T1, typename T2, typename T3, typename T4>
@ -170,9 +190,12 @@ public:
arg3{move(arg_arg3)}, arg4{arg_arg4}
{
};
protected:
// See BytecodeInstruction destructor for the rationale
~TagWithFourArguments() = default;
};
class FLDZ_ : public BytecodeInstruction
class FLDZ_ final : public BytecodeInstruction
{
public:
FLDZ_() : BytecodeInstruction{Tags::FLDZ}
@ -180,7 +203,7 @@ public:
};
};
class FEND_ : public BytecodeInstruction
class FEND_ final : public BytecodeInstruction
{
public:
FEND_() : BytecodeInstruction{Tags::FEND}
@ -188,7 +211,7 @@ public:
};
};
class FENDBLOCK_ : public BytecodeInstruction
class FENDBLOCK_ final : public BytecodeInstruction
{
public:
FENDBLOCK_() : BytecodeInstruction{Tags::FENDBLOCK}
@ -196,7 +219,7 @@ public:
};
};
class FENDEQU_ : public BytecodeInstruction
class FENDEQU_ final : public BytecodeInstruction
{
public:
FENDEQU_() : BytecodeInstruction{Tags::FENDEQU}
@ -204,7 +227,7 @@ public:
};
};
class FDIMT_ : public TagWithOneArgument<int>
class FDIMT_ final : public TagWithOneArgument<int>
{
public:
explicit FDIMT_(int size_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FDIMT, size_arg}
@ -217,7 +240,7 @@ public:
};
};
class FDIMST_ : public TagWithOneArgument<int>
class FDIMST_ final : public TagWithOneArgument<int>
{
public:
explicit FDIMST_(int size_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FDIMST, size_arg}
@ -230,7 +253,7 @@ public:
};
};
class FLDC_ : public TagWithOneArgument<double>
class FLDC_ final : public TagWithOneArgument<double>
{
public:
explicit FLDC_(double value_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDC, value_arg}
@ -243,7 +266,7 @@ public:
};
};
class FLDU_ : public TagWithOneArgument<int>
class FLDU_ final : public TagWithOneArgument<int>
{
public:
explicit FLDU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDU, pos_arg}
@ -256,7 +279,7 @@ public:
};
};
class FLDSU_ : public TagWithOneArgument<int>
class FLDSU_ final : public TagWithOneArgument<int>
{
public:
explicit FLDSU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDSU, pos_arg}
@ -269,7 +292,7 @@ public:
};
};
class FLDR_ : public TagWithOneArgument<int>
class FLDR_ final : public TagWithOneArgument<int>
{
public:
explicit FLDR_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDR, pos_arg}
@ -282,7 +305,7 @@ public:
};
};
class FLDT_ : public TagWithOneArgument<int>
class FLDT_ final : public TagWithOneArgument<int>
{
public:
explicit FLDT_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDT, pos_arg}
@ -295,7 +318,7 @@ public:
};
};
class FLDST_ : public TagWithOneArgument<int>
class FLDST_ final : public TagWithOneArgument<int>
{
public:
explicit FLDST_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDST, pos_arg}
@ -308,7 +331,7 @@ public:
};
};
class FSTPT_ : public TagWithOneArgument<int>
class FSTPT_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPT_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPT, pos_arg}
@ -321,7 +344,7 @@ public:
};
};
class FSTPST_ : public TagWithOneArgument<int>
class FSTPST_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPST_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPST, pos_arg}
@ -334,7 +357,7 @@ public:
};
};
class FSTPR_ : public TagWithOneArgument<int>
class FSTPR_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPR_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPR, pos_arg}
@ -347,7 +370,7 @@ public:
};
};
class FSTPU_ : public TagWithOneArgument<int>
class FSTPU_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPU, pos_arg}
@ -360,7 +383,7 @@ public:
};
};
class FSTPSU_ : public TagWithOneArgument<int>
class FSTPSU_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPSU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPSU, pos_arg}
@ -373,7 +396,7 @@ public:
};
};
class FSTPG_ : public TagWithOneArgument<int>
class FSTPG_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPG_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPG, pos_arg}
@ -386,7 +409,7 @@ public:
};
};
class FSTPG2_ : public TagWithTwoArguments<int, int>
class FSTPG2_ final : public TagWithTwoArguments<int, int>
{
public:
FSTPG2_(int row_arg, int col_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPG2, row_arg, col_arg}
@ -404,7 +427,7 @@ public:
};
};
class FSTPG3_ : public TagWithFourArguments<int, int, int, int>
class FSTPG3_ final : public TagWithFourArguments<int, int, int, int>
{
public:
FSTPG3_(int row_arg, int col_arg, int lag_arg, int col_pos_arg) : TagWithFourArguments::TagWithFourArguments{Tags::FSTPG3, row_arg, col_arg, lag_arg, col_pos_arg}
@ -432,7 +455,7 @@ public:
};
};
class FUNARY_ : public TagWithOneArgument<UnaryOpcode>
class FUNARY_ final : public TagWithOneArgument<UnaryOpcode>
{
public:
explicit FUNARY_(UnaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FUNARY, op_type_arg}
@ -445,7 +468,7 @@ public:
};
};
class FBINARY_ : public TagWithOneArgument<BinaryOpcode>
class FBINARY_ final : public TagWithOneArgument<BinaryOpcode>
{
public:
explicit FBINARY_(BinaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FBINARY, op_type_arg}
@ -458,7 +481,7 @@ public:
};
};
class FTRINARY_ : public TagWithOneArgument<TrinaryOpcode>
class FTRINARY_ final : public TagWithOneArgument<TrinaryOpcode>
{
public:
explicit FTRINARY_(TrinaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FTRINARY, op_type_arg}
@ -471,7 +494,7 @@ public:
};
};
class FJMPIFEVAL_ : public TagWithOneArgument<int>
class FJMPIFEVAL_ final : public TagWithOneArgument<int>
{
public:
explicit FJMPIFEVAL_(int arg_pos) : TagWithOneArgument::TagWithOneArgument{Tags::FJMPIFEVAL, arg_pos}
@ -484,7 +507,7 @@ public:
}
};
class FJMP_ : public TagWithOneArgument<int>
class FJMP_ final : public TagWithOneArgument<int>
{
public:
explicit FJMP_(int arg_pos) : TagWithOneArgument::TagWithOneArgument{Tags::FJMP, arg_pos}
@ -497,7 +520,7 @@ public:
}
};
class FLDTEF_ : public TagWithOneArgument<int>
class FLDTEF_ final : public TagWithOneArgument<int>
{
public:
explicit FLDTEF_(int number) : TagWithOneArgument::TagWithOneArgument{Tags::FLDTEF, number}
@ -510,7 +533,7 @@ public:
}
};
class FSTPTEF_ : public TagWithOneArgument<int>
class FSTPTEF_ final : public TagWithOneArgument<int>
{
public:
explicit FSTPTEF_(int number) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPTEF, number}
@ -523,7 +546,7 @@ public:
}
};
class FLDTEFD_ : public TagWithTwoArguments<int, int>
class FLDTEFD_ final : public TagWithTwoArguments<int, int>
{
public:
FLDTEFD_(int indx, int row) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDTEFD, indx, row}
@ -541,7 +564,7 @@ public:
};
};
class FSTPTEFD_ : public TagWithTwoArguments<int, int>
class FSTPTEFD_ final : public TagWithTwoArguments<int, int>
{
public:
FSTPTEFD_(int indx, int row) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPTEFD, indx, row}
@ -559,7 +582,7 @@ public:
};
};
class FLDTEFDD_ : public TagWithThreeArguments<int, int, int>
class FLDTEFDD_ final : public TagWithThreeArguments<int, int, int>
{
public:
FLDTEFDD_(int indx, int row, int col) : TagWithThreeArguments::TagWithThreeArguments{Tags::FLDTEFDD, indx, row, col}
@ -582,7 +605,7 @@ public:
};
};
class FSTPTEFDD_ : public TagWithThreeArguments<int, int, int>
class FSTPTEFDD_ final : public TagWithThreeArguments<int, int, int>
{
public:
FSTPTEFDD_(int indx, int row, int col) : TagWithThreeArguments::TagWithThreeArguments{Tags::FSTPTEF, indx, row, col}
@ -605,7 +628,7 @@ public:
};
};
class FLDVS_ : public TagWithTwoArguments<SymbolType, int>
class FLDVS_ final : public TagWithTwoArguments<SymbolType, int>
{
public:
FLDVS_(SymbolType type_arg, int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDVS, type_arg, pos_arg}
@ -623,7 +646,7 @@ public:
};
};
class FLDSV_ : public TagWithTwoArguments<SymbolType, int>
class FLDSV_ final : public TagWithTwoArguments<SymbolType, int>
{
public:
FLDSV_(SymbolType type_arg, int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDSV, type_arg, pos_arg}
@ -641,7 +664,7 @@ public:
};
};
class FSTPSV_ : public TagWithTwoArguments<SymbolType, int>
class FSTPSV_ final : public TagWithTwoArguments<SymbolType, int>
{
public:
FSTPSV_(SymbolType type_arg, int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPSV, type_arg, pos_arg}
@ -659,7 +682,7 @@ public:
};
};
class FLDV_ : public TagWithThreeArguments<SymbolType, int, int>
class FLDV_ final : public TagWithThreeArguments<SymbolType, int, int>
{
public:
FLDV_(SymbolType type_arg, int pos_arg, int lead_lag_arg) :
@ -683,7 +706,7 @@ public:
};
};
class FSTPV_ : public TagWithThreeArguments<SymbolType, int, int>
class FSTPV_ final : public TagWithThreeArguments<SymbolType, int, int>
{
public:
FSTPV_(SymbolType type_arg, int pos_arg, int lead_lag_arg) :
@ -707,7 +730,7 @@ public:
};
};
class FCALL_ : public BytecodeInstruction
class FCALL_ final : public BytecodeInstruction
{
template<typename B>
friend BytecodeWriter &operator<<(BytecodeWriter &code_file, const B &instr);
@ -826,7 +849,7 @@ public:
}
};
class FNUMEXPR_ : public BytecodeInstruction
class FNUMEXPR_ final : public BytecodeInstruction
{
private:
ExpressionType expression_type;
@ -880,7 +903,7 @@ public:
};
};
class FBEGINBLOCK_ : public BytecodeInstruction
class FBEGINBLOCK_ final : public BytecodeInstruction
{
template<typename B>
friend BytecodeWriter &operator<<(BytecodeWriter &code_file, const B &instr);