aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog.md25
-rw-r--r--README.md2
-rw-r--r--src/config.h10
-rw-r--r--src/inpla.y694
-rw-r--r--src/mytype.h4
5 files changed, 445 insertions, 290 deletions
diff --git a/Changelog.md b/Changelog.md
index 0ac8a06..ff7db18 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,4 +1,29 @@
# Change log
+### v0.9.2-3 (released on 22 August 2022)
+#### Bux fix
+
+* **Invalid register allocation**: When a rule `A(x1,...)><B(y1,...)` is given, Inpla also define the symmetry version `B(y1,...)><A(x1,...)`. The symmetry version had not been correctly compiled due to the invalid register allocation. For another invalid allocation issue, some tail recursive optimisation had not work correctly. These work well now!
+
+#### Polished
+* **Maximum port numbers**: The number of agent ports is defined as `5` in `config.h` as follows:
+
+ ```
+ // ------------------------------------------------
+ // Number of Agent Ports
+ // ------------------------------------------------
+ // MAX_PORT defines a number of ports of agents.
+ // Default is 5 and should be 2 or more.
+
+ #define MAX_PORT 5
+ ```
+
+ Change it when more ports are required. Typically, less port numbers, faster execusion.
+
+* **Filename given by `-f` option**: Inpla can be invoked with `-f` option to specify an input script file. When a given filename is not found, Inpla in this version looks for a filename adding `.in` file extension.
+
+
+
+
### v0.9.2-2 (released on 21 August 2022)
#### Bux fix
diff --git a/README.md b/README.md
index 65434ed..623af17 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
Inpla is a multi-threaded parallel interpreter of interaction nets. Once you write programs for sequential execution, it works also in multi-threaded parallel execution. Each thread is managed on each CPU-core with POSIX-thread library.
-* The current version is 0.9.2-2 (bugfix), released on **21 August 2022**. (See [Changelog.md](Changelog.md) for details.)
+* The current version is 0.9.2-3 (bugfix mainly), released on **22 August 2022**. (See [Changelog.md](Changelog.md) for details.)
* The below graph shows speed-up ratio to threads numbers for programs in the following benchmark table.
![speedup-ratio](pic/benchmark_reuse_v0.8.2-2.png)
diff --git a/src/config.h b/src/config.h
index 23afdc0..17d50aa 100644
--- a/src/config.h
+++ b/src/config.h
@@ -5,6 +5,16 @@
// ------------------------------------------------
+// Number of Agent Ports
+// ------------------------------------------------
+// MAX_PORT defines a number of ports of agents.
+// Default is 5 and should be 2 or more.
+
+#define MAX_PORT 5
+
+
+
+// ------------------------------------------------
// Heaps
// ------------------------------------------------
// There are three methods for agents and names heaps:
diff --git a/src/inpla.y b/src/inpla.y
index e359144..71c39ea 100644
--- a/src/inpla.y
+++ b/src/inpla.y
@@ -22,8 +22,8 @@
// ----------------------------------------------
-#define VERSION "0.9.2-2"
-#define BUILT_DATE "21 August 2022"
+#define VERSION "0.9.2-3"
+#define BUILT_DATE "22 August 2022"
// ------------------------------------------------------------------
@@ -2337,7 +2337,7 @@ typedef enum {
OP_RET, OP_RET_FREE_LR, OP_RET_FREE_L, OP_RET_FREE_R,
- OP_LOADI, OP_LOAD,
+ OP_LOADI, OP_LOAD, OP_LOADP,
OP_ADD, OP_SUB, OP_ADDI, OP_SUBI, OP_MUL, OP_DIV, OP_MOD,
OP_LT, OP_LE, OP_EQ, OP_EQI, OP_NE,
@@ -2476,7 +2476,7 @@ void IMCode_puts(int n) {
"RET", "RET_FREE_LR", "RET_FREE_L", "RET_FREE_R",
- "LOADI", "LOAD",
+ "LOADI", "LOAD", "OP_LOADP",
"ADD", "SUB", "ADDI", "SUBI", "MUL", "DIV", "MOD",
"LT", "LE", "EQ", "EQI", "NE",
@@ -2664,6 +2664,11 @@ void IMCode_puts(int n) {
imcode->operand1, imcode->operand2);
break;
+ case OP_LOADP:
+ printf("%s var%ld $%ld var%ld\n", string_opcode[imcode->opcode],
+ imcode->operand1, imcode->operand2, imcode->operand3);
+ break;
+
// arity is 2: opcode var1 $2
case OP_PUSHI:
@@ -2939,6 +2944,13 @@ void VMCode_puts(void **code, int n) {
(unsigned long)code[i+2]);
i+=2;
+ } else if (code[i] == CodeAddr[OP_LOADP]) {
+ printf("loadp reg%lu $%ld reg%lu\n",
+ (unsigned long)code[i+1],
+ (unsigned long)code[i+2],
+ (unsigned long)code[i+3]);
+ i+=3;
+
} else if (code[i] == CodeAddr[OP_LOOP]) {
puts("loop");
@@ -3752,6 +3764,12 @@ int CmEnv_Optimise_check_occurence_in_block(int localvar,
}
break;
+ case OP_LOADP:
+ // OP src1 port dest
+ if (imcode->operand1 == localvar) {
+ return 1;
+ }
+ break;
case OP_MKNAME:
case OP_MKGNAME:
@@ -4123,7 +4141,15 @@ int CmEnv_Optimise_VMCode_CopyPropagation(int target_imcode_addr) {
break;
-
+ case OP_LOADP:
+ // LOADP src port dest
+ if (imcode->operand1 == load_to) {
+ imcode->operand1 = load_from;
+ IMCode[target_imcode_addr].opcode = OP_DEAD_CODE;
+ return 1;
+ }
+ break;
+
case OP_PUSH:
case OP_MYPUSH:
@@ -4805,6 +4831,29 @@ int CmEnv_generate_VMCode(void **code) {
}
+
+ case OP_LOADP: {
+ // OP_LOADP src1 port dest
+ long src1 = imcode->operand1;
+ long port = imcode->operand2;
+ long dest = imcode->operand3;
+
+#ifdef OPTIMISE_IMCODE
+ src1 = CmEnv_using_reg(src1);
+ if (!CmEnv_Optimise_check_occurence_in_block(imcode->operand1, line_num))
+ CmEnv_free_reg(src1);
+
+ dest = CmEnv_using_reg(dest);
+#endif
+
+ code[addr++] = CodeAddr[imcode->opcode];
+ code[addr++] = (void *)(unsigned long)src1;
+ code[addr++] = (void *)(unsigned long)port;
+ code[addr++] = (void *)(unsigned long)dest;
+ break;
+
+ }
+
case OP_LOADI: {
// OP_LOADI int1 dest
@@ -6043,7 +6092,8 @@ int Compile_term_on_ast(Ast *ptr, int target) {
alloc[0] = Compile_term_on_ast(ptr->left, target);
result = alloc[0];
- } else {
+ } else {
+
// normal case
ptr=ptr->right;
for (i=0; i< arity; i++) {
@@ -6092,7 +6142,7 @@ int Compile_term_on_ast(Ast *ptr, int target) {
alloc[0], alloc[1], alloc[2]);
}
break;
-
+
case 4:
if (target == -1) {
mkagent = OP_MKAGENT4;
@@ -6104,7 +6154,8 @@ int Compile_term_on_ast(Ast *ptr, int target) {
alloc[0], alloc[1], alloc[2], alloc[3]);
}
break;
-
+
+#if MAX_PORT > 4
default:
if (target == -1) {
mkagent = OP_MKAGENT5;
@@ -6116,7 +6167,8 @@ int Compile_term_on_ast(Ast *ptr, int target) {
IMCode_genCode7(mkagent, result, GET_TUPLEID(arity),
alloc[0], alloc[1], alloc[2], alloc[3], alloc[4]);
}
-
+#endif
+
}
}
@@ -6225,18 +6277,28 @@ int Compile_term_on_ast(Ast *ptr, int target) {
alloc[3]);
}
break;
-
+
+#if MAX_PORT > 4
default:
if (target == -1) {
mkagent = OP_MKAGENT5;
IMCode_genCode7(mkagent, id, alloc[0], alloc[1], alloc[2],
alloc[3], alloc[4], result);
+
+ for (i=5; i<arity; i++) {
+ IMCode_genCode3(OP_LOADP, alloc[i], i, result);
+ }
+
} else {
mkagent = OP_REUSEAGENT5;
IMCode_genCode7(mkagent, result, id, alloc[0], alloc[1], alloc[2],
alloc[3], alloc[4]);
+ for (i=5; i<arity; i++) {
+ IMCode_genCode3(OP_LOADP, alloc[i], i, result);
+ }
+
}
- break;
+#endif
}
return result;
@@ -6335,14 +6397,14 @@ int check_invalid_occurrence(Ast *ast) {
// already twice
printf("ERROR: '%s' occurs twice already. \n", ast->left->sym);
printf(" Use 'ifce' command to see the occurrence.\n");
- return 1;
+ return 0;
}
}
}
- return 0;
+ return 1;
}
@@ -6398,6 +6460,7 @@ int Compile_eqlist_on_ast(Ast *at) {
#ifndef OPTIMISE_IMCODE_TRO
+ // Without Tail Rcursion Optimisation
// 2021/9/6: It seems, always EnvAddCodePUSH is selected
// because at is not NULL in this step. Should be (next == NULL)?
@@ -6423,6 +6486,7 @@ int Compile_eqlist_on_ast(Ast *at) {
#else
+ // WITH Tail Rcursion Optimisation
if ((next != NULL)
|| ((next == NULL) && (eq->id == AST_CNCT))) {
@@ -6435,9 +6499,9 @@ int Compile_eqlist_on_ast(Ast *at) {
if (eq->id == AST_CNCT_TRO_INTVAR) {
+ // rule_left_agent ~ expression
int var2 = Compile_term_on_ast(eq->right, -1);
- IMCode_genCode2(OP_LOAD_META, var2, VM_OFFSET_ANNOTATE_R);
int alloc[MAX_PORT];
@@ -6449,7 +6513,7 @@ int Compile_eqlist_on_ast(Ast *at) {
Ast *arg_list = deconst_term->right; // arglist
- // printf("TRO: %s><int\n", deconst_term->left->sym);
+ // printf("TRO: %s><int\n", deconst_term->left->sym);
for (int i=0; i<MAX_PORT; i++) {
@@ -6461,7 +6525,31 @@ int Compile_eqlist_on_ast(Ast *at) {
alloc[i] = Compile_term_on_ast(arg_list->left, -1);
arg_list = ast_getTail(arg_list);
}
+
+
for (int i=0; i<arity; i++) {
+ if (alloc[i] == VM_OFFSET_ANNOTATE_R) {
+ // VM_OFFSET_ANNOTATE_R should be preserved
+ int newreg = CmEnv_newvar();
+ IMCode_genCode2(OP_LOAD, VM_OFFSET_ANNOTATE_R, newreg);
+ alloc[i] = newreg;
+ break;
+ }
+ }
+ IMCode_genCode2(OP_LOAD_META, var2, VM_OFFSET_ANNOTATE_R);
+
+
+ for (int i=0; i<arity; i++) {
+ for (int j=i+1; j<arity; j++) {
+ if (alloc[j] == VM_OFFSET_METAVAR_L(i)) {
+ // VM_OFFSET_METAVAR_L(i) should be preserved
+ int newreg = CmEnv_newvar();
+ IMCode_genCode2(OP_LOAD, VM_OFFSET_METAVAR_L(i), newreg);
+ alloc[j] = newreg;
+ break;
+ }
+ }
+
IMCode_genCode2(OP_LOAD_META, alloc[i], VM_OFFSET_METAVAR_L(i));
}
@@ -6476,6 +6564,7 @@ int Compile_eqlist_on_ast(Ast *at) {
} else if (eq->id == AST_CNCT_TRO) {
+ // rule_left_agent ~ name where the name is meta_R
// Pealing (*L)
Ast *eq_lhs = eq->left; // (*L)(AGENT(Fib, arglist))
@@ -7242,12 +7331,11 @@ int make_rule_oneway(Ast *ast) {
ruleAgent_R = ast_remove_tuple1(ruleAgent_R);
- // #define MYDEBUG1
+ // #define MYDEBUG1
#ifdef MYDEBUG1
ast_puts(ruleAgent_L); puts("");
ast_puts(ruleAgent_R); puts("");
- ast_puts(bodies);
- exit(1);
+ // ast_puts(bodies); exit(1);
#endif
@@ -7324,6 +7412,11 @@ int make_rule_oneway(Ast *ast) {
} else {
arity = get_arity_on_ast(ruleAgent_L);
}
+ if (arity >= MAX_PORT) {
+ printf("ERROR: Too many arguments of '%s'. It should be MAX_PORT(=%d) or less.\n",
+ ruleAgent_L->left->sym, MAX_PORT);
+ return 0;
+ }
IdTable_set_arity(idL, arity);
code[0] = (void *)(unsigned long)arity;
@@ -7332,6 +7425,11 @@ int make_rule_oneway(Ast *ast) {
} else {
arity = get_arity_on_ast(ruleAgent_R);
}
+ if (arity >= MAX_PORT) {
+ printf("ERROR: Too many arguments of '%s'. It should be MAX_PORT(=%d) or less.\n",
+ ruleAgent_R->left->sym, MAX_PORT);
+ return 0;
+ }
IdTable_set_arity(idR, arity);
code[1] = (void *)(unsigned long)arity;
@@ -7363,7 +7461,7 @@ int make_rule_oneway(Ast *ast) {
CmEnv.idL = idL;
CmEnv.idR = idR;
-
+
#ifdef OPTIMISE_IMCODE_TRO
int is_tro = Ast_make_annotation_TailRecursionOptimisation(rule_mainbody);
// if (is_tro) {
@@ -7391,7 +7489,7 @@ int make_rule_oneway(Ast *ast) {
#endif
- // #define MKRULE_DEBUG
+ // #define MKRULE_DEBUG
#ifndef MKRULE_DEBUG
gencode_num += CmEnv_generate_VMCode(&code[2]);
#else
@@ -7499,7 +7597,7 @@ int make_rule(Ast *ast) {
ast->left->left = ruleAgent_R;
ast->left->right = ruleAgent_L;;
- set_annotation_LR(VM_OFFSET_ANNOTATE_R, VM_OFFSET_ANNOTATE_L);
+ // set_annotation_LR(VM_OFFSET_ANNOTATE_R, VM_OFFSET_ANNOTATE_L);
// ast_puts(ast);puts("");
@@ -7749,7 +7847,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
&&E_REUSEAGENT0 ,&&E_REUSEAGENT1, &&E_REUSEAGENT2,
&&E_REUSEAGENT3, &&E_REUSEAGENT4, &&E_REUSEAGENT5,
&&E_RET, &&E_RET_FREE_LR, &&E_RET_FREE_L, &&E_RET_FREE_R,
- &&E_LOADI, &&E_LOAD,
+ &&E_LOADI, &&E_LOAD, &&E_LOADP,
&&E_ADD, &&E_SUB, &&E_ADDI, &&E_SUBI, &&E_MUL, &&E_DIV, &&E_MOD,
&&E_LT, &&E_LE, &&E_EQ, &&E_EQI, &&E_NE,
&&E_UNM, &&E_RAND, &&E_INC, &&E_DEC,
@@ -7781,15 +7879,13 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_MKNAME:
// puts("mkname dest");
- pc++;
- reg[(unsigned long)code[pc++]] = make_Name(vm);
- goto *code[pc];
+ reg[(unsigned long)code[++pc]] = make_Name(vm);
+ goto *code[++pc];
E_MKGNAME:
// puts("mkgname id dest");
- pc++;
- i = (unsigned long)code[pc++];
+ i = (unsigned long)code[++pc];
a1 = IdTable_get_heap(i);
if (a1 == (VALUE)NULL) {
a1 = make_Name(vm);
@@ -7799,234 +7895,216 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
IdTable_set_heap(i, a1);
}
- reg[(unsigned long)code[pc++]] = a1;
- goto *code[pc];
+ reg[(unsigned long)code[++pc]] = a1;
+ goto *code[++pc];
E_MKAGENT0:
// puts("mkagent0 id dest");
- pc++;
- i = (unsigned long)code[pc++];
- reg[(unsigned long)code[pc++]] = make_Agent(vm, i);
- goto *code[pc];
+ i = (unsigned long)code[++pc];
+ reg[(unsigned long)code[++pc]] = make_Agent(vm, i);
+ goto *code[++pc];
E_MKAGENT1:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_MKAGENT1)
// puts("mkagent1 id src1 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
- AGENT(a1)->port[0] = reg[(unsigned long)code[pc++]];
- reg[(unsigned long)code[pc++]] = a1;
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
+ AGENT(a1)->port[0] = reg[(unsigned long)code[++pc]];
+ reg[(unsigned long)code[++pc]] = a1;
#else
// puts("mkagent1 id dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
- AGENT(a1)->port[0] = reg[(unsigned long)code[pc]];
- reg[(unsigned long)code[pc++]] = a1;
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
+ AGENT(a1)->port[0] = reg[(unsigned long)code[++pc]];
+ reg[(unsigned long)code[pc]] = a1;
#endif
- goto *code[pc];
+ goto *code[++pc];
E_MKAGENT2:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_MKAGENT2)
// puts("mkagent2 id src1 src2 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
+
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
}
- reg[(unsigned long)code[pc++]] = a1;
+ reg[(unsigned long)code[++pc]] = a1;
#else
// puts("mkagent2 id src1 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
}
- reg[(unsigned long)code[pc++]] = a1;
+ reg[(unsigned long)code[pc]] = a1;
#endif
- goto *code[pc];
+ goto *code[++pc];
E_MKAGENT3:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_MKAGENT3)
// puts("mkagent3 id src1 src2 src3 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
+
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
}
- reg[(unsigned long)code[pc++]] = a1;
+ reg[(unsigned long)code[++pc]] = a1;
#else
// puts("mkagent3 id src1 src2 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
}
- reg[(unsigned long)code[pc++]] = a1;
+ reg[(unsigned long)code[pc]] = a1;
#endif
- goto *code[pc];
+ goto *code[++pc];
E_MKAGENT4:
// puts("mkagent4 id src1 src2 src3 src4 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc++]];
- a1port[3] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
+ a1port[3] = reg[(unsigned long)code[++pc]];
}
- reg[(unsigned long)code[pc++]] = a1;
- goto *code[pc];
+ reg[(unsigned long)code[++pc]] = a1;
+ goto *code[++pc];
E_MKAGENT5:
// puts("mkagent5 id src1 src2 src3 src4 src5 dest");
- pc++;
- a1 = make_Agent(vm, (unsigned long)code[pc++]);
+ a1 = make_Agent(vm, (unsigned long)code[++pc]);
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc++]];
- a1port[3] = reg[(unsigned long)code[pc++]];
- a1port[4] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
+ a1port[3] = reg[(unsigned long)code[++pc]];
+ a1port[4] = reg[(unsigned long)code[++pc]];
}
- reg[(unsigned long)code[pc++]] = a1;
- goto *code[pc];
+ reg[(unsigned long)code[++pc]] = a1;
+ goto *code[++pc];
E_REUSEAGENT0:
// puts("reuseagent target id");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- AGENT(a1)->basic.id = (unsigned long)code[pc++];
- goto *code[pc];
+ a1 = reg[(unsigned long)code[++pc]];
+ AGENT(a1)->basic.id = (unsigned long)code[++pc];
+ goto *code[++pc];
E_REUSEAGENT1:
// puts("reuseagent target id src1");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- AGENT(a1)->basic.id = (unsigned long)code[pc++];
- AGENT(a1)->port[0] = reg[(unsigned long)code[pc++]];
+ a1 = reg[(unsigned long)code[++pc]];
+ AGENT(a1)->basic.id = (unsigned long)code[++pc];
+ AGENT(a1)->port[0] = reg[(unsigned long)code[++pc]];
- goto *code[pc];
+ goto *code[++pc];
E_REUSEAGENT2:
// puts("reuseagent target id src1 src2");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- AGENT(a1)->basic.id = (unsigned long)code[pc++];
+ a1 = reg[(unsigned long)code[++pc]];
+ AGENT(a1)->basic.id = (unsigned long)code[++pc];
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
}
- goto *code[pc];
+ goto *code[++pc];
E_REUSEAGENT3:
// puts("reuseagent target id src1 src2 src3");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- AGENT(a1)->basic.id = (unsigned long)code[pc++];
+ a1 = reg[(unsigned long)code[++pc]];
+ AGENT(a1)->basic.id = (unsigned long)code[++pc];
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
}
- goto *code[pc];
+ goto *code[++pc];
E_REUSEAGENT4:
// puts("reuseagent target id src1 src2 src3 src4");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- AGENT(a1)->basic.id = (unsigned long)code[pc++];
+ a1 = reg[(unsigned long)code[++pc]];
+ AGENT(a1)->basic.id = (unsigned long)code[++pc];
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc++]];
- a1port[3] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
+ a1port[3] = reg[(unsigned long)code[++pc]];
}
- goto *code[pc];
+ goto *code[++pc];
E_REUSEAGENT5:
// puts("reuseagent target id src1 src2 src3 src4 src5");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- AGENT(a1)->basic.id = (unsigned long)code[pc++];
+ a1 = reg[(unsigned long)code[++pc]];
+ AGENT(a1)->basic.id = (unsigned long)code[++pc];
{
volatile VALUE *a1port = AGENT(a1)->port;
- a1port[0] = reg[(unsigned long)code[pc++]];
- a1port[1] = reg[(unsigned long)code[pc++]];
- a1port[2] = reg[(unsigned long)code[pc++]];
- a1port[3] = reg[(unsigned long)code[pc++]];
- a1port[4] = reg[(unsigned long)code[pc++]];
+ a1port[0] = reg[(unsigned long)code[++pc]];
+ a1port[1] = reg[(unsigned long)code[++pc]];
+ a1port[2] = reg[(unsigned long)code[++pc]];
+ a1port[3] = reg[(unsigned long)code[++pc]];
+ a1port[4] = reg[(unsigned long)code[++pc]];
}
- goto *code[pc];
+ goto *code[++pc];
E_PUSH:
// puts("push reg reg");
{
- pc++;
- VALUE a1 = reg[(unsigned long)code[pc++]];
- VALUE a2 = reg[(unsigned long)code[pc++]];
+ VALUE a1 = reg[(unsigned long)code[++pc]];
+ VALUE a2 = reg[(unsigned long)code[++pc]];
PUSH(vm, a1, a2);
}
- goto *code[pc];
+ goto *code[++pc];
E_PUSHI:
// puts("pushi reg fixint");
{
- pc++;
-
- VALUE a1 = reg[(unsigned long)code[pc++]];
- VALUE a2 = (unsigned long)code[pc++];
+ VALUE a1 = reg[(unsigned long)code[++pc]];
+ VALUE a2 = (unsigned long)code[++pc];
PUSH(vm, a1, a2);
}
- goto *code[pc];
+ goto *code[++pc];
E_MYPUSH:
// puts("mypush reg reg");
{
- pc++;
- VALUE a1 = reg[(unsigned long)code[pc++]];
- VALUE a2 = reg[(unsigned long)code[pc++]];
+ VALUE a1 = reg[(unsigned long)code[++pc]];
+ VALUE a2 = reg[(unsigned long)code[++pc]];
MYPUSH(vm, a1, a2);
}
- goto *code[pc];
+ goto *code[++pc];
E_LOADI:
// puts("loadi num dest");
- pc++;
- i = (long)code[pc++];
- reg[(unsigned long)code[pc++]] = i;
- goto *code[pc];
+ i = (long)code[++pc];
+ reg[(unsigned long)code[++pc]] = i;
+ goto *code[++pc];
@@ -8115,185 +8193,179 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_LOAD:
// puts("load src dest");
- pc++;
- a1 = reg[(unsigned long)code[pc++]];
- reg[(unsigned long)code[pc++]] = a1;
- goto *code[pc];
+ a1 = reg[(unsigned long)code[++pc]];
+ reg[(unsigned long)code[++pc]] = a1;
+ goto *code[++pc];
+
+
+ E_LOADP:
+ // puts("loadp src port dest");
+ a1 = reg[(unsigned long)code[++pc]];
+ i = (unsigned long)code[++pc];
+ AGENT(reg[(unsigned long)code[++pc]])->port[i] = a1;
+ goto *code[++pc];
E_ADD:
// puts("ADD src1 src2 dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = FIX2INT(reg[(unsigned long)code[pc++]]);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(i+j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i+j);
}
- goto *code[pc];
+ goto *code[++pc];
E_SUB:
// puts("SUB src1 src2 dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = FIX2INT(reg[(unsigned long)code[pc++]]);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(i-j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i-j);
}
- goto *code[pc];
+ goto *code[++pc];
E_ADDI:
// puts("ADDI src int dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = (unsigned long)code[pc++];
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = (unsigned long)code[++pc];
- reg[(unsigned long)code[pc++]] = INT2FIX(i+j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i+j);
}
- goto *code[pc];
+ goto *code[++pc];
E_SUBI:
// puts("SUBI src int dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = (unsigned long)code[pc++];
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = (unsigned long)code[++pc];
- reg[(unsigned long)code[pc++]] = INT2FIX(i-j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i-j);
}
- goto *code[pc];
+ goto *code[++pc];
E_MUL:
// puts("MUL src1 src2 dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = FIX2INT(reg[(unsigned long)code[pc++]]);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(i*j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i*j);
}
- goto *code[pc];
+ goto *code[++pc];
E_DIV:
// puts("DIV src1 src2 dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = FIX2INT(reg[(unsigned long)code[pc++]]);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(i/j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i/j);
}
- goto *code[pc];
+ goto *code[++pc];
E_MOD:
// puts("MOD src1 src2 dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- long j = FIX2INT(reg[(unsigned long)code[pc++]]);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ long j = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(i%j);
+ reg[(unsigned long)code[++pc]] = INT2FIX(i%j);
}
- goto *code[pc];
+ goto *code[++pc];
E_LT:
// puts("LT src1 src2 dest");
- pc++;
{
// int i = FIX2INT(reg[(unsigned long)code[pc++]]);
// int j = FIX2INT(reg[(unsigned long)code[pc++]]);
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i<j) {
- reg[(unsigned long)code[pc++]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = INT2FIX(1);
} else {
- reg[(unsigned long)code[pc++]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = INT2FIX(0);
}
}
- goto *code[pc];
+ goto *code[++pc];
E_LE:
// puts("LT src1 src2 dest");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i<=j) {
- reg[(unsigned long)code[pc++]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = INT2FIX(1);
} else {
- reg[(unsigned long)code[pc++]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = INT2FIX(0);
}
}
- goto *code[pc];
+ goto *code[++pc];
E_EQ:
// puts("EQ src1 src2 dest");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i==j) {
- reg[(unsigned long)code[pc++]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = INT2FIX(1);
} else {
- reg[(unsigned long)code[pc++]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = INT2FIX(0);
}
}
- goto *code[pc];
+ goto *code[++pc];
E_EQI:
// puts("EQI src1 fixint dest");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = (unsigned long)code[pc++];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = (unsigned long)code[++pc];
if (i==j) {
- reg[(unsigned long)code[pc++]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = INT2FIX(1);
} else {
- reg[(unsigned long)code[pc++]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = INT2FIX(0);
}
}
- goto *code[pc];
+ goto *code[++pc];
E_NE:
// puts("NE src1 src2 dest");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i!=j) {
- reg[(unsigned long)code[pc++]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = INT2FIX(1);
} else {
- reg[(unsigned long)code[pc++]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = INT2FIX(0);
}
}
- goto *code[pc];
+ goto *code[++pc];
E_LT_R0:
// puts("LT_R0 src1 src2");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i<j) {
reg[0] = 1;
@@ -8301,15 +8373,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
reg[0] = 0;
}
}
- goto *code[pc];
+ goto *code[++pc];
E_LE_R0:
// puts("LE_R0 src1 src2");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i<=j) {
reg[0] = 1;
@@ -8317,15 +8388,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
reg[0] = 0;
}
}
- goto *code[pc];
+ goto *code[++pc];
E_EQ_R0:
// puts("EQ_R0 src1 src2");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i==j) {
reg[0] = 1;
@@ -8333,15 +8403,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
reg[0] = 0;
}
}
- goto *code[pc];
+ goto *code[++pc];
E_EQI_R0:
// puts("EQI_R0 src1 int");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = (unsigned long)code[pc++];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = (unsigned long)code[++pc];
if (i==j) {
reg[0] = 1;
@@ -8349,17 +8418,16 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
reg[0] = 0;
}
}
- goto *code[pc];
+ goto *code[++pc];
E_NE_R0:
// puts("NE_R0 src1 src2");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
- long j = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
+ long j = reg[(unsigned long)code[++pc]];
if (i!=j) {
reg[0] = 1;
@@ -8367,7 +8435,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
reg[0] = 0;
}
}
- goto *code[pc];
+ goto *code[++pc];
@@ -8375,50 +8443,47 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_JMPEQ0:
// puts("JMPEQ0 reg pc");
// the pc is a relative address, not absolute one!
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
if (!FIX2INT(i)) {
- int j = (unsigned long)code[pc++];
+ int j = (unsigned long)code[++pc];
pc += j;
} else {
- pc++;
+ ++pc;
}
}
- goto *code[pc];
+ goto *code[++pc];
E_JMPEQ0_R0:
// puts("JMPEQ0_R0 pc");
- pc++;
{
long i = reg[0];
if (!i) {
- int j = (unsigned long)code[pc++];
+ int j = (unsigned long)code[++pc];
pc += j;
} else {
- pc++;
+ ++pc;
}
}
- goto *code[pc];
+ goto *code[++pc];
E_JMPNEQ0:
// puts("JMPNEQ0 reg pc");
- pc++;
{
- long i = reg[(unsigned long)code[pc++]];
+ long i = reg[(unsigned long)code[++pc]];
if (FIX2INT(i)) {
- int j = (unsigned long)code[pc++];
+ int j = (unsigned long)code[++pc];
pc += j;
} else {
- pc++;
+ ++pc;
}
}
- goto *code[pc];
+ goto *code[++pc];
@@ -8527,78 +8592,70 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_UNM:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("UNM src dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(-1 * i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = INT2FIX(-1 * i);
}
#else
// puts("UNM dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(-1 * i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = INT2FIX(-1 * i);
}
#endif
- goto *code[pc];
+ goto *code[++pc];
E_RAND:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("RAND src dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(rand() % i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = INT2FIX(rand() % i);
}
#else
// puts("RAND dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(rand() % i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = INT2FIX(rand() % i);
}
#endif
- goto *code[pc];
+ goto *code[++pc];
E_INC:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("INC src dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(++i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = INT2FIX(++i);
}
#else
// puts("INC src");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(++i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = INT2FIX(++i);
}
#endif
- goto *code[pc];
+ goto *code[++pc];
E_DEC:
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("DEC src dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc++]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(--i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = INT2FIX(--i);
}
#else
// puts("DEC dest");
- pc++;
{
- long i = FIX2INT(reg[(unsigned long)code[pc]]);
- reg[(unsigned long)code[pc++]] = INT2FIX(--i);
+ long i = FIX2INT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = INT2FIX(--i);
}
#endif
- goto *code[pc];
+ goto *code[++pc];
@@ -8641,8 +8698,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_NOP:
- pc++;
- goto *code[pc];
+ goto *code[++pc];
@@ -10158,6 +10214,51 @@ void select_kind_of_push(Ast *ast, int p1, int p2) {
}
+int check_ast_arity(Ast *ast) {
+ int i;
+ Ast *ptr;
+ char *sym;
+
+ if (ast == NULL) {
+ return 1;
+ }
+
+ if (ast->id == AST_AGENT) {
+ ptr = ast->right;
+ sym = ast->left->sym;
+
+ for (i=0; i<MAX_PORT; i++) {
+ if (ptr == NULL) {
+ return 1;
+ }
+ if (!check_ast_arity(ptr->left)) {
+ return 0;
+ }
+ ptr = ast_getTail(ptr);
+ }
+
+ if (ptr != NULL) {
+ printf("Error!: `%s' has too many arguments. It should be MAX_PORT(=%d) or less.\n", sym, MAX_PORT);
+ return 0;
+ }
+
+ } else if (ast->id == AST_TUPLE) {
+ if ((ast->intval <= MAX_PORT) && (ast->intval <= 5)) {
+ return 1;
+ } else {
+ if (MAX_PORT <= 5) {
+ printf("Error: A tuple has too many arguments. It should be MAX_PORT(=%d) or less.\n",
+ MAX_PORT);
+ } else {
+ printf("Error: A tuple has too many arguments. It should be 5 or less.\n");
+ }
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
#ifndef THREAD
@@ -10248,9 +10349,13 @@ int exec(Ast *at) {
{
Ast *tmp_at=at;
while (tmp_at != NULL) {
- if ((check_invalid_occurrence(tmp_at->left->left))
- && (check_invalid_occurrence(tmp_at->left->right))) {
- // both ara invalid
+
+ if (!(check_ast_arity(tmp_at->left->left))
+ || !(check_ast_arity(tmp_at->left->right))
+ || !(check_invalid_occurrence(tmp_at->left->left))
+ || !(check_invalid_occurrence(tmp_at->left->right))) {
+
+ // invalid case
if (yyin != stdin) exit(-1);
return 0;
}
@@ -10299,13 +10404,15 @@ int exec(Ast *at) {
CmEnv_retrieve_MKGNAME();
CmEnv_generate_VMCode(code);
- // // for debug
- // CmEnv_retrieve_MKGNAME();
- // IMCode_puts(0); //exit(1);
- //
- // int codenum = CmEnv_generate_VMCode(code);
- // VMCode_puts(code, codenum-2); //exit(1);
- // // end for debug
+ // // for debug
+ // CmEnv_retrieve_MKGNAME();
+ // IMCode_puts(0); //exit(1);
+ //
+ // int codenum = CmEnv_generate_VMCode(code);
+ // VMCode_puts(code, codenum-2); //exit(1);
+ // // end for debug
+
+
#ifdef COUNT_MKAGENT
NumberOfMkAgent=0;
@@ -10536,9 +10643,13 @@ int exec(Ast *at) {
{
Ast *tmp_at=at;
while (tmp_at != NULL) {
- if ((check_invalid_occurrence(tmp_at->left->left))
- && (check_invalid_occurrence(tmp_at->left->right))) {
- // both ara invalid
+
+ if (!(check_ast_arity(tmp_at->left->left))
+ || !(check_ast_arity(tmp_at->left->right))
+ || !(check_invalid_occurrence(tmp_at->left->left))
+ || !(check_invalid_occurrence(tmp_at->left->right))) {
+
+ // invalid case
if (yyin != stdin) exit(-1);
return 0;
}
@@ -10751,7 +10862,7 @@ int main(int argc, char *argv[])
printf(" -t <num> Set the number of threads (Default: %10d)\n", MaxThreadsNum);
#else
- printf(" -w Enable Weak Reduction strategy (Default: false)\n");
+ printf(" -w Enable Weak Reduction strategy (Default: disable)\n");
#endif
@@ -10963,8 +11074,15 @@ int main(int argc, char *argv[])
} else {
if (!(yyin = fopen(fname, "r"))) {
- printf("Error: The file '%s' can not be opened.\n", fname);
- exit(-1);
+
+ char *fname_in = malloc(sizeof(char*) * 256);
+ snprintf(fname_in, 256, "%s.in", fname);
+ if (!(yyin = fopen(fname_in, "r"))) {
+ printf("Error: The file '%s' cannot be opened.\n", fname);
+ exit(-1);
+ }
+
+ free(fname_in);
}
}
diff --git a/src/mytype.h b/src/mytype.h
index 74f5d19..4cc3909 100644
--- a/src/mytype.h
+++ b/src/mytype.h
@@ -1,6 +1,8 @@
#ifndef _TYPE_
#define _TYPE_
+#include "config.h"
+
typedef unsigned int IDTYPE;
typedef unsigned long VALUE;
@@ -10,7 +12,7 @@ typedef struct {
} Basic;
-#define MAX_PORT 5
+//#define MAX_PORT 5
#ifndef THREAD
typedef struct {