File size: 3,042 Bytes
e870690 | 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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | var BytecodeVM = {
ops: {
0x01: 'PUSH',
0x02: 'ADD',
0x03: 'SUB',
0x04: 'MUL',
0x05: 'PRINT',
0x06: 'CALL_VERIFY',
0x07: 'CALL_SEAL',
0x08: 'HALT'
},
run: function(program) {
var stack = [];
var output = [];
var steps = 0;
var maxSteps = 1000;
var tokens = program.trim().split(/\s+/);
var pc = 0;
while (pc < tokens.length && steps < maxSteps) {
steps++;
var op = tokens[pc].toUpperCase();
switch (op) {
case 'PUSH':
pc++;
var val = parseFloat(tokens[pc]);
if (isNaN(val)) { output.push('ERROR: invalid number at token ' + pc); break; }
stack.push(val);
break;
case 'ADD':
if (stack.length < 2) { output.push('ERROR: stack underflow'); break; }
var b = stack.pop(); var a = stack.pop();
stack.push(a + b);
break;
case 'SUB':
if (stack.length < 2) { output.push('ERROR: stack underflow'); break; }
var b = stack.pop(); var a = stack.pop();
stack.push(a - b);
break;
case 'MUL':
if (stack.length < 2) { output.push('ERROR: stack underflow'); break; }
var b = stack.pop(); var a = stack.pop();
stack.push(a * b);
break;
case 'PRINT':
if (stack.length < 1) { output.push('ERROR: stack empty'); break; }
output.push(String(stack[stack.length - 1]));
break;
case 'CALL_VERIFY':
output.push('VERIFY: trust_gate_pass');
break;
case 'CALL_SEAL':
output.push('SEAL: sha256_generated');
break;
case 'HALT':
pc = tokens.length;
break;
default:
output.push('UNKNOWN: ' + op);
}
pc++;
}
if (steps >= maxSteps) output.push('HALTED: step limit reached');
return {
program: program,
stack: stack,
output: output,
steps: steps,
result: output.length > 0 ? output[output.length - 1] : 'empty'
};
},
render: function(r) {
return [
'ββββββββββββββββββββββββββββββββββββββββ',
'β BYTECODE VM (SAFE) β',
'β βββββββββββββββββββββββββββββββββββββββ£',
'β PROGRAM: ' + r.program.substring(0, 28).padEnd(28) + 'β',
'β STEPS: ' + String(r.steps).padEnd(28) + 'β',
'β STACK: ' + JSON.stringify(r.stack).substring(0, 28).padEnd(28) + 'β',
'β OUTPUT: ' + r.output.join(', ').substring(0, 28).padEnd(28) + 'β',
'β RESULT: ' + r.result.substring(0, 28).padEnd(28) + 'β',
'ββββββββββββββββββββββββββββββββββββββββ'
].join('\n');
}
};
|