annotate rathaxes_compiler_passes_fix_cases_where_self_would_be_incorrectly_resolved.patch @ 126:6e142648b2fe

Wip on compiler issues
author Louis Opter <louis@lse.epita.fr>
date Sun, 18 Aug 2013 12:51:47 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
126
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
1 # HG changeset patch
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
2 # Parent 3741d7036c658afaa2944b1c0a144bac61b50930
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
3 rathaxes: fix cases where ${self} would be incorrectly resolved
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
4
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
5 diff --git a/rathaxes/compiler/passes/common/rtxResolve.inc.cws b/rathaxes/compiler/passes/common/rtxResolve.inc.cws
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
6 --- a/rathaxes/compiler/passes/common/rtxResolve.inc.cws
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
7 +++ b/rathaxes/compiler/passes/common/rtxResolve.inc.cws
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
8 @@ -696,7 +696,8 @@
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
9 case "target_expr":
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
10 // Is it a variable of a rathaxes type : check in type_map ?
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
11 if (isEmpty(local_node.prefix) && isEmpty(local_node.suffix)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
12 - && existVariable(theChunk.type_map) && findElement(varName, theChunk.type_map))
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
13 + && ((existVariable(theChunk.type_map) && findElement(varName, theChunk.type_map))
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
14 + || varName == "self"))
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
15 {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
16 traceLine("inject<\"__rtx_var__\">:<LOG> Injecting a type mapping (" + varName + ").");
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
17 // Create the resolverValues for the type resolution:
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
18 @@ -705,21 +706,35 @@
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
19 rtxNodeArgs(resVal);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
20 local self;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
21 local self_value;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
22 + local self_type;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
23 // First, try to retrieve value from previous resVals, otherwise build it from chunk
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
24 - if (rtxNodeArgs_GetArgByName(resolverValues, varName, self) == true)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
25 + if (varName != "self")
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
26 {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
27 - rtxNodeArg_getValue(self, self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
28 + if (rtxNodeArgs_GetArgByName(resolverValues, varName, self) == true)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
29 + {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
30 + rtxNodeArg_getValue(self, self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
31 + }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
32 + else
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
33 + {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
34 + clearVariable(self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
35 + cnormNode_TerminalId(self_value, varName);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
36 + }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
37 + rtxNodeArgs_AppendArg(resVal, "self", theChunk.type_map[varName], self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
38 + setall self_type = theChunk.type_map[varName];
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
39 }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
40 else
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
41 {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
42 - clearVariable(self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
43 - cnormNode_TerminalId(self_value, varName);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
44 + // "self" as an identifier means that we're within some Type Template code.
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
45 + // Thus the actual value is the associated ResVal, and the type the template's type itself.
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
46 + if (rtxNodeArgs_GetArgByName(resolverValues, varName, self) == true)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
47 + {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
48 + rtxNodeArg_getValue(self, self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
49 + }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
50 + rtxNodeArgs_AppendArg(resVal, "self", self.rtype, self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
51 + setall self_type = self.rtype;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
52 }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
53 - rtxNodeArgs_AppendArg(resVal, "self", theChunk.type_map[varName], self_value);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
54
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
55 - local qTypeName = rtxRTypeName<theChunk.type_map[varName].type>(
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
56 - theChunk.type_map[varName]
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
57 - );
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
58 + local qTypeName = rtxRTypeName<self_type.type>(self_type);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
59
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
60 local mapping;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
61 local subParam;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
62 @@ -727,8 +742,7 @@
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
63 local subidentifiers;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
64 select n in subParam[].name { pushItem subidentifiers; subidentifiers#back = n; }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
65
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
66 - if (type_map<qTypeName>(resVal, theChunk.type_map[varName],
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
67 - subidentifiers,
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
68 + if (type_map<qTypeName>(resVal, self_type, subidentifiers,
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
69 local_node, mapping, source_tree) == false)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
70 {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
71 traceLine(RED + "[Error] Could not resolve mapping of '"
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
72 @@ -761,7 +775,7 @@
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
73 // If there's a resval argument for it, then take the source type from there
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
74 // Otherwise, use the chunk's type_map.
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
75 if (rtxNodeArg_getRType(self, source_type) == false)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
76 - { ref source_type = theChunk.type_map[varName]; }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
77 + { ref source_type = self_type; }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
78 rtxNodeArg_getRType(self, source_type);
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
79 }
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
80 else
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
81 @@ -769,7 +783,7 @@
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
82 // Now resolve the finaltype of the argument -> Retrieve actual param_type
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
83 removeVariable(subidentifiers#[0]); // Remove the first identifiers for the type resolution
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
84 local result_type;
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
85 - if (rtxTypingLookup_ResolveTypeFields(theChunk.type_map[varName], subidentifiers, theChunk, source_tree, source_type) == false)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
86 + if (rtxTypingLookup_ResolveTypeFields(self_type, subidentifiers, theChunk, source_tree, source_type) == false)
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
87 {
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
88 error(RED + "[Error] Could not resolve type fields for variable '"
6e142648b2fe Wip on compiler issues
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
89 + subidentifiers#front + "'" + DEFAULT_COLOR);