Skip to content

Commit

Permalink
Separate String#== and eql? and make the former spec-compliant
Browse files Browse the repository at this point in the history
  • Loading branch information
TheGrizzlyDev committed Oct 27, 2021
1 parent 174ec53 commit a1afb3c
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 4 deletions.
3 changes: 2 additions & 1 deletion include/natalie/string_value.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class StringValue : public Value {
ValuePtr initialize(Env *, ValuePtr);
ValuePtr ltlt(Env *, ValuePtr);

bool eq(ValuePtr arg) {
bool eql(ValuePtr arg) {
return *this == *arg;
}

Expand All @@ -138,6 +138,7 @@ class StringValue : public Value {
ValuePtr downcase(Env *);
ValuePtr encode(Env *, ValuePtr);
ValuePtr encoding(Env *);
bool eq(Env *, ValuePtr arg);
ValuePtr eqtilde(Env *, ValuePtr);
ValuePtr force_encoding(Env *, ValuePtr);
ValuePtr ljust(Env *, ValuePtr, ValuePtr);
Expand Down
6 changes: 3 additions & 3 deletions lib/natalie/compiler/binding_gen.rb
Original file line number Diff line number Diff line change
Expand Up @@ -715,8 +715,8 @@ def generate_name
gen.binding('String', '+', 'StringValue', 'add', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', '<<', 'StringValue', 'ltlt', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', '<=>', 'StringValue', 'cmp', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', '==', 'StringValue', 'eq', argc: 1, pass_env: false, pass_block: false, return_type: :bool)
gen.binding('String', '===', 'StringValue', 'eq', argc: 1, pass_env: false, pass_block: false, return_type: :bool)
gen.binding('String', '==', 'StringValue', 'eq', argc: 1, pass_env: true, pass_block: false, return_type: :bool)
gen.binding('String', '===', 'StringValue', 'eq', argc: 1, pass_env: true, pass_block: false, return_type: :bool)
gen.binding('String', '=~', 'StringValue', 'eqtilde', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', '[]', 'StringValue', 'ref', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', 'bytes', 'StringValue', 'bytes', argc: 0, pass_env: true, pass_block: false, return_type: :Value)
Expand All @@ -727,7 +727,7 @@ def generate_name
gen.binding('String', 'encode', 'StringValue', 'encode', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', 'encoding', 'StringValue', 'encoding', argc: 0, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', 'end_with?', 'StringValue', 'end_with', argc: 1, pass_env: true, pass_block: false, return_type: :bool)
gen.binding('String', 'eql?', 'StringValue', 'eq', argc: 1, pass_env: false, pass_block: false, return_type: :bool)
gen.binding('String', 'eql?', 'StringValue', 'eql', argc: 1, pass_env: false, pass_block: false, return_type: :bool)
gen.binding('String', 'force_encoding', 'StringValue', 'force_encoding', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
gen.binding('String', 'gsub', 'StringValue', 'gsub', argc: 1..2, pass_env: true, pass_block: true, return_type: :Value)
gen.binding('String', 'index', 'StringValue', 'index', argc: 1, pass_env: true, pass_block: false, return_type: :Value)
Expand Down
6 changes: 6 additions & 0 deletions src/string_value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,12 @@ ValuePtr StringValue::cmp(Env *env, ValuePtr other) {
return ValuePtr::integer(0);
}

bool StringValue::eq(Env *env, ValuePtr arg) {
if (!arg->is_string() && arg->respond_to(env, SymbolValue::intern("to_str")))
return arg->send(env, SymbolValue::intern("=="), { this });
return eql(arg);
}

ValuePtr StringValue::eqtilde(Env *env, ValuePtr other) {
other->assert_type(env, Value::Type::Regexp, "Regexp");
return other->as_regexp()->eqtilde(env, this);
Expand Down

0 comments on commit a1afb3c

Please sign in to comment.