Home | History | Annotate | Download | only in interpreter
      1 // Copyright 2016 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/v8.h"
      6 
      7 #include "src/interpreter/source-position-table.h"
      8 #include "test/unittests/test-utils.h"
      9 
     10 namespace v8 {
     11 namespace internal {
     12 namespace interpreter {
     13 
     14 class SourcePositionTableTest : public TestWithIsolateAndZone {
     15  public:
     16   SourcePositionTableTest() {}
     17   ~SourcePositionTableTest() override {}
     18 };
     19 
     20 // Some random offsets, mostly at 'suspicious' bit boundaries.
     21 static int offsets[] = {0,   1,   2,    3,    4,     30,      31,  32,
     22                         33,  62,  63,   64,   65,    126,     127, 128,
     23                         129, 250, 1000, 9999, 12000, 31415926};
     24 
     25 TEST_F(SourcePositionTableTest, EncodeStatement) {
     26   SourcePositionTableBuilder builder(isolate(), zone());
     27   for (int i = 0; i < arraysize(offsets); i++) {
     28     builder.AddPosition(offsets[i], offsets[i], true);
     29   }
     30 
     31   // To test correctness, we rely on the assertions in ToSourcePositionTable().
     32   // (Also below.)
     33   CHECK(!builder.ToSourcePositionTable().is_null());
     34 }
     35 
     36 TEST_F(SourcePositionTableTest, EncodeStatementDuplicates) {
     37   SourcePositionTableBuilder builder(isolate(), zone());
     38   for (int i = 0; i < arraysize(offsets); i++) {
     39     builder.AddPosition(offsets[i], offsets[i], true);
     40     builder.AddPosition(offsets[i], offsets[i] + 1, true);
     41   }
     42 
     43   // To test correctness, we rely on the assertions in ToSourcePositionTable().
     44   // (Also below.)
     45   CHECK(!builder.ToSourcePositionTable().is_null());
     46 }
     47 
     48 TEST_F(SourcePositionTableTest, EncodeExpression) {
     49   SourcePositionTableBuilder builder(isolate(), zone());
     50   for (int i = 0; i < arraysize(offsets); i++) {
     51     builder.AddPosition(offsets[i], offsets[i], false);
     52   }
     53   CHECK(!builder.ToSourcePositionTable().is_null());
     54 }
     55 
     56 TEST_F(SourcePositionTableTest, EncodeAscending) {
     57   SourcePositionTableBuilder builder(isolate(), zone());
     58 
     59   int code_offset = 0;
     60   int source_position = 0;
     61   for (int i = 0; i < arraysize(offsets); i++) {
     62     code_offset += offsets[i];
     63     source_position += offsets[i];
     64     if (i % 2) {
     65       builder.AddPosition(code_offset, source_position, true);
     66     } else {
     67       builder.AddPosition(code_offset, source_position, false);
     68     }
     69   }
     70 
     71   // Also test negative offsets for source positions:
     72   for (int i = 0; i < arraysize(offsets); i++) {
     73     code_offset += offsets[i];
     74     source_position -= offsets[i];
     75     if (i % 2) {
     76       builder.AddPosition(code_offset, source_position, true);
     77     } else {
     78       builder.AddPosition(code_offset, source_position, false);
     79     }
     80   }
     81 
     82   CHECK(!builder.ToSourcePositionTable().is_null());
     83 }
     84 
     85 }  // namespace interpreter
     86 }  // namespace internal
     87 }  // namespace v8
     88