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:
Bob Nystrom
2013-11-26 15:52:37 +00:00
parent 4f73052934
commit 6996f5a48d
12 changed files with 210 additions and 124 deletions
+4
View File
@@ -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
+13
View File
@@ -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
+4
View File
@@ -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
+27
View File
@@ -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").
+4
View File
@@ -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
+4
View File
@@ -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
+4
View File
@@ -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
+4
View File
@@ -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