[Forensics-changes] [yara] 173/192: Improve legibility of object-related code

Hilko Bengen bengen at moszumanska.debian.org
Sat Jul 1 10:32:01 UTC 2017


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to annotated tag v3.6.0
in repository yara.

commit 7be98d1489e8f6645ba2b8d624e33dac6f0bfe79
Author: Victor M. Alvarez <plusvic at gmail.com>
Date:   Mon May 15 13:09:28 2017 +0200

    Improve legibility of object-related code
---
 libyara/exec.c               |  14 +-
 libyara/grammar.c            | 450 +++++++++++++++++++++----------------------
 libyara/grammar.h            |   4 +-
 libyara/grammar.y            |   8 +-
 libyara/include/yara/types.h |  76 +++-----
 libyara/object.c             | 207 ++++++++++----------
 6 files changed, 365 insertions(+), 394 deletions(-)

diff --git a/libyara/exec.c b/libyara/exec.c
index 8037991..e379229 100644
--- a/libyara/exec.c
+++ b/libyara/exec.c
@@ -214,7 +214,7 @@ int yr_execute_code(
     {
       case OP_NOP:
         break;
-        
+
       case OP_HALT:
         assert(sp == 0); // When HALT is reached the stack should be empty.
         stop = TRUE;
@@ -481,21 +481,21 @@ int yr_execute_code(
         switch(r1.o->type)
         {
           case OBJECT_TYPE_INTEGER:
-            r1.i = ((YR_OBJECT_INTEGER*) r1.o)->value;
+            r1.i = r1.o->value.i;
             break;
 
           case OBJECT_TYPE_FLOAT:
-            if (isnan(((YR_OBJECT_DOUBLE*) r1.o)->value))
+            if (isnan(r1.o->value.d))
               r1.i = UNDEFINED;
             else
-              r1.d = ((YR_OBJECT_DOUBLE*) r1.o)->value;
+              r1.d = r1.o->value.d;
             break;
 
           case OBJECT_TYPE_STRING:
-            if (((YR_OBJECT_STRING*) r1.o)->value == NULL)
+            if (r1.o->value.ss == NULL)
               r1.i = UNDEFINED;
             else
-              r1.p = ((YR_OBJECT_STRING*) r1.o)->value;
+              r1.ss = r1.o->value.ss;
             break;
 
           default:
@@ -571,7 +571,7 @@ int yr_execute_code(
           break;
         }
 
-        function = (YR_OBJECT_FUNCTION*) r2.o;
+        function = object_as_function(r2.o);
         result = ERROR_INTERNAL_FATAL_ERROR;
 
         for (i = 0; i < MAX_OVERLOADED_FUNCTIONS; i++)
diff --git a/libyara/grammar.c b/libyara/grammar.c
index 48f33c0..ea52503 100644
--- a/libyara/grammar.c
+++ b/libyara/grammar.c
@@ -1649,7 +1649,7 @@ yyreduce:
   switch (yyn)
     {
         case 8:
-#line 230 "grammar.y" /* yacc.c:1646  */
+#line 230 "grammar.y" /* yacc.c:1661  */
     {
         int result = yr_parser_reduce_import(yyscanner, (yyvsp[0].sized_string));
 
@@ -1657,11 +1657,11 @@ yyreduce:
 
         ERROR_IF(result != ERROR_SUCCESS);
       }
-#line 1661 "grammar.c" /* yacc.c:1646  */
+#line 1661 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 9:
-#line 242 "grammar.y" /* yacc.c:1646  */
+#line 242 "grammar.y" /* yacc.c:1661  */
     {
         YR_RULE* rule = yr_parser_reduce_rule_declaration_phase_1(
             yyscanner, (int32_t) (yyvsp[-2].integer), (yyvsp[0].c_string));
@@ -1670,11 +1670,11 @@ yyreduce:
 
         (yyval.rule) = rule;
       }
-#line 1674 "grammar.c" /* yacc.c:1646  */
+#line 1674 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 10:
-#line 251 "grammar.y" /* yacc.c:1646  */
+#line 251 "grammar.y" /* yacc.c:1661  */
     {
         YR_RULE* rule = (yyvsp[-4].rule); // rule created in phase 1
 
@@ -1682,11 +1682,11 @@ yyreduce:
         rule->metas = (yyvsp[-1].meta);
         rule->strings = (yyvsp[0].string);
       }
-#line 1686 "grammar.c" /* yacc.c:1646  */
+#line 1686 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 11:
-#line 259 "grammar.y" /* yacc.c:1646  */
+#line 259 "grammar.y" /* yacc.c:1661  */
     {
         YR_RULE* rule = (yyvsp[-7].rule); // rule created in phase 1
 
@@ -1697,19 +1697,19 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 1701 "grammar.c" /* yacc.c:1646  */
+#line 1701 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 12:
-#line 274 "grammar.y" /* yacc.c:1646  */
+#line 274 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.meta) = NULL;
       }
-#line 1709 "grammar.c" /* yacc.c:1646  */
+#line 1709 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 13:
-#line 278 "grammar.y" /* yacc.c:1646  */
+#line 278 "grammar.y" /* yacc.c:1661  */
     {
         // Each rule have a list of meta-data info, consisting in a
         // sequence of YR_META structures. The last YR_META structure does
@@ -1732,19 +1732,19 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 1736 "grammar.c" /* yacc.c:1646  */
+#line 1736 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 14:
-#line 305 "grammar.y" /* yacc.c:1646  */
+#line 305 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.string) = NULL;
       }
-#line 1744 "grammar.c" /* yacc.c:1646  */
+#line 1744 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 15:
-#line 309 "grammar.y" /* yacc.c:1646  */
+#line 309 "grammar.y" /* yacc.c:1661  */
     {
         // Each rule have a list of strings, consisting in a sequence
         // of YR_STRING structures. The last YR_STRING structure does not
@@ -1767,43 +1767,43 @@ yyreduce:
 
         (yyval.string) = (yyvsp[0].string);
       }
-#line 1771 "grammar.c" /* yacc.c:1646  */
+#line 1771 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 17:
-#line 340 "grammar.y" /* yacc.c:1646  */
+#line 340 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = 0;  }
-#line 1777 "grammar.c" /* yacc.c:1646  */
+#line 1777 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 18:
-#line 341 "grammar.y" /* yacc.c:1646  */
+#line 341 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = (yyvsp[-1].integer) | (yyvsp[0].integer); }
-#line 1783 "grammar.c" /* yacc.c:1646  */
+#line 1783 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 19:
-#line 346 "grammar.y" /* yacc.c:1646  */
+#line 346 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = RULE_GFLAGS_PRIVATE; }
-#line 1789 "grammar.c" /* yacc.c:1646  */
+#line 1789 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 20:
-#line 347 "grammar.y" /* yacc.c:1646  */
+#line 347 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = RULE_GFLAGS_GLOBAL; }
-#line 1795 "grammar.c" /* yacc.c:1646  */
+#line 1795 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 21:
-#line 353 "grammar.y" /* yacc.c:1646  */
+#line 353 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.c_string) = NULL;
       }
-#line 1803 "grammar.c" /* yacc.c:1646  */
+#line 1803 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 22:
-#line 357 "grammar.y" /* yacc.c:1646  */
+#line 357 "grammar.y" /* yacc.c:1661  */
     {
         // Tags list is represented in the arena as a sequence
         // of null-terminated strings, the sequence ends with an
@@ -1817,11 +1817,11 @@ yyreduce:
 
         (yyval.c_string) = (yyvsp[0].c_string);
       }
-#line 1821 "grammar.c" /* yacc.c:1646  */
+#line 1821 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 23:
-#line 375 "grammar.y" /* yacc.c:1646  */
+#line 375 "grammar.y" /* yacc.c:1661  */
     {
         char* identifier;
 
@@ -1834,11 +1834,11 @@ yyreduce:
 
         (yyval.c_string) = identifier;
       }
-#line 1838 "grammar.c" /* yacc.c:1646  */
+#line 1838 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 24:
-#line 388 "grammar.y" /* yacc.c:1646  */
+#line 388 "grammar.y" /* yacc.c:1661  */
     {
         char* tag_name = (yyvsp[-1].c_string);
         size_t tag_length = tag_name != NULL ? strlen(tag_name) : 0;
@@ -1870,23 +1870,23 @@ yyreduce:
 
         (yyval.c_string) = (yyvsp[-1].c_string);
       }
-#line 1874 "grammar.c" /* yacc.c:1646  */
+#line 1874 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 25:
-#line 424 "grammar.y" /* yacc.c:1646  */
+#line 424 "grammar.y" /* yacc.c:1661  */
     {  (yyval.meta) = (yyvsp[0].meta); }
-#line 1880 "grammar.c" /* yacc.c:1646  */
+#line 1880 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 26:
-#line 425 "grammar.y" /* yacc.c:1646  */
+#line 425 "grammar.y" /* yacc.c:1661  */
     {  (yyval.meta) = (yyvsp[-1].meta); }
-#line 1886 "grammar.c" /* yacc.c:1646  */
+#line 1886 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 27:
-#line 431 "grammar.y" /* yacc.c:1646  */
+#line 431 "grammar.y" /* yacc.c:1661  */
     {
         SIZED_STRING* sized_string = (yyvsp[0].sized_string);
 
@@ -1902,11 +1902,11 @@ yyreduce:
 
         ERROR_IF((yyval.meta) == NULL);
       }
-#line 1906 "grammar.c" /* yacc.c:1646  */
+#line 1906 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 28:
-#line 447 "grammar.y" /* yacc.c:1646  */
+#line 447 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -1919,11 +1919,11 @@ yyreduce:
 
         ERROR_IF((yyval.meta) == NULL);
       }
-#line 1923 "grammar.c" /* yacc.c:1646  */
+#line 1923 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 29:
-#line 460 "grammar.y" /* yacc.c:1646  */
+#line 460 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -1936,11 +1936,11 @@ yyreduce:
 
         ERROR_IF((yyval.meta) == NULL);
       }
-#line 1940 "grammar.c" /* yacc.c:1646  */
+#line 1940 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 30:
-#line 473 "grammar.y" /* yacc.c:1646  */
+#line 473 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -1953,11 +1953,11 @@ yyreduce:
 
         ERROR_IF((yyval.meta) == NULL);
       }
-#line 1957 "grammar.c" /* yacc.c:1646  */
+#line 1957 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 31:
-#line 486 "grammar.y" /* yacc.c:1646  */
+#line 486 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.meta) = yr_parser_reduce_meta_declaration(
             yyscanner,
@@ -1970,31 +1970,31 @@ yyreduce:
 
         ERROR_IF((yyval.meta) == NULL);
       }
-#line 1974 "grammar.c" /* yacc.c:1646  */
+#line 1974 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 32:
-#line 502 "grammar.y" /* yacc.c:1646  */
+#line 502 "grammar.y" /* yacc.c:1661  */
     { (yyval.string) = (yyvsp[0].string); }
-#line 1980 "grammar.c" /* yacc.c:1646  */
+#line 1980 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 33:
-#line 503 "grammar.y" /* yacc.c:1646  */
+#line 503 "grammar.y" /* yacc.c:1661  */
     { (yyval.string) = (yyvsp[-1].string); }
-#line 1986 "grammar.c" /* yacc.c:1646  */
+#line 1986 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 34:
-#line 509 "grammar.y" /* yacc.c:1646  */
+#line 509 "grammar.y" /* yacc.c:1661  */
     {
         compiler->error_line = yyget_lineno(yyscanner);
       }
-#line 1994 "grammar.c" /* yacc.c:1646  */
+#line 1994 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 35:
-#line 513 "grammar.y" /* yacc.c:1646  */
+#line 513 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.string) = yr_parser_reduce_string_declaration(
             yyscanner, (int32_t) (yyvsp[0].integer), (yyvsp[-4].c_string), (yyvsp[-1].sized_string));
@@ -2005,19 +2005,19 @@ yyreduce:
         ERROR_IF((yyval.string) == NULL);
         compiler->error_line = 0;
       }
-#line 2009 "grammar.c" /* yacc.c:1646  */
+#line 2009 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 36:
-#line 524 "grammar.y" /* yacc.c:1646  */
+#line 524 "grammar.y" /* yacc.c:1661  */
     {
         compiler->error_line = yyget_lineno(yyscanner);
       }
-#line 2017 "grammar.c" /* yacc.c:1646  */
+#line 2017 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 37:
-#line 528 "grammar.y" /* yacc.c:1646  */
+#line 528 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.string) = yr_parser_reduce_string_declaration(
             yyscanner, (int32_t) (yyvsp[0].integer) | STRING_GFLAGS_REGEXP, (yyvsp[-4].c_string), (yyvsp[-1].sized_string));
@@ -2029,11 +2029,11 @@ yyreduce:
 
         compiler->error_line = 0;
       }
-#line 2033 "grammar.c" /* yacc.c:1646  */
+#line 2033 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 38:
-#line 540 "grammar.y" /* yacc.c:1646  */
+#line 540 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.string) = yr_parser_reduce_string_declaration(
             yyscanner, STRING_GFLAGS_HEXADECIMAL, (yyvsp[-2].c_string), (yyvsp[0].sized_string));
@@ -2043,47 +2043,47 @@ yyreduce:
 
         ERROR_IF((yyval.string) == NULL);
       }
-#line 2047 "grammar.c" /* yacc.c:1646  */
+#line 2047 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 39:
-#line 553 "grammar.y" /* yacc.c:1646  */
+#line 553 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = 0; }
-#line 2053 "grammar.c" /* yacc.c:1646  */
+#line 2053 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 40:
-#line 554 "grammar.y" /* yacc.c:1646  */
+#line 554 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = (yyvsp[-1].integer) | (yyvsp[0].integer); }
-#line 2059 "grammar.c" /* yacc.c:1646  */
+#line 2059 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 41:
-#line 559 "grammar.y" /* yacc.c:1646  */
+#line 559 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = STRING_GFLAGS_WIDE; }
-#line 2065 "grammar.c" /* yacc.c:1646  */
+#line 2065 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 42:
-#line 560 "grammar.y" /* yacc.c:1646  */
+#line 560 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = STRING_GFLAGS_ASCII; }
-#line 2071 "grammar.c" /* yacc.c:1646  */
+#line 2071 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 43:
-#line 561 "grammar.y" /* yacc.c:1646  */
+#line 561 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = STRING_GFLAGS_NO_CASE; }
-#line 2077 "grammar.c" /* yacc.c:1646  */
+#line 2077 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 44:
-#line 562 "grammar.y" /* yacc.c:1646  */
+#line 562 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = STRING_GFLAGS_FULL_WORD; }
-#line 2083 "grammar.c" /* yacc.c:1646  */
+#line 2083 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 45:
-#line 568 "grammar.y" /* yacc.c:1646  */
+#line 568 "grammar.y" /* yacc.c:1661  */
     {
         int var_index = yr_parser_lookup_loop_variable(yyscanner, (yyvsp[0].c_string));
 
@@ -2168,11 +2168,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 2172 "grammar.c" /* yacc.c:1646  */
+#line 2172 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 46:
-#line 653 "grammar.y" /* yacc.c:1646  */
+#line 653 "grammar.y" /* yacc.c:1661  */
     {
         YR_OBJECT* field = NULL;
 
@@ -2218,11 +2218,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 2222 "grammar.c" /* yacc.c:1646  */
+#line 2222 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 47:
-#line 699 "grammar.y" /* yacc.c:1646  */
+#line 699 "grammar.y" /* yacc.c:1661  */
     {
         YR_OBJECT_ARRAY* array;
         YR_OBJECT_DICTIONARY* dict;
@@ -2242,7 +2242,7 @@ yyreduce:
           compiler->last_result = yr_parser_emit(
               yyscanner, OP_INDEX_ARRAY, NULL);
 
-          array = (YR_OBJECT_ARRAY*) (yyvsp[-3].expression).value.object;
+          array = object_as_array((yyvsp[-3].expression).value.object);
 
           (yyval.expression).type = EXPRESSION_TYPE_OBJECT;
           (yyval.expression).value.object = array->prototype_item;
@@ -2263,7 +2263,7 @@ yyreduce:
           compiler->last_result = yr_parser_emit(
               yyscanner, OP_LOOKUP_DICT, NULL);
 
-          dict = (YR_OBJECT_DICTIONARY*) (yyvsp[-3].expression).value.object;
+          dict = object_as_dictionary((yyvsp[-3].expression).value.object);
 
           (yyval.expression).type = EXPRESSION_TYPE_OBJECT;
           (yyval.expression).value.object = dict->prototype_item;
@@ -2279,11 +2279,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 2283 "grammar.c" /* yacc.c:1646  */
+#line 2283 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 48:
-#line 757 "grammar.y" /* yacc.c:1646  */
+#line 757 "grammar.y" /* yacc.c:1661  */
     {
         YR_OBJECT_FUNCTION* function;
         char* args_fmt;
@@ -2292,7 +2292,7 @@ yyreduce:
             (yyvsp[-3].expression).value.object->type == OBJECT_TYPE_FUNCTION)
         {
           compiler->last_result = yr_parser_check_types(
-              compiler, (YR_OBJECT_FUNCTION*) (yyvsp[-3].expression).value.object, (yyvsp[-1].c_string));
+              compiler, object_as_function((yyvsp[-3].expression).value.object), (yyvsp[-1].c_string));
 
           if (compiler->last_result == ERROR_SUCCESS)
             compiler->last_result = yr_arena_write_string(
@@ -2306,7 +2306,7 @@ yyreduce:
                 NULL,
                 NULL);
 
-          function = (YR_OBJECT_FUNCTION*) (yyvsp[-3].expression).value.object;
+          function = object_as_function((yyvsp[-3].expression).value.object);
 
           (yyval.expression).type = EXPRESSION_TYPE_OBJECT;
           (yyval.expression).value.object = function->return_obj;
@@ -2324,23 +2324,23 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 2328 "grammar.c" /* yacc.c:1646  */
+#line 2328 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 49:
-#line 801 "grammar.y" /* yacc.c:1646  */
+#line 801 "grammar.y" /* yacc.c:1661  */
     { (yyval.c_string) = yr_strdup(""); }
-#line 2334 "grammar.c" /* yacc.c:1646  */
+#line 2334 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 50:
-#line 802 "grammar.y" /* yacc.c:1646  */
+#line 802 "grammar.y" /* yacc.c:1661  */
     { (yyval.c_string) = (yyvsp[0].c_string); }
-#line 2340 "grammar.c" /* yacc.c:1646  */
+#line 2340 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 51:
-#line 807 "grammar.y" /* yacc.c:1646  */
+#line 807 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.c_string) = (char*) yr_malloc(MAX_FUNCTION_ARGS + 1);
 
@@ -2367,11 +2367,11 @@ yyreduce:
 
         ERROR_IF((yyval.c_string) == NULL);
       }
-#line 2371 "grammar.c" /* yacc.c:1646  */
+#line 2371 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 52:
-#line 834 "grammar.y" /* yacc.c:1646  */
+#line 834 "grammar.y" /* yacc.c:1661  */
     {
         if (strlen((yyvsp[-2].c_string)) == MAX_FUNCTION_ARGS)
         {
@@ -2405,11 +2405,11 @@ yyreduce:
 
         (yyval.c_string) = (yyvsp[-2].c_string);
       }
-#line 2409 "grammar.c" /* yacc.c:1646  */
+#line 2409 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 53:
-#line 872 "grammar.y" /* yacc.c:1646  */
+#line 872 "grammar.y" /* yacc.c:1661  */
     {
         SIZED_STRING* sized_string = (yyvsp[0].sized_string);
         RE* re;
@@ -2447,11 +2447,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_REGEXP;
       }
-#line 2451 "grammar.c" /* yacc.c:1646  */
+#line 2451 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 54:
-#line 914 "grammar.y" /* yacc.c:1646  */
+#line 914 "grammar.y" /* yacc.c:1661  */
     {
         if ((yyvsp[0].expression).type == EXPRESSION_TYPE_STRING)
         {
@@ -2470,11 +2470,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2474 "grammar.c" /* yacc.c:1646  */
+#line 2474 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 55:
-#line 936 "grammar.y" /* yacc.c:1646  */
+#line 936 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, 1, NULL, NULL);
@@ -2483,11 +2483,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2487 "grammar.c" /* yacc.c:1646  */
+#line 2487 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 56:
-#line 945 "grammar.y" /* yacc.c:1646  */
+#line 945 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, 0, NULL, NULL);
@@ -2496,11 +2496,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2500 "grammar.c" /* yacc.c:1646  */
+#line 2500 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 57:
-#line 954 "grammar.y" /* yacc.c:1646  */
+#line 954 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_STRING, "matches");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_REGEXP, "matches");
@@ -2515,11 +2515,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2519 "grammar.c" /* yacc.c:1646  */
+#line 2519 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 58:
-#line 969 "grammar.y" /* yacc.c:1646  */
+#line 969 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_STRING, "contains");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_STRING, "contains");
@@ -2531,11 +2531,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2535 "grammar.c" /* yacc.c:1646  */
+#line 2535 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 59:
-#line 981 "grammar.y" /* yacc.c:1646  */
+#line 981 "grammar.y" /* yacc.c:1661  */
     {
         int result = yr_parser_reduce_string_identifier(
             yyscanner,
@@ -2549,11 +2549,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2553 "grammar.c" /* yacc.c:1646  */
+#line 2553 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 60:
-#line 995 "grammar.y" /* yacc.c:1646  */
+#line 995 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "at");
 
@@ -2566,11 +2566,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2570 "grammar.c" /* yacc.c:1646  */
+#line 2570 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 61:
-#line 1008 "grammar.y" /* yacc.c:1646  */
+#line 1008 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner, (yyvsp[-2].c_string), OP_FOUND_IN, UNDEFINED);
@@ -2581,11 +2581,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2585 "grammar.c" /* yacc.c:1646  */
+#line 2585 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 62:
-#line 1019 "grammar.y" /* yacc.c:1646  */
+#line 1019 "grammar.y" /* yacc.c:1661  */
     {
         if (compiler->loop_depth > 0)
         {
@@ -2595,11 +2595,11 @@ yyreduce:
 
         YYERROR;
       }
-#line 2599 "grammar.c" /* yacc.c:1646  */
+#line 2599 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 63:
-#line 1029 "grammar.y" /* yacc.c:1646  */
+#line 1029 "grammar.y" /* yacc.c:1661  */
     {
         int var_index;
 
@@ -2629,11 +2629,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 2633 "grammar.c" /* yacc.c:1646  */
+#line 2633 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 64:
-#line 1059 "grammar.y" /* yacc.c:1646  */
+#line 1059 "grammar.y" /* yacc.c:1661  */
     {
         int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
         uint8_t* addr;
@@ -2668,11 +2668,11 @@ yyreduce:
         compiler->loop_identifier[compiler->loop_depth] = (yyvsp[-4].c_string);
         compiler->loop_depth++;
       }
-#line 2672 "grammar.c" /* yacc.c:1646  */
+#line 2672 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 65:
-#line 1094 "grammar.y" /* yacc.c:1646  */
+#line 1094 "grammar.y" /* yacc.c:1661  */
     {
         int mem_offset;
 
@@ -2751,11 +2751,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2755 "grammar.c" /* yacc.c:1646  */
+#line 2755 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 66:
-#line 1173 "grammar.y" /* yacc.c:1646  */
+#line 1173 "grammar.y" /* yacc.c:1661  */
     {
         int mem_offset = LOOP_LOCAL_VARS * compiler->loop_depth;
         uint8_t* addr;
@@ -2785,11 +2785,11 @@ yyreduce:
         compiler->loop_identifier[compiler->loop_depth] = NULL;
         compiler->loop_depth++;
       }
-#line 2789 "grammar.c" /* yacc.c:1646  */
+#line 2789 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 67:
-#line 1203 "grammar.y" /* yacc.c:1646  */
+#line 1203 "grammar.y" /* yacc.c:1661  */
     {
         int mem_offset;
 
@@ -2838,31 +2838,31 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
 
       }
-#line 2842 "grammar.c" /* yacc.c:1646  */
+#line 2842 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 68:
-#line 1252 "grammar.y" /* yacc.c:1646  */
+#line 1252 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit(yyscanner, OP_OF, NULL);
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2852 "grammar.c" /* yacc.c:1646  */
+#line 2852 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 69:
-#line 1258 "grammar.y" /* yacc.c:1646  */
+#line 1258 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit(yyscanner, OP_NOT, NULL);
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2862 "grammar.c" /* yacc.c:1646  */
+#line 2862 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 70:
-#line 1264 "grammar.y" /* yacc.c:1646  */
+#line 1264 "grammar.y" /* yacc.c:1661  */
     {
         YR_FIXUP* fixup;
         void* jmp_destination_addr;
@@ -2888,11 +2888,11 @@ yyreduce:
         fixup->next = compiler->fixup_stack_head;
         compiler->fixup_stack_head = fixup;
       }
-#line 2892 "grammar.c" /* yacc.c:1646  */
+#line 2892 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 71:
-#line 1290 "grammar.y" /* yacc.c:1646  */
+#line 1290 "grammar.y" /* yacc.c:1661  */
     {
         YR_FIXUP* fixup;
         uint8_t* nop_addr;
@@ -2919,11 +2919,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2923 "grammar.c" /* yacc.c:1646  */
+#line 2923 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 72:
-#line 1317 "grammar.y" /* yacc.c:1646  */
+#line 1317 "grammar.y" /* yacc.c:1661  */
     {
         YR_FIXUP* fixup;
         void* jmp_destination_addr;
@@ -2948,11 +2948,11 @@ yyreduce:
         fixup->next = compiler->fixup_stack_head;
         compiler->fixup_stack_head = fixup;
       }
-#line 2952 "grammar.c" /* yacc.c:1646  */
+#line 2952 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 73:
-#line 1342 "grammar.y" /* yacc.c:1646  */
+#line 1342 "grammar.y" /* yacc.c:1661  */
     {
         YR_FIXUP* fixup;
         uint8_t* nop_addr;
@@ -2979,11 +2979,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2983 "grammar.c" /* yacc.c:1646  */
+#line 2983 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 74:
-#line 1369 "grammar.y" /* yacc.c:1646  */
+#line 1369 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "<", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -2992,11 +2992,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 2996 "grammar.c" /* yacc.c:1646  */
+#line 2996 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 75:
-#line 1378 "grammar.y" /* yacc.c:1646  */
+#line 1378 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, ">", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3005,11 +3005,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 3009 "grammar.c" /* yacc.c:1646  */
+#line 3009 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 76:
-#line 1387 "grammar.y" /* yacc.c:1646  */
+#line 1387 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "<=", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3018,11 +3018,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 3022 "grammar.c" /* yacc.c:1646  */
+#line 3022 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 77:
-#line 1396 "grammar.y" /* yacc.c:1646  */
+#line 1396 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, ">=", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3031,11 +3031,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 3035 "grammar.c" /* yacc.c:1646  */
+#line 3035 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 78:
-#line 1405 "grammar.y" /* yacc.c:1646  */
+#line 1405 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "==", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3044,11 +3044,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 3048 "grammar.c" /* yacc.c:1646  */
+#line 3048 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 79:
-#line 1414 "grammar.y" /* yacc.c:1646  */
+#line 1414 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "!=", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3057,39 +3057,39 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_BOOLEAN;
       }
-#line 3061 "grammar.c" /* yacc.c:1646  */
+#line 3061 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 80:
-#line 1423 "grammar.y" /* yacc.c:1646  */
+#line 1423 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.expression) = (yyvsp[0].expression);
       }
-#line 3069 "grammar.c" /* yacc.c:1646  */
+#line 3069 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 81:
-#line 1427 "grammar.y" /* yacc.c:1646  */
+#line 1427 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.expression) = (yyvsp[-1].expression);
       }
-#line 3077 "grammar.c" /* yacc.c:1646  */
+#line 3077 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 82:
-#line 1434 "grammar.y" /* yacc.c:1646  */
+#line 1434 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = INTEGER_SET_ENUMERATION; }
-#line 3083 "grammar.c" /* yacc.c:1646  */
+#line 3083 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 83:
-#line 1435 "grammar.y" /* yacc.c:1646  */
+#line 1435 "grammar.y" /* yacc.c:1661  */
     { (yyval.integer) = INTEGER_SET_RANGE; }
-#line 3089 "grammar.c" /* yacc.c:1646  */
+#line 3089 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 84:
-#line 1441 "grammar.y" /* yacc.c:1646  */
+#line 1441 "grammar.y" /* yacc.c:1661  */
     {
         if ((yyvsp[-3].expression).type != EXPRESSION_TYPE_INTEGER)
         {
@@ -3107,11 +3107,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3111 "grammar.c" /* yacc.c:1646  */
+#line 3111 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 85:
-#line 1463 "grammar.y" /* yacc.c:1646  */
+#line 1463 "grammar.y" /* yacc.c:1661  */
     {
         if ((yyvsp[0].expression).type != EXPRESSION_TYPE_INTEGER)
         {
@@ -3123,11 +3123,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3127 "grammar.c" /* yacc.c:1646  */
+#line 3127 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 86:
-#line 1475 "grammar.y" /* yacc.c:1646  */
+#line 1475 "grammar.y" /* yacc.c:1661  */
     {
         if ((yyvsp[0].expression).type != EXPRESSION_TYPE_INTEGER)
         {
@@ -3138,77 +3138,77 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3142 "grammar.c" /* yacc.c:1646  */
+#line 3142 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 87:
-#line 1490 "grammar.y" /* yacc.c:1646  */
+#line 1490 "grammar.y" /* yacc.c:1661  */
     {
         // Push end-of-list marker
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
       }
-#line 3151 "grammar.c" /* yacc.c:1646  */
+#line 3151 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 89:
-#line 1496 "grammar.y" /* yacc.c:1646  */
+#line 1496 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
         yr_parser_emit_pushes_for_strings(yyscanner, "$*");
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3162 "grammar.c" /* yacc.c:1646  */
+#line 3162 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 92:
-#line 1513 "grammar.y" /* yacc.c:1646  */
+#line 1513 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[0].c_string));
         yr_free((yyvsp[0].c_string));
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3173 "grammar.c" /* yacc.c:1646  */
+#line 3173 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 93:
-#line 1520 "grammar.y" /* yacc.c:1646  */
+#line 1520 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit_pushes_for_strings(yyscanner, (yyvsp[0].c_string));
         yr_free((yyvsp[0].c_string));
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3184 "grammar.c" /* yacc.c:1646  */
+#line 3184 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 95:
-#line 1532 "grammar.y" /* yacc.c:1646  */
+#line 1532 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, UNDEFINED, NULL, NULL);
       }
-#line 3192 "grammar.c" /* yacc.c:1646  */
+#line 3192 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 96:
-#line 1536 "grammar.y" /* yacc.c:1646  */
+#line 1536 "grammar.y" /* yacc.c:1661  */
     {
         yr_parser_emit_with_arg(yyscanner, OP_PUSH, 1, NULL, NULL);
       }
-#line 3200 "grammar.c" /* yacc.c:1646  */
+#line 3200 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 97:
-#line 1544 "grammar.y" /* yacc.c:1646  */
+#line 1544 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.expression) = (yyvsp[-1].expression);
       }
-#line 3208 "grammar.c" /* yacc.c:1646  */
+#line 3208 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 98:
-#line 1548 "grammar.y" /* yacc.c:1646  */
+#line 1548 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit(
             yyscanner, OP_FILESIZE, NULL);
@@ -3218,11 +3218,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3222 "grammar.c" /* yacc.c:1646  */
+#line 3222 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 99:
-#line 1558 "grammar.y" /* yacc.c:1646  */
+#line 1558 "grammar.y" /* yacc.c:1661  */
     {
         yywarning(yyscanner,
             "Using deprecated \"entrypoint\" keyword. Use the \"entry_point\" "
@@ -3236,11 +3236,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3240 "grammar.c" /* yacc.c:1646  */
+#line 3240 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 100:
-#line 1572 "grammar.y" /* yacc.c:1646  */
+#line 1572 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-1].expression), EXPRESSION_TYPE_INTEGER, "intXXXX or uintXXXX");
 
@@ -3256,11 +3256,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3260 "grammar.c" /* yacc.c:1646  */
+#line 3260 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 101:
-#line 1588 "grammar.y" /* yacc.c:1646  */
+#line 1588 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, (yyvsp[0].integer), NULL, NULL);
@@ -3270,11 +3270,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = (yyvsp[0].integer);
       }
-#line 3274 "grammar.c" /* yacc.c:1646  */
+#line 3274 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 102:
-#line 1598 "grammar.y" /* yacc.c:1646  */
+#line 1598 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit_with_arg_double(
             yyscanner, OP_PUSH, (yyvsp[0].double_), NULL, NULL);
@@ -3283,11 +3283,11 @@ yyreduce:
 
         (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
       }
-#line 3287 "grammar.c" /* yacc.c:1646  */
+#line 3287 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 103:
-#line 1607 "grammar.y" /* yacc.c:1646  */
+#line 1607 "grammar.y" /* yacc.c:1661  */
     {
         SIZED_STRING* sized_string;
 
@@ -3312,11 +3312,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_STRING;
         (yyval.expression).value.sized_string = sized_string;
       }
-#line 3316 "grammar.c" /* yacc.c:1646  */
+#line 3316 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 104:
-#line 1632 "grammar.y" /* yacc.c:1646  */
+#line 1632 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner, (yyvsp[0].c_string), OP_COUNT, UNDEFINED);
@@ -3328,11 +3328,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3332 "grammar.c" /* yacc.c:1646  */
+#line 3332 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 105:
-#line 1644 "grammar.y" /* yacc.c:1646  */
+#line 1644 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner, (yyvsp[-3].c_string), OP_OFFSET, UNDEFINED);
@@ -3344,11 +3344,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3348 "grammar.c" /* yacc.c:1646  */
+#line 3348 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 106:
-#line 1656 "grammar.y" /* yacc.c:1646  */
+#line 1656 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, 1, NULL, NULL);
@@ -3364,11 +3364,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3368 "grammar.c" /* yacc.c:1646  */
+#line 3368 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 107:
-#line 1672 "grammar.y" /* yacc.c:1646  */
+#line 1672 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_string_identifier(
             yyscanner, (yyvsp[-3].c_string), OP_LENGTH, UNDEFINED);
@@ -3380,11 +3380,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3384 "grammar.c" /* yacc.c:1646  */
+#line 3384 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 108:
-#line 1684 "grammar.y" /* yacc.c:1646  */
+#line 1684 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_emit_with_arg(
             yyscanner, OP_PUSH, 1, NULL, NULL);
@@ -3400,11 +3400,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = UNDEFINED;
       }
-#line 3404 "grammar.c" /* yacc.c:1646  */
+#line 3404 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 109:
-#line 1700 "grammar.y" /* yacc.c:1646  */
+#line 1700 "grammar.y" /* yacc.c:1661  */
     {
         if ((yyvsp[0].expression).type == EXPRESSION_TYPE_INTEGER)  // loop identifier
         {
@@ -3449,11 +3449,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3453 "grammar.c" /* yacc.c:1646  */
+#line 3453 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 110:
-#line 1745 "grammar.y" /* yacc.c:1646  */
+#line 1745 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER | EXPRESSION_TYPE_FLOAT, "-");
 
@@ -3472,11 +3472,11 @@ yyreduce:
 
         ERROR_IF(compiler->last_result != ERROR_SUCCESS);
       }
-#line 3476 "grammar.c" /* yacc.c:1646  */
+#line 3476 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 111:
-#line 1764 "grammar.y" /* yacc.c:1646  */
+#line 1764 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "+", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3494,11 +3494,11 @@ yyreduce:
           (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
         }
       }
-#line 3498 "grammar.c" /* yacc.c:1646  */
+#line 3498 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 112:
-#line 1782 "grammar.y" /* yacc.c:1646  */
+#line 1782 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "-", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3516,11 +3516,11 @@ yyreduce:
           (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
         }
       }
-#line 3520 "grammar.c" /* yacc.c:1646  */
+#line 3520 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 113:
-#line 1800 "grammar.y" /* yacc.c:1646  */
+#line 1800 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "*", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3538,11 +3538,11 @@ yyreduce:
           (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
         }
       }
-#line 3542 "grammar.c" /* yacc.c:1646  */
+#line 3542 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 114:
-#line 1818 "grammar.y" /* yacc.c:1646  */
+#line 1818 "grammar.y" /* yacc.c:1661  */
     {
         compiler->last_result = yr_parser_reduce_operation(
             yyscanner, "\\", (yyvsp[-2].expression), (yyvsp[0].expression));
@@ -3568,11 +3568,11 @@ yyreduce:
           (yyval.expression).type = EXPRESSION_TYPE_FLOAT;
         }
       }
-#line 3572 "grammar.c" /* yacc.c:1646  */
+#line 3572 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 115:
-#line 1844 "grammar.y" /* yacc.c:1646  */
+#line 1844 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "%");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "%");
@@ -3590,11 +3590,11 @@ yyreduce:
           ERROR_IF(compiler->last_result != ERROR_SUCCESS);
         }
       }
-#line 3594 "grammar.c" /* yacc.c:1646  */
+#line 3594 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 116:
-#line 1862 "grammar.y" /* yacc.c:1646  */
+#line 1862 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "^");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "^");
@@ -3604,11 +3604,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = OPERATION(^, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
       }
-#line 3608 "grammar.c" /* yacc.c:1646  */
+#line 3608 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 117:
-#line 1872 "grammar.y" /* yacc.c:1646  */
+#line 1872 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "^");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "^");
@@ -3618,11 +3618,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = OPERATION(&, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
       }
-#line 3622 "grammar.c" /* yacc.c:1646  */
+#line 3622 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 118:
-#line 1882 "grammar.y" /* yacc.c:1646  */
+#line 1882 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "|");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "|");
@@ -3632,11 +3632,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = OPERATION(|, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
       }
-#line 3636 "grammar.c" /* yacc.c:1646  */
+#line 3636 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 119:
-#line 1892 "grammar.y" /* yacc.c:1646  */
+#line 1892 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "~");
 
@@ -3646,11 +3646,11 @@ yyreduce:
         (yyval.expression).value.integer = ((yyvsp[0].expression).value.integer == UNDEFINED) ?
             UNDEFINED : ~((yyvsp[0].expression).value.integer);
       }
-#line 3650 "grammar.c" /* yacc.c:1646  */
+#line 3650 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 120:
-#line 1902 "grammar.y" /* yacc.c:1646  */
+#line 1902 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, "<<");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, "<<");
@@ -3660,11 +3660,11 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = OPERATION(<<, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
       }
-#line 3664 "grammar.c" /* yacc.c:1646  */
+#line 3664 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 121:
-#line 1912 "grammar.y" /* yacc.c:1646  */
+#line 1912 "grammar.y" /* yacc.c:1661  */
     {
         CHECK_TYPE((yyvsp[-2].expression), EXPRESSION_TYPE_INTEGER, ">>");
         CHECK_TYPE((yyvsp[0].expression), EXPRESSION_TYPE_INTEGER, ">>");
@@ -3674,19 +3674,19 @@ yyreduce:
         (yyval.expression).type = EXPRESSION_TYPE_INTEGER;
         (yyval.expression).value.integer = OPERATION(>>, (yyvsp[-2].expression).value.integer, (yyvsp[0].expression).value.integer);
       }
-#line 3678 "grammar.c" /* yacc.c:1646  */
+#line 3678 "grammar.c" /* yacc.c:1661  */
     break;
 
   case 122:
-#line 1922 "grammar.y" /* yacc.c:1646  */
+#line 1922 "grammar.y" /* yacc.c:1661  */
     {
         (yyval.expression) = (yyvsp[0].expression);
       }
-#line 3686 "grammar.c" /* yacc.c:1646  */
+#line 3686 "grammar.c" /* yacc.c:1661  */
     break;
 
 
-#line 3690 "grammar.c" /* yacc.c:1646  */
+#line 3690 "grammar.c" /* yacc.c:1661  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
diff --git a/libyara/grammar.h b/libyara/grammar.h
index 0e35f37..f8b4bd8 100644
--- a/libyara/grammar.h
+++ b/libyara/grammar.h
@@ -152,7 +152,7 @@ extern int yara_yydebug;
 
 union YYSTYPE
 {
-#line 204 "grammar.y" /* yacc.c:1909  */
+#line 204 "grammar.y" /* yacc.c:1915  */
 
   EXPRESSION      expression;
   SIZED_STRING*   sized_string;
@@ -163,7 +163,7 @@ union YYSTYPE
   YR_META*        meta;
   YR_RULE*        rule;
 
-#line 167 "grammar.h" /* yacc.c:1909  */
+#line 167 "grammar.h" /* yacc.c:1915  */
 };
 
 typedef union YYSTYPE YYSTYPE;
diff --git a/libyara/grammar.y b/libyara/grammar.y
index 6ba7a91..e7228ca 100644
--- a/libyara/grammar.y
+++ b/libyara/grammar.y
@@ -715,7 +715,7 @@ identifier
           compiler->last_result = yr_parser_emit(
               yyscanner, OP_INDEX_ARRAY, NULL);
 
-          array = (YR_OBJECT_ARRAY*) $1.value.object;
+          array = object_as_array($1.value.object);
 
           $$.type = EXPRESSION_TYPE_OBJECT;
           $$.value.object = array->prototype_item;
@@ -736,7 +736,7 @@ identifier
           compiler->last_result = yr_parser_emit(
               yyscanner, OP_LOOKUP_DICT, NULL);
 
-          dict = (YR_OBJECT_DICTIONARY*) $1.value.object;
+          dict = object_as_dictionary($1.value.object);
 
           $$.type = EXPRESSION_TYPE_OBJECT;
           $$.value.object = dict->prototype_item;
@@ -762,7 +762,7 @@ identifier
             $1.value.object->type == OBJECT_TYPE_FUNCTION)
         {
           compiler->last_result = yr_parser_check_types(
-              compiler, (YR_OBJECT_FUNCTION*) $1.value.object, $3);
+              compiler, object_as_function($1.value.object), $3);
 
           if (compiler->last_result == ERROR_SUCCESS)
             compiler->last_result = yr_arena_write_string(
@@ -776,7 +776,7 @@ identifier
                 NULL,
                 NULL);
 
-          function = (YR_OBJECT_FUNCTION*) $1.value.object;
+          function = object_as_function($1.value.object);
 
           $$.type = EXPRESSION_TYPE_OBJECT;
           $$.value.object = function->return_obj;
diff --git a/libyara/include/yara/types.h b/libyara/include/yara/types.h
index 4cf997e..614128c 100644
--- a/libyara/include/yara/types.h
+++ b/libyara/include/yara/types.h
@@ -442,51 +442,35 @@ typedef struct _YR_SCAN_CONTEXT
 } YR_SCAN_CONTEXT;
 
 
+struct _YR_OBJECT;
 
-#define OBJECT_COMMON_FIELDS \
-    int8_t type; \
-    const char* identifier; \
-    void* data; \
-    struct _YR_OBJECT* parent;
-
-
-typedef struct _YR_OBJECT
-{
-  OBJECT_COMMON_FIELDS
-
-} YR_OBJECT;
-
-
-typedef struct _YR_OBJECT_INTEGER
-{
-  OBJECT_COMMON_FIELDS
-  int64_t value;
-
-} YR_OBJECT_INTEGER;
 
-
-typedef struct _YR_OBJECT_DOUBLE
+typedef union _YR_VALUE
 {
-  OBJECT_COMMON_FIELDS
-  double value;
-
-} YR_OBJECT_DOUBLE;
+  int64_t i;
+  double d;
+  void* p;
+  struct _YR_OBJECT* o;
+  YR_STRING* s;
+  SIZED_STRING* ss;
+  RE* re;
 
+} YR_VALUE;
 
-typedef struct _YR_OBJECT_STRING
-{
-  OBJECT_COMMON_FIELDS
-  SIZED_STRING* value;
 
-} YR_OBJECT_STRING;
+#define OBJECT_COMMON_FIELDS \
+    int8_t type; \
+    const char* identifier; \
+    struct _YR_OBJECT* parent; \
+    void* data;
 
 
-typedef struct _YR_OBJECT_REGEXP
+typedef struct _YR_OBJECT
 {
   OBJECT_COMMON_FIELDS
-  RE_AST* value;
+  YR_VALUE value;
 
-} YR_OBJECT_REGEXP;
+} YR_OBJECT;
 
 
 typedef struct _YR_OBJECT_STRUCTURE
@@ -515,19 +499,6 @@ typedef struct _YR_OBJECT_DICTIONARY
 } YR_OBJECT_DICTIONARY;
 
 
-typedef union _YR_VALUE {
-
-  int64_t i;
-  double d;
-  void* p;
-  YR_OBJECT* o;
-  YR_STRING* s;
-  SIZED_STRING* ss;
-  RE* re;
-
-} YR_VALUE;
-
-
 struct _YR_OBJECT_FUNCTION;
 
 
@@ -540,17 +511,24 @@ typedef int (*YR_MODULE_FUNC)(
 typedef struct _YR_OBJECT_FUNCTION
 {
   OBJECT_COMMON_FIELDS
-
   YR_OBJECT* return_obj;
 
-  struct {
+  struct
+  {
     const char* arguments_fmt;
     YR_MODULE_FUNC code;
+
   } prototypes[MAX_OVERLOADED_FUNCTIONS];
 
 } YR_OBJECT_FUNCTION;
 
 
+#define object_as_structure(obj)  ((YR_OBJECT_STRUCTURE*) (obj))
+#define object_as_array(obj)      ((YR_OBJECT_ARRAY*) (obj))
+#define object_as_dictionary(obj) ((YR_OBJECT_DICTIONARY*) (obj))
+#define object_as_function(obj)   ((YR_OBJECT_FUNCTION*) (obj))
+
+
 typedef struct _YR_STRUCTURE_MEMBER
 {
   YR_OBJECT* object;
diff --git a/libyara/object.c b/libyara/object.c
index 5b5b265..6cb1ff9 100644
--- a/libyara/object.c
+++ b/libyara/object.c
@@ -72,13 +72,13 @@ int yr_object_create(
       object_size = sizeof(YR_OBJECT_DICTIONARY);
       break;
     case OBJECT_TYPE_INTEGER:
-      object_size = sizeof(YR_OBJECT_INTEGER);
+      object_size = sizeof(YR_OBJECT);
       break;
     case OBJECT_TYPE_FLOAT:
-      object_size = sizeof(YR_OBJECT_DOUBLE);
+      object_size = sizeof(YR_OBJECT);
       break;
     case OBJECT_TYPE_STRING:
-      object_size = sizeof(YR_OBJECT_STRING);
+      object_size = sizeof(YR_OBJECT);
       break;
     case OBJECT_TYPE_FUNCTION:
       object_size = sizeof(YR_OBJECT_FUNCTION);
@@ -99,32 +99,32 @@ int yr_object_create(
 
   switch(type)
   {
-    case OBJECT_TYPE_STRUCTURE:
-      ((YR_OBJECT_STRUCTURE*) obj)->members = NULL;
-      break;
-    case OBJECT_TYPE_ARRAY:
-      ((YR_OBJECT_ARRAY*) obj)->items = NULL;
-      ((YR_OBJECT_ARRAY*) obj)->prototype_item = NULL;
-      break;
-    case OBJECT_TYPE_DICTIONARY:
-      ((YR_OBJECT_DICTIONARY*) obj)->items = NULL;
-      ((YR_OBJECT_DICTIONARY*) obj)->prototype_item = NULL;
-      break;
     case OBJECT_TYPE_INTEGER:
-      ((YR_OBJECT_INTEGER*) obj)->value = UNDEFINED;
+      obj->value.i = UNDEFINED;
       break;
     case OBJECT_TYPE_FLOAT:
-      ((YR_OBJECT_DOUBLE*) obj)->value = NAN;
+      obj->value.d = NAN;
       break;
     case OBJECT_TYPE_STRING:
-      ((YR_OBJECT_STRING*) obj)->value = NULL;
+      obj->value.ss = NULL;
+      break;
+    case OBJECT_TYPE_STRUCTURE:
+      object_as_structure(obj)->members = NULL;
+      break;
+    case OBJECT_TYPE_ARRAY:
+      object_as_array(obj)->items = NULL;
+      object_as_array(obj)->prototype_item = NULL;
+      break;
+    case OBJECT_TYPE_DICTIONARY:
+      object_as_dictionary(obj)->items = NULL;
+      object_as_dictionary(obj)->prototype_item = NULL;
       break;
     case OBJECT_TYPE_FUNCTION:
-      ((YR_OBJECT_FUNCTION*) obj)->return_obj = NULL;
+      object_as_function(obj)->return_obj = NULL;
       for (i = 0; i < MAX_OVERLOADED_FUNCTIONS; i++)
       {
-        ((YR_OBJECT_FUNCTION*) obj)->prototypes[i].arguments_fmt = NULL;
-        ((YR_OBJECT_FUNCTION*) obj)->prototypes[i].code = NULL;
+        object_as_function(obj)->prototypes[i].arguments_fmt = NULL;
+        object_as_function(obj)->prototypes[i].code = NULL;
       }
       break;
   }
@@ -154,15 +154,15 @@ int yr_object_create(
         break;
 
       case OBJECT_TYPE_ARRAY:
-        ((YR_OBJECT_ARRAY*) parent)->prototype_item = obj;
+        object_as_array(parent)->prototype_item = obj;
         break;
 
       case OBJECT_TYPE_DICTIONARY:
-        ((YR_OBJECT_DICTIONARY*) parent)->prototype_item = obj;
+        object_as_dictionary(parent)->prototype_item = obj;
         break;
 
       case OBJECT_TYPE_FUNCTION:
-        ((YR_OBJECT_FUNCTION*) parent)->return_obj = obj;
+        object_as_function(parent)->return_obj = obj;
         break;
     }
   }
@@ -213,7 +213,7 @@ int yr_object_function_create(
     // Try to find if the structure already has a function
     // with that name. In that case this is a function overload.
 
-    f = (YR_OBJECT_FUNCTION*) yr_object_lookup_field(parent, identifier);
+    f = object_as_function(yr_object_lookup_field(parent, identifier));
 
     // Overloaded functions must have the same return type.
 
@@ -238,7 +238,7 @@ int yr_object_function_create(
             &return_obj),
         yr_object_destroy(o));
 
-    f = (YR_OBJECT_FUNCTION*) o;
+    f = object_as_function(o);
   }
 
   for (i = 0; i < MAX_OVERLOADED_FUNCTIONS; i++)
@@ -328,7 +328,6 @@ void yr_object_destroy(
   YR_ARRAY_ITEMS* array_items;
   YR_DICTIONARY_ITEMS* dict_items;
 
-  SIZED_STRING* str;
   int i;
 
   if (object == NULL)
@@ -337,7 +336,7 @@ void yr_object_destroy(
   switch(object->type)
   {
     case OBJECT_TYPE_STRUCTURE:
-      member = ((YR_OBJECT_STRUCTURE*) object)->members;
+      member = object_as_structure(object)->members;
 
       while (member != NULL)
       {
@@ -349,16 +348,15 @@ void yr_object_destroy(
       break;
 
     case OBJECT_TYPE_STRING:
-      str = ((YR_OBJECT_STRING*) object)->value;
-      if (str != NULL)
-        yr_free(str);
+      if (object->value.ss != NULL)
+        yr_free(object->value.ss);
       break;
 
     case OBJECT_TYPE_ARRAY:
-      if (((YR_OBJECT_ARRAY*) object)->prototype_item != NULL)
-        yr_object_destroy(((YR_OBJECT_ARRAY*) object)->prototype_item);
+      if (object_as_array(object)->prototype_item != NULL)
+        yr_object_destroy(object_as_array(object)->prototype_item);
 
-      array_items = ((YR_OBJECT_ARRAY*) object)->items;
+      array_items = object_as_array(object)->items;
 
       if (array_items != NULL)
       {
@@ -371,10 +369,10 @@ void yr_object_destroy(
       break;
 
     case OBJECT_TYPE_DICTIONARY:
-      if (((YR_OBJECT_DICTIONARY*) object)->prototype_item != NULL)
-        yr_object_destroy(((YR_OBJECT_DICTIONARY*) object)->prototype_item);
+      if (object_as_dictionary(object)->prototype_item != NULL)
+        yr_object_destroy(object_as_dictionary(object)->prototype_item);
 
-      dict_items = ((YR_OBJECT_DICTIONARY*) object)->items;
+      dict_items = object_as_dictionary(object)->items;
 
       if (dict_items != NULL)
       {
@@ -392,7 +390,7 @@ void yr_object_destroy(
       break;
 
     case OBJECT_TYPE_FUNCTION:
-      yr_object_destroy(((YR_OBJECT_FUNCTION*) object)->return_obj);
+      yr_object_destroy(object_as_function(object)->return_obj);
       break;
   }
 
@@ -410,7 +408,7 @@ YR_OBJECT* yr_object_lookup_field(
   assert(object != NULL);
   assert(object->type == OBJECT_TYPE_STRUCTURE);
 
-  member = ((YR_OBJECT_STRUCTURE*) object)->members;
+  member = object_as_structure(object)->members;
 
   while (member != NULL)
   {
@@ -557,8 +555,6 @@ int yr_object_copy(
   YR_OBJECT* o;
 
   YR_STRUCTURE_MEMBER* structure_member;
-  YR_OBJECT_FUNCTION* func;
-  YR_OBJECT_FUNCTION* func_copy;
 
   int i;
 
@@ -573,42 +569,37 @@ int yr_object_copy(
   switch(object->type)
   {
     case OBJECT_TYPE_INTEGER:
-      ((YR_OBJECT_INTEGER*) copy)->value = ((YR_OBJECT_INTEGER*) object)->value;
+      copy->value.i = object->value.i;
       break;
 
-    case OBJECT_TYPE_STRING:
-      if (((YR_OBJECT_STRING*) object)->value != NULL)
-      {
-        ((YR_OBJECT_STRING*) copy)->value = sized_string_dup(
-            ((YR_OBJECT_STRING*) object)->value);
-      }
-      else
-      {
-        ((YR_OBJECT_STRING*) copy)->value = NULL;
-      }
+    case OBJECT_TYPE_FLOAT:
+      copy->value.d = object->value.d;
       break;
 
-    case OBJECT_TYPE_FLOAT:
-      ((YR_OBJECT_DOUBLE*) copy)->value = ((YR_OBJECT_DOUBLE*) object)->value;
+    case OBJECT_TYPE_STRING:
+      if (object->value.ss != NULL)
+        copy->value.ss = sized_string_dup(object->value.ss);
+      else
+        copy->value.ss = NULL;
       break;
 
     case OBJECT_TYPE_FUNCTION:
 
-      func = (YR_OBJECT_FUNCTION*) object;
-      func_copy = (YR_OBJECT_FUNCTION*) copy;
-
       FAIL_ON_ERROR_WITH_CLEANUP(
-        yr_object_copy(func->return_obj, &func_copy->return_obj),
-        yr_object_destroy(copy));
+          yr_object_copy(
+              object_as_function(object)->return_obj,
+              &object_as_function(copy)->return_obj),
+          yr_object_destroy(copy));
 
       for (i = 0; i < MAX_OVERLOADED_FUNCTIONS; i++)
-        func_copy->prototypes[i] = func->prototypes[i];
+        object_as_function(copy)->prototypes[i] = \
+            object_as_function(object)->prototypes[i];
 
       break;
 
     case OBJECT_TYPE_STRUCTURE:
 
-      structure_member = ((YR_OBJECT_STRUCTURE*) object)->members;
+      structure_member = object_as_structure(object)->members;
 
       while (structure_member != NULL)
       {
@@ -628,21 +619,21 @@ int yr_object_copy(
 
     case OBJECT_TYPE_ARRAY:
 
-      yr_object_copy(
-        ((YR_OBJECT_ARRAY *) object)->prototype_item,
-        &o);
+      FAIL_ON_ERROR_WITH_CLEANUP(
+          yr_object_copy(object_as_array(object)->prototype_item, &o),
+          yr_object_destroy(copy));
 
-      ((YR_OBJECT_ARRAY *)copy)->prototype_item = o;
+      object_as_array(copy)->prototype_item = o;
 
       break;
 
     case OBJECT_TYPE_DICTIONARY:
 
-      yr_object_copy(
-        ((YR_OBJECT_DICTIONARY *) object)->prototype_item,
-        &o);
+      FAIL_ON_ERROR_WITH_CLEANUP(
+          yr_object_copy(object_as_dictionary(object)->prototype_item, &o),
+          yr_object_destroy(copy));
 
-      ((YR_OBJECT_DICTIONARY *)copy)->prototype_item = o;
+      object_as_dictionary(copy)->prototype_item = o;
 
       break;
 
@@ -677,9 +668,9 @@ int yr_object_structure_set_member(
 
   member->parent = object;
   sm->object = member;
-  sm->next = ((YR_OBJECT_STRUCTURE*) object)->members;
+  sm->next = object_as_structure(object)->members;
 
-  ((YR_OBJECT_STRUCTURE*) object)->members = sm;
+  object_as_structure(object)->members = sm;
 
   return ERROR_SUCCESS;
 }
@@ -698,7 +689,7 @@ YR_OBJECT* yr_object_array_get_item(
   if (index < 0)
     return NULL;
 
-  array = (YR_OBJECT_ARRAY*) object;
+  array = object_as_array(object);
 
   if (array->items != NULL && array->items->count > index)
       result = array->items->objects[index];
@@ -728,7 +719,7 @@ int yr_object_array_set_item(
   assert(index >= 0);
   assert(object->type == OBJECT_TYPE_ARRAY);
 
-  array = ((YR_OBJECT_ARRAY*) object);
+  array = object_as_array(object);
 
   if (array->items == NULL)
   {
@@ -779,7 +770,7 @@ YR_OBJECT* yr_object_dict_get_item(
 
   assert(object->type == OBJECT_TYPE_DICTIONARY);
 
-  dict = (YR_OBJECT_DICTIONARY*) object;
+  dict = object_as_dictionary(object);
 
   if (dict->items != NULL)
   {
@@ -814,7 +805,7 @@ int yr_object_dict_set_item(
 
   assert(object->type == OBJECT_TYPE_DICTIONARY);
 
-  dict = ((YR_OBJECT_DICTIONARY*) object);
+  dict = object_as_dictionary(object);
 
   if (dict->items == NULL)
   {
@@ -885,11 +876,11 @@ int yr_object_has_undefined_value(
   switch(field_obj->type)
   {
     case OBJECT_TYPE_FLOAT:
-      return isnan(((YR_OBJECT_DOUBLE*) field_obj)->value);
+      return isnan(field_obj->value.d);
     case OBJECT_TYPE_STRING:
-      return ((YR_OBJECT_STRING*) field_obj)->value == NULL;
+      return field_obj->value.ss == NULL;
     case OBJECT_TYPE_INTEGER:
-      return ((YR_OBJECT_INTEGER*) field_obj)->value == UNDEFINED;
+      return field_obj->value.i == UNDEFINED;
   }
 
   return FALSE;
@@ -919,7 +910,7 @@ int64_t yr_object_get_integer(
   assertf(integer_obj->type == OBJECT_TYPE_INTEGER,
           "type of \"%s\" is not integer\n", field);
 
-  return ((YR_OBJECT_INTEGER*) integer_obj)->value;
+  return integer_obj->value.i;
 }
 
 
@@ -946,7 +937,7 @@ double yr_object_get_float(
   assertf(double_obj->type == OBJECT_TYPE_FLOAT,
           "type of \"%s\" is not double\n", field);
 
-  return ((YR_OBJECT_DOUBLE*) double_obj)->value;
+  return double_obj->value.d;
 }
 
 
@@ -973,7 +964,7 @@ SIZED_STRING* yr_object_get_string(
   assertf(string_obj->type == OBJECT_TYPE_STRING,
           "type of \"%s\" is not string\n", field);
 
-  return ((YR_OBJECT_STRING*) string_obj)->value;
+  return string_obj->value.ss;
 }
 
 
@@ -989,8 +980,7 @@ int yr_object_set_integer(
   va_start(args, field);
 
   if (field != NULL)
-    integer_obj = _yr_object_lookup(
-        object, OBJECT_CREATE, field, args);
+    integer_obj = _yr_object_lookup(object, OBJECT_CREATE, field, args);
   else
     integer_obj = object;
 
@@ -999,7 +989,7 @@ int yr_object_set_integer(
   assert(integer_obj != NULL);
   assert(integer_obj->type == OBJECT_TYPE_INTEGER);
 
-  ((YR_OBJECT_INTEGER*) integer_obj)->value = value;
+  integer_obj->value.i = value;
 
   return ERROR_SUCCESS;
 }
@@ -1017,8 +1007,7 @@ int yr_object_set_float(
   va_start(args, field);
 
   if (field != NULL)
-    double_obj = _yr_object_lookup(
-        object, OBJECT_CREATE, field, args);
+    double_obj = _yr_object_lookup(object, OBJECT_CREATE, field, args);
   else
     double_obj = object;
 
@@ -1027,7 +1016,7 @@ int yr_object_set_float(
   assert(double_obj != NULL);
   assert(double_obj->type == OBJECT_TYPE_FLOAT);
 
-  ((YR_OBJECT_DOUBLE*) double_obj)->value = value;
+  double_obj->value.d = value;
 
   return ERROR_SUCCESS;
 }
@@ -1040,41 +1029,41 @@ int yr_object_set_string(
     const char* field,
     ...)
 {
-  YR_OBJECT_STRING* string_obj;
+  YR_OBJECT* string_obj;
 
   va_list args;
   va_start(args, field);
 
   if (field != NULL)
-    string_obj = (YR_OBJECT_STRING*) _yr_object_lookup(
-        object, OBJECT_CREATE, field, args);
+    string_obj = _yr_object_lookup(object, OBJECT_CREATE, field, args);
   else
-    string_obj = (YR_OBJECT_STRING*) object;
+    string_obj = object;
 
   va_end(args);
 
   assert(string_obj != NULL);
   assert(string_obj->type == OBJECT_TYPE_STRING);
 
-  if (string_obj->value != NULL)
-    yr_free(string_obj->value);
+  if (string_obj->value.ss != NULL)
+    yr_free(string_obj->value.ss);
 
   if (value != NULL)
   {
-    string_obj->value = (SIZED_STRING*) yr_malloc(len + sizeof(SIZED_STRING));
+    string_obj->value.ss = (SIZED_STRING*) yr_malloc(
+        len + sizeof(SIZED_STRING));
 
-    if (string_obj->value == NULL)
+    if (string_obj->value.ss == NULL)
       return ERROR_INSUFFICIENT_MEMORY;
 
-    string_obj->value->length = (uint32_t) len;
-    string_obj->value->flags = 0;
+    string_obj->value.ss->length = (uint32_t) len;
+    string_obj->value.ss->flags = 0;
 
-    memcpy(string_obj->value->c_string, value, len);
-    string_obj->value->c_string[len] = '\0';
+    memcpy(string_obj->value.ss->c_string, value, len);
+    string_obj->value.ss->c_string[len] = '\0';
   }
   else
   {
-    string_obj->value = NULL;
+    string_obj->value.ss = NULL;
   }
 
   return ERROR_SUCCESS;
@@ -1115,21 +1104,24 @@ YR_API void yr_object_print_data(
   switch(object->type)
   {
     case OBJECT_TYPE_INTEGER:
-      if (((YR_OBJECT_INTEGER*) object)->value != UNDEFINED)
-        printf(" = %" PRIu64, ((YR_OBJECT_INTEGER*) object)->value);
+
+      if (object->value.i != UNDEFINED)
+        printf(" = %" PRIu64, object->value.i);
       else
         printf(" = UNDEFINED");
+
       break;
 
     case OBJECT_TYPE_STRING:
-      if (((YR_OBJECT_STRING*) object)->value != NULL)
+
+      if (object->value.ss != NULL)
       {
         size_t l;
         printf(" = \"");
 
-        for (l = 0; l < ((YR_OBJECT_STRING*) object)->value->length; l++)
+        for (l = 0; l < object->value.ss->length; l++)
         {
-          char c = ((YR_OBJECT_STRING*) object)->value->c_string[l];
+          char c = object->value.ss->c_string[l];
 
           if (isprint((unsigned char) c))
             printf("%c", c);
@@ -1148,7 +1140,7 @@ YR_API void yr_object_print_data(
 
     case OBJECT_TYPE_STRUCTURE:
 
-      member = ((YR_OBJECT_STRUCTURE*) object)->members;
+      member = object_as_structure(object)->members;
 
       while (member != NULL)
       {
@@ -1163,7 +1155,8 @@ YR_API void yr_object_print_data(
       break;
 
     case OBJECT_TYPE_ARRAY:
-      array_items = ((YR_OBJECT_ARRAY*) object)->items;
+
+      array_items = object_as_array(object)->items;
 
       if (array_items != NULL)
       {
@@ -1181,7 +1174,7 @@ YR_API void yr_object_print_data(
 
     case OBJECT_TYPE_DICTIONARY:
 
-      dict_items = ((YR_OBJECT_DICTIONARY*) object)->items;
+      dict_items = object_as_dictionary(object)->items;
 
       if (dict_items != NULL)
       {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/forensics/yara.git



More information about the forensics-changes mailing list