| Index: core/inspector/CodeGeneratorInstrumentation.py
|
| diff --git a/core/inspector/CodeGeneratorInstrumentation.py b/core/inspector/CodeGeneratorInstrumentation.py
|
| index a1744eb633bb18576d2b6b0bd7219b6ec3a1f59e..b72cb5d26108d7c8d5cd67f957cff3e0f7a42694 100644
|
| --- a/core/inspector/CodeGeneratorInstrumentation.py
|
| +++ b/core/inspector/CodeGeneratorInstrumentation.py
|
| @@ -34,26 +34,27 @@ import sys
|
|
|
| template_h = string.Template("""// Code generated from InspectorInstrumentation.idl
|
|
|
| -#ifndef InspectorInstrumentationInl_h
|
| -#define InspectorInstrumentationInl_h
|
| +#ifndef ${file_name}_h
|
| +#define ${file_name}_h
|
| +
|
| +${includes}
|
|
|
| namespace WebCore {
|
|
|
| namespace InspectorInstrumentation {
|
|
|
| -$impl_declarations
|
| -$inline_methods
|
| +$methods
|
| } // namespace InspectorInstrumentation
|
|
|
| } // namespace WebCore
|
|
|
| -#endif // !defined(InspectorInstrumentationInl_h)
|
| +#endif // !defined(${file_name}_h)
|
| """)
|
|
|
| template_inline = string.Template("""
|
| inline void ${name}(${params_public})
|
| { ${fast_return}
|
| - if (InstrumentingAgents* instrumentingAgents = ${agents_getter})
|
| + if (${condition})
|
| ${name}Impl(${params_impl});
|
| }
|
| """)
|
| @@ -65,20 +66,12 @@ inline void ${name}(${params_public})
|
| }
|
| """)
|
|
|
| -template_inline_accepts_cookie = string.Template("""
|
| -inline void ${name}(${params_public})
|
| -{ ${fast_return}
|
| - if (${cookie}.isValid())
|
| - ${name}Impl(${params_impl});
|
| -}
|
| -""")
|
| -
|
| -template_inline_returns_cookie = string.Template("""
|
| -inline InspectorInstrumentationCookie ${name}(${params_public})
|
| +template_inline_returns_value = string.Template("""
|
| +inline ${return_type} ${name}(${params_public})
|
| { ${fast_return}
|
| - if (InstrumentingAgents* instrumentingAgents = ${agents_getter})
|
| + if (${condition})
|
| return ${name}Impl(${params_impl});
|
| - return InspectorInstrumentationCookie();
|
| + return ${default_return_value};
|
| }
|
| """)
|
|
|
| @@ -86,36 +79,14 @@ inline InspectorInstrumentationCookie ${name}(${params_public})
|
| template_cpp = string.Template("""// Code generated from InspectorInstrumentation.idl
|
|
|
| #include "config.h"
|
| -#include "core/inspector/InspectorInstrumentation.h"
|
| -
|
| -#include "core/inspector/InspectorAgent.h"
|
| -#include "core/inspector/InspectorApplicationCacheAgent.h"
|
| -#include "core/inspector/InspectorCSSAgent.h"
|
| -#include "core/inspector/InspectorCanvasAgent.h"
|
| -#include "core/inspector/InspectorConsoleAgent.h"
|
| -#include "core/inspector/InspectorConsoleInstrumentation.h"
|
| -#include "core/inspector/InspectorDOMAgent.h"
|
| -#include "core/inspector/InspectorDOMDebuggerAgent.h"
|
| -#include "core/inspector/InspectorDOMStorageAgent.h"
|
| -#include "core/inspector/InspectorDatabaseAgent.h"
|
| -#include "core/inspector/InspectorDatabaseInstrumentation.h"
|
| -#include "core/inspector/InspectorDebuggerAgent.h"
|
| -#include "core/inspector/InspectorHeapProfilerAgent.h"
|
| -#include "core/inspector/InspectorLayerTreeAgent.h"
|
| -#include "core/inspector/InspectorPageAgent.h"
|
| -#include "core/inspector/InspectorProfilerAgent.h"
|
| -#include "core/inspector/InspectorResourceAgent.h"
|
| -#include "core/inspector/InspectorTimelineAgent.h"
|
| -#include "core/inspector/InspectorWorkerAgent.h"
|
| -#include "core/inspector/InstrumentingAgents.h"
|
| -#include "core/inspector/PageDebuggerAgent.h"
|
| -#include "core/inspector/PageRuntimeAgent.h"
|
| -#include "core/inspector/WorkerRuntimeAgent.h"
|
| +
|
| +${includes}
|
|
|
| namespace WebCore {
|
| +${extra_definitions}
|
|
|
| namespace InspectorInstrumentation {
|
| -$out_of_line_methods
|
| +$methods
|
|
|
| } // namespace InspectorInstrumentation
|
|
|
| @@ -123,79 +94,277 @@ $out_of_line_methods
|
| """)
|
|
|
| template_outofline = string.Template("""
|
| -void ${name}Impl(${params_impl})
|
| -{${agent_calls}
|
| +${return_type} ${name}Impl(${params_impl})
|
| +{${impl_lines}
|
| }""")
|
|
|
| template_agent_call = string.Template("""
|
| - if (${agent_class}* ${agent}Agent = ${agent_fetch})
|
| - ${agent}Agent->${name}(${params_agent});""")
|
| + if (${agent_class}* agent = ${agent_fetch})
|
| + ${maybe_return}agent->${name}(${params_agent});""")
|
|
|
| -template_timeline_agent_call = string.Template("""
|
| +template_agent_call_timeline_returns_cookie = string.Template("""
|
| int timelineAgentId = 0;
|
| - if (InspectorTimelineAgent* timelineAgent = instrumentingAgents->inspectorTimelineAgent()) {
|
| - if (timelineAgent->${name}(${params_agent}))
|
| - timelineAgentId = timelineAgent->id();
|
| + if (InspectorTimelineAgent* agent = agents->inspectorTimelineAgent()) {
|
| + if (agent->${name}(${params_agent}))
|
| + timelineAgentId = agent->id();
|
| }""")
|
|
|
| -template_outofline_returns_cookie = string.Template("""
|
| -${return_type} ${name}Impl(${params_impl})
|
| -{${agent_calls}
|
| - return InspectorInstrumentationCookie(instrumentingAgents, ${timeline_agent_id});
|
| +
|
| +template_instrumenting_agents_h = string.Template("""// Code generated from InspectorInstrumentation.idl
|
| +
|
| +#ifndef InstrumentingAgentsInl_h
|
| +#define InstrumentingAgentsInl_h
|
| +
|
| +#include <wtf/FastAllocBase.h>
|
| +#include <wtf/Noncopyable.h>
|
| +#include <wtf/PassRefPtr.h>
|
| +#include <wtf/RefCounted.h>
|
| +
|
| +namespace WebCore {
|
| +
|
| +${forward_list}
|
| +
|
| +class InstrumentingAgents : public RefCounted<InstrumentingAgents> {
|
| + WTF_MAKE_NONCOPYABLE(InstrumentingAgents);
|
| + WTF_MAKE_FAST_ALLOCATED;
|
| +public:
|
| + static PassRefPtr<InstrumentingAgents> create()
|
| + {
|
| + return adoptRef(new InstrumentingAgents());
|
| + }
|
| + ~InstrumentingAgents() { }
|
| + void reset();
|
| +
|
| +${accessor_list}
|
| +
|
| +private:
|
| + InstrumentingAgents();
|
| +
|
| +${member_list}
|
| +};
|
| +
|
| +}
|
| +
|
| +#endif // !defined(InstrumentingAgentsInl_h)
|
| +""")
|
| +
|
| +template_instrumenting_agent_accessor = string.Template("""
|
| + ${class_name}* ${getter_name}() const { return ${member_name}; }
|
| + void set${class_name}(${class_name}* agent) { ${member_name} = agent; }""")
|
| +
|
| +template_instrumenting_agents_cpp = string.Template("""
|
| +InstrumentingAgents::InstrumentingAgents()
|
| + : $init_list
|
| +{
|
| +}
|
| +
|
| +void InstrumentingAgents::reset()
|
| +{
|
| + $reset_list
|
| }""")
|
|
|
|
|
| +
|
| +def match_and_consume(pattern, source):
|
| + match = re.match(pattern, source)
|
| + if match:
|
| + return match, source[len(match.group(0)):].strip()
|
| + return None, source
|
| +
|
| +
|
| def load_model_from_idl(source):
|
| - source = re.sub("//.*\n", "", source) # Remove line comments
|
| - source = re.sub("\n", " ", source) # Remove newlines
|
| - source = re.sub("/\*.*\*/", "", source) # Remove block comments
|
| - source = re.sub("\s\s+", " ", source) # Collapse whitespace
|
| + source = re.sub("//.*", "", source) # Remove line comments
|
| + source = re.sub("/\*(.|\n)*?\*/", "", source, re.MULTILINE) # Remove block comments
|
| + source = re.sub("\]\s*?\n\s*", "] ", source) # Merge the method annotation with the next line
|
| source = source.strip()
|
|
|
| - match = re.match("interface\s\w*\s?\{(.*)\}", source)
|
| - if not match:
|
| - sys.stderr.write("Cannot parse the file")
|
| - sys.exit(1)
|
| - lines = match.group(1)
|
| + model = []
|
| +
|
| + while len(source):
|
| + match, source = match_and_consume("interface\s(\w*)\s?\{([^\{]*)\}", source)
|
| + if not match:
|
| + sys.stderr.write("Cannot parse %s\n" % source[:100])
|
| + sys.exit(1)
|
| + model.append(File(match.group(1), match.group(2)))
|
| +
|
| + return model
|
| +
|
| +
|
| +class File:
|
| + def __init__(self, name, source):
|
| + self.name = name
|
| + self.header_name = self.name + "Inl"
|
| + self.includes = [include_inspector_header("InspectorInstrumentation")]
|
| + self.declarations = []
|
| + for line in map(str.strip, source.split("\n")):
|
| + line = re.sub("\s{2,}", " ", line).strip() # Collapse whitespace
|
| + if len(line) == 0:
|
| + continue
|
| + if line[0] == "#":
|
| + self.includes.append(line)
|
| + else:
|
| + self.declarations.append(Method(line))
|
| + self.includes.sort()
|
| +
|
| + def generate(self, cpp_lines, used_agents):
|
| + header_lines = []
|
| + for declaration in self.declarations:
|
| + for agent in set(declaration.agents):
|
| + used_agents.add(agent)
|
| + declaration.generate_header(header_lines)
|
| + declaration.generate_cpp(cpp_lines)
|
|
|
| - methods = []
|
| - for line in map(str.strip, lines.split(";")):
|
| - if len(line) == 0:
|
| - continue
|
| - methods.append(Method(line))
|
| - return methods
|
| + return template_h.substitute(None,
|
| + file_name=self.header_name,
|
| + includes="\n".join(self.includes),
|
| + methods="\n".join(header_lines))
|
|
|
|
|
| class Method:
|
| def __init__(self, source):
|
| - match = re.match("(\[[\w|,|=|\s]*\])?\s?(\w*) (\w*)\((.*)\)", source)
|
| + match = re.match("(\[[\w|,|=|\s]*\])?\s?(\w*\*?) (\w*)\((.*)\)\s?;", source)
|
| if not match:
|
| sys.stderr.write("Cannot parse %s\n" % source)
|
| sys.exit(1)
|
|
|
| - self.method_options = []
|
| + self.options = []
|
| if match.group(1):
|
| - method_options_str = re.sub("\s", "", match.group(1)[1:-1])
|
| - if len(method_options_str) != 0:
|
| - self.method_options = method_options_str.split(",")
|
| + options_str = re.sub("\s", "", match.group(1)[1:-1])
|
| + if len(options_str) != 0:
|
| + self.options = options_str.split(",")
|
|
|
| self.return_type = match.group(2)
|
|
|
| self.name = match.group(3)
|
|
|
| - param_string = match.group(4)
|
| + # Splitting parameters by a comma, assuming that attribute lists contain no more than one attribute.
|
| + self.params = map(Parameter, map(str.strip, match.group(4).split(",")))
|
| +
|
| + self.accepts_cookie = len(self.params) and self.params[0].type == "const InspectorInstrumentationCookie&"
|
| + self.returns_cookie = self.return_type == "InspectorInstrumentationCookie"
|
| +
|
| + self.returns_value = self.return_type != "void"
|
| +
|
| + if self.return_type == "bool":
|
| + self.default_return_value = "false"
|
| + elif self.return_type == "String":
|
| + self.default_return_value = "\"\""
|
| + else:
|
| + self.default_return_value = self.return_type + "()"
|
| +
|
| + for param in self.params:
|
| + if "DefaultReturn" in param.options:
|
| + self.default_return_value = param.name
|
| +
|
| + self.params_impl = self.params
|
| + if not self.accepts_cookie and not "Inline=Forward" in self.options:
|
| + if not "Keep" in self.params_impl[0].options:
|
| + self.params_impl = self.params_impl[1:]
|
| + self.params_impl = [Parameter("InstrumentingAgents* agents")] + self.params_impl
|
| + self.agents_selector_class = re.match("(\w*)", self.params[0].type).group(1)
|
| +
|
| + self.agents = filter(lambda option: not "=" in option, self.options)
|
| +
|
| + def generate_header(self, header_lines):
|
| + if "Inline=Custom" in self.options:
|
| + return
|
| +
|
| + header_lines.append("%s %sImpl(%s);" % (
|
| + self.return_type, self.name, ", ".join(map(Parameter.to_str_class, self.params_impl))))
|
| +
|
| + if "Inline=FastReturn" in self.options or "Inline=Forward" in self.options:
|
| + fast_return = "\n FAST_RETURN_IF_NO_FRONTENDS(%s);" % self.default_return_value
|
| + else:
|
| + fast_return = ""
|
| +
|
| + for param in self.params:
|
| + if "FastReturn" in param.options:
|
| + fast_return += "\n if (!%s)\n return %s;" % (param.name, self.default_return_value)
|
|
|
| - self.param_options = []
|
| - options_match = re.match("\[(.*)\]\s?(.*)", param_string)
|
| - if options_match:
|
| - param_string = options_match.group(2)
|
| - self.param_options = map(str.strip, options_match.group(1).split(","))
|
| + if self.accepts_cookie:
|
| + condition = "%s.isValid()" % self.params_impl[0].name
|
| + template = template_inline
|
| + elif "Inline=Forward" in self.options:
|
| + condition = ""
|
| + template = template_inline_forward
|
| + else:
|
| + condition = "InstrumentingAgents* agents = instrumentingAgentsFor%s(%s)" % (
|
| + self.agents_selector_class, self.params[0].name)
|
| +
|
| + if self.returns_value:
|
| + template = template_inline_returns_value
|
| + else:
|
| + template = template_inline
|
| +
|
| + header_lines.append(template.substitute(
|
| + None,
|
| + name=self.name,
|
| + fast_return=fast_return,
|
| + return_type=self.return_type,
|
| + default_return_value=self.default_return_value,
|
| + params_public=", ".join(map(Parameter.to_str_full, self.params)),
|
| + params_impl=", ".join(map(Parameter.to_str_name, self.params_impl)),
|
| + condition=condition))
|
| +
|
| + def generate_cpp(self, cpp_lines):
|
| + if len(self.agents) == 0:
|
| + return
|
| +
|
| + body_lines = map(self.generate_agent_call, self.agents)
|
| +
|
| + if self.returns_cookie:
|
| + if "Timeline" in self.agents:
|
| + timeline_agent_id = "timelineAgentId"
|
| + else:
|
| + timeline_agent_id = "0"
|
| + body_lines.append("\n return InspectorInstrumentationCookie(agents, %s);" % timeline_agent_id)
|
| + elif self.returns_value:
|
| + body_lines.append("\n return %s;" % self.default_return_value)
|
| +
|
| + cpp_lines.append(template_outofline.substitute(
|
| + None,
|
| + return_type=self.return_type,
|
| + name=self.name,
|
| + params_impl=", ".join(map(Parameter.to_str_class_and_name, self.params_impl)),
|
| + impl_lines="".join(body_lines)))
|
| +
|
| + def generate_agent_call(self, agent):
|
| + agent_class, agent_getter = agent_getter_signature(agent)
|
| +
|
| + leading_param_name = self.params_impl[0].name
|
| + if not self.accepts_cookie:
|
| + agent_fetch = "%s->%s()" % (leading_param_name, agent_getter)
|
| + elif agent == "Timeline":
|
| + agent_fetch = "retrieveTimelineAgent(%s)" % leading_param_name
|
| + else:
|
| + agent_fetch = "%s.instrumentingAgents()->%s()" % (leading_param_name, agent_getter)
|
|
|
| - self.params = map(Parameter, map(str.strip, param_string.split(",")))
|
| + if agent == "Timeline" and self.returns_cookie:
|
| + template = template_agent_call_timeline_returns_cookie
|
| + else:
|
| + template = template_agent_call
|
| +
|
| + if not self.returns_value or self.returns_cookie:
|
| + maybe_return = ""
|
| + else:
|
| + maybe_return = "return "
|
| +
|
| + return template.substitute(
|
| + None,
|
| + name=self.name,
|
| + agent_class=agent_class,
|
| + agent_fetch=agent_fetch,
|
| + maybe_return=maybe_return,
|
| + params_agent=", ".join(map(Parameter.to_str_name, self.params_impl)[1:]))
|
|
|
|
|
| class Parameter:
|
| def __init__(self, source):
|
| + self.options = []
|
| + match, source = match_and_consume("\[(\w*)\]", source)
|
| + if match:
|
| + self.options.append(match.group(1))
|
| +
|
| parts = map(str.strip, source.split("="))
|
| if len(parts) == 1:
|
| self.default_value = None
|
| @@ -232,45 +401,9 @@ class Parameter:
|
| return self.name
|
|
|
|
|
| -# This function is only needed to minimize the diff with the handwritten code.
|
| -# In fact it is sufficient to return a globally unique string.
|
| def generate_param_name(param_type):
|
| - base_name = re.match("(const |RefPtr<|PassRefPtr<)?(\w*)", param_type).group(2)
|
| -
|
| - custom_param_types = {
|
| - "CharacterData": "characterData",
|
| - "CSSSelector": "pseudoState",
|
| - "DocumentStyleSheetCollection": "styleSheetCollection",
|
| - "EventPath": "eventPath",
|
| - "FormData": "formData",
|
| - "InspectorCSSOMWrappers": "inspectorCSSOMWrappers",
|
| - "InstrumentingAgents": "instrumentingAgents",
|
| - "NamedFlow": "namedFlow",
|
| - "RenderObject": "renderer",
|
| - "RenderLayer": "renderLayer",
|
| - "ResourceLoader": "resourceLoader",
|
| - "PseudoElement": "pseudoElement",
|
| - "ScriptState": "scriptState"}
|
| - if base_name in custom_param_types:
|
| - return custom_param_types[base_name]
|
| -
|
| - match = re.match("(.*)([A-Z][a-z]+)", base_name)
|
| - if match:
|
| - return match.group(2).lower() # CamelCaseWord -> word
|
| -
|
| - if base_name.lower() == base_name:
|
| - return base_name + "_"
|
| - return base_name.lower()
|
| -
|
| -
|
| -# This function is only needed to minimize the diff with the handwritten code.
|
| -# In fact is is sufficient to hardcode a constant string (e.g. "agent") into the template.
|
| -def agent_variable_name(agent):
|
| - if re.match("DOM", agent):
|
| - return re.sub("DOM", "dom", agent)
|
| - if agent.upper() == agent:
|
| - return agent.lower()
|
| - return agent[0].lower() + agent[1:]
|
| + base_name = re.match("(const |PassRefPtr<)?(\w*)", param_type).group(2)
|
| + return "param" + base_name
|
|
|
|
|
| def agent_class_name(agent):
|
| @@ -280,178 +413,93 @@ def agent_class_name(agent):
|
| return "Inspector%sAgent" % agent
|
|
|
|
|
| -def agent_getter_name(agent):
|
| - name = agent_class_name(agent)
|
| - return name[0].lower() + name[1:]
|
| +def agent_getter_signature(agent):
|
| + agent_class = agent_class_name(agent)
|
| + return agent_class, agent_class[0].lower() + agent_class[1:]
|
|
|
|
|
| -def generate(input_path, output_h_dir, output_cpp_dir):
|
| - fin = open(input_path, "r")
|
| - declarations = load_model_from_idl(fin.read())
|
| - fin.close()
|
| +def include_header(name):
|
| + return "#include \"%s.h\"" % name
|
|
|
| - impl_declarations = []
|
| - inline_methods = []
|
| - out_of_line_methods = []
|
|
|
| - for declaration in declarations:
|
| - param_string_public = ", ".join(map(Parameter.to_str_full, declaration.params))
|
| +def include_inspector_header(name):
|
| + return include_header("core/inspector/" + name)
|
|
|
| - param_list_impl_parsed = declaration.params[:]
|
|
|
| - accepts_cookie = (declaration.params[0].type == "const InspectorInstrumentationCookie&")
|
| - if not accepts_cookie and not "Inline=Forward" in declaration.method_options:
|
| - if not "Keep" in declaration.param_options:
|
| - param_list_impl_parsed = param_list_impl_parsed[1:]
|
| - param_list_impl_parsed = [Parameter("InstrumentingAgents*")] + param_list_impl_parsed
|
| +def generate_instrumenting_agents(used_agents):
|
| + agents = list(used_agents)
|
|
|
| - generate_inline = not "Inline=Custom" in declaration.method_options
|
| - if generate_inline:
|
| - impl_declarations.append("%s %sImpl(%s);" % (
|
| - declaration.return_type, declaration.name, ", ".join(map(Parameter.to_str_class, param_list_impl_parsed))))
|
| + forward_list = []
|
| + accessor_list = []
|
| + member_list = []
|
| + init_list = []
|
| + reset_list = []
|
|
|
| - leading_impl_param_name = param_list_impl_parsed[0].name
|
| - param_string_impl_full = ", ".join(map(Parameter.to_str_class_and_name, param_list_impl_parsed))
|
| + for agent in agents:
|
| + class_name, getter_name = agent_getter_signature(agent)
|
| + member_name = "m_" + getter_name
|
|
|
| - param_list_impl_names_only = map(Parameter.to_str_name, param_list_impl_parsed)
|
| - param_string_impl_names_only = ", ".join(param_list_impl_names_only)
|
| - param_string_agent = ", ".join(param_list_impl_names_only[1:])
|
| + forward_list.append("class %s;" % class_name)
|
| + accessor_list.append(template_instrumenting_agent_accessor.substitute(
|
| + None,
|
| + class_name=class_name,
|
| + getter_name=getter_name,
|
| + member_name=member_name))
|
| + member_list.append(" %s* %s;" % (class_name, member_name))
|
| + init_list.append("%s(0)" % member_name)
|
| + reset_list.append("%s = 0;" % member_name)
|
|
|
| - def is_agent_name(name):
|
| - return not "=" in name
|
| + forward_list.sort()
|
| + accessor_list.sort()
|
| + member_list.sort()
|
| + init_list.sort()
|
| + reset_list.sort()
|
|
|
| - agents = filter(is_agent_name, declaration.method_options)
|
| + header_lines = template_instrumenting_agents_h.substitute(
|
| + None,
|
| + forward_list="\n".join(forward_list),
|
| + accessor_list="\n".join(accessor_list),
|
| + member_list="\n".join(member_list))
|
|
|
| - if "Inline=FastReturn" in declaration.method_options or "Inline=Forward" in declaration.method_options:
|
| - fast_return = "\n FAST_RETURN_IF_NO_FRONTENDS(%s());" % declaration.return_type
|
| - else:
|
| - fast_return = ""
|
| + cpp_lines = template_instrumenting_agents_cpp.substitute(
|
| + None,
|
| + init_list="\n , ".join(init_list),
|
| + reset_list="\n ".join(reset_list))
|
|
|
| - if accepts_cookie:
|
| - if generate_inline:
|
| - inline_methods.append(
|
| - template_inline_accepts_cookie.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - fast_return=fast_return,
|
| - params_public=param_string_public,
|
| - params_impl=param_string_impl_names_only,
|
| - cookie=leading_impl_param_name))
|
| - if len(agents):
|
| - agent_calls = []
|
| - for agent in agents:
|
| - if agent == "Timeline":
|
| - agent_fetch = "retrieveTimelineAgent(%s)" % leading_impl_param_name
|
| - else:
|
| - agent_fetch = "%s.instrumentingAgents()->%s()" % (leading_impl_param_name, agent_getter_name(agent))
|
| - agent_calls.append(
|
| - template_agent_call.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - agent_fetch=agent_fetch,
|
| - params_agent=param_string_agent,
|
| - agent_class=agent_class_name(agent),
|
| - agent=agent_variable_name(agent)))
|
| - out_of_line_methods.append(
|
| - template_outofline.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - params_impl=param_string_impl_full,
|
| - agent_calls="".join(agent_calls)))
|
| - else:
|
| - leading_public_param = declaration.params[0]
|
| - selector_class = re.match("(\w*)", leading_public_param.type).group(1)
|
| - agents_getter = "instrumentingAgentsFor%s(%s)" % (selector_class, leading_public_param.name)
|
| - if declaration.return_type == "void":
|
| - if generate_inline:
|
| - if "Inline=Forward" in declaration.method_options:
|
| - inline_methods.append(
|
| - template_inline_forward.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - fast_return=fast_return,
|
| - params_public=param_string_public,
|
| - params_impl=param_string_impl_names_only))
|
| - else:
|
| - inline_methods.append(
|
| - template_inline.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - fast_return=fast_return,
|
| - params_public=param_string_public,
|
| - params_impl=param_string_impl_names_only,
|
| - agents_getter=agents_getter))
|
| - if len(agents):
|
| - agent_calls = []
|
| - for agent in agents:
|
| - agent_fetch = "%s->%s()" % (leading_impl_param_name, agent_getter_name(agent))
|
| - agent_call = template_agent_call.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - agent_fetch=agent_fetch,
|
| - params_agent=param_string_agent,
|
| - agent_class=agent_class_name(agent),
|
| - agent=agent_variable_name(agent))
|
| - agent_calls.append(agent_call)
|
| - out_of_line_methods.append(
|
| - template_outofline.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - params_impl=param_string_impl_full,
|
| - agent_calls="".join(agent_calls)))
|
| - elif declaration.return_type == "InspectorInstrumentationCookie":
|
| - if generate_inline:
|
| - inline_methods.append(
|
| - template_inline_returns_cookie.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - fast_return=fast_return,
|
| - params_public=param_string_public,
|
| - params_impl=param_string_impl_names_only,
|
| - agents_getter=agents_getter))
|
| -
|
| - if len(agents):
|
| - timeline_agent_id = "0"
|
| - agent_calls = []
|
| - for agent in agents:
|
| - if agent == "Timeline":
|
| - agent_call = template_timeline_agent_call.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - params_agent=param_string_agent)
|
| - timeline_agent_id = "timelineAgentId"
|
| - else:
|
| - agent_fetch = "%s->%s()" % (leading_impl_param_name, agent_getter_name(agent))
|
| - agent_call = template_agent_call.substitute(
|
| - None,
|
| - name=declaration.name,
|
| - agent_fetch=agent_fetch,
|
| - params_agent=param_string_agent,
|
| - agent_class=agent_class_name(agent),
|
| - agent=agent_variable_name(agent))
|
| - agent_calls.append(agent_call)
|
| -
|
| - out_of_line_methods.append(
|
| - template_outofline_returns_cookie.substitute(
|
| - None,
|
| - return_type=declaration.return_type,
|
| - name=declaration.name,
|
| - params_impl=param_string_impl_full,
|
| - agent_calls="".join(agent_calls),
|
| - timeline_agent_id=timeline_agent_id))
|
| - else:
|
| - sys.stderr.write("Unsupported return type %s" % declaration.return_type)
|
| - sys.exit(1)
|
| + return header_lines, cpp_lines
|
| +
|
| +
|
| +def generate(input_path, output_h_dir, output_cpp_dir):
|
| + fin = open(input_path, "r")
|
| + files = load_model_from_idl(fin.read())
|
| + fin.close()
|
| +
|
| + cpp_includes = []
|
| + cpp_lines = []
|
| + used_agents = set()
|
| + for f in files:
|
| + cpp_includes.append(include_header(f.header_name))
|
| +
|
| + fout = open(output_h_dir + "/" + f.header_name + ".h", "w")
|
| + fout.write(f.generate(cpp_lines, used_agents))
|
| + fout.close()
|
| +
|
| + for agent in used_agents:
|
| + cpp_includes.append(include_inspector_header(agent_class_name(agent)))
|
| + cpp_includes.append(include_header("InstrumentingAgentsInl"))
|
| + cpp_includes.sort()
|
| +
|
| + instrumenting_agents_header, instrumenting_agents_cpp = generate_instrumenting_agents(used_agents)
|
|
|
| - fout = open(output_h_dir + "/InspectorInstrumentationInl.h", "w")
|
| - fout.write(template_h.substitute(None,
|
| - impl_declarations="\n".join(impl_declarations),
|
| - inline_methods="".join(inline_methods)))
|
| + fout = open(output_h_dir + "/" + "InstrumentingAgentsInl.h", "w")
|
| + fout.write(instrumenting_agents_header)
|
| fout.close()
|
|
|
| fout = open(output_cpp_dir + "/InspectorInstrumentationImpl.cpp", "w")
|
| fout.write(template_cpp.substitute(None,
|
| - out_of_line_methods="\n".join(out_of_line_methods)))
|
| + includes="\n".join(cpp_includes),
|
| + extra_definitions=instrumenting_agents_cpp,
|
| + methods="\n".join(cpp_lines)))
|
| fout.close()
|
|
|
|
|
|
|