Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/torque/test-torque.tq')
-rw-r--r--deps/v8/test/torque/test-torque.tq2063
1 files changed, 1034 insertions, 1029 deletions
diff --git a/deps/v8/test/torque/test-torque.tq b/deps/v8/test/torque/test-torque.tq
index 0693878cce3..8db908bc334 100644
--- a/deps/v8/test/torque/test-torque.tq
+++ b/deps/v8/test/torque/test-torque.tq
@@ -2,1226 +2,1231 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// Test line comment
+/* Test mulitline
+ comment
+*/
+
namespace test {
- macro ElementsKindTestHelper1(kind: constexpr ElementsKind): bool {
- if constexpr (
- (kind == ElementsKind::UINT8_ELEMENTS) ||
- (kind == ElementsKind::UINT16_ELEMENTS)) {
- return true;
- } else {
- return false;
- }
+macro ElementsKindTestHelper1(kind: constexpr ElementsKind): bool {
+ if constexpr (
+ (kind == ElementsKind::UINT8_ELEMENTS) ||
+ (kind == ElementsKind::UINT16_ELEMENTS)) {
+ return true;
+ } else {
+ return false;
}
+}
- macro ElementsKindTestHelper2(kind: constexpr ElementsKind): constexpr bool {
- return (
- (kind == ElementsKind::UINT8_ELEMENTS) ||
- (kind == ElementsKind::UINT16_ELEMENTS));
- }
+macro ElementsKindTestHelper2(kind: constexpr ElementsKind): constexpr bool {
+ return (
+ (kind == ElementsKind::UINT8_ELEMENTS) ||
+ (kind == ElementsKind::UINT16_ELEMENTS));
+}
- macro LabelTestHelper1(): never
- labels Label1 {
- goto Label1;
- }
+macro LabelTestHelper1(): never
+ labels Label1 {
+ goto Label1;
+}
- macro LabelTestHelper2(): never
- labels Label2(Smi) {
- goto Label2(42);
- }
+macro LabelTestHelper2(): never
+ labels Label2(Smi) {
+ goto Label2(42);
+}
- macro LabelTestHelper3(): never
- labels Label3(Oddball, Smi) {
- goto Label3(Null, 7);
- }
+macro LabelTestHelper3(): never
+ labels Label3(Oddball, Smi) {
+ goto Label3(Null, 7);
+}
- @export
- macro TestConstexpr1() {
- check(FromConstexpr<bool>(
- IsFastElementsKind(ElementsKind::PACKED_SMI_ELEMENTS)));
- }
+@export
+macro TestConstexpr1() {
+ check(FromConstexpr<bool>(
+ IsFastElementsKind(ElementsKind::PACKED_SMI_ELEMENTS)));
+}
- @export
- macro TestConstexprIf() {
- check(ElementsKindTestHelper1(ElementsKind::UINT8_ELEMENTS));
- check(ElementsKindTestHelper1(ElementsKind::UINT16_ELEMENTS));
- check(!ElementsKindTestHelper1(ElementsKind::UINT32_ELEMENTS));
- }
+@export
+macro TestConstexprIf() {
+ check(ElementsKindTestHelper1(ElementsKind::UINT8_ELEMENTS));
+ check(ElementsKindTestHelper1(ElementsKind::UINT16_ELEMENTS));
+ check(!ElementsKindTestHelper1(ElementsKind::UINT32_ELEMENTS));
+}
- @export
- macro TestConstexprReturn() {
- check(FromConstexpr<bool>(
- ElementsKindTestHelper2(ElementsKind::UINT8_ELEMENTS)));
- check(FromConstexpr<bool>(
- ElementsKindTestHelper2(ElementsKind::UINT16_ELEMENTS)));
- check(!FromConstexpr<bool>(
- ElementsKindTestHelper2(ElementsKind::UINT32_ELEMENTS)));
- check(FromConstexpr<bool>(
- !ElementsKindTestHelper2(ElementsKind::UINT32_ELEMENTS)));
- }
+@export
+macro TestConstexprReturn() {
+ check(FromConstexpr<bool>(
+ ElementsKindTestHelper2(ElementsKind::UINT8_ELEMENTS)));
+ check(FromConstexpr<bool>(
+ ElementsKindTestHelper2(ElementsKind::UINT16_ELEMENTS)));
+ check(!FromConstexpr<bool>(
+ ElementsKindTestHelper2(ElementsKind::UINT32_ELEMENTS)));
+ check(FromConstexpr<bool>(
+ !ElementsKindTestHelper2(ElementsKind::UINT32_ELEMENTS)));
+}
- @export
- macro TestGotoLabel(): Boolean {
- try {
- LabelTestHelper1() otherwise Label1;
- }
- label Label1 {
- return True;
- }
+@export
+macro TestGotoLabel(): Boolean {
+ try {
+ LabelTestHelper1() otherwise Label1;
+ } label Label1 {
+ return True;
}
+}
- @export
- macro TestGotoLabelWithOneParameter(): Boolean {
- try {
- LabelTestHelper2() otherwise Label2;
- }
- label Label2(smi: Smi) {
- check(smi == 42);
- return True;
- }
+@export
+macro TestGotoLabelWithOneParameter(): Boolean {
+ try {
+ LabelTestHelper2() otherwise Label2;
+ } label Label2(smi: Smi) {
+ check(smi == 42);
+ return True;
}
+}
- @export
- macro TestGotoLabelWithTwoParameters(): Boolean {
- try {
- LabelTestHelper3() otherwise Label3;
- }
- label Label3(o: Oddball, smi: Smi) {
- check(o == Null);
- check(smi == 7);
- return True;
- }
+@export
+macro TestGotoLabelWithTwoParameters(): Boolean {
+ try {
+ LabelTestHelper3() otherwise Label3;
+ } label Label3(o: Oddball, smi: Smi) {
+ check(o == Null);
+ check(smi == 7);
+ return True;
}
+}
- builtin GenericBuiltinTest<T: type>(_c: Context, _param: T): JSAny {
- return Null;
- }
+builtin GenericBuiltinTest<T: type>(_param: T): JSAny {
+ return Null;
+}
- GenericBuiltinTest<JSAny>(_c: Context, param: JSAny): JSAny {
- return param;
- }
+GenericBuiltinTest<JSAny>(param: JSAny): JSAny {
+ return param;
+}
- @export
- macro TestBuiltinSpecialization(c: Context) {
- check(GenericBuiltinTest<Smi>(c, 0) == Null);
- check(GenericBuiltinTest<Smi>(c, 1) == Null);
- check(GenericBuiltinTest<JSAny>(c, Undefined) == Undefined);
- check(GenericBuiltinTest<JSAny>(c, Undefined) == Undefined);
- }
+@export
+macro TestBuiltinSpecialization() {
+ check(GenericBuiltinTest<Smi>(0) == Null);
+ check(GenericBuiltinTest<Smi>(1) == Null);
+ check(GenericBuiltinTest<JSAny>(Undefined) == Undefined);
+ check(GenericBuiltinTest<JSAny>(Undefined) == Undefined);
+}
- macro LabelTestHelper4(flag: constexpr bool): never
- labels Label4, Label5 {
- if constexpr (flag) {
- goto Label4;
- } else {
- goto Label5;
- }
+macro LabelTestHelper4(flag: constexpr bool): never
+ labels Label4, Label5 {
+ if constexpr (flag) {
+ goto Label4;
+ } else {
+ goto Label5;
}
+}
- macro CallLabelTestHelper4(flag: constexpr bool): bool {
- try {
- LabelTestHelper4(flag) otherwise Label4, Label5;
- }
- label Label4 {
- return true;
- }
- label Label5 {
- return false;
- }
+macro CallLabelTestHelper4(flag: constexpr bool): bool {
+ try {
+ LabelTestHelper4(flag) otherwise Label4, Label5;
+ } label Label4 {
+ return true;
+ } label Label5 {
+ return false;
}
+}
- @export
- macro TestPartiallyUnusedLabel(): Boolean {
- const r1: bool = CallLabelTestHelper4(true);
- const r2: bool = CallLabelTestHelper4(false);
+@export
+macro TestPartiallyUnusedLabel(): Boolean {
+ const r1: bool = CallLabelTestHelper4(true);
+ const r2: bool = CallLabelTestHelper4(false);
- if (r1 && !r2) {
- return True;
- } else {
- return False;
- }
+ if (r1 && !r2) {
+ return True;
+ } else {
+ return False;
}
+}
- macro GenericMacroTest<T: type>(_param: T): Object {
- return Undefined;
- }
+macro GenericMacroTest<T: type>(_param: T): Object {
+ return Undefined;
+}
- GenericMacroTest<Object>(param2: Object): Object {
- return param2;
- }
+GenericMacroTest<Object>(param2: Object): Object {
+ return param2;
+}
- macro GenericMacroTestWithLabels<T: type>(_param: T): Object
- labels _X {
- return Undefined;
- }
+macro GenericMacroTestWithLabels<T: type>(_param: T): Object
+labels _X {
+ return Undefined;
+}
- GenericMacroTestWithLabels<Object>(param2: Object): Object
- labels Y {
- return Cast<Smi>(param2) otherwise Y;
- }
+GenericMacroTestWithLabels<Object>(param2: Object): Object
+ labels Y {
+ return Cast<Smi>(param2) otherwise Y;
+}
- @export
- macro TestMacroSpecialization() {
+@export
+macro TestMacroSpecialization() {
+ try {
+ const _smi0: Smi = 0;
+ check(GenericMacroTest<Smi>(0) == Undefined);
+ check(GenericMacroTest<Smi>(1) == Undefined);
+ check(GenericMacroTest<Object>(Null) == Null);
+ check(GenericMacroTest<Object>(False) == False);
+ check(GenericMacroTest<Object>(True) == True);
+ check((GenericMacroTestWithLabels<Smi>(0) otherwise Fail) == Undefined);
+ check((GenericMacroTestWithLabels<Smi>(0) otherwise Fail) == Undefined);
try {
- const _smi0: Smi = 0;
- check(GenericMacroTest<Smi>(0) == Undefined);
- check(GenericMacroTest<Smi>(1) == Undefined);
- check(GenericMacroTest<Object>(Null) == Null);
- check(GenericMacroTest<Object>(False) == False);
- check(GenericMacroTest<Object>(True) == True);
- check((GenericMacroTestWithLabels<Smi>(0) otherwise Fail) == Undefined);
- check((GenericMacroTestWithLabels<Smi>(0) otherwise Fail) == Undefined);
- try {
- GenericMacroTestWithLabels<Object>(False) otherwise Expected;
- }
- label Expected {}
- }
- label Fail {
- unreachable;
- }
+ GenericMacroTestWithLabels<Object>(False) otherwise Expected;
+ } label Expected {}
+ } label Fail {
+ unreachable;
}
+}
- builtin TestHelperPlus1(_context: Context, x: Smi): Smi {
- return x + 1;
- }
- builtin TestHelperPlus2(_context: Context, x: Smi): Smi {
- return x + 2;
- }
+builtin TestHelperPlus1(x: Smi): Smi {
+ return x + 1;
+}
+builtin TestHelperPlus2(x: Smi): Smi {
+ return x + 2;
+}
- @export
- macro TestFunctionPointers(implicit context: Context)(): Boolean {
- let fptr: builtin(Context, Smi) => Smi = TestHelperPlus1;
- check(fptr(context, 42) == 43);
- fptr = TestHelperPlus2;
- check(fptr(context, 42) == 44);
- return True;
- }
+@export
+macro TestFunctionPointers(implicit context: Context)(): Boolean {
+ let fptr: builtin(Smi) => Smi = TestHelperPlus1;
+ check(fptr(42) == 43);
+ fptr = TestHelperPlus2;
+ check(fptr(42) == 44);
+ return True;
+}
- @export
- macro TestVariableRedeclaration(implicit context: Context)(): Boolean {
- let _var1: int31 = FromConstexpr<bool>(42 == 0) ? 0 : 1;
- let _var2: int31 = FromConstexpr<bool>(42 == 0) ? 1 : 0;
- return True;
- }
+@export
+macro TestVariableRedeclaration(implicit context: Context)(): Boolean {
+ let _var1: int31 = FromConstexpr<bool>(42 == 0) ? 0 : 1;
+ let _var2: int31 = FromConstexpr<bool>(42 == 0) ? 1 : 0;
+ return True;
+}
- @export
- macro TestTernaryOperator(x: Smi): Smi {
- const b: bool = x < 0 ? true : false;
- return b ? x - 10 : x + 100;
- }
+@export
+macro TestTernaryOperator(x: Smi): Smi {
+ const b: bool = x < 0 ? true : false;
+ return b ? x - 10 : x + 100;
+}
- @export
- macro TestFunctionPointerToGeneric(c: Context) {
- const fptr1: builtin(Context, Smi) => JSAny = GenericBuiltinTest<Smi>;
- const fptr2: builtin(Context, JSAny) => JSAny = GenericBuiltinTest<JSAny>;
+@export
+macro TestFunctionPointerToGeneric() {
+ const fptr1: builtin(Smi) => JSAny = GenericBuiltinTest<Smi>;
+ const fptr2: builtin(JSAny) => JSAny = GenericBuiltinTest<JSAny>;
- check(fptr1(c, 0) == Null);
- check(fptr1(c, 1) == Null);
- check(fptr2(c, Undefined) == Undefined);
- check(fptr2(c, Undefined) == Undefined);
- }
+ check(fptr1(0) == Null);
+ check(fptr1(1) == Null);
+ check(fptr2(Undefined) == Undefined);
+ check(fptr2(Undefined) == Undefined);
+}
- type ObjectToObject = builtin(Context, JSAny) => JSAny;
- @export
- macro TestTypeAlias(x: ObjectToObject): BuiltinPtr {
- return x;
- }
+type ObjectToObject = builtin(Context, JSAny) => JSAny;
+@export
+macro TestTypeAlias(x: ObjectToObject): BuiltinPtr {
+ return x;
+}
- @export
- macro TestUnsafeCast(implicit context: Context)(n: Number): Boolean {
- if (TaggedIsSmi(n)) {
- const m: Smi = UnsafeCast<Smi>(n);
+@export
+macro TestUnsafeCast(implicit context: Context)(n: Number): Boolean {
+ if (TaggedIsSmi(n)) {
+ const m: Smi = UnsafeCast<Smi>(n);
- check(TestHelperPlus1(context, m) == 11);
- return True;
- }
- return False;
+ check(TestHelperPlus1(m) == 11);
+ return True;
}
+ return False;
+}
- @export
- macro TestHexLiteral() {
- check(Convert<intptr>(0xffff) + 1 == 0x10000);
- check(Convert<intptr>(-0xffff) == -65535);
- }
+@export
+macro TestHexLiteral() {
+ check(Convert<intptr>(0xffff) + 1 == 0x10000);
+ check(Convert<intptr>(-0xffff) == -65535);
+}
- @export
- macro TestLargeIntegerLiterals(implicit c: Context)() {
- let _x: int32 = 0x40000000;
- let _y: int32 = 0x7fffffff;
- }
+@export
+macro TestLargeIntegerLiterals(implicit c: Context)() {
+ let _x: int32 = 0x40000000;
+ let _y: int32 = 0x7fffffff;
+}
- @export
- macro TestMultilineAssert() {
- const someVeryLongVariableNameThatWillCauseLineBreaks: Smi = 5;
- check(
- someVeryLongVariableNameThatWillCauseLineBreaks > 0 &&
- someVeryLongVariableNameThatWillCauseLineBreaks < 10);
- }
+@export
+macro TestMultilineAssert() {
+ const someVeryLongVariableNameThatWillCauseLineBreaks: Smi = 5;
+ check(
+ someVeryLongVariableNameThatWillCauseLineBreaks > 0 &&
+ someVeryLongVariableNameThatWillCauseLineBreaks < 10);
+}
- @export
- macro TestNewlineInString() {
- Print('Hello, World!\n');
- }
+@export
+macro TestNewlineInString() {
+ Print('Hello, World!\n');
+}
- const kConstexprConst: constexpr int31 = 5;
- const kIntptrConst: intptr = 4;
- const kSmiConst: Smi = 3;
+const kConstexprConst: constexpr int31 = 5;
+const kIntptrConst: intptr = 4;
+const kSmiConst: Smi = 3;
- @export
- macro TestModuleConstBindings() {
- check(kConstexprConst == Int32Constant(5));
- check(kIntptrConst == 4);
- check(kSmiConst == 3);
- }
+@export
+macro TestModuleConstBindings() {
+ check(kConstexprConst == Int32Constant(5));
+ check(kIntptrConst == 4);
+ check(kSmiConst == 3);
+}
- @export
- macro TestLocalConstBindings() {
- const x: constexpr int31 = 3;
+@export
+macro TestLocalConstBindings() {
+ const x: constexpr int31 = 3;
+ const xSmi: Smi = x;
+ {
+ const x: Smi = x + FromConstexpr<Smi>(1);
+ check(x == xSmi + 1);
const xSmi: Smi = x;
- {
- const x: Smi = x + FromConstexpr<Smi>(1);
- check(x == xSmi + 1);
- const xSmi: Smi = x;
- check(x == xSmi);
- check(x == 4);
- }
- check(xSmi == 3);
check(x == xSmi);
+ check(x == 4);
}
+ check(xSmi == 3);
+ check(x == xSmi);
+}
- struct TestStructA {
- indexes: FixedArray;
- i: Smi;
- k: Number;
- }
+struct TestStructA {
+ indexes: FixedArray;
+ i: Smi;
+ k: Number;
+}
- struct TestStructB {
- x: TestStructA;
- y: Smi;
- }
+struct TestStructB {
+ x: TestStructA;
+ y: Smi;
+}
- @export
- macro TestStruct1(i: TestStructA): Smi {
- return i.i;
- }
+@export
+macro TestStruct1(i: TestStructA): Smi {
+ return i.i;
+}
- @export
- macro TestStruct2(implicit context: Context)(): TestStructA {
- return TestStructA{
- indexes: UnsafeCast<FixedArray>(kEmptyFixedArray),
- i: 27,
- k: 31
- };
- }
+@export
+macro TestStruct2(implicit context: Context)(): TestStructA {
+ return TestStructA{
+ indexes: UnsafeCast<FixedArray>(kEmptyFixedArray),
+ i: 27,
+ k: 31
+ };
+}
- @export
- macro TestStruct3(implicit context: Context)(): TestStructA {
- let a: TestStructA =
- TestStructA{indexes: UnsafeCast<FixedArray>(kEmptyFixedArray), i: 13, k: 5};
- let _b: TestStructA = a;
- const c: TestStructA = TestStruct2();
- a.i = TestStruct1(c);
- a.k = a.i;
- let d: TestStructB;
- d.x = a;
- d = TestStructB{x: a, y: 7};
- let _e: TestStructA = d.x;
- let f: Smi = TestStructA{
- indexes: UnsafeCast<FixedArray>(kEmptyFixedArray),
- i: 27,
- k: 31
- }.i;
- f = TestStruct2().i;
- return a;
- }
+@export
+macro TestStruct3(implicit context: Context)(): TestStructA {
+ let a: TestStructA =
+ TestStructA{indexes: UnsafeCast<FixedArray>(kEmptyFixedArray), i: 13, k: 5};
+ let _b: TestStructA = a;
+ const c: TestStructA = TestStruct2();
+ a.i = TestStruct1(c);
+ a.k = a.i;
+ let d: TestStructB;
+ d.x = a;
+ d = TestStructB{x: a, y: 7};
+ let _e: TestStructA = d.x;
+ let f: Smi = TestStructA{
+ indexes: UnsafeCast<FixedArray>(kEmptyFixedArray),
+ i: 27,
+ k: 31
+ }.i;
+ f = TestStruct2().i;
+ return a;
+}
- struct TestStructC {
- x: TestStructA;
- y: TestStructA;
- }
+struct TestStructC {
+ x: TestStructA;
+ y: TestStructA;
+}
- @export
- macro TestStruct4(implicit context: Context)(): TestStructC {
- return TestStructC{x: TestStruct2(), y: TestStruct2()};
- }
+@export
+macro TestStruct4(implicit context: Context)(): TestStructC {
+ return TestStructC{x: TestStruct2(), y: TestStruct2()};
+}
- macro TestStructInLabel(implicit context: Context)(): never labels
- Foo(TestStructA) {
- goto Foo(TestStruct2());
- }
- @export // Silence unused warning.
- macro CallTestStructInLabel(implicit context: Context)() {
- try {
- TestStructInLabel() otherwise Foo;
+macro TestStructInLabel(implicit context: Context)(): never labels
+Foo(TestStructA) {
+ goto Foo(TestStruct2());
+}
+@export // Silence unused warning.
+macro CallTestStructInLabel(implicit context: Context)() {
+ try {
+ TestStructInLabel() otherwise Foo;
+ } label Foo(_s: TestStructA) {}
+}
+
+// This macro tests different versions of the for-loop where some parts
+// are (not) present.
+@export
+macro TestForLoop() {
+ let sum: Smi = 0;
+ for (let i: Smi = 0; i < 5; ++i) sum += i;
+ check(sum == 10);
+
+ sum = 0;
+ let j: Smi = 0;
+ for (; j < 5; ++j) sum += j;
+ check(sum == 10);
+
+ sum = 0;
+ j = 0;
+ for (; j < 5;) sum += j++;
+ check(sum == 10);
+
+ // Check that break works. No test expression.
+ sum = 0;
+ for (let i: Smi = 0;; ++i) {
+ if (i == 5) break;
+ sum += i;
+ }
+ check(sum == 10);
+
+ sum = 0;
+ j = 0;
+ for (;;) {
+ if (j == 5) break;
+ sum += j;
+ j++;
+ }
+ check(sum == 10);
+
+ // The following tests are the same as above, but use continue to skip
+ // index 3.
+ sum = 0;
+ for (let i: Smi = 0; i < 5; ++i) {
+ if (i == 3) continue;
+ sum += i;
+ }
+ check(sum == 7);
+
+ sum = 0;
+ j = 0;
+ for (; j < 5; ++j) {
+ if (j == 3) continue;
+ sum += j;
+ }
+ check(sum == 7);
+
+ sum = 0;
+ j = 0;
+ for (; j < 5;) {
+ if (j == 3) {
+ j++;
+ continue;
}
- label Foo(_s: TestStructA) {}
+ sum += j;
+ j++;
}
+ check(sum == 7);
- // This macro tests different versions of the for-loop where some parts
- // are (not) present.
- @export
- macro TestForLoop() {
- let sum: Smi = 0;
- for (let i: Smi = 0; i < 5; ++i) sum += i;
- check(sum == 10);
-
- sum = 0;
- let j: Smi = 0;
- for (; j < 5; ++j) sum += j;
- check(sum == 10);
-
- sum = 0;
- j = 0;
- for (; j < 5;) sum += j++;
- check(sum == 10);
-
- // Check that break works. No test expression.
- sum = 0;
- for (let i: Smi = 0;; ++i) {
- if (i == 5) break;
- sum += i;
- }
- check(sum == 10);
+ sum = 0;
+ for (let i: Smi = 0;; ++i) {
+ if (i == 3) continue;
+ if (i == 5) break;
+ sum += i;
+ }
+ check(sum == 7);
- sum = 0;
- j = 0;
- for (;;) {
- if (j == 5) break;
- sum += j;
+ sum = 0;
+ j = 0;
+ for (;;) {
+ if (j == 3) {
j++;
+ continue;
}
- check(sum == 10);
-
- // The following tests are the same as above, but use continue to skip
- // index 3.
- sum = 0;
- for (let i: Smi = 0; i < 5; ++i) {
- if (i == 3) continue;
- sum += i;
- }
- check(sum == 7);
- sum = 0;
- j = 0;
- for (; j < 5; ++j) {
- if (j == 3) continue;
- sum += j;
- }
- check(sum == 7);
-
- sum = 0;
- j = 0;
- for (; j < 5;) {
- if (j == 3) {
- j++;
- continue;
- }
- sum += j;
- j++;
- }
- check(sum == 7);
+ if (j == 5) break;
+ sum += j;
+ j++;
+ }
+ check(sum == 7);
- sum = 0;
- for (let i: Smi = 0;; ++i) {
- if (i == 3) continue;
- if (i == 5) break;
- sum += i;
+ j = 0;
+ try {
+ for (;;) {
+ if (++j == 10) goto Exit;
}
- check(sum == 7);
+ } label Exit {
+ check(j == 10);
+ }
- sum = 0;
- j = 0;
- for (;;) {
- if (j == 3) {
- j++;
- continue;
- }
+ // Test if we can handle uninitialized values on the stack.
+ let _i: Smi;
+ for (let j: Smi = 0; j < 10; ++j) {
+ }
+}
- if (j == 5) break;
- sum += j;
- j++;
- }
- check(sum == 7);
+@export
+macro TestSubtyping(x: Smi) {
+ const _foo: JSAny = x;
+}
- j = 0;
- try {
- for (;;) {
- if (++j == 10) goto Exit;
- }
+macro IncrementIfSmi<A: type>(x: A): A {
+ typeswitch (x) {
+ case (x: Smi): {
+ return x + 1;
}
- label Exit {
- check(j == 10);
+ case (o: A): {
+ return o;
}
+ }
+}
- // Test if we can handle uninitialized values on the stack.
- let _i: Smi;
- for (let j: Smi = 0; j < 10; ++j) {
+type NumberOrFixedArray = Number|FixedArray;
+macro TypeswitchExample(implicit context: Context)(x: NumberOrFixedArray):
+ int32 {
+ let result: int32 = 0;
+ typeswitch (IncrementIfSmi(x)) {
+ case (_x: FixedArray): {
+ result = result + 1;
+ }
+ case (Number): {
+ result = result + 2;
}
}
- @export
- macro TestSubtyping(x: Smi) {
- const _foo: JSAny = x;
- }
+ result = result * 10;
- macro IncrementIfSmi<A: type>(x: A): A {
- typeswitch (x) {
- case (x: Smi): {
- return x + 1;
- }
- case (o: A): {
- return o;
- }
+ typeswitch (IncrementIfSmi(x)) {
+ case (x: Smi): {
+ result = result + Convert<int32>(x);
}
- }
-
- type NumberOrFixedArray = Number|FixedArray;
- macro TypeswitchExample(implicit context: Context)(x: NumberOrFixedArray):
- int32 {
- let result: int32 = 0;
- typeswitch (IncrementIfSmi(x)) {
- case (_x: FixedArray): {
- result = result + 1;
- }
- case (Number): {
- result = result + 2;
- }
+ case (a: FixedArray): {
+ result = result + Convert<int32>(a.length);
}
-
- result = result * 10;
-
- typeswitch (IncrementIfSmi(x)) {
- case (x: Smi): {
- result = result + Convert<int32>(x);
- }
- case (a: FixedArray): {
- result = result + Convert<int32>(a.length);
- }
- case (_x: HeapNumber): {
- result = result + 7;
- }
+ case (_x: HeapNumber): {
+ result = result + 7;
}
-
- return result;
}
- @export
- macro TestTypeswitch(implicit context: Context)() {
- check(TypeswitchExample(FromConstexpr<Smi>(5)) == 26);
- const a: FixedArray = AllocateZeroedFixedArray(3);
- check(TypeswitchExample(a) == 13);
- check(TypeswitchExample(FromConstexpr<Number>(0.5)) == 27);
- }
+ return result;
+}
- @export
- macro TestTypeswitchAsanLsanFailure(implicit context: Context)(obj: Object) {
- typeswitch (obj) {
- case (_o: Smi): {
- }
- case (_o: JSTypedArray): {
- }
- case (_o: JSReceiver): {
- }
- case (_o: HeapObject): {
- }
- }
- }
+@export
+macro TestTypeswitch(implicit context: Context)() {
+ check(TypeswitchExample(FromConstexpr<Smi>(5)) == 26);
+ const a: FixedArray = AllocateZeroedFixedArray(3);
+ check(TypeswitchExample(a) == 13);
+ check(TypeswitchExample(FromConstexpr<Number>(0.5)) == 27);
+}
- macro ExampleGenericOverload<A: type>(o: Object): A {
- return o;
- }
- macro ExampleGenericOverload<A: type>(o: Smi): A {
- return o + 1;
+@export
+macro TestTypeswitchAsanLsanFailure(implicit context: Context)(obj: Object) {
+ typeswitch (obj) {
+ case (_o: Smi): {
+ }
+ case (_o: JSTypedArray): {
+ }
+ case (_o: JSReceiver): {
+ }
+ case (_o: HeapObject): {
+ }
}
+}
- @export
- macro TestGenericOverload(implicit context: Context)() {
- const xSmi: Smi = 5;
- const xObject: Object = xSmi;
- check(ExampleGenericOverload<Smi>(xSmi) == 6);
- check(UnsafeCast<Smi>(ExampleGenericOverload<Object>(xObject)) == 5);
- }
+macro ExampleGenericOverload<A: type>(o: Object): A {
+ return o;
+}
+macro ExampleGenericOverload<A: type>(o: Smi): A {
+ return o + 1;
+}
- @export
- macro TestEquality(implicit context: Context)() {
- const notEqual: bool =
- AllocateHeapNumberWithValue(0.5) != AllocateHeapNumberWithValue(0.5);
- check(!notEqual);
- const equal: bool =
- AllocateHeapNumberWithValue(0.5) == AllocateHeapNumberWithValue(0.5);
- check(equal);
- }
+@export
+macro TestGenericOverload(implicit context: Context)() {
+ const xSmi: Smi = 5;
+ const xObject: Object = xSmi;
+ check(ExampleGenericOverload<Smi>(xSmi) == 6);
+ check(UnsafeCast<Smi>(ExampleGenericOverload<Object>(xObject)) == 5);
+}
- @export
- macro TestOrAnd(x: bool, y: bool, z: bool): bool {
- return x || y && z ? true : false;
- }
+@export
+macro TestEquality(implicit context: Context)() {
+ const notEqual: bool =
+ AllocateHeapNumberWithValue(0.5) != AllocateHeapNumberWithValue(0.5);
+ check(!notEqual);
+ const equal: bool =
+ AllocateHeapNumberWithValue(0.5) == AllocateHeapNumberWithValue(0.5);
+ check(equal);
+}
- @export
- macro TestAndOr(x: bool, y: bool, z: bool): bool {
- return x && y || z ? true : false;
- }
+@export
+macro TestOrAnd(x: bool, y: bool, z: bool): bool {
+ return x || y && z ? true : false;
+}
- @export
- macro TestLogicalOperators() {
- check(TestAndOr(true, true, true));
- check(TestAndOr(true, true, false));
- check(TestAndOr(true, false, true));
- check(!TestAndOr(true, false, false));
- check(TestAndOr(false, true, true));
- check(!TestAndOr(false, true, false));
- check(TestAndOr(false, false, true));
- check(!TestAndOr(false, false, false));
- check(TestOrAnd(true, true, true));
- check(TestOrAnd(true, true, false));
- check(TestOrAnd(true, false, true));
- check(TestOrAnd(true, false, false));
- check(TestOrAnd(false, true, true));
- check(!TestOrAnd(false, true, false));
- check(!TestOrAnd(false, false, true));
- check(!TestOrAnd(false, false, false));
- }
+@export
+macro TestAndOr(x: bool, y: bool, z: bool): bool {
+ return x && y || z ? true : false;
+}
- @export
- macro TestCall(i: Smi): Smi labels A {
- if (i < 5) return i;
- goto A;
- }
+@export
+macro TestLogicalOperators() {
+ check(TestAndOr(true, true, true));
+ check(TestAndOr(true, true, false));
+ check(TestAndOr(true, false, true));
+ check(!TestAndOr(true, false, false));
+ check(TestAndOr(false, true, true));
+ check(!TestAndOr(false, true, false));
+ check(TestAndOr(false, false, true));
+ check(!TestAndOr(false, false, false));
+ check(TestOrAnd(true, true, true));
+ check(TestOrAnd(true, true, false));
+ check(TestOrAnd(true, false, true));
+ check(TestOrAnd(true, false, false));
+ check(TestOrAnd(false, true, true));
+ check(!TestOrAnd(false, true, false));
+ check(!TestOrAnd(false, false, true));
+ check(!TestOrAnd(false, false, false));
+}
- @export
- macro TestOtherwiseWithCode1() {
- let v: Smi = 0;
- let s: Smi = 1;
- try {
- TestCall(10) otherwise goto B(++s);
- }
- label B(v1: Smi) {
- v = v1;
- }
- assert(v == 2);
- }
+@export
+macro TestCall(i: Smi): Smi labels A {
+ if (i < 5) return i;
+ goto A;
+}
- @export
- macro TestOtherwiseWithCode2() {
- let s: Smi = 0;
- for (let i: Smi = 0; i < 10; ++i) {
- TestCall(i) otherwise break;
- ++s;
- }
- assert(s == 5);
+@export
+macro TestOtherwiseWithCode1() {
+ let v: Smi = 0;
+ let s: Smi = 1;
+ try {
+ TestCall(10) otherwise goto B(++s);
+ } label B(v1: Smi) {
+ v = v1;
}
+ assert(v == 2);
+}
- @export
- macro TestOtherwiseWithCode3() {
- let s: Smi = 0;
- for (let i: Smi = 0; i < 10; ++i) {
- s += TestCall(i) otherwise break;
- }
- assert(s == 10);
+@export
+macro TestOtherwiseWithCode2() {
+ let s: Smi = 0;
+ for (let i: Smi = 0; i < 10; ++i) {
+ TestCall(i) otherwise break;
+ ++s;
}
+ assert(s == 5);
+}
- @export
- macro TestForwardLabel() {
- try {
- goto A;
- }
- label A {
- goto B(5);
- }
- label B(b: Smi) {
- assert(b == 5);
- }
+@export
+macro TestOtherwiseWithCode3() {
+ let s: Smi = 0;
+ for (let i: Smi = 0; i < 10; ++i) {
+ s += TestCall(i) otherwise break;
}
+ assert(s == 10);
+}
- @export
- macro TestQualifiedAccess(implicit context: Context)() {
- const s: Smi = 0;
- check(!Is<JSArray>(s));
+@export
+macro TestForwardLabel() {
+ try {
+ goto A;
+ } label A {
+ goto B(5);
+ } label B(b: Smi) {
+ assert(b == 5);
}
+}
- @export
- macro TestCatch1(implicit context: Context)(): Smi {
- let r: Smi = 0;
- try {
- ThrowTypeError(MessageTemplate::kInvalidArrayLength);
- } catch (_e) {
- r = 1;
- return r;
- }
- }
+@export
+macro TestQualifiedAccess(implicit context: Context)() {
+ const s: Smi = 0;
+ check(!Is<JSArray>(s));
+}
- @export
- macro TestCatch2Wrapper(implicit context: Context)(): never {
+@export
+macro TestCatch1(implicit context: Context)(): Smi {
+ let r: Smi = 0;
+ try {
ThrowTypeError(MessageTemplate::kInvalidArrayLength);
+ } catch (_e) {
+ r = 1;
+ return r;
}
+}
- @export
- macro TestCatch2(implicit context: Context)(): Smi {
- let r: Smi = 0;
- try {
- TestCatch2Wrapper();
- } catch (_e) {
- r = 2;
- return r;
- }
- }
+@export
+macro TestCatch2Wrapper(implicit context: Context)(): never {
+ ThrowTypeError(MessageTemplate::kInvalidArrayLength);
+}
- @export
- macro TestCatch3WrapperWithLabel(implicit context: Context)():
- never labels _Abort {
- ThrowTypeError(MessageTemplate::kInvalidArrayLength);
+@export
+macro TestCatch2(implicit context: Context)(): Smi {
+ let r: Smi = 0;
+ try {
+ TestCatch2Wrapper();
+ } catch (_e) {
+ r = 2;
+ return r;
}
+}
- @export
- macro TestCatch3(implicit context: Context)(): Smi {
- let r: Smi = 0;
- try {
- TestCatch3WrapperWithLabel() otherwise Abort;
- }
- label Abort {
- return -1;
- }
- catch (_e) {
- r = 2;
- return r;
- }
+@export
+macro TestCatch3WrapperWithLabel(implicit context: Context)():
+ never labels _Abort {
+ ThrowTypeError(MessageTemplate::kInvalidArrayLength);
+}
+
+@export
+macro TestCatch3(implicit context: Context)(): Smi {
+ let r: Smi = 0;
+ try {
+ TestCatch3WrapperWithLabel() otherwise Abort;
+ } catch (_e) {
+ r = 2;
+ return r;
+ } label Abort {
+ return -1;
}
+}
- // This test doesn't actually test the functionality of iterators,
- // it's only purpose is to make sure tha the CSA macros in the
- // IteratorBuiltinsAssembler match the signatures provided in
- // iterator.tq.
- @export
- macro TestIterator(implicit context: Context)(o: JSReceiver, map: Map) {
- try {
- const t1: JSAny = iterator::GetIteratorMethod(o);
- const t2: iterator::IteratorRecord = iterator::GetIterator(o);
+// This test doesn't actually test the functionality of iterators,
+// it's only purpose is to make sure tha the CSA macros in the
+// IteratorBuiltinsAssembler match the signatures provided in
+// iterator.tq.
+@export
+transitioning macro TestIterator(implicit context: Context)(
+ o: JSReceiver, map: Map) {
+ try {
+ const t1: JSAny = iterator::GetIteratorMethod(o);
+ const t2: iterator::IteratorRecord = iterator::GetIterator(o);
- const _t3: JSAny = iterator::IteratorStep(t2) otherwise Fail;
- const _t4: JSAny = iterator::IteratorStep(t2, map) otherwise Fail;
+ const _t3: JSAny = iterator::IteratorStep(t2) otherwise Fail;
+ const _t4: JSAny = iterator::IteratorStep(t2, map) otherwise Fail;
- const t5: JSAny = iterator::IteratorValue(o);
- const _t6: JSAny = iterator::IteratorValue(o, map);
+ const _t5: JSAny = iterator::IteratorValue(o);
+ const _t6: JSAny = iterator::IteratorValue(o, map);
- const _t7: JSArray = iterator::IterableToList(t1, t1);
+ const _t7: JSArray = iterator::IterableToList(t1, t1);
- iterator::IteratorCloseOnException(t2, t5);
- }
- label Fail {}
- }
+ iterator::IteratorCloseOnException(t2);
+ } label Fail {}
+}
- @export
- macro TestFrame1(implicit context: Context)() {
- const f: Frame = LoadFramePointer();
- const frameType: FrameType =
- Cast<FrameType>(f.context_or_frame_type) otherwise unreachable;
- assert(frameType == STUB_FRAME);
- assert(f.caller == LoadParentFramePointer());
- typeswitch (f) {
- case (_f: StandardFrame): {
- unreachable;
- }
- case (_f: ArgumentsAdaptorFrame): {
- unreachable;
- }
- case (_f: StubFrame): {
- }
+@export
+macro TestFrame1(implicit context: Context)() {
+ const f: Frame = LoadFramePointer();
+ const frameType: FrameType =
+ Cast<FrameType>(f.context_or_frame_type) otherwise unreachable;
+ assert(frameType == STUB_FRAME);
+ assert(f.caller == LoadParentFramePointer());
+ typeswitch (f) {
+ case (_f: StandardFrame): {
+ unreachable;
}
- }
-
- @export
- macro TestNew(implicit context: Context)() {
- const f: JSArray = NewJSArray();
- check(f.IsEmpty());
- f.length = 0;
- }
-
- struct TestInner {
- macro SetX(newValue: int32) {
- this.x = newValue;
+ case (_f: ArgumentsAdaptorFrame): {
+ unreachable;
}
- macro GetX(): int32 {
- return this.x;
+ case (_f: StubFrame): {
}
- x: int32;
- y: int32;
}
+}
- struct TestOuter {
- a: int32;
- b: TestInner;
- c: int32;
- }
+@export
+macro TestNew(implicit context: Context)() {
+ const f: JSArray = NewJSArray();
+ check(f.IsEmpty());
+ f.length = 0;
+}
- @export
- macro TestStructConstructor(implicit context: Context)() {
- // Test default constructor
- let a: TestOuter = TestOuter{a: 5, b: TestInner{x: 6, y: 7}, c: 8};
- check(a.a == 5);
- check(a.b.x == 6);
- check(a.b.y == 7);
- check(a.c == 8);
- a.b.x = 1;
- check(a.b.x == 1);
- a.b.SetX(2);
- check(a.b.x == 2);
- check(a.b.GetX() == 2);
+struct TestInner {
+ macro SetX(newValue: int32) {
+ this.x = newValue;
}
-
- class InternalClass extends HeapObject {
- macro Flip() labels NotASmi {
- const tmp = Cast<Smi>(this.b) otherwise NotASmi;
- this.b = this.a;
- this.a = tmp;
- }
- a: Smi;
- b: Number;
+ macro GetX(): int32 {
+ return this.x;
}
+ x: int32;
+ y: int32;
+}
- macro NewInternalClass(x: Smi): InternalClass {
- return new InternalClass{a: x, b: x + 1};
- }
+struct TestOuter {
+ a: int32;
+ b: TestInner;
+ c: int32;
+}
- @export
- macro TestInternalClass(implicit context: Context)() {
- const o = NewInternalClass(5);
- o.Flip() otherwise unreachable;
- check(o.a == 6);
- check(o.b == 5);
- }
+@export
+macro TestStructConstructor(implicit context: Context)() {
+ // Test default constructor
+ let a: TestOuter = TestOuter{a: 5, b: TestInner{x: 6, y: 7}, c: 8};
+ check(a.a == 5);
+ check(a.b.x == 6);
+ check(a.b.y == 7);
+ check(a.c == 8);
+ a.b.x = 1;
+ check(a.b.x == 1);
+ a.b.SetX(2);
+ check(a.b.x == 2);
+ check(a.b.GetX() == 2);
+}
- struct StructWithConst {
- macro TestMethod1(): int32 {
- return this.b;
- }
- macro TestMethod2(): Object {
- return this.a;
- }
- a: Object;
- const b: int32;
+class InternalClass extends HeapObject {
+ macro Flip() labels NotASmi {
+ const tmp = Cast<Smi>(this.b) otherwise NotASmi;
+ this.b = this.a;
+ this.a = tmp;
}
+ a: Smi;
+ b: Number;
+}
- @export
- macro TestConstInStructs() {
- const x = StructWithConst{a: Null, b: 1};
- let y = StructWithConst{a: Null, b: 1};
- y.a = Undefined;
- const _copy = x;
+macro NewInternalClass(x: Smi): InternalClass {
+ return new InternalClass{a: x, b: x + 1};
+}
- check(x.TestMethod1() == 1);
- check(x.TestMethod2() == Null);
- }
+@export
+macro TestInternalClass(implicit context: Context)() {
+ const o = NewInternalClass(5);
+ o.Flip() otherwise unreachable;
+ check(o.a == 6);
+ check(o.b == 5);
+}
- @export
- macro TestParentFrameArguments(implicit context: Context)() {
- const parentFrame = LoadParentFramePointer();
- const castFrame = Cast<StandardFrame>(parentFrame) otherwise unreachable;
- const arguments = GetFrameArguments(castFrame, 1);
- ArgumentsIterator{arguments, current: 0};
+struct StructWithConst {
+ macro TestMethod1(): int32 {
+ return this.b;
}
-
- struct TestIterator {
- macro Next(): Object labels NoMore {
- if (this.count-- == 0) goto NoMore;
- return TheHole;
- }
- count: Smi;
+ macro TestMethod2(): Object {
+ return this.a;
}
+ a: Object;
+ const b: int32;
+}
- @export
- macro TestNewFixedArrayFromSpread(implicit context: Context)(): Object {
- let i = TestIterator{count: 5};
- return new FixedArray{map: kFixedArrayMap, length: 5, objects: ...i};
- }
+@export
+macro TestConstInStructs() {
+ const x = StructWithConst{a: Null, b: 1};
+ let y = StructWithConst{a: Null, b: 1};
+ y.a = Undefined;
+ const _copy = x;
- class SmiPair extends HeapObject {
- macro GetA():&Smi {
- return & this.a;
- }
- a: Smi;
- b: Smi;
- }
+ check(x.TestMethod1() == 1);
+ check(x.TestMethod2() == Null);
+}
- macro Swap<T: type>(a:&T, b:&T) {
- const tmp = * a;
- * a = * b;
- * b = tmp;
- }
+@export
+macro TestParentFrameArguments(implicit context: Context)() {
+ const parentFrame = LoadParentFramePointer();
+ const castFrame = Cast<StandardFrame>(parentFrame) otherwise unreachable;
+ const arguments = GetFrameArguments(castFrame, 1);
+ ArgumentsIterator{arguments, current: 0};
+}
- @export
- macro TestReferences() {
- const array = new SmiPair{a: 7, b: 2};
- const ref:&Smi = & array.a;
- * ref = 3 + * ref;
- -- * ref;
- Swap(& array.b, array.GetA());
- check(array.a == 2);
- check(array.b == 9);
+struct TestIterator {
+ macro Next(): Object labels NoMore {
+ if (this.count-- == 0) goto NoMore;
+ return TheHole;
}
+ count: Smi;
+}
- @export
- macro TestSlices() {
- const it = TestIterator{count: 3};
- const a = new FixedArray{map: kFixedArrayMap, length: 3, objects: ...it};
- check(a.length == 3);
+@export
+macro TestNewFixedArrayFromSpread(implicit context: Context)(): Object {
+ let i = TestIterator{count: 5};
+ return new FixedArray{map: kFixedArrayMap, length: 5, objects: ...i};
+}
- const oneTwoThree = Convert<Smi>(123);
- a.objects[0] = oneTwoThree;
- const firstRef:&Object = & a.objects[0];
- check(TaggedEqual(* firstRef, oneTwoThree));
+class SmiPair extends HeapObject {
+ macro GetA():&Smi {
+ return & this.a;
+ }
+ a: Smi;
+ b: Smi;
+}
- const slice: torque_internal::Slice<Object> = & a.objects;
- const firstRefAgain:&Object = slice.TryAtIndex(0) otherwise unreachable;
- check(TaggedEqual(* firstRefAgain, oneTwoThree));
+macro Swap<T: type>(a:&T, b:&T) {
+ const tmp = * a;
+ * a = * b;
+ * b = tmp;
+}
- const threeTwoOne = Convert<Smi>(321);
- * firstRefAgain = threeTwoOne;
- check(TaggedEqual(a.objects[0], threeTwoOne));
+@export
+macro TestReferences() {
+ const array = new SmiPair{a: 7, b: 2};
+ const ref:&Smi = & array.a;
+ * ref = 3 + * ref;
+ -- * ref;
+ Swap(& array.b, array.GetA());
+ check(array.a == 2);
+ check(array.b == 9);
+}
- // *slice; // error, not allowed
- // a.objects; // error, not allowed
- // a.objects = slice; // error, not allowed
+@export
+macro TestSlices() {
+ const it = TestIterator{count: 3};
+ const a = new FixedArray{map: kFixedArrayMap, length: 3, objects: ...it};
+ check(a.length == 3);
- // TODO(gsps): Currently errors, but should be allowed:
- // const _sameSlice: torque_internal::Slice<Object> = &(*slice);
- // (*slice)[0] : Smi
- }
+ const oneTwoThree = Convert<Smi>(123);
+ a.objects[0] = oneTwoThree;
+ const firstRef:&Object = & a.objects[0];
+ check(TaggedEqual(* firstRef, oneTwoThree));
- @export
- macro TestSliceEnumeration(implicit context: Context)(): Undefined {
- const fixedArray: FixedArray = AllocateZeroedFixedArray(3);
- for (let i: intptr = 0; i < 3; i++) {
- check(UnsafeCast<Smi>(fixedArray.objects[i]) == 0);
- fixedArray.objects[i] = Convert<Smi>(i) + 3;
- }
+ const slice: torque_internal::Slice<Object> = & a.objects;
+ const firstRefAgain:&Object = slice.TryAtIndex(0) otherwise unreachable;
+ check(TaggedEqual(* firstRefAgain, oneTwoThree));
- let slice = & fixedArray.objects;
- for (let i: intptr = 0; i < slice.length; i++) {
- let ref = slice.TryAtIndex(i) otherwise unreachable;
- const value = UnsafeCast<Smi>(* ref);
- check(value == Convert<Smi>(i) + 3);
- * ref = value + 4;
- }
+ const threeTwoOne = Convert<Smi>(321);
+ * firstRefAgain = threeTwoOne;
+ check(TaggedEqual(a.objects[0], threeTwoOne));
- let it = slice.Iterator();
- let count: Smi = 0;
- while (true) {
- const value = UnsafeCast<Smi>(it.Next() otherwise break);
- check(value == count + 7);
- count++;
- }
- check(count == 3);
- check(it.Empty());
+ // *slice; // error, not allowed
+ // a.objects; // error, not allowed
+ // a.objects = slice; // error, not allowed
- return Undefined;
- }
+ // TODO(gsps): Currently errors, but should be allowed:
+ // const _sameSlice: torque_internal::Slice<Object> = &(*slice);
+ // (*slice)[0] : Smi
+}
- @export
- macro TestStaticAssert() {
- StaticAssert(1 + 2 == 3);
+@export
+macro TestSliceEnumeration(implicit context: Context)(): Undefined {
+ const fixedArray: FixedArray = AllocateZeroedFixedArray(3);
+ for (let i: intptr = 0; i < 3; i++) {
+ check(UnsafeCast<Smi>(fixedArray.objects[i]) == 0);
+ fixedArray.objects[i] = Convert<Smi>(i) + 3;
}
- class SmiBox extends HeapObject {
- value: Smi;
- unrelated: Smi;
+ let slice = & fixedArray.objects;
+ for (let i: intptr = 0; i < slice.length; i++) {
+ let ref = slice.TryAtIndex(i) otherwise unreachable;
+ const value = UnsafeCast<Smi>(* ref);
+ check(value == Convert<Smi>(i) + 3);
+ * ref = value + 4;
}
- builtin NewSmiBox(implicit context: Context)(value: Smi): SmiBox {
- return new SmiBox{value, unrelated: 0};
+ let it = slice.Iterator();
+ let count: Smi = 0;
+ while (true) {
+ const value = UnsafeCast<Smi>(it.Next() otherwise break);
+ check(value == count + 7);
+ count++;
}
+ check(count == 3);
+ check(it.Empty());
- @export
- macro TestLoadEliminationFixed(implicit context: Context)() {
- const box = NewSmiBox(123);
- const v1 = box.value;
- box.unrelated = 999;
- const v2 = (box.unrelated == 0) ? box.value : box.value;
- StaticAssert(TaggedEqual(v1, v2));
-
- box.value = 11;
- const v3 = box.value;
- const eleven: Smi = 11;
- StaticAssert(TaggedEqual(v3, eleven));
- }
+ return Undefined;
+}
- @export
- macro TestLoadEliminationVariable(implicit context: Context)() {
- const a = UnsafeCast<FixedArray>(kEmptyFixedArray);
- const box = NewSmiBox(1);
- const v1 = a.objects[box.value];
- const u1 = a.objects[box.value + 2];
- const v2 = a.objects[box.value];
- const u2 = a.objects[box.value + 2];
- StaticAssert(TaggedEqual(v1, v2));
- StaticAssert(TaggedEqual(u1, u2));
- }
+@export
+macro TestStaticAssert() {
+ StaticAssert(1 + 2 == 3);
+}
+
+class SmiBox extends HeapObject {
+ value: Smi;
+ unrelated: Smi;
+}
+
+builtin NewSmiBox(implicit context: Context)(value: Smi): SmiBox {
+ return new SmiBox{value, unrelated: 0};
+}
+
+@export
+macro TestLoadEliminationFixed(implicit context: Context)() {
+ const box = NewSmiBox(123);
+ const v1 = box.value;
+ box.unrelated = 999;
+ const v2 = (box.unrelated == 0) ? box.value : box.value;
+ StaticAssert(TaggedEqual(v1, v2));
+
+ box.value = 11;
+ const v3 = box.value;
+ const eleven: Smi = 11;
+ StaticAssert(TaggedEqual(v3, eleven));
+}
+
+@export
+macro TestLoadEliminationVariable(implicit context: Context)() {
+ const a = UnsafeCast<FixedArray>(kEmptyFixedArray);
+ const box = NewSmiBox(1);
+ const v1 = a.objects[box.value];
+ const u1 = a.objects[box.value + 2];
+ const v2 = a.objects[box.value];
+ const u2 = a.objects[box.value + 2];
+ StaticAssert(TaggedEqual(v1, v2));
+ StaticAssert(TaggedEqual(u1, u2));
+}
- @export
- macro TestRedundantArrayElementCheck(implicit context: Context)(): Smi {
- const a = kEmptyFixedArray;
- for (let i: Smi = 0; i < a.length; i++) {
+@export
+macro TestRedundantArrayElementCheck(implicit context: Context)(): Smi {
+ const a = kEmptyFixedArray;
+ for (let i: Smi = 0; i < a.length; i++) {
+ if (a.objects[i] == TheHole) {
if (a.objects[i] == TheHole) {
- if (a.objects[i] == TheHole) {
- return -1;
- } else {
- StaticAssert(false);
- }
+ return -1;
+ } else {
+ StaticAssert(false);
}
}
- return 1;
}
+ return 1;
+}
- @export
- macro TestRedundantSmiCheck(implicit context: Context)(): Smi {
- const a = kEmptyFixedArray;
- const x = a.objects[1];
- typeswitch (x) {
- case (Smi): {
- Cast<Smi>(x) otherwise VerifiedUnreachable();
- return -1;
- }
- case (Object): {
- }
+@export
+macro TestRedundantSmiCheck(implicit context: Context)(): Smi {
+ const a = kEmptyFixedArray;
+ const x = a.objects[1];
+ typeswitch (x) {
+ case (Smi): {
+ Cast<Smi>(x) otherwise VerifiedUnreachable();
+ return -1;
+ }
+ case (Object): {
}
- return 1;
}
+ return 1;
+}
- struct SBox<T: type> {
- value: T;
- }
+struct SBox<T: type> {
+ value: T;
+}
- @export
- macro TestGenericStruct1(): intptr {
- const i: intptr = 123;
- let box = SBox{value: i};
- let boxbox: SBox<SBox<intptr>> = SBox{value: box};
- check(box.value == 123);
- boxbox.value.value *= 2;
- check(boxbox.value.value == 246);
- return boxbox.value.value;
- }
+@export
+macro TestGenericStruct1(): intptr {
+ const i: intptr = 123;
+ let box = SBox{value: i};
+ let boxbox: SBox<SBox<intptr>> = SBox{value: box};
+ check(box.value == 123);
+ boxbox.value.value *= 2;
+ check(boxbox.value.value == 246);
+ return boxbox.value.value;
+}
- struct TestTuple<T1: type, T2: type> {
- const fst: T1;
- const snd: T2;
- }
+struct TestTuple<T1: type, T2: type> {
+ const fst: T1;
+ const snd: T2;
+}
- macro TupleSwap<T1: type, T2: type>(tuple: TestTuple<T1, T2>):
- TestTuple<T2, T1> {
- return TestTuple{fst: tuple.snd, snd: tuple.fst};
- }
+macro TupleSwap<T1: type, T2: type>(tuple: TestTuple<T1, T2>):
+ TestTuple<T2, T1> {
+ return TestTuple{fst: tuple.snd, snd: tuple.fst};
+}
- @export
- macro TestGenericStruct2():
- TestTuple<TestTuple<intptr, Smi>, TestTuple<Smi, intptr>> {
- const intptrAndSmi = TestTuple<intptr, Smi>{fst: 1, snd: 2};
- const smiAndIntptr = TupleSwap(intptrAndSmi);
- check(intptrAndSmi.fst == smiAndIntptr.snd);
- check(intptrAndSmi.snd == smiAndIntptr.fst);
- const tupleTuple =
- TestTuple<TestTuple<intptr, Smi>>{fst: intptrAndSmi, snd: smiAndIntptr};
- return tupleTuple;
- }
+@export
+macro TestGenericStruct2():
+ TestTuple<TestTuple<intptr, Smi>, TestTuple<Smi, intptr>> {
+ const intptrAndSmi = TestTuple<intptr, Smi>{fst: 1, snd: 2};
+ const smiAndIntptr = TupleSwap(intptrAndSmi);
+ check(intptrAndSmi.fst == smiAndIntptr.snd);
+ check(intptrAndSmi.snd == smiAndIntptr.fst);
+ const tupleTuple =
+ TestTuple<TestTuple<intptr, Smi>>{fst: intptrAndSmi, snd: smiAndIntptr};
+ return tupleTuple;
+}
- macro BranchAndWriteResult(x: Smi, box: SmiBox): bool {
- if (x > 5 || x < 0) {
- box.value = 1;
- return true;
- } else {
- box.value = 2;
- return false;
- }
+macro BranchAndWriteResult(x: Smi, box: SmiBox): bool {
+ if (x > 5 || x < 0) {
+ box.value = 1;
+ return true;
+ } else {
+ box.value = 2;
+ return false;
}
+}
- @export
- macro TestBranchOnBoolOptimization(implicit context: Context)(input: Smi) {
- const box = NewSmiBox(1);
- // If the two branches get combined into one, we should be able to determine
- // the value of {box} statically.
- if (BranchAndWriteResult(input, box)) {
- StaticAssert(box.value == 1);
- } else {
- StaticAssert(box.value == 2);
- }
+@export
+macro TestBranchOnBoolOptimization(implicit context: Context)(input: Smi) {
+ const box = NewSmiBox(1);
+ // If the two branches get combined into one, we should be able to determine
+ // the value of {box} statically.
+ if (BranchAndWriteResult(input, box)) {
+ StaticAssert(box.value == 1);
+ } else {
+ StaticAssert(box.value == 2);
}
+}
- bitfield struct TestBitFieldStruct extends uint8 {
- a: bool: 1 bit;
- b: uint16: 3 bit;
- c: uint32: 3 bit;
- d: bool: 1 bit;
- }
+bitfield struct TestBitFieldStruct extends uint8 {
+ a: bool: 1 bit;
+ b: uint16: 3 bit;
+ c: uint32: 3 bit;
+ d: bool: 1 bit;
+}
- @export
- macro TestBitFieldLoad(
- val: TestBitFieldStruct, expectedA: bool, expectedB: uint16,
- expectedC: uint32, expectedD: bool) {
- check(val.a == expectedA);
- check(val.b == expectedB);
- check(val.c == expectedC);
- check(val.d == expectedD);
- }
+@export
+macro TestBitFieldLoad(
+ val: TestBitFieldStruct, expectedA: bool, expectedB: uint16,
+ expectedC: uint32, expectedD: bool) {
+ check(val.a == expectedA);
+ check(val.b == expectedB);
+ check(val.c == expectedC);
+ check(val.d == expectedD);
+}
- @export
- macro TestBitFieldStore(val: TestBitFieldStruct) {
- let val: TestBitFieldStruct = val; // Get a mutable local copy.
- const a: bool = val.a;
- const b: uint16 = val.b;
- let c: uint32 = val.c;
- const d: bool = val.d;
+@export
+macro TestBitFieldStore(val: TestBitFieldStruct) {
+ let val: TestBitFieldStruct = val; // Get a mutable local copy.
+ const a: bool = val.a;
+ const b: uint16 = val.b;
+ let c: uint32 = val.c;
+ const d: bool = val.d;
- val.a = !a;
- TestBitFieldLoad(val, !a, b, c, d);
+ val.a = !a;
+ TestBitFieldLoad(val, !a, b, c, d);
- c = Unsigned(7 - Signed(val.c));
- val.c = c;
- TestBitFieldLoad(val, !a, b, c, d);
+ c = Unsigned(7 - Signed(val.c));
+ val.c = c;
+ TestBitFieldLoad(val, !a, b, c, d);
- val.d = val.b == val.c;
- TestBitFieldLoad(val, !a, b, c, b == c);
- }
+ val.d = val.b == val.c;
+ TestBitFieldLoad(val, !a, b, c, b == c);
+}
- // Some other bitfield structs, to verify getting uintptr values out of word32
- // structs and vice versa.
- bitfield struct TestBitFieldStruct2 extends uint32 {
- a: uintptr: 5 bit;
- b: uintptr: 6 bit;
- }
- bitfield struct TestBitFieldStruct3 extends uintptr {
- c: bool: 1 bit;
- d: uint32: 9 bit;
- e: uintptr: 17 bit;
- }
+@export
+macro TestBitFieldInit(a: bool, b: uint16, c: uint32, d: bool) {
+ const val: TestBitFieldStruct = TestBitFieldStruct{a: a, b: b, c: c, d: d};
+ TestBitFieldLoad(val, a, b, c, d);
+}
- @export
- macro TestBitFieldUintptrOps(
- val2: TestBitFieldStruct2, val3: TestBitFieldStruct3) {
- let val2: TestBitFieldStruct2 = val2; // Get a mutable local copy.
- let val3: TestBitFieldStruct3 = val3; // Get a mutable local copy.
-
- // Caller is expected to provide these exact values, so we can verify
- // reading values before starting to write anything.
- check(val2.a == 3);
- check(val2.b == 61);
- check(val3.c);
- check(val3.d == 500);
- check(val3.e == 0x1cc);
-
- val2.b = 16;
- check(val2.a == 3);
- check(val2.b == 16);
-
- val2.b++;
- check(val2.a == 3);
- check(val2.b == 17);
-
- val3.d = 99;
- val3.e = 1234;
- check(val3.c);
- check(val3.d == 99);
- check(val3.e == 1234);
- }
+// Some other bitfield structs, to verify getting uintptr values out of word32
+// structs and vice versa.
+bitfield struct TestBitFieldStruct2 extends uint32 {
+ a: uintptr: 5 bit;
+ b: uintptr: 6 bit;
+}
+bitfield struct TestBitFieldStruct3 extends uintptr {
+ c: bool: 1 bit;
+ d: uint32: 9 bit;
+ e: uintptr: 17 bit;
+}
- @export
- class ExportedSubClass extends ExportedSubClassBase {
- c_field: int32;
- d_field: int32;
- e_field: Smi;
- }
+@export
+macro TestBitFieldUintptrOps(
+ val2: TestBitFieldStruct2, val3: TestBitFieldStruct3) {
+ let val2: TestBitFieldStruct2 = val2; // Get a mutable local copy.
+ let val3: TestBitFieldStruct3 = val3; // Get a mutable local copy.
+
+ // Caller is expected to provide these exact values, so we can verify
+ // reading values before starting to write anything.
+ check(val2.a == 3);
+ check(val2.b == 61);
+ check(val3.c);
+ check(val3.d == 500);
+ check(val3.e == 0x1cc);
+
+ val2.b = 16;
+ check(val2.a == 3);
+ check(val2.b == 16);
+
+ val2.b++;
+ check(val2.a == 3);
+ check(val2.b == 17);
+
+ val3.d = 99;
+ val3.e = 1234;
+ check(val3.c);
+ check(val3.d == 99);
+ check(val3.e == 1234);
+}
- @export
- class ExportedSubClassBase extends HeapObject {
- a: HeapObject;
- b: HeapObject;
- }
+@export
+class ExportedSubClass extends ExportedSubClassBase {
+ c_field: int32;
+ d_field: int32;
+ e_field: Smi;
+}
- class InternalClassWithSmiElements extends FixedArrayBase {
- data: Smi;
- object: Oddball;
- entries[length]: Smi;
- }
+@export
+class ExportedSubClassBase extends HeapObject {
+ a: HeapObject;
+ b: HeapObject;
+}
- struct InternalClassStructElement {
- a: Smi;
- b: Smi;
- }
+@abstract
+class AbstractInternalClass extends HeapObject {
+}
- class InternalClassWithStructElements extends HeapObject {
- dummy1: int32;
- dummy2: int32;
- const count: Smi;
- data: Smi;
- object: Object;
- entries[count]: Smi;
- more_entries[count]: InternalClassStructElement;
- }
+class AbstractInternalClassSubclass1 extends AbstractInternalClass {}
- struct SmiGeneratorIterator {
- macro Next(): Smi labels _NoMore {
- return this.value++;
- }
- value: Smi;
- }
+class AbstractInternalClassSubclass2 extends AbstractInternalClass {}
- struct InternalClassStructElementGeneratorIterator {
- macro Next(): InternalClassStructElement labels _NoMore {
- return InternalClassStructElement{a: this.value++, b: this.value++};
- }
- value: Smi;
- }
+class InternalClassWithSmiElements extends FixedArrayBase {
+ data: Smi;
+ object: Oddball;
+ entries[length]: Smi;
+}
- @export
- macro TestFullyGeneratedClassWithElements() {
- // Test creation, initialization and access of a fully generated class with
- // simple (Smi) elements
- const length: Smi = Convert<Smi>(3);
- const object1 = new InternalClassWithSmiElements{
- length,
- data: 0,
- object: Undefined,
- entries: ...SmiGeneratorIterator {
- value: 11
- }
- };
- assert(object1.length == 3);
- assert(object1.data == 0);
- assert(object1.object == Undefined);
- assert(object1.entries[0] == 11);
- assert(object1.entries[1] == 12);
- assert(object1.entries[2] == 13);
-
- // Test creation, initialization and access of a fully generated class
- // with elements that are a struct.
- const object2 = new InternalClassWithStructElements{
- dummy1: 44,
- dummy2: 45,
- count: length,
- data: 55,
- object: Undefined,
- entries: ...SmiGeneratorIterator{value: 3},
- more_entries: ...InternalClassStructElementGeneratorIterator {
- value: 1
- }
- };
-
- assert(object2.dummy1 == 44);
- assert(object2.dummy2 == 45);
- assert(object2.count == 3);
- assert(object2.data == 55);
- assert(object2.object == Undefined);
- assert(object2.entries[0] == 3);
- assert(object2.entries[1] == 4);
- assert(object2.entries[2] == 5);
- assert(object2.more_entries[0].a == 1);
- assert(object2.more_entries[0].b == 2);
- assert(object2.more_entries[1].a == 3);
- assert(object2.more_entries[1].b == 4);
- assert(object2.more_entries[2].a == 5);
- assert(object2.more_entries[2].b == 6);
+struct InternalClassStructElement {
+ a: Smi;
+ b: Smi;
+}
+
+class InternalClassWithStructElements extends HeapObject {
+ dummy1: int32;
+ dummy2: int32;
+ const count: Smi;
+ data: Smi;
+ object: Object;
+ entries[count]: Smi;
+ more_entries[count]: InternalClassStructElement;
+}
+
+struct SmiGeneratorIterator {
+ macro Next(): Smi labels _NoMore {
+ return this.value++;
}
+ value: Smi;
+}
- @export
- macro TestFullyGeneratedClassFromCpp(): ExportedSubClass {
- return new
- ExportedSubClass{a: Null, b: Null, c_field: 7, d_field: 8, e_field: 9};
+struct InternalClassStructElementGeneratorIterator {
+ macro Next(): InternalClassStructElement labels _NoMore {
+ return InternalClassStructElement{a: this.value++, b: this.value++};
}
+ value: Smi;
+}
+
+@export
+macro TestFullyGeneratedClassWithElements() {
+ // Test creation, initialization and access of a fully generated class with
+ // simple (Smi) elements
+ const length: Smi = Convert<Smi>(3);
+ const object1 = new InternalClassWithSmiElements{
+ length,
+ data: 0,
+ object: Undefined,
+ entries: ...SmiGeneratorIterator {
+ value: 11
+ }
+ };
+ assert(object1.length == 3);
+ assert(object1.data == 0);
+ assert(object1.object == Undefined);
+ assert(object1.entries[0] == 11);
+ assert(object1.entries[1] == 12);
+ assert(object1.entries[2] == 13);
+
+ // Test creation, initialization and access of a fully generated class
+ // with elements that are a struct.
+ const object2 = new InternalClassWithStructElements{
+ dummy1: 44,
+ dummy2: 45,
+ count: length,
+ data: 55,
+ object: Undefined,
+ entries: ...SmiGeneratorIterator{value: 3},
+ more_entries: ...InternalClassStructElementGeneratorIterator {
+ value: 1
+ }
+ };
+
+ assert(object2.dummy1 == 44);
+ assert(object2.dummy2 == 45);
+ assert(object2.count == 3);
+ assert(object2.data == 55);
+ assert(object2.object == Undefined);
+ assert(object2.entries[0] == 3);
+ assert(object2.entries[1] == 4);
+ assert(object2.entries[2] == 5);
+ assert(object2.more_entries[0].a == 1);
+ assert(object2.more_entries[0].b == 2);
+ assert(object2.more_entries[1].a == 3);
+ assert(object2.more_entries[1].b == 4);
+ assert(object2.more_entries[2].a == 5);
+ assert(object2.more_entries[2].b == 6);
+}
+
+@export
+macro TestFullyGeneratedClassFromCpp(): ExportedSubClass {
+ return new
+ ExportedSubClass{a: Null, b: Null, c_field: 7, d_field: 8, e_field: 9};
+}
}