74 lines
2.6 KiB
Java
74 lines
2.6 KiB
Java
/* -*- Mode: Javascript -*-
|
|
* -*- coding: UTF-8 -*-
|
|
* Copyright (C) 2011 by Artur Ventura
|
|
*
|
|
* File: cpu.jsh
|
|
*
|
|
* Author: Artur Ventura
|
|
*
|
|
*/
|
|
|
|
#ifndef _CPU_JSH_
|
|
#define _CPU_JSH_
|
|
|
|
#include "log.jsh"
|
|
|
|
#define T_BOOLEAN 4
|
|
#define T_CHAR 5
|
|
#define T_FLOAT 6
|
|
#define T_DOUBLE 7
|
|
#define T_BYTE 8
|
|
#define T_SHORT 9
|
|
#define T_INT 10
|
|
#define T_LONG 11
|
|
|
|
|
|
#define JVM_THROWS_NEW(exception) throw "VER: throws new exception"
|
|
#ifdef DEBUG_INTRP
|
|
#define LOG_INTRP(x) write(x)
|
|
#define DEFALIAS(opx) case opx: if(!temp) { temp = pc + ": opx op:[" + operand_stack + "] lvar:[" + local_variables + "]"; }
|
|
|
|
#else
|
|
#define LOG_INTRP(x)
|
|
#define DEFALIAS(opx) case opx:
|
|
#endif
|
|
|
|
#define PANIC(msg) throw new JVMPanic(msg)
|
|
|
|
#define DEFOP(opx) case opx: LOG_INTRP(pc + ": opx op:[" + operand_stack + "] lvar:[" + local_variables + "]");
|
|
#define DEFNOP() LOG_INTRP(temp)
|
|
#define ENDDEF break;
|
|
|
|
#define OPPOP() operand_stack.pop()
|
|
|
|
#ifdef DEBUG_INTRP
|
|
#define OPPUSH(v) var $unused = v; if (typeof $unused === "undefined") {PANIC("pushing undefined to stack")}; operand_stack.push($unused)
|
|
#else
|
|
#define OPPUSH(v) operand_stack.push(v)
|
|
#endif
|
|
#define OPPOPD() (operand_stack.pop() || operand_stack.pop())
|
|
#define OPPUSHD(v) (operand_stack.push(v) && operand_stack.push(null))
|
|
|
|
#define OPSTACK(v) operand_stack[v]
|
|
#define OPSTACK_MULTIPOP(x) operand_stack.splice(x)
|
|
#define OPSTACK_LENGTH() operand_stack.length
|
|
|
|
#define LOCAL_VAR(v) local_variables[v]
|
|
#define OPCODE opcode
|
|
#define PC pc
|
|
#define STACK_MOVE(y,x) OPSTACK(OPSTACK_LENGTH()-y) = OPSTACK(OPSTACK_LENGTH()-x)
|
|
#define READ_NEXT() code[pc++]
|
|
|
|
#define CHECK_NULL(ref) if (ref == NULL){ JVM_THROWS_NEW(java.lang.NullPointerException); }
|
|
#define CHECK_ARRAY_INDEX(ind,ref) if (ind >= ref.length){ JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException); }
|
|
|
|
#define TO_INT(value) if (isNaN(value)){ OPPUSH(0); }else if(IS_OVERFLOW(value,INT_MAX_VALUE)){ OPPUSH(INT_MAX_VALUE); }else if(IS_UNDERFLOW(value,INT_MIN_VALUE)){ OPPUSH(INT_MIN_VALUE); }else{ OPPUSH(Math.round(value)); }
|
|
#define TO_FLOAT(value) if (isNaN(value)){ OPPUSHD(NaN); }else if(IS_OVERFLOW(value,FLOAT_MAX_VALUE)){ OPPUSHD(POSITIVE_INF); }else if (IS_UNDERFLOW(value,FLOAT_MIN_VALUE)){ OPPUSHD(NEGATIVE_INF); }else{ OPPUSHD(value);}
|
|
#define TO_LONG(value) if (isNaN(value)){ OPPUSH(0); }else if(IS_OVERFLOW(value,LONG_MAX_VALUE)){ OPPUSH(LONG_MAX_VALUE); }else if(IS_UNDERFLOW(value,LONG_MIN_VALUE)){ OPPUSH(LONG_MIN_VALUE); }else{ OPPUSH(Math.round(value));}
|
|
|
|
function canonicalName(ref) {return ref.str.replace(/\//g,".");}
|
|
|
|
#define QWORD(byte1,byte2,byte3,byte4) ((byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4)
|
|
|
|
#endif //_CPU_JSH_
|