Changeset View
Changeset View
Standalone View
Standalone View
src/script/interpreter.cpp
Show First 20 Lines • Show All 333 Lines • ▼ Show 20 Lines | try { | ||||
// Some opcodes are disabled. | // Some opcodes are disabled. | ||||
switch (opcode) { | switch (opcode) { | ||||
case OP_CAT: | case OP_CAT: | ||||
case OP_SPLIT: | case OP_SPLIT: | ||||
case OP_BIN2NUM: | case OP_BIN2NUM: | ||||
case OP_NUM2BIN: | case OP_NUM2BIN: | ||||
case OP_INVERT: | case OP_INVERT: | ||||
case OP_AND: | |||||
case OP_OR: | |||||
case OP_XOR: | |||||
case OP_2MUL: | case OP_2MUL: | ||||
case OP_2DIV: | case OP_2DIV: | ||||
case OP_MUL: | case OP_MUL: | ||||
case OP_DIV: | case OP_DIV: | ||||
case OP_MOD: | case OP_MOD: | ||||
case OP_LSHIFT: | case OP_LSHIFT: | ||||
case OP_RSHIFT: | case OP_RSHIFT: | ||||
return set_error(serror, SCRIPT_ERR_DISABLED_OPCODE); | return set_error(serror, SCRIPT_ERR_DISABLED_OPCODE); | ||||
case OP_AND: | |||||
case OP_OR: | |||||
case OP_XOR: | |||||
// These opcodes are only conditionaly disabled. | |||||
if ((flags & SCRIPT_ENABLE_MONOLITH_OPCODES) == 0) { | |||||
return set_error(serror, SCRIPT_ERR_DISABLED_OPCODE); | |||||
} | |||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
if (fExec && 0 <= opcode && opcode <= OP_PUSHDATA4) { | if (fExec && 0 <= opcode && opcode <= OP_PUSHDATA4) { | ||||
if (fRequireMinimal && | if (fRequireMinimal && | ||||
!CheckMinimalPush(vchPushValue, opcode)) { | !CheckMinimalPush(vchPushValue, opcode)) { | ||||
return set_error(serror, SCRIPT_ERR_MINIMALDATA); | return set_error(serror, SCRIPT_ERR_MINIMALDATA); | ||||
▲ Show 20 Lines • Show All 424 Lines • ▼ Show 20 Lines | try { | ||||
} | } | ||||
CScriptNum bn(stacktop(-1).size()); | CScriptNum bn(stacktop(-1).size()); | ||||
stack.push_back(bn.getvch()); | stack.push_back(bn.getvch()); | ||||
} break; | } break; | ||||
// | // | ||||
// Bitwise logic | // Bitwise logic | ||||
// | // | ||||
case OP_AND: | |||||
case OP_OR: | |||||
case OP_XOR: { | |||||
// (x1 x2 - out) | |||||
if (stack.size() < 2) { | |||||
return set_error( | |||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
} | |||||
valtype &vch1 = stacktop(-2); | |||||
valtype &vch2 = stacktop(-1); | |||||
// Inputs must be the same size | |||||
if (vch1.size() != vch2.size()) { | |||||
return set_error(serror, | |||||
SCRIPT_ERR_INVALID_OPERAND_SIZE); | |||||
} | |||||
// To avoid allocating, we modify vch1 in place. | |||||
switch (opcode) { | |||||
case OP_AND: | |||||
for (size_t i = 0; i < vch1.size(); ++i) { | |||||
vch1[i] &= vch2[i]; | |||||
} | |||||
break; | |||||
case OP_OR: | |||||
for (size_t i = 0; i < vch1.size(); ++i) { | |||||
vch1[i] |= vch2[i]; | |||||
} | |||||
break; | |||||
case OP_XOR: | |||||
for (size_t i = 0; i < vch1.size(); ++i) { | |||||
vch1[i] ^= vch2[i]; | |||||
} | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
// And pop vch2. | |||||
popstack(stack); | |||||
} break; | |||||
case OP_EQUAL: | case OP_EQUAL: | ||||
case OP_EQUALVERIFY: | case OP_EQUALVERIFY: | ||||
// case OP_NOTEQUAL: // use OP_NUMNOTEQUAL | // case OP_NOTEQUAL: // use OP_NUMNOTEQUAL | ||||
{ | { | ||||
// (x1 x2 - bool) | // (x1 x2 - bool) | ||||
if (stack.size() < 2) { | if (stack.size() < 2) { | ||||
return set_error( | return set_error( | ||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
▲ Show 20 Lines • Show All 844 Lines • Show Last 20 Lines |