Implement 'this' context parsing and serialization; Other minor improvements

This commit is contained in:
dcodeIO
2018-05-30 16:22:56 +02:00
parent c9ed03028d
commit 9d25f78fc1
18 changed files with 1589 additions and 1464 deletions

View File

@ -3,22 +3,24 @@ import "allocator/arena";
// From The Computer Language Benchmarks Game
// http://benchmarksgame.alioth.debian.org
const SOLAR_MASS = 4.0 * Math.PI * Math.PI;
const DAYS_PER_YEAR = 365.24;
type float = f64; // interchangeable f32/f64 for testing
const SOLAR_MASS = <float>(4.0 * Math.PI * Math.PI);
const DAYS_PER_YEAR: float = 365.24;
class Body {
constructor(
public x: f64,
public y: f64,
public z: f64,
public vx: f64,
public vy: f64,
public vz: f64,
public mass: f64
public x: float,
public y: float,
public z: float,
public vx: float,
public vy: float,
public vz: float,
public mass: float
) {}
offsetMomentum(px: f64, py: f64, pz: f64): this {
offsetMomentum(px: float, py: float, pz: float): this {
this.vx = -px / SOLAR_MASS;
this.vy = -py / SOLAR_MASS;
this.vz = -pz / SOLAR_MASS;
@ -85,9 +87,9 @@ class NBodySystem {
constructor(
public bodies: Body[]
) {
var px = 0.0;
var py = 0.0;
var pz = 0.0;
var px: float = 0.0;
var py: float = 0.0;
var pz: float = 0.0;
var size = bodies.length;
for (let i = 0; i < size; i++) {
let b = unchecked(bodies[i]);
@ -99,7 +101,7 @@ class NBodySystem {
bodies[0].offsetMomentum(px, py, pz);
}
advance(dt: f64): void {
advance(dt: float): void {
var bodies = this.bodies;
var size: u32 = bodies.length;
// var buffer = changetype<usize>(bodies.buffer_);
@ -126,7 +128,7 @@ class NBodySystem {
let dz = iz - bodyj.z;
let distanceSq = dx * dx + dy * dy + dz * dz;
let distance = Math.sqrt(distanceSq);
let distance = <float>Math.sqrt(distanceSq);
let mag = dt / (distanceSq * distance);
let bim = bodyim * mag;
@ -151,8 +153,8 @@ class NBodySystem {
}
}
energy(): f64 {
var e = 0.0;
energy(): float {
var e: float = 0.0;
var bodies = this.bodies;
for (let i: u32 = 0, size: u32 = bodies.length; i < size; ++i) {
@ -171,11 +173,11 @@ class NBodySystem {
e += 0.5 * bim * (vx * vx + vy * vy + vz * vz);
for (let j: u32 = i + 1; j < size; ++j) {
let bodyj = bodies[j];
let bodyj = unchecked(bodies[j]);
let dx = ix - bodyj.x;
let dy = iy - bodyj.y;
let dz = iz - bodyj.z;
let distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
let distance = <float>Math.sqrt(dx * dx + dy * dy + dz * dz);
e -= bim * bodyj.mass / distance;
}
}
@ -200,7 +202,7 @@ export function getBody(index: i32): Body | null {
return <u32>index < <u32>bodies.length ? bodies[index] : null;
}
export function step(): f64 {
export function step(): float {
system.advance(0.01);
return system.energy();
}

View File

@ -17,7 +17,7 @@ function asmFunc(global, env, buffer) {
var Math_floor = global.Math.floor;
var Math_ceil = global.Math.ceil;
var Math_sqrt = global.Math.sqrt;
var abort = env.abort;
var $lib_env_abort = env.abort;
var $lib_allocator_arena_startOffset = 0;
var $lib_allocator_arena_offset = 0;
var assembly_index_system = 0;
@ -165,7 +165,7 @@ function asmFunc(global, env, buffer) {
$1 = $1 | 0;
var $2 = 0, $3 = 0, $4 = 0;
if ($1 >>> 0 > 268435454 >>> 0) {
abort(0 | 0, 8 | 0, 23 | 0, 39 | 0);
$lib_env_abort(0 | 0, 8 | 0, 23 | 0, 39 | 0);
abort();
}
$3 = $1 << 2 | 0;
@ -189,18 +189,19 @@ function asmFunc(global, env, buffer) {
$1 = $1 | 0;
var $2 = 0, $3 = 0, $4 = 0.0, $5 = 0.0, $6 = 0.0, $7 = 0.0, $72 = 0, $8 = 0, $50 = 0;
$8 = HEAP32[($1 + 4 | 0) >> 2] | 0;
continue_0 : do {
if (($2 | 0) < ($8 | 0)) {
break_0 : {
repeat_0 : do {
if (($2 | 0) >= ($8 | 0)) break break_0;
$3 = HEAPU32[(((HEAPU32[$1 >> 2] | 0) + ($2 << 2 | 0) | 0) + 8 | 0) >> 2] | 0;
$4 = +HEAPF64[($3 + 48 | 0) >> 3];
$5 = $5 + +HEAPF64[($3 + 24 | 0) >> 3] * $4;
$6 = $6 + +HEAPF64[($3 + 32 | 0) >> 3] * $4;
$7 = $7 + +HEAPF64[($3 + 40 | 0) >> 3] * $4;
$2 = $2 + 1 | 0;
continue continue_0;
}
break continue_0;
} while (1);
continue repeat_0;
break repeat_0;
} while (1);
};
$2 = HEAPU32[$1 >> 2] | 0;
if (0 >>> 0 < ((HEAP32[$2 >> 2] | 0) >>> 2 | 0) >>> 0) $50 = HEAPU32[($2 + 8 | 0) >> 2] | 0; else abort();
$2 = $50;
@ -250,8 +251,9 @@ function asmFunc(global, env, buffer) {
var $2 = 0, $3 = 0.0, $9 = 0.0, $4 = 0, $5 = 0.0, $6 = 0.0, $7 = 0.0, $8 = 0, $10 = 0.0, $11 = 0.0, $12 = 0.0, $13 = 0, $14 = 0, $15 = 0.0, $16 = 0.0, $17 = 0.0, $18 = 0.0;
$13 = HEAPU32[$0 >> 2] | 0;
$14 = HEAP32[($13 + 4 | 0) >> 2] | 0;
continue_0 : do {
if ($4 >>> 0 < $14 >>> 0) {
break_0 : {
repeat_0 : do {
if ($4 >>> 0 >= $14 >>> 0) break break_0;
$0 = HEAPU32[(((HEAPU32[$13 >> 2] | 0) + ($4 << 2 | 0) | 0) + 8 | 0) >> 2] | 0;
$15 = +HEAPF64[$0 >> 3];
$16 = +HEAPF64[($0 + 8 | 0) >> 3];
@ -260,9 +262,10 @@ function asmFunc(global, env, buffer) {
$6 = +HEAPF64[($0 + 32 | 0) >> 3];
$7 = +HEAPF64[($0 + 40 | 0) >> 3];
$18 = +HEAPF64[($0 + 48 | 0) >> 3];
$8 = $4 + 1 | 0;
continue_1 : do {
if ($8 >>> 0 < $14 >>> 0) {
break_1 : {
$8 = $4 + 1 | 0;
repeat_1 : do {
if ($8 >>> 0 >= $14 >>> 0) break break_1;
$2 = HEAPU32[(((HEAPU32[$13 >> 2] | 0) + ($8 << 2 | 0) | 0) + 8 | 0) >> 2] | 0;
$10 = $15 - +HEAPF64[$2 >> 3];
$11 = $16 - +HEAPF64[($2 + 8 | 0) >> 3];
@ -278,10 +281,10 @@ function asmFunc(global, env, buffer) {
HEAPF64[($2 + 32 | 0) >> 3] = +HEAPF64[($2 + 32 | 0) >> 3] + $11 * $3;
HEAPF64[($2 + 40 | 0) >> 3] = +HEAPF64[($2 + 40 | 0) >> 3] + $12 * $3;
$8 = $8 + 1 | 0;
continue continue_1;
}
break continue_1;
} while (1);
continue repeat_1;
break repeat_1;
} while (1);
};
HEAPF64[($0 + 24 | 0) >> 3] = $5;
HEAPF64[($0 + 32 | 0) >> 3] = $6;
HEAPF64[($0 + 40 | 0) >> 3] = $7;
@ -289,20 +292,21 @@ function asmFunc(global, env, buffer) {
HEAPF64[($0 + 8 | 0) >> 3] = +HEAPF64[($0 + 8 | 0) >> 3] + $1 * $6;
HEAPF64[($0 + 16 | 0) >> 3] = +HEAPF64[($0 + 16 | 0) >> 3] + $1 * $7;
$4 = $4 + 1 | 0;
continue continue_0;
}
break continue_0;
} while (1);
continue repeat_0;
break repeat_0;
} while (1);
};
}
function assembly_index_NBodySystem_energy($0) {
$0 = $0 | 0;
var $1 = 0.0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $10 = 0.0, $6 = 0.0, $7 = 0.0, $8 = 0.0, $9 = 0.0, $30 = 0.0, $39 = 0.0, $45 = 0.0, $59 = 0.0, $72 = 0, $77 = 0.0, $92 = 0.0;
$4 = HEAPU32[$0 >> 2] | 0;
$5 = HEAP32[($4 + 4 | 0) >> 2] | 0;
continue_0 : do {
if ($3 >>> 0 < $5 >>> 0) {
$0 = HEAPU32[(((HEAPU32[$4 >> 2] | 0) + ($3 << 2 | 0) | 0) + 8 | 0) >> 2] | 0;
var $1 = 0.0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $10 = 0.0, $6 = 0.0, $7 = 0.0, $8 = 0.0, $9 = 0.0, $30 = 0.0, $39 = 0.0, $45 = 0.0, $69 = 0.0, $84 = 0.0;
break_0 : {
$4 = HEAPU32[$0 >> 2] | 0;
$5 = HEAP32[($4 + 4 | 0) >> 2] | 0;
repeat_0 : do {
if ($2 >>> 0 >= $5 >>> 0) break break_0;
$0 = HEAPU32[(((HEAPU32[$4 >> 2] | 0) + ($2 << 2 | 0) | 0) + 8 | 0) >> 2] | 0;
$7 = +HEAPF64[$0 >> 3];
$8 = +HEAPF64[($0 + 8 | 0) >> 3];
$9 = +HEAPF64[($0 + 16 | 0) >> 3];
@ -314,29 +318,27 @@ function asmFunc(global, env, buffer) {
$45 = $39 + $1 * $1;
$1 = +HEAPF64[($0 + 40 | 0) >> 3];
$1 = $30 + .5 * $10 * ($45 + $1 * $1);
$0 = $3 + 1 | 0;
continue_1 : do {
if ($0 >>> 0 < $5 >>> 0) {
$59 = $7;
$2 = HEAPU32[$4 >> 2] | 0;
if ($0 >>> 0 < ((HEAP32[$2 >> 2] | 0) >>> 2 | 0) >>> 0) $72 = HEAPU32[(($2 + ($0 << 2 | 0) | 0) + 8 | 0) >> 2] | 0; else abort();
$2 = $72;
$6 = $59 - +HEAPF64[$2 >> 3];
$77 = $1;
$1 = $8 - +HEAPF64[($2 + 8 | 0) >> 3];
$92 = $6 * $6 + $1 * $1;
$1 = $9 - +HEAPF64[($2 + 16 | 0) >> 3];
$1 = $77 - $10 * +HEAPF64[($2 + 48 | 0) >> 3] / Math_sqrt($92 + $1 * $1);
break_1 : {
$0 = $2 + 1 | 0;
repeat_1 : do {
if ($0 >>> 0 >= $5 >>> 0) break break_1;
$3 = HEAPU32[(((HEAPU32[$4 >> 2] | 0) + ($0 << 2 | 0) | 0) + 8 | 0) >> 2] | 0;
$6 = $7 - +HEAPF64[$3 >> 3];
$69 = $1;
$1 = $8 - +HEAPF64[($3 + 8 | 0) >> 3];
$84 = $6 * $6 + $1 * $1;
$1 = $9 - +HEAPF64[($3 + 16 | 0) >> 3];
$1 = $69 - $10 * +HEAPF64[($3 + 48 | 0) >> 3] / Math_sqrt($84 + $1 * $1);
$0 = $0 + 1 | 0;
continue continue_1;
}
break continue_1;
} while (1);
$3 = $3 + 1 | 0;
continue continue_0;
}
break continue_0;
} while (1);
continue repeat_1;
break repeat_1;
} while (1);
};
$2 = $2 + 1 | 0;
continue repeat_0;
break repeat_0;
} while (1);
};
return +$1;
}
@ -348,14 +350,15 @@ function asmFunc(global, env, buffer) {
function assembly_index_bench($0) {
$0 = $0 | 0;
var $1 = 0;
continue_0 : do {
if ($1 >>> 0 < $0 >>> 0) {
break_0 : {
repeat_0 : do {
if ($1 >>> 0 >= $0 >>> 0) break break_0;
assembly_index_NBodySystem_advance(assembly_index_system | 0, +(.01));
$1 = $1 + 1 | 0;
continue continue_0;
}
break continue_0;
} while (1);
continue repeat_0;
break repeat_0;
} while (1);
};
}
function start() {

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff