feat: replace per-type equality primitives with unified object_eqeq and wrenGetClass
Move equality and inequality primitives from Bool and Function to a single Object-level implementation using valuesEqual, and add wrenGetClass to return the runtime class of any value. Refactor newSingleClass to inherit methods from superclass and wire metaclass superclass to classClass. Add type-checking tests for all built-in types and class inheritance.
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
io.write(true is Bool) // expect: true
|
||||
io.write(true is Object) // expect: true
|
||||
io.write(true is Num) // expect: false
|
||||
io.write(true.type == Bool) // expect: true
|
||||
@@ -0,0 +1,13 @@
|
||||
io.write(Num == Num) // expect: true
|
||||
io.write(Num == Bool) // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(Num == 123) // expect: false
|
||||
io.write(Num == true) // expect: false
|
||||
|
||||
io.write(Num != Num) // expect: false
|
||||
io.write(Num != Bool) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(Num != 123) // expect: true
|
||||
io.write(Num != true) // expect: true
|
||||
@@ -0,0 +1,4 @@
|
||||
io.write((fn 0) is Function) // expect: true
|
||||
io.write((fn 0) is Object) // expect: true
|
||||
io.write((fn 0) is String) // expect: false
|
||||
io.write((fn 0).type == Function) // expect: true
|
||||
@@ -1,3 +1,4 @@
|
||||
io.write(Num is Class) // expect: true
|
||||
io.write(true is Bool) // expect: true
|
||||
io.write((fn 1) is Function) // expect: true
|
||||
io.write(123 is Num) // expect: true
|
||||
@@ -11,6 +12,32 @@ io.write((fn 1) is Num) // expect: false
|
||||
io.write("s" is Null) // expect: false
|
||||
io.write(123 is String) // expect: false
|
||||
|
||||
// Everything extends Object.
|
||||
io.write(Num is Object) // expect: true
|
||||
io.write(null is Object) // expect: true
|
||||
io.write(true is Object) // expect: true
|
||||
io.write((fn 1) is Object) // expect: true
|
||||
io.write("s" is Object) // expect: true
|
||||
io.write(123 is Object) // expect: true
|
||||
|
||||
// Inheritance.
|
||||
class A {}
|
||||
class B is A {}
|
||||
class C is B {}
|
||||
var a = A.new
|
||||
var b = B.new
|
||||
var c = C.new
|
||||
|
||||
io.write(a is A) // expect: true
|
||||
io.write(a is B) // expect: false
|
||||
io.write(a is C) // expect: false
|
||||
io.write(b is A) // expect: true
|
||||
io.write(b is B) // expect: true
|
||||
io.write(b is C) // expect: false
|
||||
io.write(c is A) // expect: true
|
||||
io.write(c is B) // expect: true
|
||||
io.write(c is C) // expect: true
|
||||
|
||||
// TODO(bob): Non-class on RHS.
|
||||
// TODO(bob): Precedence and associativity.
|
||||
// TODO(bob): Metaclasses ("Num is Class").
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
io.write([] is List) // expect: true
|
||||
io.write([] is Object) // expect: true
|
||||
io.write([] is Bool) // expect: false
|
||||
io.write([].type == List) // expect: true
|
||||
@@ -0,0 +1,4 @@
|
||||
io.write(null is Null) // expect: true
|
||||
io.write(null is Object) // expect: true
|
||||
io.write(null is Bool) // expect: false
|
||||
io.write(null.type == Null) // expect: true
|
||||
@@ -0,0 +1,4 @@
|
||||
io.write(123 is Num) // expect: true
|
||||
io.write(123 is Object) // expect: true
|
||||
io.write(123 is String) // expect: false
|
||||
io.write(123.type == Num) // expect: true
|
||||
@@ -0,0 +1,4 @@
|
||||
io.write("s" is String) // expect: true
|
||||
io.write("s" is Object) // expect: true
|
||||
io.write("s" is Num) // expect: false
|
||||
io.write("s".type == String) // expect: true
|
||||
Reference in New Issue
Block a user