void orte_idl_attr_fake_ops(IDL_tree attr, IDL_ns ns) { IDL_tree attr_name, ident, curnode, op1, op2, intf; GString *attrname; OIDL_Attr_Info *setme; g_assert(attr && IDL_NODE_TYPE(attr) == IDLN_ATTR_DCL); attrname = g_string_new(NULL); for(curnode = IDL_ATTR_DCL(attr).simple_declarations; curnode; curnode = IDL_LIST(curnode).next) { op1 = op2 = NULL; attr_name = IDL_LIST(curnode).data; g_string_printf(attrname, "_get_%s", IDL_IDENT(attr_name).str); ident = IDL_ident_new(g_strdup(attrname->str)); IDL_IDENT_TO_NS(ident) = IDL_IDENT_TO_NS(attr_name); op1 = IDL_op_dcl_new(0, IDL_ATTR_DCL(attr).param_type_spec, ident, NULL, NULL, NULL); IDL_NODE_UP(op1) = IDL_NODE_UP(attr); intf = IDL_NODE_UP (IDL_NODE_UP (op1)); IDL_NS(ns).current = IDL_IDENT_TO_NS (IDL_INTERFACE (intf).ident); IDL_ns_place_new(ns, ident); if(!IDL_ATTR_DCL(attr).f_readonly) { g_string_printf(attrname, "_set_%s", IDL_IDENT(attr_name).str); ident = IDL_ident_new(g_strdup(attrname->str)); IDL_IDENT_TO_NS(ident) = IDL_IDENT_TO_NS(attr_name); op2 = IDL_op_dcl_new(0, NULL, ident, NULL, NULL, NULL); IDL_NODE_UP(op2) = IDL_NODE_UP(attr); intf = IDL_NODE_UP (IDL_NODE_UP (op2)); IDL_NS(ns).current = IDL_IDENT_TO_NS (IDL_INTERFACE (intf).ident); IDL_ns_place_new(ns, ident); IDL_OP_DCL(op2).parameter_dcls = IDL_list_new( IDL_param_dcl_new(IDL_PARAM_IN, IDL_ATTR_DCL(attr).param_type_spec, IDL_ident_new(g_strdup("value")))); } setme = g_new0(OIDL_Attr_Info, 1); setme->op1 = op1; setme->op2 = op2; attr_name->data = setme; } g_string_free(attrname, TRUE); }
IDL_tree IDL_ns_qualified_ident_new (IDL_tree nsid) { IDL_tree l = NULL, item; while (nsid != NULL) { if (IDL_GENTREE (nsid).data == NULL) { nsid = IDL_NODE_UP (nsid); continue; } assert (IDL_GENTREE (nsid).data != NULL); assert (IDL_NODE_TYPE (IDL_GENTREE (nsid).data) == IDLN_IDENT); item = IDL_list_new (IDL_ident_new ( g_strdup (IDL_IDENT (IDL_GENTREE (nsid).data).str))); l = IDL_list_concat (item, l); nsid = IDL_NODE_UP (nsid); } return l; }
IDL_ns IDL_ns_new (void) { IDL_ns ns; ns = g_new0 (struct _IDL_ns, 1); if (ns == NULL) { yyerror ("IDL_ns_new: memory exhausted"); return NULL; } IDL_NS (ns).global = IDL_gentree_new (IDL_ident_hash, IDL_ident_equal, IDL_ident_new ("")); IDL_NS (ns).file = IDL_NS (ns).current = IDL_NS (ns).global; IDL_NS (ns).inhibits = g_hash_table_new (g_direct_hash, g_direct_equal); IDL_NS (ns).filename_hash = g_hash_table_new (g_str_hash, g_str_equal); return ns; }
/* * Shared between the interface class declaration and the NS_DECL_IFOO macro * provided to aid declaration of implementation classes. * mode... * AS_DECL writes 'NS_IMETHOD foo(string bar, long sil)' * AS_IMPL writes 'NS_IMETHODIMP className::foo(string bar, long sil)' * AS_CALL writes 'foo(bar, sil)' */ static gboolean write_method_signature(IDL_tree method_tree, FILE *outfile, int mode, const char *className) { struct _IDL_OP_DCL *op = &IDL_OP_DCL(method_tree); gboolean no_generated_args = TRUE; gboolean op_notxpcom = (IDL_tree_property_get(op->ident, "notxpcom") != NULL); const char *name; IDL_tree iter; if (mode == AS_DECL) { if (op_notxpcom) { fputs("NS_IMETHOD_(", outfile); if (!write_type(op->op_type_spec, FALSE, outfile)) return FALSE; fputc(')', outfile); } else { fputs("NS_IMETHOD", outfile); } fputc(' ', outfile); } else if (mode == AS_IMPL) { if (op_notxpcom) { fputs("NS_IMETHODIMP_(", outfile); if (!write_type(op->op_type_spec, FALSE, outfile)) return FALSE; fputc(')', outfile); } else { fputs("NS_IMETHODIMP", outfile); } fputc(' ', outfile); } name = IDL_IDENT(op->ident).str; if (mode == AS_IMPL) { fprintf(outfile, "%s::%c%s(", className, toupper(*name), name + 1); } else { fprintf(outfile, "%c%s(", toupper(*name), name + 1); } for (iter = op->parameter_dcls; iter; iter = IDL_LIST(iter).next) { if (mode == AS_DECL || mode == AS_IMPL) { if (!write_param(IDL_LIST(iter).data, outfile)) return FALSE; } else { fputs(IDL_IDENT(IDL_PARAM_DCL(IDL_LIST(iter).data) .simple_declarator).str, outfile); } if ((IDL_LIST(iter).next || (!op_notxpcom && op->op_type_spec) || op->f_varargs)) fputs(", ", outfile); no_generated_args = FALSE; } /* make IDL return value into trailing out argument */ if (op->op_type_spec && !op_notxpcom) { IDL_tree fake_param = IDL_param_dcl_new(IDL_PARAM_OUT, op->op_type_spec, IDL_ident_new("_retval")); if (!fake_param) return FALSE; if (mode == AS_DECL || mode == AS_IMPL) { if (!write_param(fake_param, outfile)) return FALSE; } else { fputs("_retval", outfile); } if (op->f_varargs) fputs(", ", outfile); no_generated_args = FALSE; } /* varargs go last */ if (op->f_varargs) { if (mode == AS_DECL || mode == AS_IMPL) { fputs("nsVarArgs *", outfile); } fputs("_varargs", outfile); no_generated_args = FALSE; } /* * If generated method has no arguments, output 'void' to avoid C legacy * behavior of disabling type checking. */ if (no_generated_args && mode == AS_DECL) { fputs("void", outfile); } fputc(')', outfile); return TRUE; }
/* * Shared between the interface class declaration and the NS_DECL_IFOO macro * provided to aid declaration of implementation classes. * mode... */ static gboolean write_method_signature(IDL_tree method_tree, FILE *outfile, const char *className) { struct _IDL_OP_DCL *op = &IDL_OP_DCL(method_tree); gboolean no_generated_args = TRUE; gboolean op_notxpcom = (IDL_tree_property_get(op->ident, "notxpcom") != NULL); const char *name; IDL_tree iter; if (op_notxpcom && !op->op_type_spec) fputs("procedure ", outfile); else fputs("function ", outfile); name = IDL_IDENT(op->ident).str; if( is_reserved(name) ) fputc('_', outfile); fprintf(outfile, "%c%s(", toupper(*name), name + 1); for (iter = op->parameter_dcls; iter; iter = IDL_LIST(iter).next) { if (!write_param(IDL_LIST(iter).data, outfile)) return FALSE; if ((IDL_LIST(iter).next || (!op_notxpcom && op->op_type_spec) || op->f_varargs)) fputs("; ", outfile); no_generated_args = FALSE; } /* make IDL return value into trailing out argument */ if (op->op_type_spec && !op_notxpcom) { IDL_tree fake_param = IDL_param_dcl_new(IDL_PARAM_OUT, op->op_type_spec, IDL_ident_new("_retval")); if (!fake_param) return FALSE; if (!write_param(fake_param, outfile)) return FALSE; if (op->f_varargs) fputs("; ", outfile); no_generated_args = FALSE; } /* varargs go last */ if (op->f_varargs) { fputs("_varargs : PVarArgs", outfile); no_generated_args = FALSE; } fputc(')', outfile); if (op_notxpcom) { if (!interface_write_type(op->op_type_spec, FALSE, FALSE, FALSE, FALSE, NULL, outfile)) return FALSE; } else { fputs(": nsresult", outfile); } fputs("; stdcall", outfile); return TRUE; }