Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: opal/opal
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 8337fbc5f299
Choose a base ref
...
head repository: opal/opal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 001f0282d5fd
Choose a head ref
  • 4 commits
  • 4 files changed
  • 1 contributor

Commits on Oct 31, 2014

  1. Copy the full SHA
    fd17f4e View commit details

Commits on Nov 1, 2014

  1. Use Hash@smap in JSON

    elia committed Nov 1, 2014
    Copy the full SHA
    1f27b57 View commit details
  2. Use Hash string map in Native

    elia committed Nov 1, 2014
    Copy the full SHA
    b96411d View commit details
  3. Go back to the normal formatter

    elia committed Nov 1, 2014
    Copy the full SHA
    001f028 View commit details
Showing with 76 additions and 44 deletions.
  1. +29 −27 opal/corelib/hash.rb
  2. +1 −1 spec/spec_helper.rb
  3. +16 −3 stdlib/json.rb
  4. +30 −13 stdlib/native.rb
56 changes: 29 additions & 27 deletions opal/corelib/hash.rb
Original file line number Diff line number Diff line change
@@ -564,42 +564,44 @@ def indexes(*keys)

alias indices indexes

`var inspect_ids = {}`
`var inspect_ids = null;`
def inspect
%x{
var inspect = [],
keys = self.keys
_map = self.map,
smap = self.smap,
top = inspect_ids === null,
id = #{object_id},
seen = '{...}';
var top = (inspect_ids === null);
try {
var inspect = [],
keys = self.keys
_map = self.map,
smap = self.smap,
id = #{object_id};
if (top) {
inspect_ids = {}
}
if (top) {
inspect_ids = {}
}
if (inspect_ids.hasOwnProperty(id)) {
return '{...}';
}
if (inspect_ids.hasOwnProperty(id)) {
return seen;
}
inspect_ids[id] = true;
inspect_ids[id] = true;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i],
value = key.$$is_string ? smap[key] : _map[key.$hash()];
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i],
value = key.$$is_string ? smap[key] : _map[key.$hash()];
value = value;
key = key;
inspect.push(key.$inspect() + '=>' + value.$inspect());
}
value = value.$inspect();
key = key.$inspect();
inspect.push(key + '=>' + value);
}
return '{' + inspect.join(', ') + '}';
} finally {
return '{' + inspect.join(', ') + '}';
if (top) {
inspect_ids = null;
}
}
}
ensure
`if (top) {
inspect_ids = null
}`
end

def invert
2 changes: 1 addition & 1 deletion spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -28,7 +28,7 @@ def at_exit(&block)

case
when defined?(NodeJS)
formatter_class = NodeJSDocFormatter
formatter_class = NodeJSFormatter
when `(typeof(window) !== 'undefined')`
if `!!window.OPAL_SPEC_PHANTOM`
require 'phantomjs'
19 changes: 16 additions & 3 deletions stdlib/json.rb
Original file line number Diff line number Diff line change
@@ -78,7 +78,7 @@ def self.from_object(js_object, options = {})
options[:object_class] ||= Hash
options[:array_class] ||= Array

`to_opal(js_object, options.map)`
`to_opal(js_object, options.smap)`
end

def self.generate(obj, options = {})
@@ -136,11 +136,24 @@ def to_json
class Hash
def to_json
%x{
var inspect = [], keys = self.keys, map = self.map;
var inspect = [],
keys = self.keys,
_map = self.map,
smap = self.smap,
map, khash;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
inspect.push(#{`key`.to_s.to_json} + ':' + #{`map[key.$hash()]`.to_json});
if (key.$$is_string) {
map = smap;
khash = key;
} else {
map = _map;
khash = key.$hash();
}
inspect.push(#{`key`.to_s.to_json} + ':' + #{`map[khash]`.to_json});
}
return '{' + inspect.join(', ') + '}';
43 changes: 30 additions & 13 deletions stdlib/native.rb
Original file line number Diff line number Diff line change
@@ -459,12 +459,21 @@ def initialize(defaults = undefined, &block)
%x{
if (defaults != null) {
if (defaults.constructor === Object) {
var map = self.map,
keys = self.keys;
var _map = self.map,
smap = self.smap,
keys = self.keys,
map, khash, value;
for (var key in defaults) {
var value = defaults[key],
khash = key.$hash();
value = defaults[key];
if (key.$$is_string) {
map = smap;
khash = key;
} else {
map = _map;
khash = key.$hash();
}
if (value && value.constructor === Object) {
map[khash] = #{Hash.new(`value`)};
@@ -492,20 +501,28 @@ def to_n
%x{
var result = {},
keys = self.keys,
map = self.map,
bucket,
value;
_map = self.map,
smap = self.smap,
map, khash, value;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i],
khash = key.$hash(),
obj = map[khash];
key = keys[i];
if (key.$$is_string) {
map = smap;
khash = key;
} else {
map = _map;
khash = key.$hash();
}
if (#{`obj`.respond_to? :to_n}) {
result[key] = #{`obj`.to_n};
value = map[khash];
if (#{`value`.respond_to? :to_n}) {
result[key] = #{`value`.to_n};
}
else {
result[key] = obj;
result[key] = value;
}
}