Skip to content

Commit

Permalink
[js] Make native refs do coercions
Browse files Browse the repository at this point in the history
  • Loading branch information
pmurias committed Oct 5, 2017
1 parent 659fee4 commit 2354d8c
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 25 deletions.
25 changes: 25 additions & 0 deletions src/vm/js/nqp-runtime/coercions.js
@@ -0,0 +1,25 @@
exports.strToNum = function(str) {
/* TODO - more converts more stuff */
if (str === 'NaN') return NaN;
if (str === 'Inf') return Infinity;
if (str === '-Inf') return -Infinity;
if (str === '+Inf') return Infinity;
let parsed = parseFloat(str);
if (isNaN(parsed)) {
return 0;
}
return parsed;
};

exports.numToStr = function(num) {
if (num === Infinity) return 'Inf';
if (num === -Infinity) return '-Inf';
if (num === 0 && 1/num === -Infinity) return '-0';

return num.toString();
};

/* TODO - more error checking */
exports.strToInt = function(str) {
return str.parseInt()|0;
};
26 changes: 26 additions & 0 deletions src/vm/js/nqp-runtime/container-specs.js
@@ -1,5 +1,7 @@
'use strict';

const coercions = require('./coercions');

var NQPInt = require('./nqp-int.js');

class CodePair {
Expand Down Expand Up @@ -108,6 +110,14 @@ class NativeRef {
return this.get();
}

$$getNum() {
return this.get();
}

$$getStr() {
return this.get().toString();
}

$$decont(ctx, value) {
var hll = STable.hllOwner;
if (hll === undefined) {
Expand Down Expand Up @@ -148,10 +158,18 @@ class NativeRef {
return this.get();
}

$$getInt() {
return this.get()|0;
}

$$getNum() {
return this.get();
}

$$getStr() {
return this.get().toString();
}

$$decont(ctx, value) {
var hll = STable.hllOwner;
if (hll === undefined) {
Expand Down Expand Up @@ -200,6 +218,14 @@ class NativeRef {
return this.get();
}

$$getInt() {
return coercions.strToInt(this.get());
}

$$getNum() {
return coercions.strToNum(this.get());
}

$$decont(ctx, value) {
var hll = STable.hllOwner;
if (hll === undefined) {
Expand Down
32 changes: 7 additions & 25 deletions src/vm/js/nqp-runtime/runtime.js
Expand Up @@ -98,6 +98,11 @@ for (let name in refs.helpers) {
exports[name] = refs.helpers[name];
}

const coercions = require('./coercions');

exports.strToNum = coercions.strToNum;
exports.numToStr = coercions.numToStr;

let libpath = [];
exports.libpath = function(paths) {
libpath = paths;
Expand Down Expand Up @@ -190,7 +195,7 @@ op.setdispatcherfor = function(dispatcher, dispatcherFor) {
exports.toStr = function(arg_, ctx) {
var arg = arg_.$$decont(ctx);
if (typeof arg == 'number') {
return numToStr(arg);
return coercions.numToStr(arg);
} else if (typeof arg == 'string') {
return arg;
} else if (arg === Null) {
Expand All @@ -214,29 +219,6 @@ exports.toStr = function(arg_, ctx) {
}
};

function strToNum(str) {
if (str === 'NaN') return NaN;
if (str === 'Inf') return Infinity;
if (str === '-Inf') return -Infinity;
if (str === '+Inf') return Infinity;
let parsed = parseFloat(str);
if (isNaN(parsed)) {
return 0;
}
return parsed;
}

exports.strToNum = strToNum;

function numToStr(num) {
if (num === Infinity) return 'Inf';
if (num === -Infinity) return '-Inf';
if (num === 0 && 1/num === -Infinity) return '-0';

return num.toString();
}

exports.numToStr = numToStr;

exports.toNum = function(arg_, ctx) {
let arg = arg_.$$decont(ctx);
Expand All @@ -245,7 +227,7 @@ exports.toNum = function(arg_, ctx) {
} else if (arg === Null) {
return 0;
} else if (typeof arg == 'string') {
return strToNum(arg);
return coercions.strToNum(arg);
} else if (arg._STable && arg._STable.methodCache && arg._STable.methodCache.get('Num')) {
var result = arg.Num(ctx, null, arg); // eslint-disable-line new-cap
if (result.$$getNum) {
Expand Down

0 comments on commit 2354d8c

Please sign in to comment.