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: 4a41f7778705
Choose a base ref
...
head repository: opal/opal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 263205bb1d86
Choose a head ref
  • 3 commits
  • 3 files changed
  • 2 contributors

Commits on Apr 3, 2015

  1. Copy the full SHA
    2476961 View commit details
  2. Copy the full SHA
    c9c83cf View commit details
  3. Merge pull request #789 from vais/string

    String#to_i, revised String#oct, and String.try_convert fully compliant with rubyspec
    meh committed Apr 3, 2015

    Verified

    This commit was signed with the committer’s verified signature.
    Copy the full SHA
    263205b View commit details
Showing with 120 additions and 73 deletions.
  1. +83 −27 opal/corelib/string.rb
  2. +0 −46 spec/filters/bugs/string.rb
  3. +37 −0 spec/filters/unsupported/large_numbers.rb
110 changes: 83 additions & 27 deletions opal/corelib/string.rb
Original file line number Diff line number Diff line change
@@ -11,9 +11,7 @@ def __id__
alias object_id __id__

def self.try_convert(what)
what.to_str
rescue
nil
Opal.coerce_to?(what, String, :to_str)
end

def self.new(str = '')
@@ -724,29 +722,44 @@ def next

def oct
%x{
var radix = 8;
var result,
string = self,
radix = 8;
var string = self.replace(/^\s*([+-]?)(0[bodx])?/, function (match, sign, base) {
switch (base) {
case '0b': radix = 2; break;
case '0o': radix = 8; break;
case '0d': radix = 10; break;
case '0x': radix = 16; break;
}
return sign;
});
if (string.charAt(0) === '_') {
if (/^\s*_/.test(string)) {
return 0;
}
var result = parseInt(string.replace(/_(?!_)/g, ''), radix);
if (isNaN(result)) {
return 0;
}
string = string.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/i, function (original, head, flag, tail) {
switch (tail.charAt(0)) {
case '+':
case '-':
return original;
case '0':
if (tail.charAt(1) === 'x' && flag === '0x') {
return original;
}
}
switch (flag) {
case '0b':
radix = 2;
break;
case '0':
case '0o':
radix = 8;
break;
case '0d':
radix = 10;
break;
case '0x':
radix = 16;
break;
}
return head + tail;
});
return result;
result = parseInt(string.replace(/_(?!_)/g, ''), radix);
return isNaN(result) ? 0 : result;
}
end

@@ -1203,17 +1216,60 @@ def to_f

def to_i(base = 10)
%x{
if (self.charAt(0) === '_') {
return 0;
}
var result,
string = self,
radix = #{Opal.coerce_to(`base`, Integer, :to_int)};
var result = parseInt(self.replace(/_(?!_)/g, ''), base);
if (radix === 1 || radix < 0 || radix > 36) {
#{raise ArgumentError, "invalid radix #{`radix`}"}
}
if (isNaN(result)) {
if (/^\s*_/.test(string)) {
return 0;
}
return result;
string = string.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/i, function (original, head, flag, tail) {
switch (tail.charAt(0)) {
case '+':
case '-':
return original;
case '0':
if (tail.charAt(1) === 'x' && flag === '0x' && (radix === 0 || radix === 16)) {
return original;
}
}
switch (flag) {
case '0b':
if (radix === 0 || radix === 2) {
radix = 2;
return head + tail;
}
break;
case '0':
case '0o':
if (radix === 0 || radix === 8) {
radix = 8;
return head + tail;
}
break;
case '0d':
if (radix === 0 || radix === 10) {
radix = 10;
return head + tail;
}
break;
case '0x':
if (radix === 0 || radix === 16) {
radix = 16;
return head + tail;
}
break;
}
return original
});
result = parseInt(string.replace(/_(?!_)/g, ''), radix);
return isNaN(result) ? 0 : result;
}
end

46 changes: 0 additions & 46 deletions spec/filters/bugs/string.rb
Original file line number Diff line number Diff line change
@@ -66,9 +66,6 @@
fails "String#match with [pattern, position] when given a positive position matches the pattern against self starting at an optional index"
fails "String#match with [pattern, position] when given a negative position matches the pattern against self starting at an optional index"

fails "String.try_convert sends #to_str to the argument and raises TypeError if it's not a kind of String"
fails "String.try_convert does not rescue exceptions raised by #to_str"

fails "String#to_c returns a Complex object"
fails "String#to_c understands integers"
fails "String#to_c understands negative integers"
@@ -94,49 +91,6 @@
fails "String#to_c understands negative scientific notation for the real and imaginary part in the same String"
fails "String#to_c returns a complex number with 0 as the real part, 0 as the imaginary part for unrecognised Strings"

fails "String#to_i auto-detects base 8 via leading 0 when base = 0"
fails "String#to_i auto-detects base 2 via 0b when base = 0"
fails "String#to_i auto-detects base 10 via 0d when base = 0"
fails "String#to_i auto-detects base 8 via 0o when base = 0"
fails "String#to_i doesn't handle foreign base specifiers when base is > 0"
fails "String#to_i tries to convert the base to an integer using to_int"
fails "String#to_i raises an ArgumentError for illegal bases (1, < 0 or > 36)"
fails "String#to_i with bases parses a String in base 2"
fails "String#to_i with bases parses a String in base 3"
fails "String#to_i with bases parses a String in base 4"
fails "String#to_i with bases parses a String in base 5"
fails "String#to_i with bases parses a String in base 6"
fails "String#to_i with bases parses a String in base 7"
fails "String#to_i with bases parses a String in base 8"
fails "String#to_i with bases parses a String in base 9"
fails "String#to_i with bases parses a String in base 10"
fails "String#to_i with bases parses a String in base 11"
fails "String#to_i with bases parses a String in base 12"
fails "String#to_i with bases parses a String in base 13"
fails "String#to_i with bases parses a String in base 14"
fails "String#to_i with bases parses a String in base 15"
fails "String#to_i with bases parses a String in base 16"
fails "String#to_i with bases parses a String in base 17"
fails "String#to_i with bases parses a String in base 18"
fails "String#to_i with bases parses a String in base 19"
fails "String#to_i with bases parses a String in base 20"
fails "String#to_i with bases parses a String in base 21"
fails "String#to_i with bases parses a String in base 22"
fails "String#to_i with bases parses a String in base 23"
fails "String#to_i with bases parses a String in base 24"
fails "String#to_i with bases parses a String in base 25"
fails "String#to_i with bases parses a String in base 26"
fails "String#to_i with bases parses a String in base 27"
fails "String#to_i with bases parses a String in base 28"
fails "String#to_i with bases parses a String in base 29"
fails "String#to_i with bases parses a String in base 30"
fails "String#to_i with bases parses a String in base 31"
fails "String#to_i with bases parses a String in base 32"
fails "String#to_i with bases parses a String in base 33"
fails "String#to_i with bases parses a String in base 34"
fails "String#to_i with bases parses a String in base 35"
fails "String#to_i with bases parses a String in base 36"

fails "String#to_r returns a Rational object"
fails "String#to_r returns (0/1) for the empty String"
fails "String#to_r returns (n/1) for a String starting with a decimal _n_"
37 changes: 37 additions & 0 deletions spec/filters/unsupported/large_numbers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
opal_filter "large_numbers" do
fails "String#to_i with bases parses a String in base 2"
fails "String#to_i with bases parses a String in base 3"
fails "String#to_i with bases parses a String in base 4"
fails "String#to_i with bases parses a String in base 5"
fails "String#to_i with bases parses a String in base 6"
fails "String#to_i with bases parses a String in base 7"
fails "String#to_i with bases parses a String in base 8"
fails "String#to_i with bases parses a String in base 9"
fails "String#to_i with bases parses a String in base 10"
fails "String#to_i with bases parses a String in base 11"
fails "String#to_i with bases parses a String in base 12"
fails "String#to_i with bases parses a String in base 13"
fails "String#to_i with bases parses a String in base 14"
fails "String#to_i with bases parses a String in base 15"
fails "String#to_i with bases parses a String in base 16"
fails "String#to_i with bases parses a String in base 17"
fails "String#to_i with bases parses a String in base 18"
fails "String#to_i with bases parses a String in base 19"
fails "String#to_i with bases parses a String in base 20"
fails "String#to_i with bases parses a String in base 21"
fails "String#to_i with bases parses a String in base 22"
fails "String#to_i with bases parses a String in base 23"
fails "String#to_i with bases parses a String in base 24"
fails "String#to_i with bases parses a String in base 25"
fails "String#to_i with bases parses a String in base 26"
fails "String#to_i with bases parses a String in base 27"
fails "String#to_i with bases parses a String in base 28"
fails "String#to_i with bases parses a String in base 29"
fails "String#to_i with bases parses a String in base 30"
fails "String#to_i with bases parses a String in base 31"
fails "String#to_i with bases parses a String in base 32"
fails "String#to_i with bases parses a String in base 33"
fails "String#to_i with bases parses a String in base 34"
fails "String#to_i with bases parses a String in base 35"
fails "String#to_i with bases parses a String in base 36"
end