2026-07-19 22:56:57 -05:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| Query.mqh |
|
|
|
|
|
//| Copyright 2026, MetaQuotes Ltd. |
|
|
|
|
|
//| https://www.mql5.com |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
#property copyright "Copyright 2026, MetaQuotes Ltd."
|
|
|
|
|
#property link "https://www.mql5.com"
|
|
|
|
|
#property strict
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-07-20 22:44:15 -05:00
|
|
|
#include "Parser.mqh"
|
2026-07-19 22:56:57 -05:00
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
namespace TSN
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
class CSLDomQuery;
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
typedef void(*CSLQueryFunc)(CSLDomQuery* state);
|
|
|
|
|
|
2026-07-19 22:56:57 -05:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-07-20 22:44:15 -05:00
|
|
|
class CSLDomQuery : public CSLDomQueryCompiler
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
|
|
|
|
private:
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Dom
|
2026-07-19 22:56:57 -05:00
|
|
|
CDomNodeManager* m_dom;
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Bytecode
|
2026-07-19 22:56:57 -05:00
|
|
|
long m_bytecode[];
|
|
|
|
|
int m_bytecode_s;
|
|
|
|
|
int m_bytecode_r;
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Funciones
|
|
|
|
|
CSLQueryFunc m_funcs[128];
|
|
|
|
|
int m_funcs_size;
|
2026-07-19 22:56:57 -05:00
|
|
|
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Iteracion
|
2026-07-19 22:56:57 -05:00
|
|
|
//- iteracion de obj
|
2026-07-20 22:44:15 -05:00
|
|
|
CHashMapFastIterator(string, CDomNodeBase*) m_stack_it_obj[TSN_DOMPATH_MAX_DEPTH_ITER];
|
2026-07-19 22:56:57 -05:00
|
|
|
//- iteracion de array
|
2026-07-20 22:44:15 -05:00
|
|
|
int m_stack_it_ix[TSN_DOMPATH_MAX_DEPTH_ITER];
|
|
|
|
|
int m_stack_it_k[TSN_DOMPATH_MAX_DEPTH_ITER];
|
|
|
|
|
int m_stack_it_count[TSN_DOMPATH_MAX_DEPTH_ITER];
|
2026-07-19 22:56:57 -05:00
|
|
|
//- cacheables
|
|
|
|
|
int m_stack_it_curr;
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Registros constantes
|
|
|
|
|
DomConstantStr m_rk_str[TSN_DOMPATH_MAX_S_RK];
|
|
|
|
|
DomPathV m_rk[TSN_DOMPATH_MAX_S_RK];
|
|
|
|
|
int m_rk_s;
|
2026-07-19 22:56:57 -05:00
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Registros dinamicos
|
2026-07-21 08:53:15 -05:00
|
|
|
CDomNodeBase* m_dnodes[TSN_DOMPATH_MAX_S_R];
|
|
|
|
|
int m_dnodes_size;
|
2026-07-20 22:44:15 -05:00
|
|
|
string m_sreg[TSN_DOMPATH_MAX_S_R];
|
|
|
|
|
int m_sreg_s;
|
|
|
|
|
DomPathV m_reg[TSN_DOMPATH_MAX_S_R];
|
|
|
|
|
int m_reg_s;
|
|
|
|
|
|
|
|
|
|
//--- Call frame actual
|
|
|
|
|
int m_num_args;
|
|
|
|
|
int m_reg_start;
|
|
|
|
|
|
|
|
|
|
//--- Actual
|
|
|
|
|
ulong m_current_hash;
|
2026-07-19 22:56:57 -05:00
|
|
|
CDomNodeBase* m_curr;
|
|
|
|
|
bool m_last_bool_r;
|
|
|
|
|
//CDomNodeBase* m_root;
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//---
|
|
|
|
|
int m_ip;
|
|
|
|
|
|
2026-07-19 22:56:57 -05:00
|
|
|
public:
|
|
|
|
|
CSLDomQuery(void) {}
|
|
|
|
|
~CSLDomQuery(void) {}
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
bool Run(CDomNodeBase& *elemts[]);
|
2026-07-19 22:56:57 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-07-20 22:44:15 -05:00
|
|
|
struct DomConstantStr
|
|
|
|
|
{
|
|
|
|
|
uchar arr[];
|
|
|
|
|
int len;
|
|
|
|
|
bool operator=(const string& other)
|
|
|
|
|
{
|
|
|
|
|
const int l = StringLen(other);
|
|
|
|
|
if(l != len)
|
|
|
|
|
return false;
|
|
|
|
|
int k = 0;
|
|
|
|
|
for(int i = start; i < start + len; i++)
|
|
|
|
|
if(arr[i] != other[k++])
|
|
|
|
|
return false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
bool operator<(const string& other)
|
|
|
|
|
{
|
|
|
|
|
const int l = StringLen(other);
|
|
|
|
|
if(l != len)
|
|
|
|
|
return true;
|
|
|
|
|
int k = 0;
|
|
|
|
|
for(int i = start; i < start + len; i++)
|
|
|
|
|
if(arr[i] < other[k++])
|
|
|
|
|
return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
bool operator<=(const string& other)
|
|
|
|
|
{
|
|
|
|
|
const int l = StringLen(other);
|
|
|
|
|
if(l != len)
|
|
|
|
|
return true;
|
|
|
|
|
int k = 0;
|
|
|
|
|
for(int i = start; i < start + len; i++)
|
|
|
|
|
if(arr[i] <= other[k++])
|
|
|
|
|
return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
2026-07-19 22:56:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-07-20 22:44:15 -05:00
|
|
|
//---
|
|
|
|
|
#define TSN_DOMPATH_DO_MATH_TYPED_ALL(B, C, OP) \
|
|
|
|
|
switch(B.tt) \
|
|
|
|
|
{ \
|
|
|
|
|
case DOMPATHV_TYPE_BOL: \
|
|
|
|
|
B.v.bv OP= (C.tt == DOMPATHV_TYPE_FLT ? (bool)C.v.dv : C.v.bv); \
|
2026-07-21 08:53:15 -05:00
|
|
|
m_ip++; \
|
2026-07-20 22:44:15 -05:00
|
|
|
break; \
|
|
|
|
|
case DOMPATHV_TYPE_INT: \
|
|
|
|
|
B.v.iv OP= (C.tt == DOMPATHV_TYPE_FLT ? (long)C.v.dv : C.v.iv); \
|
2026-07-21 08:53:15 -05:00
|
|
|
m_ip++; \
|
2026-07-20 22:44:15 -05:00
|
|
|
break; \
|
|
|
|
|
case DOMPATHV_TYPE_FLT: \
|
|
|
|
|
B.v.dv OP= (C.tt != DOMPATHV_TYPE_FLT ? (double)C.v.lv : C.v.dv); \
|
2026-07-21 08:53:15 -05:00
|
|
|
m_ip++; \
|
2026-07-20 22:44:15 -05:00
|
|
|
break; \
|
|
|
|
|
default: \
|
|
|
|
|
m_ip = int(m_bytecode[m_ip+1] >> TSN_DOMPATH_BIT_INS_JUMP_START_MATHERR); \
|
|
|
|
|
break; \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
#define TSN_DOMPATH_DO_MATH_TYPED_INTEGER(B, C, OP) \
|
|
|
|
|
switch(B.tt) \
|
|
|
|
|
{ \
|
|
|
|
|
case DOMPATHV_TYPE_BOL: \
|
|
|
|
|
B.v.bv OP= C.v.bv; \
|
2026-07-21 08:53:15 -05:00
|
|
|
m_ip++; \
|
2026-07-20 22:44:15 -05:00
|
|
|
break; \
|
|
|
|
|
case DOMPATHV_TYPE_INT: \
|
|
|
|
|
B.v.iv OP= C.v.iv; \
|
2026-07-21 08:53:15 -05:00
|
|
|
m_ip++; \
|
2026-07-20 22:44:15 -05:00
|
|
|
break; \
|
|
|
|
|
default: \
|
|
|
|
|
m_ip = int(m_bytecode[m_ip+1] >> TSN_DOMPATH_BIT_INS_JUMP_START_MATHERR); \
|
|
|
|
|
break; \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
#define TSN_DOMPATH_DEFINE_MATH_OP(OP, FUNC) \
|
|
|
|
|
const long l = m_bytecode[m_ip];\
|
|
|
|
|
const int b = int(l >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_INS_MASK_INDEX_REG; \
|
|
|
|
|
switch(uchar(m_bytecode[m_ip+1]&2)) \
|
|
|
|
|
{ \
|
|
|
|
|
case TSN_DOMPATH_INS_MATH_TYPE_DS: \
|
|
|
|
|
{ \
|
|
|
|
|
const TSNDomPathValues c = m_rk[int(l >> TSN_DOMPATH_INS_MATH_BIT_START_REG_2)]; \
|
|
|
|
|
FUNC(m_reg[b], c, OP) \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
case TSN_DOMPATH_INS_MATH_TYPE_SD: \
|
|
|
|
|
{ \
|
|
|
|
|
const TSNDomPathValues c = m_reg[int(l >> TSN_DOMPATH_INS_MATH_BIT_START_REG_2)]; \
|
|
|
|
|
FUNC(m_rk[b], c, OP) \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
case TSN_DOMPATH_INS_MATH_TYPE_DD: \
|
|
|
|
|
{ \
|
|
|
|
|
const TSNDomPathValues c = m_reg[int(l >> TSN_DOMPATH_INS_MATH_BIT_START_REG_2)]; \
|
|
|
|
|
FUNC(m_reg[b], c, OP) \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
default:\
|
|
|
|
|
break;\
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
// string solo comparcion con srting no hay casteo implciito
|
|
|
|
|
#define TSN_DOMPATH_DO_COMP_TYPED_ALL(B, C, OP, bstring_reg, cstring_reg) \
|
|
|
|
|
switch(B.tt) \
|
|
|
|
|
{ \
|
|
|
|
|
case DOMPATHV_TYPE_BOL: \
|
|
|
|
|
res = (B.v.bv OP (C.tt == DOMPATHV_TYPE_FLT ? (bool)C.v.dv : C.v.bv)); \
|
|
|
|
|
break; \
|
|
|
|
|
case DOMPATHV_TYPE_INT: \
|
|
|
|
|
res = (B.v.iv OP (C.tt == DOMPATHV_TYPE_FLT ? (long)C.v.dv : C.v.iv)); \
|
|
|
|
|
break; \
|
|
|
|
|
case DOMPATHV_TYPE_FLT: \
|
|
|
|
|
res = (B.v.dv OP (C.tt != DOMPATHV_TYPE_FLT ? (double)C.v.lv : C.v.dv)); \
|
|
|
|
|
break; \
|
|
|
|
|
case DOMPATHV_TYPE_STR: \
|
|
|
|
|
{\
|
|
|
|
|
if(C.tt!=DOMPATHV_TYPE_STR)\
|
|
|
|
|
break; \
|
|
|
|
|
res = (bstring_reg[B.v.ix] OP cstring_reg[C.v.ix]) + 1; \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
default: \
|
|
|
|
|
break; \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
#define TSN_DOMPATH_DEFINE_BOOL_OP(OP) \
|
|
|
|
|
bool res=false;\
|
|
|
|
|
const long l = m_bytecode[m_ip];\
|
|
|
|
|
const int b = int(l >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_INS_MASK_INDEX_REG; \
|
|
|
|
|
switch(uchar(m_bytecode[m_ip+1]&2)) \
|
|
|
|
|
{ \
|
|
|
|
|
case TSN_DOMPATH_INS_MATH_TYPE_DS: \
|
|
|
|
|
{ \
|
|
|
|
|
const TSNDomPathValues c = m_rk[int(l >> TSN_DOMPATH_INS_MATH_BIT_START_REG_2)]; \
|
|
|
|
|
TSN_DOMPATH_DO_COMP_TYPED_ALL(m_reg[b], c, OP, m_reg_s) \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
case TSN_DOMPATH_INS_MATH_TYPE_SD: \
|
|
|
|
|
{ \
|
|
|
|
|
const TSNDomPathValues c = m_reg[int(l >> TSN_DOMPATH_INS_MATH_BIT_START_REG_2)]; \
|
|
|
|
|
TSN_DOMPATH_DO_COMP_TYPED_ALL(m_rk[b], c, OP, m_rk_s) \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
case TSN_DOMPATH_INS_MATH_TYPE_DD: \
|
|
|
|
|
{ \
|
|
|
|
|
const TSNDomPathValues c = m_reg[int(l >> TSN_DOMPATH_INS_MATH_BIT_START_REG_2)]; \
|
|
|
|
|
TSN_DOMPATH_DO_COMP_TYPED_ALL(m_reg[b], c, OP, m_reg_s) \
|
|
|
|
|
break; \
|
|
|
|
|
} \
|
|
|
|
|
default:\
|
|
|
|
|
break;\
|
|
|
|
|
} \
|
|
|
|
|
m_ip++;\
|
|
|
|
|
if(res == bool((m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_JUMP_START_CMP_V) & 1))\
|
|
|
|
|
m_ip++;\
|
|
|
|
|
else\
|
|
|
|
|
m_ip = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_JUMP_START_CMPFALSE) & TSN_DOMPATH_BIT_INS_JUMP_START_MATHERR;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
bool CSLDomQuery::Run(CDomNodeBase& *elemts[])
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
|
|
|
|
//---
|
2026-07-20 22:44:15 -05:00
|
|
|
m_ip = 0;
|
2026-07-19 22:56:57 -05:00
|
|
|
|
|
|
|
|
//---
|
2026-07-20 22:44:15 -05:00
|
|
|
while(m_ip < m_bytecode_s)
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
switch(uchar(m_bytecode[m_ip]&TSN_DOMPATH_MASK_INS_TYPE))
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Acceso
|
|
|
|
|
// Acceso normal en iteracion
|
2026-07-19 22:56:57 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_ACCESO_KEY:
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
// accceso directo por hash 64
|
|
|
|
|
m_curr = m_curr.Get((ulong)m_bytecode[m_ip + 1]);
|
|
|
|
|
if(m_curr == NULL)
|
|
|
|
|
{
|
|
|
|
|
// JUMP explicito a direccion especificada.
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// Acceso F
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_ACCESO_KEY_F:
|
|
|
|
|
{
|
|
|
|
|
// accceso directo por hash 64
|
|
|
|
|
m_curr = m_curr.Get((ulong)m_bytecode[m_ip + 1]);
|
|
|
|
|
if(m_curr == NULL)
|
|
|
|
|
return; // place holder.. aqui seria finalizar de una
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_ACCESO_IDX:
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
m_curr = m_curr.AtSafe(m_bytecode[m_ip++] >> TSN_DOMPATH_BIT_INS_ETYPE); // Acceso
|
|
|
|
|
if(m_curr == NULL)
|
|
|
|
|
{
|
|
|
|
|
// JUMP explicito a direccion especificada.
|
|
|
|
|
break;
|
|
|
|
|
}
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_ACCESO_IDX_F
|
|
|
|
|
{
|
|
|
|
|
m_curr = m_curr.AtSafe(m_bytecode[m_ip++] >> TSN_DOMPATH_BIT_INS_ETYPE); // Acceso
|
|
|
|
|
if(m_curr == NULL)
|
|
|
|
|
return; // aqui seria finalizar directo..
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//--- Iniciar iteracion
|
2026-07-19 22:56:57 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_INICIAR_ITERACION:
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
m_stack_it_curr++;
|
2026-07-19 22:56:57 -05:00
|
|
|
if(m_curr.m_type == TSN_SBL_BASE_TYPE_OBJ)
|
|
|
|
|
{
|
|
|
|
|
m_stack_it_obj[m_stack_it_curr] = m_curr.BenginIteration();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
//falta
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_ITER_ASSING:
|
|
|
|
|
{
|
|
|
|
|
if(m_curr.m_type == TSN_SBL_BASE_TYPE_OBJ)
|
|
|
|
|
{
|
|
|
|
|
if(m_stack_it_obj[m_stack_it_curr].IsValid())
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
m_current_hash = m_stack_it_obj[m_stack_it_curr].Hash();
|
2026-07-19 22:56:57 -05:00
|
|
|
m_curr = m_stack_it_obj[m_stack_it_curr].Val();
|
|
|
|
|
m_stack_it_obj[m_stack_it_curr].Next();
|
2026-07-20 22:44:15 -05:00
|
|
|
m_ip++; // Siguiente instrucciones
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
|
|
|
|
else // SI no es valido
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
// Saltamos a donde se diga
|
|
|
|
|
m_ip = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_ETYPE);
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
//falta
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//---
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_EXIST:
|
2026-07-20 07:27:42 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
// 2 slots
|
|
|
|
|
// expectred [type=8 1 slot][hash=64] (cada [] es un slot)
|
|
|
|
|
m_last_bool_r = (m_current_hash == (ulong)m_bytecode[m_ip + 1]);
|
2026-07-20 07:27:42 -05:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- save basico para nativos
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_SAVE:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
// [8type][28=k][28=jump]
|
|
|
|
|
const int k = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_INS_MASK_INDEX_REG;
|
|
|
|
|
switch(m_curr.m_type)
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-21 08:53:15 -05:00
|
|
|
case TSN_SBL_BASE_TYPE_OBJ:
|
|
|
|
|
m_reg[k].tt = DOMPATHV_TYPE_OBJ;
|
|
|
|
|
m_reg[k].v.ix = m_dnodes_size;
|
|
|
|
|
m_dnodes[m_dnodes_size++] = m_curr;
|
|
|
|
|
break;
|
|
|
|
|
case TSN_SBL_BASE_TYPE_ARR:
|
|
|
|
|
m_reg[k].tt = DOMPATHV_TYPE_ARR;
|
|
|
|
|
m_reg[k].v.ix = m_dnodes_size;
|
|
|
|
|
m_dnodes[m_dnodes_size++] = m_curr;
|
|
|
|
|
break;
|
2026-07-20 22:44:15 -05:00
|
|
|
case TSN_SBL_BASE_TYPE_INT:
|
|
|
|
|
m_reg[k].v.iv = m_curr.m_v.iv;
|
|
|
|
|
m_reg[k].tt = DOMPATHV_TYPE_INT;
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
2026-07-20 22:44:15 -05:00
|
|
|
case TSN_SBL_BASE_TYPE_FLT:
|
|
|
|
|
m_reg[k].v.dv = m_curr.m_v.dv;
|
|
|
|
|
m_reg[k].tt = DOMPATHV_TYPE_FLT;
|
|
|
|
|
break;
|
|
|
|
|
case TSN_SBL_BASE_TYPE_BOL:
|
|
|
|
|
m_reg[k].v.bv = m_curr.m_v.bv;
|
|
|
|
|
m_reg[k].tt = DOMPATHV_TYPE_BOL;
|
|
|
|
|
break;
|
|
|
|
|
case TSN_SBL_BASE_TYPE_STR:
|
|
|
|
|
m_reg[k].tt = DOMPATHV_TYPE_BOL;
|
|
|
|
|
m_reg[k].v.ix = m_sreg_s;
|
|
|
|
|
m_reg_s[m_sreg_s++] = m_curr.m_ctx.m_string_stack[m_curr.m_v.ix];
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
default:
|
2026-07-20 22:44:15 -05:00
|
|
|
{
|
2026-07-21 08:53:15 -05:00
|
|
|
// Nota que solo los valores normales como string\int se guranda en reg
|
|
|
|
|
// Los otros como arr tambien pero solo se almacnea us nodo su unica utilidad es para funciones..
|
|
|
|
|
// Tipo invalido null
|
2026-07-20 22:44:15 -05:00
|
|
|
// Aqui un jump a direccion especificada
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
2026-07-20 22:44:15 -05:00
|
|
|
}
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- math
|
|
|
|
|
// math entero usa 2 slots.. para sus intrucciones
|
|
|
|
|
// [type][28][28] | [2][28]
|
|
|
|
|
// 8 bits type, 28 valor 1, 28 valor ahora para el siuient eslot solo es de qeu tipo es.. (sd\ds\.etc..)
|
|
|
|
|
// 28 bits ultimso a donde salta
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_MUL:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP(*, TSN_DOMPATH_DO_MATH_TYPED_ALL)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_RES:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP(-, TSN_DOMPATH_DO_MATH_TYPED_ALL)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_DIV:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP( /, TSN_DOMPATH_DO_MATH_TYPED_ALL)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_SUM:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
//TSN_DOMPATH_DEFINE_MATH_OP(*)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_MOD:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP( %, TSN_DOMPATH_DO_MATH_TYPED_INTEGER)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_BIT_OR:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP( |, TSN_DOMPATH_DO_MATH_TYPED_INTEGER)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_BIT_AND:
|
|
|
|
|
{
|
|
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP(&, TSN_DOMPATH_DO_MATH_TYPED_INTEGER)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_BIT_XOR:
|
|
|
|
|
{
|
|
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP(^, TSN_DOMPATH_DO_MATH_TYPED_INTEGER)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_BIT_DEZ_IZQ:
|
|
|
|
|
{
|
|
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP( <<, TSN_DOMPATH_DO_MATH_TYPED_INTEGER)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_M_BIT_DEZ_DRC:
|
|
|
|
|
{
|
|
|
|
|
TSN_DOMPATH_DEFINE_MATH_OP( >> TSN_DOMPATH_DO_MATH_TYPED_INTEGER)
|
|
|
|
|
break;
|
|
|
|
|
}
|
2026-07-19 22:56:57 -05:00
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Operaciones de compracion
|
|
|
|
|
// [type][28][28] | [2][28][1]
|
|
|
|
|
//--- Cmp (comparaciones..)
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_COMPARE_EQ:
|
|
|
|
|
{
|
|
|
|
|
TSN_DOMPATH_DEFINE_BOOL_OP( ==)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_COMPARE_MENOR:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_BOOL_OP( <)
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
case DOMPATH_QUERY_INS_TYPE_COMPARE_MENOR_EQ:
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
TSN_DOMPATH_DEFINE_BOOL_OP( <=)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_COMPARE_IS:
|
|
|
|
|
{
|
|
|
|
|
//--- [8bytes][KIndex=28][28] | [1 bit = resultado esperado]
|
|
|
|
|
bool res = false;
|
|
|
|
|
const int k = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_INS_MASK_INDEX_REG;
|
|
|
|
|
switch(m_curr.m_type)
|
2026-07-19 22:56:57 -05:00
|
|
|
{
|
2026-07-20 22:44:15 -05:00
|
|
|
case TSN_SBL_BASE_TYPE_INT:
|
|
|
|
|
res = m_reg[k].v.iv != 0;
|
|
|
|
|
break;
|
|
|
|
|
case TSN_SBL_BASE_TYPE_FLT:
|
|
|
|
|
res = m_reg[k].v.dv != 0;
|
|
|
|
|
break;
|
|
|
|
|
case TSN_SBL_BASE_TYPE_BOL:
|
|
|
|
|
res = m_reg[k].v.bv;
|
|
|
|
|
break;
|
|
|
|
|
case TSN_SBL_BASE_TYPE_STR:
|
|
|
|
|
res = m_sreg[m_reg[k].v.ix].Length() != 0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
2026-07-20 22:44:15 -05:00
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
m_ip++;
|
|
|
|
|
if(res == bool(m_bytecode[m_ip]))
|
|
|
|
|
m_ip++; // sigueinte normal
|
|
|
|
|
else
|
|
|
|
|
m_ip = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_JUMP_START_CMPIS_FALSE); // saltamos
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//---
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_CALL:
|
|
|
|
|
{
|
|
|
|
|
// [8type][28=direecion donde poner el valor final][28 numero de argumentos]
|
|
|
|
|
// [indice de funcion] (slot completo)
|
|
|
|
|
m_reg_start = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_ETYPE) & TSN_DOMPATH_INS_MASK_INDEX_REG;
|
|
|
|
|
m_num_args = int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_BIT_START_NARGS);
|
|
|
|
|
m_ip++;
|
|
|
|
|
m_funcs[m_bytecode[m_ip]](&this); // llamamos
|
|
|
|
|
// ahora ya se sape que la funcion escrbiio un valor en dicho registro
|
|
|
|
|
m_ip++; // Siguiente insturccion
|
|
|
|
|
break;
|
|
|
|
|
}
|
2026-07-19 22:56:57 -05:00
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//----
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_LOADK:
|
|
|
|
|
{
|
|
|
|
|
// [8type][28dirrecion donde se copia reg][28 dirrecion src kreg]
|
|
|
|
|
m_reg[int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_ETYPE)
|
|
|
|
|
& TSN_DOMPATH_INS_MASK_INDEX_REG] = m_rk[int(m_bytecode[m_ip] >> TSN_DOMPATH_BIT_INS_BIT_START_NARGS)];
|
|
|
|
|
m_ip++;
|
2026-07-19 22:56:57 -05:00
|
|
|
break;
|
2026-07-20 22:44:15 -05:00
|
|
|
}
|
2026-07-19 22:56:57 -05:00
|
|
|
|
2026-07-20 22:44:15 -05:00
|
|
|
//--- Finaes
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_APPEND:
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case DOMPATH_QUERY_INS_TYPE_SALIDA:
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2026-07-19 22:56:57 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|