[vala] girparser: Simplify postprocessing callbacks. Use symbols info for records.
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] girparser: Simplify postprocessing callbacks. Use symbols info for records.
- Date: Mon, 4 Apr 2011 14:15:44 +0000 (UTC)
commit bdc3327719019c2f781185a7315f56aa8edd5ef3
Author: Luca Bruno <lucabru src gnome org>
Date: Tue Nov 16 10:24:37 2010 +0100
girparser: Simplify postprocessing callbacks. Use symbols info for records.
vala/valagirparser.vala | 67 ++++++++++++++++++++++++-----------------------
1 files changed, 34 insertions(+), 33 deletions(-)
---
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index afcc860..0ebca05 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -479,11 +479,6 @@ public class Vala.GirParser : CodeVisitor {
public HashMap<string,string> girdata;
}
- class CallbackScope {
- public Symbol parent_symbol;
- public UnresolvedSymbol gtype_struct_for;
- }
-
class Alias {
public string name;
public DataType base_type;
@@ -521,10 +516,11 @@ public class Vala.GirParser : CodeVisitor {
ArrayList<UnresolvedSymbol> unresolved_gir_symbols = new ArrayList<UnresolvedSymbol> ();
HashMap<UnresolvedSymbol,ArrayList<Symbol>> symbol_reparent_map = new HashMap<UnresolvedSymbol,ArrayList<Symbol>> (unresolved_symbol_hash, unresolved_symbol_equal);
HashMap<Namespace,ArrayList<Method>> namespace_methods = new HashMap<Namespace,ArrayList<Method>> ();
- HashMap<CallbackScope,ArrayList<Delegate>> gtype_callbacks = new HashMap<CallbackScope,ArrayList<Delegate>> (callback_scope_hash, callback_scope_equal);
ArrayList<Alias> aliases = new ArrayList<Alias> ();
ArrayList<Interface> interfaces = new ArrayList<Interface> ();
+ HashMap<UnresolvedSymbol,ArrayList<Delegate>> gtype_callbacks;
+
/**
* Parses all .gir source files in the specified code
* context and builds a code tree.
@@ -540,7 +536,6 @@ public class Vala.GirParser : CodeVisitor {
postprocess_interfaces ();
postprocess_reparenting ();
- postprocess_gtype_callbacks ();
postprocess_aliases ();
postprocess_namespace_methods ();
}
@@ -1363,6 +1358,7 @@ public class Vala.GirParser : CodeVisitor {
var old_symbol = current_symbol;
current_symbols_info = new HashMap<string,ArrayList<SymbolInfo>> (str_hash, str_equal);
current_symbol = ns;
+ gtype_callbacks = new HashMap<UnresolvedSymbol,ArrayList<Delegate>> (unresolved_symbol_hash, unresolved_symbol_equal);
while (current_token == MarkupTokenType.START_ELEMENT) {
if (!push_metadata ()) {
skip_element ();
@@ -1417,6 +1413,7 @@ public class Vala.GirParser : CodeVisitor {
merge_add_process (ns);
current_symbols_info = old_symbols_info;
current_symbol = old_symbol;
+ postprocess_gtype_callbacks (ns);
if (!new_namespace) {
ns = null;
@@ -1872,6 +1869,10 @@ public class Vala.GirParser : CodeVisitor {
}
next ();
+ var old_symbols_info = current_symbols_info;
+ var old_symbol = current_symbol;
+ current_symbols_info = new HashMap<string,ArrayList<SymbolInfo>> (str_hash, str_equal);
+ current_symbol = st;
while (current_token == MarkupTokenType.START_ELEMENT) {
if (!push_metadata ()) {
skip_element ();
@@ -1880,14 +1881,14 @@ public class Vala.GirParser : CodeVisitor {
if (reader.name == "field") {
if (reader.get_attribute ("name") != "priv") {
- st.add_field (parse_field ());
+ add_symbol_info (parse_field ());
} else {
skip_element ();
}
} else if (reader.name == "constructor") {
parse_constructor ();
} else if (reader.name == "method") {
- st.add_method (parse_method ("method"));
+ add_symbol_info (parse_method ("method"));
} else if (reader.name == "union") {
Struct s = parse_union ();
var s_fields = s.get_fields ();
@@ -1906,7 +1907,11 @@ public class Vala.GirParser : CodeVisitor {
}
end_element ("record");
+ merge_add_process (st);
+ current_symbols_info = old_symbols_info;
+ current_symbol = old_symbol;
current_gtype_struct_for = null;
+
return st;
}
@@ -2112,13 +2117,11 @@ public class Vala.GirParser : CodeVisitor {
type = element_get_type (type, true);
if (type is DelegateType && current_gtype_struct_for != null) {
// virtual
- var callback_scope = new CallbackScope ();
- callback_scope.parent_symbol = current_symbol;
- callback_scope.gtype_struct_for = parse_symbol_from_string (current_gtype_struct_for);
- ArrayList<Delegate> callbacks = gtype_callbacks.get (callback_scope);
+ var gtype_struct_for = parse_symbol_from_string (current_gtype_struct_for);
+ ArrayList<Delegate> callbacks = gtype_callbacks.get (gtype_struct_for);
if (callbacks == null) {
callbacks = new ArrayList<Delegate> ();
- gtype_callbacks.set (callback_scope, callbacks);
+ gtype_callbacks.set (gtype_struct_for, callbacks);
}
callbacks.add (((DelegateType) type).delegate_symbol);
}
@@ -2475,7 +2478,10 @@ public class Vala.GirParser : CodeVisitor {
cl.set_dup_function ("g_boxed_copy");
next ();
-
+ var old_symbols_info = current_symbols_info;
+ var old_symbol = current_symbol;
+ current_symbols_info = new HashMap<string,ArrayList<SymbolInfo>> (str_hash, str_equal);
+ current_symbol = cl;
while (current_token == MarkupTokenType.START_ELEMENT) {
if (!push_metadata ()) {
skip_element ();
@@ -2483,11 +2489,11 @@ public class Vala.GirParser : CodeVisitor {
}
if (reader.name == "field") {
- cl.add_field (parse_field ());
+ add_symbol_info (parse_field ());
} else if (reader.name == "constructor") {
parse_constructor ();
} else if (reader.name == "method") {
- cl.add_method (parse_method ("method"));
+ add_symbol_info (parse_method ("method"));
} else {
// error
Report.error (get_current_src (), "unknown child element `%s' in `class'".printf (reader.name));
@@ -2497,6 +2503,11 @@ public class Vala.GirParser : CodeVisitor {
pop_metadata ();
}
end_element (element_name);
+
+ merge_add_process (cl);
+ current_symbols_info = old_symbols_info;
+ current_symbol = old_symbol;
+
return cl;
}
@@ -2708,14 +2719,15 @@ public class Vala.GirParser : CodeVisitor {
}
}
- void postprocess_gtype_callbacks () {
- foreach (CallbackScope callback_scope in gtype_callbacks.get_keys ()) {
- var gtype = resolve_symbol (callback_scope.parent_symbol.scope, callback_scope.gtype_struct_for) as ObjectTypeSymbol;
+ void postprocess_gtype_callbacks (Namespace ns) {
+ foreach (UnresolvedSymbol gtype_struct_for in gtype_callbacks.get_keys ()) {
+ // parent symbol is the record, therefore use parent of parent symbol
+ var gtype = resolve_symbol (ns.scope, gtype_struct_for) as ObjectTypeSymbol;
if (gtype == null) {
- Report.error (null, "unknown symbol `%s'".printf (callback_scope.gtype_struct_for.to_string ()));
+ Report.error (null, "unknown symbol `%s' while postprocessing callbacks".printf (gtype_struct_for.name));
continue;
}
- ArrayList<Delegate> callbacks = gtype_callbacks.get (callback_scope);
+ ArrayList<Delegate> callbacks = gtype_callbacks.get (gtype_struct_for);
foreach (Delegate d in callbacks) {
var symbol = gtype.scope.lookup (d.name);
if (symbol == null) {
@@ -2878,15 +2890,4 @@ public class Vala.GirParser : CodeVisitor {
}
return true;
}
-
- static uint callback_scope_hash (void *ptr) {
- var cs = (CallbackScope) ptr;
- return unresolved_symbol_hash (cs.gtype_struct_for);
- }
-
- static bool callback_scope_equal (void *ptr1, void *ptr2) {
- var cs1 = (CallbackScope) ptr1;
- var cs2 = (CallbackScope) ptr2;
- return cs1.parent_symbol == cs2.parent_symbol && unresolved_symbol_equal (cs1.gtype_struct_for, cs2.gtype_struct_for);
- }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]