summaryrefslogtreecommitdiff
path: root/src/jsapi-libdom.h
blob: e8d57c485621bae9163e7d9e3d55c3f8c79e9270 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* binding generator output
 *
 * This file is part of nsgenbind.
 * Licensed under the MIT License,
 *                http://www.opensource.org/licenses/mit-license.php
 * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
 */

#ifndef nsgenbind_jsapi_libdom_h
#define nsgenbind_jsapi_libdom_h

struct options;

struct binding_interface {
	const char *name; /**< name of interface */
	struct genbind_node *node; /**< node of interface in binding */
	struct webidl_node *widl_node; /**< node of interface in webidl */
	const char *inherit_name; /**< name of interface this inherits from */
	int own_properties; /**< the number of properties the interface has */
	int own_functions; /**< the number of functions the interface has */

	bool has_type_properties; /**< some of the properties on the
				   * interface have a type handler
				   */

	int inherit_idx; /**< index into binding map of inherited
			  * interface or -1 for not in map
			  */
	int refcount; /**< number of entries in map that refer to this
		       * interface
		       */
	int output_idx; /**< for interfaces that will be output (node
			 * is valid) this is the output array index
			 */
};

struct binding {
	struct genbind_node *gb_ast; /* root node of binding AST */
	struct webidl_node *wi_ast; /* root node of webidl AST */

	const char *name; /* Name of binding (first interface name by default) */
	int interfacec; /* numer of interfaces in the interface map */
	struct binding_interface *interfaces; /* binding interface map */

	const char *interface; /* webidl interface binding is for */

	bool has_private; /* true if the binding requires a private structure */
	struct genbind_node *binding_list; /* node list of the binding */

	struct genbind_node *addproperty; /* binding api add property node or NULL */
	struct genbind_node *delproperty; /* binding api delete property node or NULL */
	struct genbind_node *getproperty; /* binding api get property node or NULL */
	struct genbind_node *setproperty; /* binding api set property node or NULL */
	struct genbind_node *enumerate; /* binding api enumerate node or NULL */
	struct genbind_node *resolve; /* binding api resolve node or NULL */
	struct genbind_node *finalise; /* binding api finalise node or NULL */
	struct genbind_node *mark; /* binding api mark node or NULL */

	const char *hdrguard; /* header file guard name */

	FILE *outfile ; /* file handle output should be written to,
			 * allows reuse of callback routines to output
			 * to headers and source files
			 */
	FILE *srcfile ; /* output source file */
	FILE *hdrfile ; /* output header file */
};

/** Generate binding between jsapi and netsurf libdom */
int jsapi_libdom_output(struct options *options, struct genbind_node *genbind_ast, struct genbind_node *binding_node);

/** Build interface map.
 *
 * Generate a map of all interfaces referenced from a binding and
 * their relationships to each other.
 *
 * The map will contain all the interfaces both directly referenced by
 * the binding and all those inherited through the WebIDL.
 *
 * The map is topoligicaly sorted to ensure no forward inheritance
 * references.
 *
 * The map contains an monotinicaly incrementing index for all
 * interfaces referenced in the binding (i.e. those to be exported).
 */
int build_interface_map(struct genbind_node *binding_node,
			struct webidl_node *webidl_ast,
			int *interfacec_out,
			struct binding_interface **interfaces_out);


/** output code block from a node */
void output_code_block(struct binding *binding, struct genbind_node *codelist);

/** generate classes */
int output_jsclasses(struct binding *binding);

/* Generate jsapi native function specifiers */
int output_function_spec(struct binding *binding);

/**
 * Generate jsapi native function bodies.
 *
 * web IDL describes methods as operators
 * http://www.w3.org/TR/WebIDL/#idl-operations
 *
 * This walks the web IDL AST to find all operator interface members
 * and construct appropriate jsapi native function body to implement
 * them.
 *
 * Function body contents can be overriden with an operator code
 * block in the binding definition.
 *
 * @param binding The binding information
 */
int output_function_bodies(struct binding *binding);

/** generate property tinyid enum */
int output_property_tinyid(struct binding *binding);

/** generate property specifier structure */
int output_property_spec(struct binding *binding);

/** generate property function bodies */
int output_property_body(struct binding *binding);

/** generate binding initialisation */
int output_class_init(struct binding *binding);

/** generate binding class constructors */
int output_class_new(struct binding *binding);


#endif