feat: add Object.same static method for reliable built-in equality

Introduce a new static method `Object.same(obj1, obj2)` that exposes the VM's
built-in equality semantics (`wrenValuesEqual`) directly, bypassing any
user-defined `==` overrides. This required creating a dedicated metaclass for
Object (subclass of Class) to host the static method without polluting every
class with a `same` method. The implementation wires up a new `Object metaclass`
in the core initialization sequence, adjusts the class hierarchy setup order,
and adds comprehensive tests covering value types, identity comparison, and
verification that `Object.same` ignores custom `==` operators.
This commit is contained in:
Bob Nystrom
2015-05-01 14:55:28 +00:00
parent cbfbb3a4cd
commit 332f570a1a
6 changed files with 116 additions and 31 deletions
+18 -3
View File
@@ -1,6 +1,21 @@
^title Object Class
^category core
## Static Methods
## **same**(obj1, obj2)
Returns `true` if *obj1* and *obj2* are the same. For [value
types](../values.html), this returns `true` if the objects have equivalent
state. In other words, numbers, strings, booleans, and ranges compare by value.
For all other objects, this returns `true` only if *obj1* and *obj2* refer to
the exact same object in memory.
This is similar to the built in `==` operator in Object except that this cannot
be overriden. It allows you to reliably access the built-in equality semantics
even on user-defined classes.
## Methods
### **!** operator
@@ -9,9 +24,9 @@ Returns `false`, since most objects are considered [true](control-flow.html#trut
### **==**(other) and **!=**(other) operators
Compares two objects using built-in equality. This compares numbers by value,
and all other objects are compared by identity—two objects are equal only
if they are the exact same object.
Compares two objects using built-in equality. This compares [value
types](../values.html) by value, and all other objects are compared by
identity—two objects are equal only if they are the exact same object.
### **toString**