/* -*- Mode: Javascript -*- * -*- coding: UTF-8 -*- * Copyright (C) 2011 by Artur Ventura * * File: constantPool.js * Time-stamp: Fri Jul 15 02:46:27 2011 * * Author: Artur Ventura * */ #include "constantPool.jsh" #include "cpu.jsh" /** @constructor */ var constUtf8 = function(){ this.str = null; this.id = CONSTANT_Utf8; this.read = function ( dStream ) { var strBuf; var charCnt; var byte_x,byte_y,byte_z; var result; var one_char = '\u0000'; this.length = dStream.getU2(); strBuf = ""; charCnt = 0; while (charCnt < this.length) { byte_x = dStream .getU1(); charCnt++; if ((byte_x >> 7) == 1){ byte_y = dStream .getU1(); charCnt++; if ((byte_x >> 5) == 7){ byte_z = dStream .getU1(); charCnt++; result = ((byte_x & 0xf) << 12) + ((byte_y & 0x3f) << 6) + (byte_z & 0x3f) }else{ result = ((byte_x & 0x1f) << 6) + (byte_y & 0x3f) } }else{ result = byte_x } strBuf += String.fromCharCode(byte_x); } // while this.str = strBuf.toString(); } // read return this; }; /** @constructor */ var constInt = function(){ this.value = null; this.id = CONSTANT_Integer; this.read = function ( dStream ){ this.value = dStream.getInt32(); } }; /** @constructor */ var constFloat = function(){ this.value = null; this.id = CONSTANT_Float; this.read = function ( dStream ){ this.value = dStream.getFloat32(); } }; /** @constructor */ var constLong = function(){ this.high = null; this.low = null; this.id = CONSTANT_Long; this.read = function (dStream){ var high = dStream.getU4(); var low = dStream.getU4(); this.value = math.Long.fromBits(low,high) } }; /** @constructor */ var constDouble = function(){ this.high = null; this.low = null; this.id = CONSTANT_Double; this.read = function (dStream){ // var high_bytes = dStream.getU4(); // var low_bytes = dStream.getU4(); // var bits = (high_bytes * Math.pow(2,32)) + low_bytes; // if (bits == 0x7ff0000000000000){ // this.value = POSITIVE_INF; // }else if (bits == 0xfff0000000000000){ // this.value = NEGATIVE_INF // }else if ((0x7ff0000000000001 < bits && bits < 0x7fffffffffffffff) || (0xfff0000000000001 < bits && bits < 0xffffffffffffffff)){ // this.value = NaN; // }else{ // var s = ((high_bytes >> 31) == 0) ? 1 : -1; // var e = ((high_bytes >> 20) & 0x7ff); // var m = 1 // /* // (e == 0) ? // (bits & 0xfffffffffffff) * 2 : // (bits & 0xfffffffffffff) | 0x10000000000000;*/ // var string = (((high_bytes & 0xfffff) * Math.pow(2,32)) + low_bytes).toString(2); // for (var i=0; i= constantPool.constantPool.length){ throw "ConstantPoolRef: ref out of bounds: " + (index-1).toString() + ", length: " + constantPool.constantPool.length; } var result = constantPool.constantPool[index - 1]; if (expected && result.id != expected){ throw "ConstantPoolRef: ref was expected to be " + constTagName(expected) + " but at " + index + " there's a " + constTagName(result.id); } return result; } var ConstantPool = function(){ } ConstantPool.prototype.loadFromStream = function(dStream){ this.constantPoolCount = dStream.getU2(); this.constantPool = []; for(var i = 1; i < this.constantPoolCount; i++){ var tag = dStream.getU1(); var alloc = allocConstEntry(tag); alloc.read(dStream); this.constantPool[(i-1)] = alloc; if (alloc.id == CONSTANT_Long || alloc.id == CONSTANT_Double) { i++; this.constantPool[(i-1)] = null; } } for(var i = 1; i < this.constantPoolCount; i++){ var obj = this.constantPool[(i-1)]; if (obj && obj.set_ref){ obj.set_ref(this.constantPool); } } this.each = function(fn,kind){ for(var i = 1; i < this.constantPoolCount; i++){ var obj = this.constantPool[(i-1)]; if (obj){ if (obj.id != kind) {continue;} fn(obj); } } } } ConstantPool.prototype.get = function (i){ return this.constantPool[(i-1)]; }