Преглед на файлове

ncd: support calling methods on objects in dependencies

ambrop7 преди 15 години
родител
ревизия
f9ed9f44fa

+ 24 - 24
generated/NCDConfigParser_parse.c

@@ -89,7 +89,7 @@ typedef union {
 #define ParseARG_PDECL ,struct parser_out *parser_out
 #define ParseARG_FETCH struct parser_out *parser_out = yypParser->parser_out
 #define ParseARG_STORE yypParser->parser_out = parser_out
-#define YYNSTATE 35
+#define YYNSTATE 34
 #define YYNRULE 17
 #define YY_NO_ACTION      (YYNSTATE+YYNRULE+2)
 #define YY_ACCEPT_ACTION  (YYNSTATE+YYNRULE+1)
@@ -160,37 +160,37 @@ static const YYMINORTYPE yyzerominor = { 0 };
 **  yy_default[]       Default action for each state.
 */
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */    26,   19,   32,   26,   22,   32,   14,   24,   15,   26,
- /*    10 */    27,   34,   53,   30,   26,   25,   33,   17,   18,   13,
- /*    20 */    28,   18,   29,   18,   10,   12,   24,   20,   21,   31,
- /*    30 */    23,   35,   16,    8,    9,    5,   12,    3,    1,   54,
- /*    40 */     2,    6,   11,   54,   54,   54,    7,   54,    4,
+ /*     0 */    22,   18,   30,   22,   24,   30,   14,   20,   15,   22,
+ /*    10 */    26,   32,   52,   29,   22,   21,   31,   17,   13,   20,
+ /*    20 */    27,   13,   33,   13,    1,   34,   16,   11,   19,   28,
+ /*    30 */    23,   25,    5,    9,    8,    6,   53,    3,    2,   53,
+ /*    40 */    10,   12,   53,    4,   53,    7,
 };
 static const YYCODETYPE yy_lookahead[] = {
  /*     0 */    15,   16,   17,   15,   16,   17,   13,    2,    1,   15,
  /*    10 */    13,   17,   19,    2,   15,   10,   17,   14,   15,    2,
- /*    20 */    14,   15,   14,   15,    8,    9,    2,   18,   15,   15,
- /*    30 */    18,    0,    2,    4,    6,    3,    9,   11,    5,   20,
- /*    40 */     5,    7,    6,   20,   20,   20,    7,   20,   11,
+ /*    20 */    14,   15,   14,   15,    5,    0,    2,    8,   18,   15,
+ /*    30 */    15,   18,    3,    6,    4,    7,   20,   11,    5,   20,
+ /*    40 */     9,    6,   20,   11,   20,    7,
 };
 #define YY_SHIFT_USE_DFLT (-1)
-#define YY_SHIFT_MAX 26
+#define YY_SHIFT_MAX 25
 static const signed char yy_shift_ofst[] = {
  /*     0 */     7,    5,    5,    5,    5,   17,   17,   17,    7,   11,
- /*    10 */    24,   11,   24,   16,   31,   30,   32,   29,   33,   28,
- /*    20 */    34,   35,   36,   39,   27,   26,   37,
+ /*    10 */    17,   17,   11,   19,   25,   24,   29,   30,   27,   28,
+ /*    20 */    31,   26,   32,   33,   35,   38,
 };
 #define YY_REDUCE_USE_DFLT (-16)
 #define YY_REDUCE_MAX 12
 static const signed char yy_reduce_ofst[] = {
- /*     0 */    -7,  -15,  -12,   -6,   -1,    3,    6,    8,   -3,    9,
- /*    10 */    13,   12,   14,
+ /*     0 */    -7,  -15,  -12,   -6,   -1,    3,    6,    8,   -3,   10,
+ /*    10 */    14,   15,   13,
 };
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */    52,   44,   44,   52,   52,   52,   38,   40,   36,   50,
- /*    10 */    52,   50,   52,   42,   52,   52,   52,   52,   52,   52,
- /*    20 */    52,   52,   52,   52,   42,   46,   47,   37,   39,   41,
- /*    30 */    51,   43,   45,   49,   48,
+ /*     0 */    51,   43,   43,   51,   51,   51,   37,   39,   35,   49,
+ /*    10 */    51,   51,   49,   51,   51,   51,   51,   51,   51,   51,
+ /*    20 */    41,   45,   46,   51,   51,   51,   36,   38,   42,   50,
+ /*    30 */    44,   48,   47,   40,
 };
 #define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
 
@@ -301,8 +301,8 @@ static const char *const yyRuleName[] = {
  /*   2 */ "interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces",
  /*   3 */ "statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
  /*   4 */ "statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements",
- /*   5 */ "statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
- /*   6 */ "statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements",
+ /*   5 */ "statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
+ /*   6 */ "statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements",
  /*   7 */ "statement_names ::= NAME",
  /*   8 */ "statement_names ::= NAME DOT statement_names",
  /*   9 */ "statement_args_maybe ::=",
@@ -811,10 +811,10 @@ static void yy_reduce(
 }
 #line 813 "NCDConfigParser_parse.c"
         break;
-      case 5: /* statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
+      case 5: /* statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
 #line 108 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy30 = NCDConfig_make_statements(yymsp[-7].minor.yy0, yymsp[-5].minor.yy4, yymsp[-3].minor.yy24, yymsp[-1].minor.yy33, NULL);
+    yygotominor.yy30 = NCDConfig_make_statements(yymsp[-7].minor.yy4, yymsp[-5].minor.yy4, yymsp[-3].minor.yy24, yymsp[-1].minor.yy33, NULL);
     if (!yygotominor.yy30) {
         parser_out->out_of_memory = 1;
     }
@@ -825,10 +825,10 @@ static void yy_reduce(
 }
 #line 827 "NCDConfigParser_parse.c"
         break;
-      case 6: /* statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements */
+      case 6: /* statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements */
 #line 115 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy30 = NCDConfig_make_statements(yymsp[-8].minor.yy0, yymsp[-6].minor.yy4, yymsp[-4].minor.yy24, yymsp[-2].minor.yy33, yymsp[0].minor.yy30);
+    yygotominor.yy30 = NCDConfig_make_statements(yymsp[-8].minor.yy4, yymsp[-6].minor.yy4, yymsp[-4].minor.yy24, yymsp[-2].minor.yy33, yymsp[0].minor.yy30);
     if (!yygotominor.yy30) {
         parser_out->out_of_memory = 1;
     }

+ 98 - 105
generated/NCDConfigParser_parse.out

@@ -19,16 +19,16 @@ State 1:
           statement_args ::= * STRING COMMA statement_args
           statement_args ::= * statement_names COMMA statement_args
 
-                          NAME shift  24
-                        STRING shift  25
-               statement_names shift  26
-          statement_args_maybe shift  19
-                statement_args shift  32
+                          NAME shift  20
+                        STRING shift  21
+               statement_names shift  22
+          statement_args_maybe shift  18
+                statement_args shift  30
                      {default} reduce 9
 
 State 2:
-          statements ::= NAME ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= NAME ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statements ::= statement_names ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= statement_names ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
       (9) statement_args_maybe ::= *
@@ -38,11 +38,11 @@ State 2:
           statement_args ::= * STRING COMMA statement_args
           statement_args ::= * statement_names COMMA statement_args
 
-                          NAME shift  24
-                        STRING shift  25
-               statement_names shift  26
-          statement_args_maybe shift  22
-                statement_args shift  32
+                          NAME shift  20
+                        STRING shift  21
+               statement_names shift  22
+          statement_args_maybe shift  24
+                statement_args shift  30
                      {default} reduce 9
 
 State 3:
@@ -54,10 +54,10 @@ State 3:
           statement_args ::= STRING COMMA * statement_args
           statement_args ::= * statement_names COMMA statement_args
 
-                          NAME shift  24
-                        STRING shift  25
-               statement_names shift  26
-                statement_args shift  34
+                          NAME shift  20
+                        STRING shift  21
+               statement_names shift  22
+                statement_args shift  32
 
 State 4:
           statement_names ::= * NAME
@@ -68,53 +68,53 @@ State 4:
           statement_args ::= * statement_names COMMA statement_args
           statement_args ::= statement_names COMMA * statement_args
 
-                          NAME shift  24
-                        STRING shift  25
-               statement_names shift  26
-                statement_args shift  33
+                          NAME shift  20
+                        STRING shift  21
+               statement_names shift  22
+                statement_args shift  31
 
 State 5:
           interfaces ::= PROCESS NAME CURLY_OPEN * statements CURLY_CLOSE
           interfaces ::= PROCESS NAME CURLY_OPEN * statements CURLY_CLOSE interfaces
           statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= * NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= * NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  13
+                          NAME shift  20
                     statements shift  17
-               statement_names shift  18
+               statement_names shift  13
 
 State 6:
           statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
       (3) statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
           statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
           statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON * statements
-          statements ::= * NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= * NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  13
-                    statements shift  28
-               statement_names shift  18
+                          NAME shift  20
+                    statements shift  27
+               statement_names shift  13
                      {default} reduce 3
 
 State 7:
           statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= * NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-      (5) statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
-          statements ::= * NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON * statements
+          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+      (5) statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
+          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON * statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  13
-                    statements shift  29
-               statement_names shift  18
+                          NAME shift  20
+                    statements shift  33
+               statement_names shift  13
                      {default} reduce 5
 
 State 8:
@@ -124,7 +124,7 @@ State 8:
           interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE * interfaces
 
                        PROCESS shift  15
-                    interfaces shift  27
+                    interfaces shift  26
                      {default} reduce 1
 
 State 9:
@@ -133,46 +133,45 @@ State 9:
      (15) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  30
-                    name_maybe shift  20
+                          NAME shift  29
+                    name_maybe shift  19
                      {default} reduce 15
 
 State 10:
-          statements ::= NAME ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= NAME ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
+          statement_names ::= NAME DOT * statement_names
 
-                          NAME shift  24
-               statement_names shift  21
+                          NAME shift  20
+               statement_names shift  28
 
 State 11:
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON statements
-     (15) name_maybe ::= *
-          name_maybe ::= * NAME
+          statements ::= statement_names ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= statement_names ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statement_names ::= * NAME
+          statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  30
-                    name_maybe shift  23
-                     {default} reduce 15
+                          NAME shift  20
+               statement_names shift  23
 
 State 12:
-          statement_names ::= * NAME
-          statement_names ::= * NAME DOT statement_names
-          statement_names ::= NAME DOT * statement_names
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON statements
+     (15) name_maybe ::= *
+          name_maybe ::= * NAME
 
-                          NAME shift  24
-               statement_names shift  31
+                          NAME shift  29
+                    name_maybe shift  25
+                     {default} reduce 15
 
 State 13:
-          statements ::= NAME * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= NAME * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-      (7) statement_names ::= NAME *
-          statement_names ::= NAME * DOT statement_names
+          statements ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statements ::= statement_names * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= statement_names * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
 
-                         ARROW shift  10
-                           DOT shift  12
-                     {default} reduce 7
+                    ROUND_OPEN shift  1
+                         ARROW shift  11
 
 State 14:
       (0) input ::= interfaces *
@@ -198,102 +197,96 @@ State 17:
                    CURLY_CLOSE shift  8
 
 State 18:
-          statements ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-
-                    ROUND_OPEN shift  1
-
-State 19:
           statements ::= statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
           statements ::= statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON statements
 
                    ROUND_CLOSE shift  9
 
-State 20:
+State 19:
           statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
           statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON statements
 
                      SEMICOLON shift  6
 
-State 21:
-          statements ::= NAME ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= NAME ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-
-                    ROUND_OPEN shift  2
-
-State 22:
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON statements
-
-                   ROUND_CLOSE shift  11
-
-State 23:
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
-          statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON statements
-
-                     SEMICOLON shift  7
-
-State 24:
+State 20:
       (7) statement_names ::= NAME *
           statement_names ::= NAME * DOT statement_names
 
-                           DOT shift  12
+                           DOT shift  10
                      {default} reduce 7
 
-State 25:
+State 21:
      (11) statement_args ::= STRING *
           statement_args ::= STRING * COMMA statement_args
 
                          COMMA shift  3
                      {default} reduce 11
 
-State 26:
+State 22:
      (12) statement_args ::= statement_names *
           statement_args ::= statement_names * COMMA statement_args
 
                          COMMA shift  4
                      {default} reduce 12
 
-State 27:
+State 23:
+          statements ::= statement_names ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= statement_names ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+
+                    ROUND_OPEN shift  2
+
+State 24:
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON statements
+
+                   ROUND_CLOSE shift  12
+
+State 25:
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
+          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON statements
+
+                     SEMICOLON shift  7
+
+State 26:
       (2) interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces *
 
                      {default} reduce 2
 
-State 28:
+State 27:
       (4) statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements *
 
                      {default} reduce 4
 
-State 29:
-      (6) statements ::= NAME ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements *
+State 28:
+      (8) statement_names ::= NAME DOT statement_names *
 
-                     {default} reduce 6
+                     {default} reduce 8
 
-State 30:
+State 29:
      (16) name_maybe ::= NAME *
 
                      {default} reduce 16
 
-State 31:
-      (8) statement_names ::= NAME DOT statement_names *
-
-                     {default} reduce 8
-
-State 32:
+State 30:
      (10) statement_args_maybe ::= statement_args *
 
                      {default} reduce 10
 
-State 33:
+State 31:
      (14) statement_args ::= statement_names COMMA statement_args *
 
                      {default} reduce 14
 
-State 34:
+State 32:
      (13) statement_args ::= STRING COMMA statement_args *
 
                      {default} reduce 13
 
+State 33:
+      (6) statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements *
+
+                     {default} reduce 6
+
 ----------------------------------------------------
 Symbols:
     0: $:

+ 2 - 2
generated/NCDConfigParser_parse.y

@@ -105,14 +105,14 @@ statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CL
     }
 }
 
-statements(R) ::= NAME(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
+statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
     R = NCDConfig_make_statements(M, A, B, C, NULL);
     if (!R) {
         parser_out->out_of_memory = 1;
     }
 }
 
-statements(R) ::= NAME(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
+statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
     R = NCDConfig_make_statements(M, A, B, C, N);
     if (!R) {
         parser_out->out_of_memory = 1;

+ 27 - 1
ncd/NCDModule.c

@@ -89,7 +89,7 @@ static void clean_job_handler (NCDModuleInst *n)
 }
 
 void NCDModuleInst_Init (NCDModuleInst *n, const struct NCDModule *m, NCDModuleInst *method_object, NCDValue *args, const char *logprefix, BReactor *reactor, BProcessManager *manager,
-                         NCDModule_handler_event handler_event, NCDModule_handler_getvar handler_getvar, void *user)
+                         NCDModule_handler_event handler_event, NCDModule_handler_getvar handler_getvar, NCDModule_handler_getobj handler_getobj, void *user)
 {
     // init arguments
     n->m = m;
@@ -100,6 +100,7 @@ void NCDModuleInst_Init (NCDModuleInst *n, const struct NCDModule *m, NCDModuleI
     n->manager = manager;
     n->handler_event = handler_event;
     n->handler_getvar = handler_getvar;
+    n->handler_getobj = handler_getobj;
     n->user = user;
     
     // init jobs
@@ -187,6 +188,7 @@ int NCDModuleInst_GetVar (NCDModuleInst *n, const char *name, NCDValue *out)
 {
     DebugObject_Access(&n->d_obj);
     ASSERT(n->state == STATE_UP)
+    ASSERT(name)
     
     if (!n->m->func_getvar) {
         return 0;
@@ -195,6 +197,19 @@ int NCDModuleInst_GetVar (NCDModuleInst *n, const char *name, NCDValue *out)
     return n->m->func_getvar(n->inst_user, name, out);
 }
 
+NCDModuleInst * NCDModuleInst_GetObj (NCDModuleInst *n, const char *objname)
+{
+    DebugObject_Access(&n->d_obj);
+    ASSERT(n->state == STATE_UP)
+    ASSERT(objname)
+    
+    if (!n->m->func_getobj) {
+        return NULL;
+    }
+    
+    return n->m->func_getobj(n->inst_user, objname);
+}
+
 int NCDModuleInst_HaveError (NCDModuleInst *n)
 {
     DebugObject_Access(&n->d_obj);
@@ -296,6 +311,17 @@ int NCDModuleInst_Backend_GetVar (NCDModuleInst *n, const char *modname, const c
     return res;
 }
 
+NCDModuleInst * NCDModuleInst_Backend_GetObj (NCDModuleInst *n, const char *objname)
+{
+    DebugObject_Access(&n->d_obj);
+    ASSERT(n->state == STATE_DOWN_PCLEAN || n->state == STATE_DOWN_UNCLEAN || n->state == STATE_DOWN_CLEAN ||
+           n->state == STATE_UP || n->state == STATE_DOWN_DIE || n->state == STATE_UP_DIE ||
+           n->state == STATE_DYING)
+    ASSERT(objname)
+    
+    return n->handler_getobj(n->user, objname);
+}
+
 void NCDModuleInst_Backend_Log (NCDModuleInst *n, int channel, int level, const char *fmt, ...)
 {
     DebugObject_Access(&n->d_obj);

+ 9 - 1
ncd/NCDModule.h

@@ -37,8 +37,11 @@
 #define NCDMODULE_TOEVENT_DIE 101
 #define NCDMODULE_TOEVENT_CLEAN 102
 
+struct NCDModuleInst_s;
+
 typedef void (*NCDModule_handler_event) (void *user, int event);
 typedef int (*NCDModule_handler_getvar) (void *user, const char *modname, const char *varname, NCDValue *out);
+typedef struct NCDModuleInst_s * (*NCDModule_handler_getobj) (void *user, const char *objname);
 
 struct NCDModule;
 
@@ -56,6 +59,7 @@ typedef struct NCDModuleInst_s {
     BProcessManager *manager;
     NCDModule_handler_event handler_event;
     NCDModule_handler_getvar handler_getvar;
+    NCDModule_handler_getobj handler_getobj;
     void *user;
     BPending init_job;
     BPending uninit_job;
@@ -68,14 +72,16 @@ typedef struct NCDModuleInst_s {
 } NCDModuleInst;
 
 void NCDModuleInst_Init (NCDModuleInst *n, const struct NCDModule *m, NCDModuleInst *method_object, NCDValue *args, const char *logprefix, BReactor *reactor, BProcessManager *manager,
-                         NCDModule_handler_event handler_event, NCDModule_handler_getvar handler_getvar, void *user);
+                         NCDModule_handler_event handler_event, NCDModule_handler_getvar handler_getvar, NCDModule_handler_getobj handler_getobj, void *user);
 void NCDModuleInst_Free (NCDModuleInst *n);
 void NCDModuleInst_Event (NCDModuleInst *n, int event);
 int NCDModuleInst_GetVar (NCDModuleInst *n, const char *name, NCDValue *out) WARN_UNUSED;
+NCDModuleInst * NCDModuleInst_GetObj (NCDModuleInst *n, const char *objname) WARN_UNUSED;
 int NCDModuleInst_HaveError (NCDModuleInst *n);
 void NCDModuleInst_Backend_SetUser (NCDModuleInst *n, void *user);
 void NCDModuleInst_Backend_Event (NCDModuleInst *n, int event);
 int NCDModuleInst_Backend_GetVar (NCDModuleInst *n, const char *modname, const char *varname, NCDValue *out) WARN_UNUSED;
+NCDModuleInst * NCDModuleInst_Backend_GetObj (NCDModuleInst *n, const char *objname) WARN_UNUSED;
 void NCDModuleInst_Backend_Log (NCDModuleInst *n, int channel, int level, const char *fmt, ...);
 void NCDModuleInst_Backend_SetError (NCDModuleInst *n);
 
@@ -84,6 +90,7 @@ typedef void (*NCDModule_func_globalfree) (void);
 typedef void (*NCDModule_func_new) (NCDModuleInst *params);
 typedef void (*NCDModule_func_die) (void *o);
 typedef int (*NCDModule_func_getvar) (void *o, const char *name, NCDValue *out);
+typedef NCDModuleInst * (*NCDModule_func_getobj) (void *o, const char *objname);
 typedef void (*NCDModule_func_clean) (void *o);
 
 struct NCDModule {
@@ -91,6 +98,7 @@ struct NCDModule {
     NCDModule_func_new func_new;
     NCDModule_func_die func_die;
     NCDModule_func_getvar func_getvar;
+    NCDModule_func_getobj func_getobj;
     NCDModule_func_clean func_clean;
 };
 

+ 11 - 1
ncd/modules/depend.c

@@ -350,6 +350,15 @@ fail0:
     return ret;
 }
 
+static NCDModuleInst * depend_func_getobj (void *vo, const char *objname)
+{
+    struct depend *o = vo;
+    ASSERT(o->p)
+    ASSERT(!o->p->dying)
+    
+    return NCDModuleInst_Backend_GetObj(o->p->i, objname);
+}
+
 static const struct NCDModule modules[] = {
     {
         .type = "provide",
@@ -360,7 +369,8 @@ static const struct NCDModule modules[] = {
         .func_new = depend_func_new,
         .func_die = depend_func_die,
         .func_clean = depend_func_clean,
-        .func_getvar = depend_func_getvar
+        .func_getvar = depend_func_getvar,
+        .func_getobj = depend_func_getobj
     }, {
         .type = NULL
     }

+ 12 - 1
ncd/modules/multidepend.c

@@ -392,6 +392,16 @@ fail0:
     return ret;
 }
 
+static NCDModuleInst * depend_func_getobj (void *vo, const char *objname)
+{
+    struct depend *o = vo;
+    ASSERT(o->provide)
+    ASSERT(!o->provide_collapsing)
+    ASSERT(!o->provide->dying)
+    
+    return NCDModuleInst_Backend_GetObj(o->provide->i, objname);
+}
+
 static const struct NCDModule modules[] = {
     {
         .type = "multiprovide",
@@ -402,7 +412,8 @@ static const struct NCDModule modules[] = {
         .func_new = depend_func_new,
         .func_die = depend_func_die,
         .func_clean = depend_func_clean,
-        .func_getvar = depend_func_getvar
+        .func_getvar = depend_func_getvar,
+        .func_getobj = depend_func_getobj
     }, {
         .type = NULL
     }

+ 100 - 33
ncd/ncd.c

@@ -152,11 +152,12 @@ static void process_advance_job_handler (struct process *p);
 static void process_wait_timer_handler (struct process *p);
 static struct process_statement * process_find_statement (struct process *p, size_t pos, const char *name);
 static int process_resolve_variable (struct process *p, size_t pos, const char *modname, const char *varname, NCDValue *out);
+static struct process_statement * process_resolve_object (struct process *p, size_t pos, const char *objname);
 static void process_statement_log (struct process_statement *ps, int level, const char *fmt, ...);
 static void process_statement_set_error (struct process_statement *ps);
 static void process_statement_instance_handler_event (struct process_statement *ps, int event);
 static int process_statement_instance_handler_getvar (struct process_statement *ps, const char *modname, const char *varname, NCDValue *out);
-static void free_job_handler (void *unused);
+static NCDModuleInst * process_statement_instance_handler_getobj (struct process_statement *ps, const char *objname);
 
 int main (int argc, char **argv)
 {
@@ -524,24 +525,34 @@ const struct NCDModule * find_module (const char *name)
 
 int statement_init (struct statement *s, struct NCDConfig_statements *conf)
 {
+    s->object_name = NULL;
+    s->method_name = NULL;
+    s->name = NULL;
+    s->first_arg = NULL;
+    
     // set object name
-    if (!conf->objname) {
-        s->object_name = NULL;
-    } else {
-        if (!(s->object_name = strdup(conf->objname))) {
-            BLog(BLOG_ERROR, "strdup failed");
-            goto fail0;
+    if (conf->objname) {
+        if (!(s->object_name = NCDConfig_concat_strings(conf->objname))) {
+            BLog(BLOG_ERROR, "NCDConfig_concat_strings failed");
+            goto fail;
         }
     }
     
     // set method name
     if (!(s->method_name = NCDConfig_concat_strings(conf->names))) {
         BLog(BLOG_ERROR, "NCDConfig_concat_strings failed");
-        goto fail1;
+        goto fail;
+    }
+    
+    // init name
+    if (conf->name) {
+        if (!(s->name = strdup(conf->name))) {
+            BLog(BLOG_ERROR, "strdup failed");
+            goto fail;
+        }
     }
     
     // init arguments
-    s->first_arg = NULL;
     struct argument_elem **prevptr = &s->first_arg;
     struct NCDConfig_arguments *arg = conf->args;
     while (arg) {
@@ -590,42 +601,27 @@ int statement_init (struct statement *s, struct NCDConfig_statements *conf)
     loop_fail1:
         free(e);
     loop_fail0:
-        goto fail2;
-    }
-    
-    // init name
-    if (!conf->name) {
-        s->name = NULL;
-    } else {
-        if (!(s->name = strdup(conf->name))) {
-            BLog(BLOG_ERROR, "strdup failed");
-            goto fail1;
-        }
+        goto fail;
     }
     
     return 1;
     
-fail2:
+fail:
     statement_free_args(s);
+    free(s->name);
     free(s->method_name);
-fail1:
     free(s->object_name);
-fail0:
     return 0;
 }
 
 void statement_free (struct statement *s)
 {
-    // free name
-    free(s->name);
-    
     // free arguments
     statement_free_args(s);
     
-    // free method name
+    // free names
+    free(s->name);
     free(s->method_name);
-    
-    // free object name
     free(s->object_name);
 }
 
@@ -945,12 +941,12 @@ void process_advance_job_handler (struct process *p)
             goto fail0;
         }
     } else {
-        // this is an object->method_call(); type is "typeof(object)::method_call"
+        // this is a some.object.somewhere->method_call(); type is "typeof(some.object.somewhere)::method_call"
         
-        // find referred-to statement
-        struct process_statement *obj_ps = process_find_statement(p, p->ap, ps->s.object_name);
+        // resolve object
+        struct process_statement *obj_ps = process_resolve_object(p, p->ap, ps->s.object_name);
         if (!obj_ps) {
-            process_statement_log(ps, BLOG_ERROR, "failed to find object for method call: %s", ps->s.object_name);
+            process_statement_log(ps, BLOG_ERROR, "failed to resolve object %s for method call", ps->s.object_name);
             goto fail0;
         }
         ASSERT(obj_ps->state == SSTATE_ADULT)
@@ -1009,6 +1005,7 @@ void process_advance_job_handler (struct process *p)
         &ps->inst, module, method_object, &ps->inst_args, ps->logprefix, &ss, &manager,
         (NCDModule_handler_event)process_statement_instance_handler_event,
         (NCDModule_handler_getvar)process_statement_instance_handler_getvar,
+        (NCDModule_handler_getobj)process_statement_instance_handler_getobj,
         ps
     );
     
@@ -1097,6 +1094,59 @@ int process_resolve_variable (struct process *p, size_t pos, const char *modname
     return 1;
 }
 
+struct process_statement * process_resolve_object (struct process *p, size_t pos, const char *objname)
+{
+    process_assert_pointers(p);
+    ASSERT(pos >= 0)
+    ASSERT(pos <= process_rap(p))
+    ASSERT(objname)
+    
+    struct process_statement *res_ps = NULL;
+    
+    // copy name
+    char *name = strdup(objname);
+    if (!name) {
+        process_log(p, BLOG_ERROR, "strdup failed");
+        goto fail0;
+    }
+    
+    // split name into first name and the rest
+    const char *objname_first = name;
+    const char *objname_rest = NULL;
+    char *dot = strstr(name, ".");
+    if (dot) {
+        *dot = '\0';
+        objname_rest = dot + 1;
+    }
+    
+    // find referred-to statement of the first name
+    struct process_statement *first_ps = process_find_statement(p, pos, objname_first);
+    if (!first_ps) {
+        process_log(p, BLOG_ERROR, "failed to find first object for %s", objname);
+        goto fail1;
+    }
+    ASSERT(first_ps->state == SSTATE_ADULT)
+    
+    if (!objname_rest) {
+        // this is the target
+        res_ps = first_ps;
+    } else {
+        // query this statement
+        NCDModuleInst *inst = NCDModuleInst_GetObj(&first_ps->inst, objname_rest);
+        if (!inst) {
+            process_log(p, BLOG_ERROR, "object failed to provide contained object for %s", objname);
+            goto fail1;
+        }
+        res_ps = UPPER_OBJECT(inst, struct process_statement, inst);
+        ASSERT(res_ps->state == SSTATE_ADULT)
+    }
+    
+fail1:
+    free(name);
+fail0:
+    return res_ps;
+}
+
 void process_statement_log (struct process_statement *ps, int level, const char *fmt, ...)
 {
     va_list vl;
@@ -1198,3 +1248,20 @@ int process_statement_instance_handler_getvar (struct process_statement *ps, con
     
     return process_resolve_variable(ps->p, ps->i, modname, varname, out);
 }
+
+NCDModuleInst * process_statement_instance_handler_getobj (struct process_statement *ps, const char *objname)
+{
+    ASSERT(ps->state != SSTATE_FORGOTTEN)
+    
+    if (ps->i > process_rap(ps->p)) {
+        process_statement_log(ps, BLOG_ERROR, "tried to resolve object %s but it's dirty", objname);
+        return 0;
+    }
+    
+    struct process_statement *rps = process_resolve_object(ps->p, ps->i, objname);
+    if (!rps) {
+        return NULL;
+    }
+    
+    return &rps->inst;
+}

+ 2 - 2
ncdconfig/NCDConfig.c

@@ -47,7 +47,7 @@ void NCDConfig_free_statements (struct NCDConfig_statements *v)
         return;
     }
     
-    free(v->objname);
+    NCDConfig_free_strings(v->objname);
     NCDConfig_free_strings(v->names);
     NCDConfig_free_arguments(v->args);
     free(v->name);
@@ -114,7 +114,7 @@ fail:
     return NULL;
 }
 
-struct NCDConfig_statements * NCDConfig_make_statements (char *objname, struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next)
+struct NCDConfig_statements * NCDConfig_make_statements (struct NCDConfig_strings *objname, struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next)
 {
     struct NCDConfig_statements *v = malloc(sizeof(*v));
     if (!v) {

+ 2 - 2
ncdconfig/NCDConfig.h

@@ -35,7 +35,7 @@ struct NCDConfig_interfaces {
 };
 
 struct NCDConfig_statements {
-    char *objname;
+    struct NCDConfig_strings *objname;
     struct NCDConfig_strings *names;
     struct NCDConfig_arguments *args;
     char *name;
@@ -64,7 +64,7 @@ void NCDConfig_free_statements (struct NCDConfig_statements *v);
 void NCDConfig_free_arguments (struct NCDConfig_arguments *v);
 void NCDConfig_free_strings (struct NCDConfig_strings *v);
 struct NCDConfig_interfaces * NCDConfig_make_interfaces (char *name, struct NCDConfig_statements *statements, int have_next, struct NCDConfig_interfaces *next);
-struct NCDConfig_statements * NCDConfig_make_statements (char *objname, struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next);
+struct NCDConfig_statements * NCDConfig_make_statements (struct NCDConfig_strings *objname, struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next);
 struct NCDConfig_arguments * NCDConfig_make_arguments_string (char *str, struct NCDConfig_arguments *next);
 struct NCDConfig_arguments * NCDConfig_make_arguments_var (struct NCDConfig_strings *var, struct NCDConfig_arguments *next);
 struct NCDConfig_strings * NCDConfig_make_strings (char *value, int have_next, struct NCDConfig_strings *next);

+ 2 - 2
ncdconfig/NCDConfigParser_parse.y

@@ -105,14 +105,14 @@ statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CL
     }
 }
 
-statements(R) ::= NAME(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
+statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
     R = NCDConfig_make_statements(M, A, B, C, NULL);
     if (!R) {
         parser_out->out_of_memory = 1;
     }
 }
 
-statements(R) ::= NAME(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
+statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
     R = NCDConfig_make_statements(M, A, B, C, N);
     if (!R) {
         parser_out->out_of_memory = 1;