CHECK(!memcmp(dst, expected, act_len)); \
delete[] dst;
+#define CHECK_OTAG(is_set) \
+ if (is_set) \
+ CHECK(norm.is_opening_tag_seen()); \
+ else \
+ CHECK(!norm.is_opening_tag_seen());
+
#define NORMALIZE_L(src, src_len, dst, dst_len, depth, ret, ptr, len) \
{ \
"var b = 2;\r\n";
static const char unexpected_tag_expected0[] =
- "var a=1;";
-
-static const char unexpected_tag_expected0_ext[] =
- "var a=1;";
+ "var a=1;<script>var b=2;";
static const char unexpected_tag_buf1[] =
"var a = 1;\n"
"var b = 2;\r\n";
static const char unexpected_tag_expected1[] =
- "var a=1;";
-
-static const char unexpected_tag_expected1_ext[] =
- "var a=1;";
+ "var a=1;<script type=application/javascript>var b=2;";
static const char unexpected_tag_buf2[] =
"var a = 1;\n"
"var b = 2;\r\n";
static const char unexpected_tag_expected2[] =
- "var a=1;var str='";
-
-static const char unexpected_tag_expected2_ext[] =
"var a=1;var str='<script> something';var b=2;";
static const char unexpected_tag_buf3[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected3[] =
- "var a=1;var str='something ";
-
-static const char unexpected_tag_expected3_ext[] =
"var a=1;var str='something <script> something';var b=2;";
static const char unexpected_tag_buf4[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected4[] =
- "var a=1;var str='something ";
-
-static const char unexpected_tag_expected4_ext[] =
"var a=1;var str='something <script>';var b=2;";
static const char unexpected_tag_buf5[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected8[] =
- "var a=1;var str='something \\";
-
-static const char unexpected_tag_expected8_ext[] =
"var a=1;var str='something \\<script> something';var b=2;";
static const char unexpected_tag_buf9[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected10[] =
- "var a=1;";
-
-static const char unexpected_tag_expected10_ext[] =
"var a=1;var b=2;";
static const char unexpected_tag_buf11[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected11[] =
- "var a=1;";
-
-static const char unexpected_tag_expected11_ext[] =
"var a=1;var b=2;";
static const char unexpected_tag_buf12[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected12[] =
- "var a=1;";
-
-static const char unexpected_tag_expected12_ext[] =
"var a=1;var b=2;";
static const char unexpected_tag_buf13[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected13[] =
- "var a=1;";
-
-static const char unexpected_tag_expected13_ext[] =
"var a=1;var b=2;";
static const char unexpected_tag_buf14[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected14[] =
- "var a=1;";
-
-static const char unexpected_tag_expected14_ext[] =
"var a=1;var b=2;";
static const char unexpected_tag_buf15[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected15[] =
- "var a=1;";
-
-static const char unexpected_tag_expected15_ext[] =
"var a=1;var b=2;";
static const char unexpected_tag_buf16[] =
static const char unexpected_tag_expected22[] =
"var a=1;var str='script somescript /script something';var b=2;";
-static const char unexpected_tag_expected22_ext[] =
- "var a=1;var str='script somescript /script something';var b=2;";
-
static const char unexpected_tag_buf23[] =
"var a = 1;\n"
"var str = 'script somescript /script something <script>';\n"
"var b = 2;\r\n";
static const char unexpected_tag_expected23[] =
- "var a=1;var str='script somescript /script something ";
-
-static const char unexpected_tag_expected23_ext[] =
"var a=1;var str='script somescript /script something <script>';var b=2;";
static const char unexpected_tag_buf24[] =
"var b = 2;\r\n";
static const char unexpected_tag_expected24[] =
- "var a=1;var str='something ";
-
-static const char unexpected_tag_expected24_ext[] =
"var a=1;var str='something <sCrIpT>';var b=2;";
+static const char unexpected_tag_buf25[] =
+ "var template = ` <script> ` ;";
+
+static const char unexpected_tag_expected25[] =
+ "var template=` <script> `;";
+
+static const char unexpected_tag_buf26[] =
+ "var regex = / <script> / ;";
+
+static const char unexpected_tag_expected26[] =
+ "var regex=/ <script> /;";
+
TEST_CASE("nested script tags", "[JSNormalizer]")
{
SECTION("explicit open tag - simple")
{
NORMALIZE(unexpected_tag_buf0);
- VALIDATE_FAIL(unexpected_tag_buf0, unexpected_tag_expected0, JSTokenizer::OPENING_TAG, 19);
+ VALIDATE(unexpected_tag_buf0, unexpected_tag_expected0);
+ CHECK_OTAG(true);
}
SECTION("explicit open tag - complex")
{
NORMALIZE(unexpected_tag_buf1);
- VALIDATE_FAIL(unexpected_tag_buf1, unexpected_tag_expected1, JSTokenizer::OPENING_TAG, 19);
+ VALIDATE(unexpected_tag_buf1, unexpected_tag_expected1);
+ CHECK_OTAG(true);
}
SECTION("open tag within literal - start")
{
NORMALIZE(unexpected_tag_buf2);
- VALIDATE_FAIL(unexpected_tag_buf2, unexpected_tag_expected2, JSTokenizer::OPENING_TAG, 30);
+ VALIDATE(unexpected_tag_buf2, unexpected_tag_expected2);
+ CHECK_OTAG(true);
}
SECTION("open tag within literal - mid")
{
NORMALIZE(unexpected_tag_buf3);
- VALIDATE_FAIL(unexpected_tag_buf3, unexpected_tag_expected3, JSTokenizer::OPENING_TAG, 40);
+ VALIDATE(unexpected_tag_buf3, unexpected_tag_expected3);
+ CHECK_OTAG(true);
}
SECTION("open tag within literal - end")
{
NORMALIZE(unexpected_tag_buf4);
- VALIDATE_FAIL(unexpected_tag_buf4, unexpected_tag_expected4, JSTokenizer::OPENING_TAG, 40);
+ VALIDATE(unexpected_tag_buf4, unexpected_tag_expected4);
+ CHECK_OTAG(true);
}
SECTION("close tag within literal - start")
{
SECTION("open tag within literal - escaped")
{
NORMALIZE(unexpected_tag_buf8);
- VALIDATE_FAIL(unexpected_tag_buf8, unexpected_tag_expected8, JSTokenizer::OPENING_TAG, 41);
+ VALIDATE(unexpected_tag_buf8, unexpected_tag_expected8);
+ CHECK_OTAG(true);
}
SECTION("close tag within literal - escaped")
{
SECTION("open tag within single-line comment - start")
{
NORMALIZE(unexpected_tag_buf10);
- VALIDATE_FAIL(unexpected_tag_buf10, unexpected_tag_expected10, JSTokenizer::OPENING_TAG, 20);
+ VALIDATE(unexpected_tag_buf10, unexpected_tag_expected10);
+ CHECK_OTAG(true);
}
SECTION("open tag within single-line comment - mid")
{
NORMALIZE(unexpected_tag_buf11);
- VALIDATE_FAIL(unexpected_tag_buf11, unexpected_tag_expected11, JSTokenizer::OPENING_TAG, 30);
+ VALIDATE(unexpected_tag_buf11, unexpected_tag_expected11);
+ CHECK_OTAG(true);
}
SECTION("open tag within single-line comment - end")
{
NORMALIZE(unexpected_tag_buf12);
- VALIDATE_FAIL(unexpected_tag_buf12, unexpected_tag_expected12, JSTokenizer::OPENING_TAG, 30);
+ VALIDATE(unexpected_tag_buf12, unexpected_tag_expected12);
+ CHECK_OTAG(true);
}
SECTION("open tag within multi-line comment - start")
{
NORMALIZE(unexpected_tag_buf13);
- VALIDATE_FAIL(unexpected_tag_buf13, unexpected_tag_expected13, JSTokenizer::OPENING_TAG, 20);
+ VALIDATE(unexpected_tag_buf13, unexpected_tag_expected13);
+ CHECK_OTAG(true);
}
SECTION("open tag within multi-line comment - mid")
{
NORMALIZE(unexpected_tag_buf14);
- VALIDATE_FAIL(unexpected_tag_buf14, unexpected_tag_expected14, JSTokenizer::OPENING_TAG, 30);
+ VALIDATE(unexpected_tag_buf14, unexpected_tag_expected14);
+ CHECK_OTAG(true);
}
SECTION("open tag within multi-line comment - end")
{
NORMALIZE(unexpected_tag_buf15);
- VALIDATE_FAIL(unexpected_tag_buf15, unexpected_tag_expected15, JSTokenizer::OPENING_TAG, 30);
+ VALIDATE(unexpected_tag_buf15, unexpected_tag_expected15);
+ CHECK_OTAG(true);
}
SECTION("close tag within single-line comment - start")
{
SECTION("multiple patterns - matched")
{
NORMALIZE(unexpected_tag_buf23);
- VALIDATE_FAIL(unexpected_tag_buf23, unexpected_tag_expected23, JSTokenizer::OPENING_TAG, 66);
+ VALIDATE(unexpected_tag_buf23, unexpected_tag_expected23);
+ CHECK_OTAG(true);
}
SECTION("mixed lower and upper case")
{
NORMALIZE(unexpected_tag_buf24);
- VALIDATE_FAIL(unexpected_tag_buf24, unexpected_tag_expected24, JSTokenizer::OPENING_TAG, 40);
+ VALIDATE(unexpected_tag_buf24, unexpected_tag_expected24);
+ CHECK_OTAG(true);
+ }
+ SECTION("opening tag within template literal")
+ {
+ NORMALIZE(unexpected_tag_buf25);
+ VALIDATE(unexpected_tag_buf25, unexpected_tag_expected25);
+ CHECK_OTAG(true);
+ }
+ SECTION("opening tag within regex literal")
+ {
+ NORMALIZE(unexpected_tag_buf26);
+ VALIDATE(unexpected_tag_buf26, unexpected_tag_expected26);
+ CHECK_OTAG(true);
}
}
NORMALIZE(src);
VALIDATE(src, exp);
+ CHECK_OTAG(false);
}
SECTION("valid 1")
{
NORMALIZE(src);
VALIDATE(src, exp);
+ CHECK_OTAG(false);
}
SECTION("valid 2")
{
NORMALIZE(src);
VALIDATE(src, exp);
+ CHECK_OTAG(false);
}
SECTION("tabulation")
{
const char src[] = "<script\x9";
- const char exp[] = "";
+ const char exp[] = "<script";
NORMALIZE(src);
- VALIDATE_FAIL(src, exp, JSTokenizer::OPENING_TAG, 8);
+ VALIDATE(src, exp);
+ CHECK_OTAG(true);
}
SECTION("line feed")
{
const char src[] = "<script\xA";
- const char exp[] = "";
+ const char exp[] = "<script";
NORMALIZE(src);
- VALIDATE_FAIL(src, exp, JSTokenizer::OPENING_TAG, 8);
+ VALIDATE(src, exp);
+ CHECK_OTAG(true);
}
SECTION("form feed")
{
const char src[] = "<script\xC";
- const char exp[] = "";
+ const char exp[] = "<script";
NORMALIZE(src);
- VALIDATE_FAIL(src, exp, JSTokenizer::OPENING_TAG, 8);
+ VALIDATE(src, exp);
+ CHECK_OTAG(true);
}
SECTION("space")
{
const char src[] = "<script\x20";
- const char exp[] = "";
+ const char exp[] = "<script";
NORMALIZE(src);
- VALIDATE_FAIL(src, exp, JSTokenizer::OPENING_TAG, 8);
+ VALIDATE(src, exp);
+ CHECK_OTAG(true);
}
SECTION("solidus")
{
const char src[] = "<script\x2F";
- const char exp[] = "";
+ const char exp[] = "<script\x2F";
NORMALIZE(src);
- VALIDATE_FAIL(src, exp, JSTokenizer::OPENING_TAG, 8);
+ VALIDATE(src, exp);
+ CHECK_OTAG(true);
}
SECTION("greater than")
{
const char src[] = "<script\x3E";
- const char exp[] = "";
+ const char exp[] = "<script\x3E";
NORMALIZE(src);
- VALIDATE_FAIL(src, exp, JSTokenizer::OPENING_TAG, 8);
+ VALIDATE(src, exp);
+ CHECK_OTAG(true);
}
}
SECTION("explicit open tag - simple")
{
NORMALIZE_EXT(unexpected_tag_buf0);
- VALIDATE_FAIL(unexpected_tag_buf0, unexpected_tag_expected0_ext, JSTokenizer::OPENING_TAG, 19);
+ VALIDATE(unexpected_tag_buf0, unexpected_tag_expected0);
+ CHECK_OTAG(false);
}
SECTION("explicit open tag - complex")
{
NORMALIZE_EXT(unexpected_tag_buf1);
- VALIDATE_FAIL(unexpected_tag_buf1, unexpected_tag_expected1_ext, JSTokenizer::OPENING_TAG, 19);
+ VALIDATE(unexpected_tag_buf1, unexpected_tag_expected1);
+ CHECK_OTAG(false);
}
SECTION("open tag within literal - start")
{
NORMALIZE_EXT(unexpected_tag_buf2);
- VALIDATE(unexpected_tag_buf2, unexpected_tag_expected2_ext);
+ VALIDATE(unexpected_tag_buf2, unexpected_tag_expected2);
+ CHECK_OTAG(false);
}
SECTION("open tag within literal - mid")
{
NORMALIZE_EXT(unexpected_tag_buf3);
- VALIDATE(unexpected_tag_buf3, unexpected_tag_expected3_ext);
+ VALIDATE(unexpected_tag_buf3, unexpected_tag_expected3);
+ CHECK_OTAG(false);
}
SECTION("open tag within literal - end")
{
NORMALIZE_EXT(unexpected_tag_buf4);
- VALIDATE(unexpected_tag_buf4, unexpected_tag_expected4_ext);
+ VALIDATE(unexpected_tag_buf4, unexpected_tag_expected4);
+ CHECK_OTAG(false);
}
SECTION("close tag within literal - start")
{
SECTION("open tag within literal - escaped")
{
NORMALIZE_EXT(unexpected_tag_buf8);
- VALIDATE(unexpected_tag_buf8, unexpected_tag_expected8_ext);
+ VALIDATE(unexpected_tag_buf8, unexpected_tag_expected8);
+ CHECK_OTAG(false);
}
SECTION("close tag within literal - escaped")
{
SECTION("open tag within single-line comment - start")
{
NORMALIZE_EXT(unexpected_tag_buf10);
- VALIDATE(unexpected_tag_buf10, unexpected_tag_expected10_ext);
+ VALIDATE(unexpected_tag_buf10, unexpected_tag_expected10);
+ CHECK_OTAG(false);
}
SECTION("open tag within single-line comment - mid")
{
NORMALIZE_EXT(unexpected_tag_buf11);
- VALIDATE(unexpected_tag_buf11, unexpected_tag_expected11_ext);
+ VALIDATE(unexpected_tag_buf11, unexpected_tag_expected11);
+ CHECK_OTAG(false);
}
SECTION("open tag within single-line comment - end")
{
NORMALIZE_EXT(unexpected_tag_buf12);
- VALIDATE(unexpected_tag_buf12, unexpected_tag_expected12_ext);
+ VALIDATE(unexpected_tag_buf12, unexpected_tag_expected12);
+ CHECK_OTAG(false);
}
SECTION("open tag within multi-line comment - start")
{
NORMALIZE_EXT(unexpected_tag_buf13);
- VALIDATE(unexpected_tag_buf13, unexpected_tag_expected13_ext);
+ VALIDATE(unexpected_tag_buf13, unexpected_tag_expected13);
+ CHECK_OTAG(false);
}
SECTION("open tag within multi-line comment - mid")
{
NORMALIZE_EXT(unexpected_tag_buf14);
- VALIDATE(unexpected_tag_buf14, unexpected_tag_expected14_ext);
+ VALIDATE(unexpected_tag_buf14, unexpected_tag_expected14);
+ CHECK_OTAG(false);
}
SECTION("open tag within multi-line comment - end")
{
NORMALIZE_EXT(unexpected_tag_buf15);
- VALIDATE(unexpected_tag_buf15, unexpected_tag_expected15_ext);
+ VALIDATE(unexpected_tag_buf15, unexpected_tag_expected15);
+ CHECK_OTAG(false);
}
SECTION("close tag within single-line comment - start")
{
SECTION("multiple patterns - not matched")
{
NORMALIZE_EXT(unexpected_tag_buf22);
- VALIDATE(unexpected_tag_buf22, unexpected_tag_expected22_ext);
+ VALIDATE(unexpected_tag_buf22, unexpected_tag_expected22);
}
SECTION("multiple patterns - matched")
{
NORMALIZE_EXT(unexpected_tag_buf23);
- VALIDATE(unexpected_tag_buf23, unexpected_tag_expected23_ext);
+ VALIDATE(unexpected_tag_buf23, unexpected_tag_expected23);
+ CHECK_OTAG(false);
}
SECTION("mixed lower and upper case")
{
NORMALIZE_EXT(unexpected_tag_buf24);
- VALIDATE(unexpected_tag_buf24, unexpected_tag_expected24_ext);
+ VALIDATE(unexpected_tag_buf24, unexpected_tag_expected24);
+ CHECK_OTAG(false);
+ }
+ SECTION("opening tag within template literal")
+ {
+ NORMALIZE_EXT(unexpected_tag_buf25);
+ VALIDATE(unexpected_tag_buf25, unexpected_tag_expected25);
+ CHECK_OTAG(false);
+ }
+ SECTION("opening tag within regex literal")
+ {
+ NORMALIZE_EXT(unexpected_tag_buf26);
+ VALIDATE(unexpected_tag_buf26, unexpected_tag_expected26);
+ CHECK_OTAG(false);
}
}
NORMALIZE_3(dat1, dat2, dat3, exp1, exp2, exp3);
NORM_COMBINED_3(dat1, dat2, dat3, exp);
}
+ SECTION("complete open tag - identifier")
+ {
+ const char dat1[] = " ( a <script> ";
+ const char dat2[] = " b ) ";
+ const char exp1[] = "(a<script>";
+ const char exp2[] = "b)";
+ const char exp[] = "(a<script>b)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("incomplete open tag - identifier")
+ {
+ const char dat1[] = " <script ";
+ const char dat2[] = " a ; ";
+ const char exp1[] = "<script";
+ const char exp2[] = " a;";
+ const char exp[] = "<script a;";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("incomplete open tag - operator")
+ {
+ const char dat1[] = " ( a <script ";
+ const char dat2[] = " ) ";
+ const char exp1[] = "(a<script";
+ const char exp2[] = ")";
+ const char exp[] = "(a<script)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("identifier - complete open tag")
+ {
+ const char dat1[] = " ( a ";
+ const char dat2[] = " <script> b ) ";
+ const char exp1[] = "(a";
+ const char exp2[] = "<script>b)";
+ const char exp[] = "(a<script>b)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("identifier - incomplete open tag")
+ {
+ const char dat1[] = " ( a ";
+ const char dat2[] = " <script ) ";
+ const char exp1[] = "(a";
+ const char exp2[] = "<script)";
+ const char exp[] = "(a<script)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("operator - incomplete open tag")
+ {
+ const char dat1[] = " ( a < ";
+ const char dat2[] = " <script ) ";
+ const char exp1[] = "(a<";
+ const char exp2[] = "<script)";
+ const char exp[] = "(a<<script)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("identifier - incomplete open tag as a comparison")
+ {
+ const char dat1[] = " ( a < ";
+ const char dat2[] = " script ) ";
+ const char exp1[] = "(a<";
+ const char exp2[] = "script)";
+ const char exp[] = "(a<script)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
+ SECTION("identifier - complete open tag as a comparison")
+ {
+ const char dat1[] = " ( a <";
+ const char dat2[] = "script ) ";
+ const char exp1[] = "(a<";
+ const char exp2[] = "<script)";
+ const char exp[] = "(a<script)";
+
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
+ }
}
TEST_CASE("split in comments", "[JSNormalizer]")
const char dat1[] = "<";
const char dat2[] = "script>";
const char exp1[] = "<";
- const char exp2[] = "";
- const char exp[] = "";
+ const char exp2[] = "<script>";
+ const char exp[] = "<script>";
- NORM_BAD_2(dat1, dat2, exp1, exp2, JSTokenizer::OPENING_TAG);
- NORM_COMBINED_BAD_2(dat1, dat2, exp, JSTokenizer::OPENING_TAG);
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
}
SECTION("str='<s cript'")
{
const char dat1[] = "var str ='<s";
const char dat2[] = "cript>';";
const char exp1[] = "var str='<s";
- const char exp2[] = "";
- const char exp[] = "var str='";
+ const char exp2[] = "<script>';";
+ const char exp[] = "var str='<script>';";
- NORM_BAD_2(dat1, dat2, exp1, exp2, JSTokenizer::OPENING_TAG);
- NORM_COMBINED_BAD_2(dat1, dat2, exp, JSTokenizer::OPENING_TAG);
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
}
SECTION("str='<scrip t'")
{
const char dat1[] = "var str ='<scrip";
const char dat2[] = "t>';";
const char exp1[] = "var str='<scrip";
- const char exp2[] = "";
- const char exp[] = "var str='";
+ const char exp2[] = "<script>';";
+ const char exp[] = "var str='<script>';";
- NORM_BAD_2(dat1, dat2, exp1, exp2, JSTokenizer::OPENING_TAG);
- NORM_COMBINED_BAD_2(dat1, dat2, exp, JSTokenizer::OPENING_TAG);
+ NORMALIZE_2(dat1, dat2, exp1, exp2);
+ NORM_COMBINED_2(dat1, dat2, exp);
}
SECTION("< scr ipt")
{
const char dat3[] = "ipt>";
const char exp1[] = "<";
const char exp2[] = "scr";
- const char exp3[] = "";
- const char exp[] = "";
+ const char exp3[] = "<script>";
+ const char exp[] = "<script>";
- NORM_BAD_3(dat1, dat2, dat3, exp1, exp2, exp3, JSTokenizer::OPENING_TAG);
- NORM_COMBINED_BAD_3(dat1, dat2, dat3, exp, JSTokenizer::OPENING_TAG);
+ NORMALIZE_3(dat1, dat2, dat3, exp1, exp2, exp3);
+ NORM_COMBINED_3(dat1, dat2, dat3, exp);
}
SECTION("str='<sc rip t'")
{
const char dat3[] = "t>\";";
const char exp1[] = "var str=\"<sc";
const char exp2[] = "scrip";
- const char exp3[] = "";
- const char exp[] = "var str=\"";
+ const char exp3[] = "<script>\";";
+ const char exp[] = "var str=\"<script>\";";
- NORM_BAD_3(dat1, dat2, dat3, exp1, exp2, exp3, JSTokenizer::OPENING_TAG);
- NORM_COMBINED_BAD_3(dat1, dat2, dat3, exp, JSTokenizer::OPENING_TAG);
+ NORMALIZE_3(dat1, dat2, dat3, exp1, exp2, exp3);
+ NORM_COMBINED_3(dat1, dat2, dat3, exp);
}
}