opal/corelib/runtime.js in opal-0.6.0 vs opal/corelib/runtime.js in opal-0.6.1

- old
+ new

@@ -600,10 +600,28 @@ } return block.apply(null, args); }; + // Finds the corresponding exception match in candidates. Each candidate can + // be a value, or an array of values. Returns null if not found. + Opal.$rescue = function(exception, candidates) { + for (var i = 0; i != candidates.length; i++) { + var candidate = candidates[i]; + if (candidate._isArray) { + var subresult; + if (subresult = Opal.$rescue(exception, candidate)) { + return subresult; + } + } + else if (candidate['$==='](exception)) { + return candidate; + } + } + return null; + }; + Opal.is_a = function(object, klass) { if (object.__meta__ === klass) { return true; } @@ -760,12 +778,19 @@ if (arguments.length == 1) { if (arguments[0]._isArray) { var args = arguments[0]; for (var i = 0, length = args.length; i < length; i++) { - var key = args[i][0], obj = args[i][1]; + var pair = args[i]; + if (pair.length !== 2) { + throw Opal.ArgumentError.$new("value not of length 2: " + pair.$inspect()); + } + + var key = pair[0], + obj = pair[1]; + if (assocs[key] == null) { keys.push(key); } assocs[key] = obj; @@ -778,10 +803,15 @@ keys.push(key); } } } else { - for (var i = 0, length = arguments.length; i < length; i++) { + var length = arguments.length; + if (length % 2 !== 0) { + throw Opal.ArgumentError.$new("odd number of arguments for Hash"); + } + + for (var i = 0; i < length; i++) { var key = arguments[i], obj = arguments[++i]; if (assocs[key] == null) { keys.push(key);