Skip to content

Commit

Permalink
[js] Implement VMHash repr.
Browse files Browse the repository at this point in the history
  • Loading branch information
pmurias committed Apr 23, 2017
1 parent 61b9a2d commit 1cb4124
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 39 deletions.
2 changes: 1 addition & 1 deletion src/vm/js/nqp-runtime/core.js
Expand Up @@ -126,7 +126,7 @@ exports.named = function(parts) {
};

exports.op.ishash = function(obj) {
return obj instanceof Hash ? 1 : 0;
return obj instanceof Hash || (obj._STable && obj._STable.REPR instanceof reprs.VMHash) ? 1 : 0;
};

op.existspos = function(array, idx) {
Expand Down
40 changes: 40 additions & 0 deletions src/vm/js/nqp-runtime/hash-iter.js
@@ -0,0 +1,40 @@
let NQPObject = require('./nqp-object.js');
class HashIter extends NQPObject {
constructor(hash) {
super();
this.$$hash = hash.content;
this.$$keys = Object.keys(hash.$$toObject());
this.$$target = this.$$keys.length - 1;
this.$$idx = -1;
}

$$shift() {
this.$$idx++;
return this;
}

$$iterval() {
return this.$$hash.get(this.$$keys[this.$$idx]);
}

$$iterkey_s() {
return this.$$keys[this.$$idx];
}

$$toBool(ctx) {
return this.$$idx < this.$$target;
}

Str(ctx, _NAMED, self) {
return this.$$iterkey_s();
}

key(ctx, _NAMED, self) {
return this.$$iterkey_s();
}

value(ctx, _NAMED, self) {
return this.$$iterval();
}
};
module.exports = HashIter;
40 changes: 2 additions & 38 deletions src/vm/js/nqp-runtime/hash.js
Expand Up @@ -3,47 +3,11 @@
var NQPObject = require('./nqp-object.js');
var Null = require('./null.js');

let HashIter = require('./hash-iter.js');

var repossession = require('./repossession.js');
var compilingSCs = repossession.compilingSCs;

class HashIter extends NQPObject {
constructor(hash) {
super();
this.$$hash = hash.content;
this.$$keys = Object.keys(hash.$$toObject());
this.$$target = this.$$keys.length - 1;
this.$$idx = -1;
}

$$shift() {
this.$$idx++;
return this;
}

$$iterval() {
return this.$$hash.get(this.$$keys[this.$$idx]);
}

$$iterkey_s() {
return this.$$keys[this.$$idx];
}

$$toBool(ctx) {
return this.$$idx < this.$$target;
}

Str(ctx, _NAMED, self) {
return this.$$iterkey_s();
}

key(ctx, _NAMED, self) {
return this.$$iterkey_s();
}

value(ctx, _NAMED, self) {
return this.$$iterval();
}
};

class Hash extends NQPObject {
constructor() {
Expand Down
81 changes: 81 additions & 0 deletions src/vm/js/nqp-runtime/reprs.js
Expand Up @@ -1169,6 +1169,87 @@ class VMArray extends REPR {

reprs.VMArray = VMArray;

let HashIter = require('./hash-iter.js');

class VMHash extends REPR {
allocate(STable) {
var obj = new STable.objConstructor();
obj.content = new Map();
return obj;
}

setupSTable(STable) {
STable.addInternalMethods(class {
$$clone() {
var cloned = new STable.objConstructor();
cloned.content = new Map();
this.content.forEach(function(value, key, map) {
cloned.content.set(key, value);
});
return cloned;
}

$$bindkey(key, value) {
this.content.set(key, value);
if (this._SC !== undefined) this.$$scwb();
return value;
}

$$atkey(key) {
return this.content.has(key) ? this.content.get(key) : Null;
}

$$existskey(key) {
return this.content.has(key);
}

$$deletekey(key) {
if (this._SC !== undefined) this.$$scwb();
this.content.delete(key);
return this;
}

$$elems() {
return this.content.size;
}

$$numify() {
return this.$$elems();
}

$$iterator() {
return new HashIter(this);
}

$$toObject() {
var ret = {};
this.content.forEach(function(value, key, map) {
ret[key] = value;
});
return ret;
}
});
}

deserializeFinish(obj, data) {
obj.content = new Map();
let elems = data.varint();
for (var i = 0; i < elems; i++) {
let str = data.str();
obj.content.set(str, data.variant());
}
}

serialize(cursor, obj) {
cursor.varint(obj.$$elems());
obj.content.forEach(function(value, key, map) {
cursor.str(key);
cursor.ref(value);
}, this);
}
};

reprs.VMHash = VMHash;

class VMIter {
deserializeFinish(obj, data) {
Expand Down

0 comments on commit 1cb4124

Please sign in to comment.