This repository has been archived by the owner on Jul 29, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoperation.cpp
68 lines (52 loc) · 1.8 KB
/
operation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef JDECOMPILER_OPERATION_CPP
#define JDECOMPILER_OPERATION_CPP
#include "operation.h"
namespace jdecompiler {
template<class T>
const T* Operation::getReturnTypeAs(const T* type) const {
const T* newType = getReturnType()->castTo(type);
onCastReturnType(newType);
return newType;
}
template<class T>
const T* Operation::getReturnTypeAsWidest(const T* type) const {
const T* newType = getReturnType()->castToWidest(type);
onCastReturnType(newType);
return newType;
}
const Operation* Operation::getOriginalOperation() const {
return this;
}
template<class D, class... Ds>
bool Operation::checkDup(const DecompilationContext& context, const Operation* operation) {
if(instanceof<const D*>(operation)) {
if(static_cast<const D*>(operation)->operation != context.stack.pop())
throw DecompilationException("Illegal stack state after dup operation");
return true;
}
if constexpr(sizeof...(Ds) > 0)
return checkDup<Ds...>(context, operation);
else
return false;
}
Priority Operation::getPriority() const {
return Priority::DEFAULT_PRIORITY;
}
string Operation::toStringPriority(const Operation* operation, const StringifyContext& context, const Associativity associativity) const {
const Priority thisPriority = this->getPriority(),
otherPriority = operation->getPriority();
if(otherPriority < thisPriority || (otherPriority == thisPriority && getAssociativityByPriority(otherPriority) != associativity))
return '(' + operation->toString(context) + ')';
return operation->toString(context);
}
bool Operation::canAddToCode() const {
return true;
}
inline void Operation::remove(const DecompilationContext& context) const {
context.methodScope.removeOperation(this, context);
}
bool Operation::canStringify() const {
return true;
}
}
#endif