mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 04:15:43 +00:00
more icodeasm hacks
This commit is contained in:
parent
38e6240070
commit
a7476e025b
@ -114,6 +114,173 @@ namespace ICodeASM {
|
|||||||
return tl;
|
return tl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseUInt32 (iter begin, iter end, uint32 *rval)
|
||||||
|
{
|
||||||
|
uint32 position = 0;
|
||||||
|
iter curpos;
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (curpos = begin; curpos < end; ++curpos) {
|
||||||
|
switch (*curpos)
|
||||||
|
{
|
||||||
|
case '0'...'9':
|
||||||
|
position++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
curpos = begin;
|
||||||
|
for (; position >= 0; --position)
|
||||||
|
*rval += (*curpos++ - '0') * pow (10, position);
|
||||||
|
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseDouble (iter begin, iter end, double *rval)
|
||||||
|
{
|
||||||
|
uint32 integer
|
||||||
|
iter curpos = ParseUInt32 (begin, end, *integer);
|
||||||
|
*rval = static_cast<double>(integer);
|
||||||
|
if (*curpos != '.')
|
||||||
|
return curpos;
|
||||||
|
|
||||||
|
++curpos;
|
||||||
|
uint32 position = 0;
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (curpos = begin; curpos < end; ++curpos) {
|
||||||
|
switch (*curpos)
|
||||||
|
{
|
||||||
|
case '0'...'9':
|
||||||
|
*rval += (*curpos - '0') * (1 / pow (10, ++position));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseAlpha (iter begin, iter end, string *rval)
|
||||||
|
{
|
||||||
|
string str = new string();
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (curpos = begin; curpos < end; ++curpos) {
|
||||||
|
switch (*curpos)
|
||||||
|
{
|
||||||
|
case 'a'...'z':
|
||||||
|
case 'A'...'Z':
|
||||||
|
case '0'...'9':
|
||||||
|
case '_':
|
||||||
|
str += *curpos;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rval = str;
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseString (iter begin, iter end, string *rval)
|
||||||
|
{
|
||||||
|
char delim = *begin;
|
||||||
|
bool isTerminated = false;
|
||||||
|
string *str = new string();
|
||||||
|
|
||||||
|
if (delim != '\'' && delim != '"')
|
||||||
|
ASSERT ("|begin| does not point at a string");
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (bool isEscaped = false, iter curpos = ++tl.begin; curpos < end;
|
||||||
|
++curpos) {
|
||||||
|
|
||||||
|
switch (*curpos) {
|
||||||
|
case '\\':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\\';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
isEscaped = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\t';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
str += 't';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\n';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
str += 'n';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\r';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
str += 'r';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '\n':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\r';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
/* unescaped newline == unterminated string */
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case delim:
|
||||||
|
if (isEscaped) {
|
||||||
|
str += delim;
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
++curpos;
|
||||||
|
isTerminated = true;
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
isEscaped = false;
|
||||||
|
str += *curpos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isTerminated)
|
||||||
|
{
|
||||||
|
delete str;
|
||||||
|
throw new ICodeParseException ("Unterminated string literal.");
|
||||||
|
}
|
||||||
|
|
||||||
|
rval = str;
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
iter
|
iter
|
||||||
ICodeParser::ParseStatement (iter begin, iter end)
|
ICodeParser::ParseStatement (iter begin, iter end)
|
||||||
{
|
{
|
||||||
@ -150,7 +317,7 @@ namespace ICodeASM {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tl.type == ttLabel) {
|
if (tl.type == ttLabel) {
|
||||||
string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */
|
string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */
|
||||||
mLabels[label_str] = mStatementNodes.end();
|
mLabels[label_str] = mStatementNodes.end();
|
||||||
return tl.end;
|
return tl.end;
|
||||||
} else if (tl.type == ttInstruction) {
|
} else if (tl.type == ttInstruction) {
|
||||||
@ -192,8 +359,37 @@ namespace ICodeASM {
|
|||||||
CASE_TYPE(UInt32);
|
CASE_TYPE(UInt32);
|
||||||
CASE_TYPE(Register);
|
CASE_TYPE(Register);
|
||||||
CASE_TYPE(StringAtom);
|
CASE_TYPE(StringAtom);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# undef CASE_TYPE
|
||||||
|
|
||||||
|
return curpos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseArgumentListOperand (iter begin, iter end,
|
||||||
|
AnyOperand *rval)
|
||||||
|
{
|
||||||
|
/* XXX this is hard, lets go shopping */
|
||||||
|
ASSERT ("Not Implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseBinaryOpOperand (iter begin, iter end,
|
||||||
|
AnyOperand *rval)
|
||||||
|
{
|
||||||
|
TokenLocation tl = SeekTokenStart (begin, end);
|
||||||
|
|
||||||
|
if (tl.estimate != teString)
|
||||||
|
throw new ICodeParseException ("Expected BinaryOp as a quoted string.");
|
||||||
|
string *str;
|
||||||
|
end = ParseString (tl.begin, end, str);
|
||||||
|
rval->asString = str;
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,9 +85,7 @@ namespace ICodeASM {
|
|||||||
Register asRegister;
|
Register asRegister;
|
||||||
bool asBool;
|
bool asBool;
|
||||||
ArgumentList *asArgumentList;
|
ArgumentList *asArgumentList;
|
||||||
struct {
|
string *asString;
|
||||||
iter begin, end;
|
|
||||||
} asString;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StatementNode {
|
struct StatementNode {
|
||||||
@ -105,22 +103,26 @@ namespace ICodeASM {
|
|||||||
public:
|
public:
|
||||||
void ParseSourceFromString (const string source);
|
void ParseSourceFromString (const string source);
|
||||||
TokenLocation SeekTokenStart (iter begin, iter end);
|
TokenLocation SeekTokenStart (iter begin, iter end);
|
||||||
|
iter ParseUInt32 (iter begin, iter end, uint32 *rval);
|
||||||
|
iter ParseDouble (iter begin, iter end, double *rval);
|
||||||
|
iter ParseAlpha (iter begin, iter end, string *rval);
|
||||||
|
iter ParseString (iter begin, iter end, string *rval);
|
||||||
iter ParseStatement (iter begin, iter end);
|
iter ParseStatement (iter begin, iter end);
|
||||||
iter ParseInstruction (uint icodeID, iter start, iter end);
|
iter ParseInstruction (uint icodeID, iter start, iter end);
|
||||||
|
|
||||||
iter ParseArgumentListOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseArgumentListOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseBinaryOpOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseBinaryOpOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseBoolOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseBoolOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseDoubleOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseDoubleOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseICodeModuleOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseICodeModuleOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSClassOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSClassOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSStringOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSStringOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSFunctionOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSFunctionOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSTypeOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSTypeOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseLabelOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseLabelOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseUInt32Operand (iter start, iter end, AnyOperand *rval);
|
iter ParseUInt32Operand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseRegisterOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseRegisterOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseStringAtomOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseStringAtomOperand (iter begin, iter end, AnyOperand *o);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,173 @@ namespace ICodeASM {
|
|||||||
return tl;
|
return tl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseUInt32 (iter begin, iter end, uint32 *rval)
|
||||||
|
{
|
||||||
|
uint32 position = 0;
|
||||||
|
iter curpos;
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (curpos = begin; curpos < end; ++curpos) {
|
||||||
|
switch (*curpos)
|
||||||
|
{
|
||||||
|
case '0'...'9':
|
||||||
|
position++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
curpos = begin;
|
||||||
|
for (; position >= 0; --position)
|
||||||
|
*rval += (*curpos++ - '0') * pow (10, position);
|
||||||
|
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseDouble (iter begin, iter end, double *rval)
|
||||||
|
{
|
||||||
|
uint32 integer
|
||||||
|
iter curpos = ParseUInt32 (begin, end, *integer);
|
||||||
|
*rval = static_cast<double>(integer);
|
||||||
|
if (*curpos != '.')
|
||||||
|
return curpos;
|
||||||
|
|
||||||
|
++curpos;
|
||||||
|
uint32 position = 0;
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (curpos = begin; curpos < end; ++curpos) {
|
||||||
|
switch (*curpos)
|
||||||
|
{
|
||||||
|
case '0'...'9':
|
||||||
|
*rval += (*curpos - '0') * (1 / pow (10, ++position));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseAlpha (iter begin, iter end, string *rval)
|
||||||
|
{
|
||||||
|
string str = new string();
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (curpos = begin; curpos < end; ++curpos) {
|
||||||
|
switch (*curpos)
|
||||||
|
{
|
||||||
|
case 'a'...'z':
|
||||||
|
case 'A'...'Z':
|
||||||
|
case '0'...'9':
|
||||||
|
case '_':
|
||||||
|
str += *curpos;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rval = str;
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseString (iter begin, iter end, string *rval)
|
||||||
|
{
|
||||||
|
char delim = *begin;
|
||||||
|
bool isTerminated = false;
|
||||||
|
string *str = new string();
|
||||||
|
|
||||||
|
if (delim != '\'' && delim != '"')
|
||||||
|
ASSERT ("|begin| does not point at a string");
|
||||||
|
|
||||||
|
scan_loop:
|
||||||
|
for (bool isEscaped = false, iter curpos = ++tl.begin; curpos < end;
|
||||||
|
++curpos) {
|
||||||
|
|
||||||
|
switch (*curpos) {
|
||||||
|
case '\\':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\\';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
isEscaped = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\t';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
str += 't';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\n';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
str += 'n';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\r';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
str += 'r';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '\n':
|
||||||
|
if (isEscaped) {
|
||||||
|
str += '\r';
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
/* unescaped newline == unterminated string */
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case delim:
|
||||||
|
if (isEscaped) {
|
||||||
|
str += delim;
|
||||||
|
isEscaped = false;
|
||||||
|
} else {
|
||||||
|
++curpos;
|
||||||
|
isTerminated = true;
|
||||||
|
break scan_loop;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
isEscaped = false;
|
||||||
|
str += *curpos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isTerminated)
|
||||||
|
{
|
||||||
|
delete str;
|
||||||
|
throw new ICodeParseException ("Unterminated string literal.");
|
||||||
|
}
|
||||||
|
|
||||||
|
rval = str;
|
||||||
|
return curpos;
|
||||||
|
}
|
||||||
|
|
||||||
iter
|
iter
|
||||||
ICodeParser::ParseStatement (iter begin, iter end)
|
ICodeParser::ParseStatement (iter begin, iter end)
|
||||||
{
|
{
|
||||||
@ -150,7 +317,7 @@ namespace ICodeASM {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tl.type == ttLabel) {
|
if (tl.type == ttLabel) {
|
||||||
string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */
|
string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */
|
||||||
mLabels[label_str] = mStatementNodes.end();
|
mLabels[label_str] = mStatementNodes.end();
|
||||||
return tl.end;
|
return tl.end;
|
||||||
} else if (tl.type == ttInstruction) {
|
} else if (tl.type == ttInstruction) {
|
||||||
@ -192,8 +359,37 @@ namespace ICodeASM {
|
|||||||
CASE_TYPE(UInt32);
|
CASE_TYPE(UInt32);
|
||||||
CASE_TYPE(Register);
|
CASE_TYPE(Register);
|
||||||
CASE_TYPE(StringAtom);
|
CASE_TYPE(StringAtom);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# undef CASE_TYPE
|
||||||
|
|
||||||
|
return curpos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseArgumentListOperand (iter begin, iter end,
|
||||||
|
AnyOperand *rval)
|
||||||
|
{
|
||||||
|
/* XXX this is hard, lets go shopping */
|
||||||
|
ASSERT ("Not Implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
iter
|
||||||
|
ICodeParser::ParseBinaryOpOperand (iter begin, iter end,
|
||||||
|
AnyOperand *rval)
|
||||||
|
{
|
||||||
|
TokenLocation tl = SeekTokenStart (begin, end);
|
||||||
|
|
||||||
|
if (tl.estimate != teString)
|
||||||
|
throw new ICodeParseException ("Expected BinaryOp as a quoted string.");
|
||||||
|
string *str;
|
||||||
|
end = ParseString (tl.begin, end, str);
|
||||||
|
rval->asString = str;
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,9 +85,7 @@ namespace ICodeASM {
|
|||||||
Register asRegister;
|
Register asRegister;
|
||||||
bool asBool;
|
bool asBool;
|
||||||
ArgumentList *asArgumentList;
|
ArgumentList *asArgumentList;
|
||||||
struct {
|
string *asString;
|
||||||
iter begin, end;
|
|
||||||
} asString;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StatementNode {
|
struct StatementNode {
|
||||||
@ -105,22 +103,26 @@ namespace ICodeASM {
|
|||||||
public:
|
public:
|
||||||
void ParseSourceFromString (const string source);
|
void ParseSourceFromString (const string source);
|
||||||
TokenLocation SeekTokenStart (iter begin, iter end);
|
TokenLocation SeekTokenStart (iter begin, iter end);
|
||||||
|
iter ParseUInt32 (iter begin, iter end, uint32 *rval);
|
||||||
|
iter ParseDouble (iter begin, iter end, double *rval);
|
||||||
|
iter ParseAlpha (iter begin, iter end, string *rval);
|
||||||
|
iter ParseString (iter begin, iter end, string *rval);
|
||||||
iter ParseStatement (iter begin, iter end);
|
iter ParseStatement (iter begin, iter end);
|
||||||
iter ParseInstruction (uint icodeID, iter start, iter end);
|
iter ParseInstruction (uint icodeID, iter start, iter end);
|
||||||
|
|
||||||
iter ParseArgumentListOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseArgumentListOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseBinaryOpOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseBinaryOpOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseBoolOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseBoolOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseDoubleOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseDoubleOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseICodeModuleOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseICodeModuleOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSClassOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSClassOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSStringOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSStringOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSFunctionOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSFunctionOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseJSTypeOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseJSTypeOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseLabelOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseLabelOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseUInt32Operand (iter start, iter end, AnyOperand *rval);
|
iter ParseUInt32Operand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseRegisterOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseRegisterOperand (iter begin, iter end, AnyOperand *o);
|
||||||
iter ParseStringAtomOperand (iter start, iter end, AnyOperand *rval);
|
iter ParseStringAtomOperand (iter begin, iter end, AnyOperand *o);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user