Skip to content

Instantly share code, notes, and snippets.

@leeight
Created June 13, 2014 05:25
Show Gist options
  • Save leeight/2f42c40c6f834f6ecfb6 to your computer and use it in GitHub Desktop.
Save leeight/2f42c40c6f834f6ecfb6 to your computer and use it in GitHub Desktop.
var assert = console.assert;
var DOUBLE = 0,
INT32 = 1,
BOOL = 2,
PTR = 3;
var MAXDOUBLE = 0xfff80000,
INT32TAG = 0xfff90000,
BOOLTAG = 0xfffa0000,
PTRTAG = 0xfffb0000;
var tags = [MAXDOUBLE, INT32TAG, BOOLTAG, PTRTAG];
var heap = new ArrayBuffer(128),
f64 = new Float64Array(heap),
ui32 = new Uint32Array(heap),
i32 = new Int32Array(heap),
ui8 = new Uint8Array(heap);
var hp = 0;
// super basic alloc just as an example
function alloc(){
return hp++;
}
var NULL = alloc();
function Value(type, value){
var addr = alloc();
if (type === DOUBLE) {
f64[addr] = value;
} else {
var addr32 = addr << 1;
i32[addr32] = value;
ui32[addr32 + 1] = tags[type];
}
return addr;
}
Value.isDouble = function isDouble(addr){
return ui32[(addr << 1) + 1] < MAXDOUBLE;
};
Value.isInt32 = function isInt32(addr){
return ui32[(addr << 1) + 1] === INT32TAG;
};
Value.isBool = function isBool(addr){
return ui32[(addr << 1) + 1] === BOOLTAG;
};
Value.isPointer = function isPointer(addr){
return ui32[(addr << 1) + 1] === PTRTAG;
};
Value.getDouble = function getDouble(addr){
assert(Value.isDouble(addr));
return f64[addr];
};
Value.getInt32 = function getInt32(addr){
assert(Value.isInt32(addr));
return i32[addr << 1];
};
Value.getBool = function getBool(addr){
assert(Value.isBool(addr));
return i32[addr << 1] ? true : false;
};
Value.getPointer = function getPointer(addr){
assert(Value.isPointer(addr));
return ui32[addr << 1];
};
Value.get = function get(addr){
var addr32 = addr << 1;
var tag = ui32[addr32 + 1];
if (tag < MAXDOUBLE) {
return f64[addr];
}
switch (tag) {
case INT32TAG:
return i32[addr32];
case BOOLTAG:
return i32[addr32] ? true : false;
case PTRTAG:
return ui32[addr32];
}
};
var bool = Value(BOOL, true);
console.log(Value.get(bool));
var int32 = Value(INT32, 200000);
console.log(Value.get(int32));
var double = Value(DOUBLE, 2000000.45);
console.log(Value.get(double));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment