Add lexer support for `TOKEN_INTERPOLATION` to split string literals at interpolation points, introduce `MAX_INTERPOLATION_NESTING` limit of 8, and compile interpolated strings by emitting calls to `String.interpolate_()`. Optimize list and map literal construction with new `addCore_` primitives to reduce stack churn. Update `String`, `List`, and `Map` `toString` methods in core library to use interpolation syntax, and migrate all benchmark and test files from explicit concatenation to interpolated strings.
78 lines
1.5 KiB
Plaintext
78 lines
1.5 KiB
Plaintext
class Api {
|
|
foreign static finalized
|
|
}
|
|
|
|
// Class with a default constructor.
|
|
foreign class Counter {
|
|
construct new() {}
|
|
foreign increment(amount)
|
|
foreign value
|
|
}
|
|
|
|
var counter = Counter.new()
|
|
System.print(counter.value) // expect: 0
|
|
counter.increment(3.1)
|
|
System.print(counter.value) // expect: 3.1
|
|
counter.increment(1.2)
|
|
System.print(counter.value) // expect: 4.3
|
|
|
|
// Foreign classes can inherit a class as long as it has no fields.
|
|
class PointBase {
|
|
inherited() {
|
|
System.print("inherited method")
|
|
}
|
|
}
|
|
|
|
// Class with non-default constructor.
|
|
foreign class Point is PointBase {
|
|
construct new() {
|
|
System.print("default")
|
|
}
|
|
|
|
construct new(x, y, z) {
|
|
System.print("%(x), %(y), %(z)")
|
|
}
|
|
|
|
foreign translate(x, y, z)
|
|
foreign toString
|
|
}
|
|
|
|
var p = Point.new(1, 2, 3) // expect: 1, 2, 3
|
|
System.print(p) // expect: (1, 2, 3)
|
|
p.translate(3, 4, 5)
|
|
System.print(p) // expect: (4, 6, 8)
|
|
|
|
p = Point.new() // expect: default
|
|
System.print(p) // expect: (0, 0, 0)
|
|
|
|
p.inherited() // expect: inherited method
|
|
|
|
var error = Fiber.new {
|
|
class Subclass is Point {}
|
|
}.try()
|
|
System.print(error) // expect: Class 'Subclass' cannot inherit from foreign class 'Point'.
|
|
|
|
// Class with a finalizer.
|
|
foreign class Resource {
|
|
construct new() {}
|
|
}
|
|
|
|
var resources = [
|
|
Resource.new(),
|
|
Resource.new(),
|
|
Resource.new()
|
|
]
|
|
|
|
System.gc()
|
|
System.print(Api.finalized) // expect: 0
|
|
|
|
resources.removeAt(-1)
|
|
|
|
System.gc()
|
|
System.print(Api.finalized) // expect: 1
|
|
|
|
resources.clear()
|
|
|
|
System.gc()
|
|
System.print(Api.finalized) // expect: 3
|