MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / parsePostfixExpression

Function parsePostfixExpression

pcsx2/DebugTools/ExpressionParser.cpp:414–609  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

412}
413
414bool parsePostfixExpression(PostfixExpression& exp, IExpressionFunctions* funcs, u64& dest, std::string& error)
415{
416 size_t num = 0;
417 u64 opcode;
418 std::vector<u64> valueStack;
419 u64 arg[5] = {0};
420 float fArg[5] = {0};
421 bool useFloat = false;
422
423 while (num < exp.size())
424 {
425 switch (exp[num].first)
426 {
427 case EXCOMM_CONST: // konstante zahl
428 valueStack.push_back(exp[num++].second);
429 break;
430 case EXCOMM_CONST_FLOAT:
431 useFloat = true;
432 valueStack.push_back(exp[num++].second);
433 break;
434 case EXCOMM_REF:
435 useFloat = useFloat || funcs->getReferenceType(exp[num].second) == EXPR_TYPE_FLOAT;
436 opcode = funcs->getReferenceValue(exp[num++].second);
437 valueStack.push_back(opcode);
438 break;
439 case EXCOMM_OP: // opcode
440 opcode = exp[num++].second;
441 if (valueStack.size() < ExpressionOpcodes[opcode].args)
442 {
443 error = TRANSLATE("ExpressionParser", "Not enough arguments.");
444 return false;
445 }
446 for (int l = 0; l < ExpressionOpcodes[opcode].args; l++)
447 {
448 arg[l] = valueStack[valueStack.size()-1];
449 fArg[l] = arg[l];
450 valueStack.pop_back();
451 }
452
453 switch (opcode)
454 {
455 case EXOP_MEMSIZE: // must be followed by EXOP_MEM
456 if (exp[num++].second != EXOP_MEM)
457 {
458 error = TRANSLATE("ExpressionParser", "Invalid memsize operator.");
459 return false;
460 }
461
462 u64 val;
463 if(!funcs->getMemoryValue(arg[1],arg[0],val,error))
464 {
465 return false;
466 }
467 valueStack.push_back(val);
468 break;
469 case EXOP_MEM:
470 {
471 u64 val;

Callers 2

parseExpressionFunction · 0.85
parseExpressionMethod · 0.85

Calls 6

getReferenceTypeMethod · 0.80
getReferenceValueMethod · 0.80
getMemoryValueMethod · 0.80
sizeMethod · 0.45
push_backMethod · 0.45
pop_backMethod · 0.45

Tested by

no test coverage detected