TypeReference bool_type;
TypeReference int_type;
TypeReference string_type;
+ TypeReference float_type;
+ TypeReference double_type;
public construct (bool manage_memory = true) {
memory_management = manage_memory;
int_type = new TypeReference ();
int_type.data_type = (DataType) root_symbol.lookup ("int").node;
+ float_type = new TypeReference ();
+ float_type.data_type = (DataType) root_symbol.lookup ("float").node;
+
+ double_type = new TypeReference ();
+ double_type.data_type = (DataType) root_symbol.lookup ("double").node;
+
string_type = new TypeReference ();
string_type.data_type = (DataType) root_symbol.lookup ("string").node;
} else if (prop.type_reference.data_type == bool_type.data_type) {
cspec.call = new CCodeIdentifier ("g_param_spec_boolean");
cspec.add_argument (new CCodeConstant ("FALSE"));
+ } else if (prop.type_reference.data_type == float_type.data_type) {
+ cspec.call = new CCodeIdentifier ("g_param_spec_float");
+ cspec.add_argument (new CCodeConstant ("-G_MAXFLOAT"));
+ cspec.add_argument (new CCodeConstant ("G_MAXFLOAT"));
+ cspec.add_argument (new CCodeConstant ("0"));
+ } else if (prop.type_reference.data_type == double_type.data_type) {
+ cspec.call = new CCodeIdentifier ("g_param_spec_double");
+ cspec.add_argument (new CCodeConstant ("-G_MAXDOUBLE"));
+ cspec.add_argument (new CCodeConstant ("G_MAXDOUBLE"));
+ cspec.add_argument (new CCodeConstant ("0"));
} else {
cspec.call = new CCodeIdentifier ("g_param_spec_pointer");
}
return new CCodeIdentifier ("g_value_set_int");
} else if (type_reference.data_type == bool_type.data_type) {
return new CCodeIdentifier ("g_value_set_boolean");
+ } else if (type_reference.data_type == float_type.data_type) {
+ return new CCodeIdentifier ("g_value_set_float");
+ } else if (type_reference.data_type == double_type.data_type) {
+ return new CCodeIdentifier ("g_value_set_double");
} else {
return new CCodeIdentifier ("g_value_set_pointer");
}
cgetcall.call = new CCodeIdentifier ("g_value_get_int");
} else if (prop.type_reference.type_name == "bool") {
cgetcall.call = new CCodeIdentifier ("g_value_get_boolean");
+ } else if (prop.type_reference.type_name == "float") {
+ cgetcall.call = new CCodeIdentifier ("g_value_get_float");
+ } else if (prop.type_reference.type_name == "double") {
+ cgetcall.call = new CCodeIdentifier ("g_value_get_double");
} else {
cgetcall.call = new CCodeIdentifier ("g_value_get_pointer");
}
if (f.symbol.parent_symbol.node is DataType) {
var t = (DataType) f.symbol.parent_symbol.node;
var cdecl = new CCodeDeclaration (f.type_reference.get_cname ());
- var var_decl = new CCodeVariableDeclarator ("%s_%s".printf (t.get_lower_case_cname (null), f.get_cname ()));
+ var var_decl = new CCodeVariableDeclarator (f.get_cname ());
if (f.initializer != null) {
var_decl.initializer = (CCodeExpression) f.initializer.ccodenode;
}
expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
}
} else {
- if (f.symbol.parent_symbol.node is DataType) {
- var t = (DataType) f.symbol.parent_symbol.node;
- expr.ccodenode = new CCodeIdentifier ("%s_%s".printf (t.get_lower_case_cname (null), f.get_cname ()));
- } else {
- expr.ccodenode = new CCodeIdentifier (f.get_cname ());
- }
+ expr.ccodenode = new CCodeIdentifier (f.get_cname ());
}
} else if (expr.symbol_reference.node is Constant) {
var c = (Constant) expr.symbol_reference.node;
ccast.add_argument (cexpr);
cexpr = ccast;
}
+
+ if (a.operator != AssignmentOperator.SIMPLE) {
+ CCodeBinaryOperator cop;
+ if (a.operator == AssignmentOperator.BITWISE_OR) {
+ cop = CCodeBinaryOperator.BITWISE_OR;
+ } else if (a.operator == AssignmentOperator.BITWISE_AND) {
+ cop = CCodeBinaryOperator.BITWISE_AND;
+ } else if (a.operator == AssignmentOperator.BITWISE_XOR) {
+ cop = CCodeBinaryOperator.BITWISE_XOR;
+ } else if (a.operator == AssignmentOperator.ADD) {
+ cop = CCodeBinaryOperator.PLUS;
+ } else if (a.operator == AssignmentOperator.SUB) {
+ cop = CCodeBinaryOperator.MINUS;
+ } else if (a.operator == AssignmentOperator.MUL) {
+ cop = CCodeBinaryOperator.MUL;
+ } else if (a.operator == AssignmentOperator.DIV) {
+ cop = CCodeBinaryOperator.DIV;
+ } else if (a.operator == AssignmentOperator.PERCENT) {
+ cop = CCodeBinaryOperator.MOD;
+ } else if (a.operator == AssignmentOperator.SHIFT_LEFT) {
+ cop = CCodeBinaryOperator.SHIFT_LEFT;
+ } else if (a.operator == AssignmentOperator.SHIFT_RIGHT) {
+ cop = CCodeBinaryOperator.SHIFT_RIGHT;
+ }
+ cexpr = new CCodeBinaryExpression (cop, (CCodeExpression) a.left.ccodenode, new CCodeParenthesizedExpression (cexpr));
+ }
ccall.add_argument (cexpr);
string dup_function;
string free_function;
string type_id;
+ string lower_case_cprefix;
string lower_case_csuffix;
bool reference_type;
string marshaller_type_name;
this.cname = cname;
}
+ public override ref string get_lower_case_cprefix () {
+ if (lower_case_cprefix == null) {
+ lower_case_cprefix = "%s_".printf (get_lower_case_cname (null));
+ }
+ return lower_case_cprefix;
+ }
+
private string get_lower_case_csuffix () {
if (lower_case_csuffix == null) {
lower_case_csuffix = Namespace.camel_case_to_lower_case (name);
return reference_type;
}
+ /**
+ * Sets whether this data type has value or reference type semantics.
+ *
+ * @param ref_type true if this data type has reference type semantics
+ */
+ public void set_is_reference_type (bool ref_type) {
+ reference_type = ref_type;
+ }
+
private void process_ccode_attribute (Attribute! a) {
foreach (NamedArgument arg in a.args) {
if (arg.name == "cname") {
set_cname (((StringLiteral) lit).eval ());
}
}
+ } else if (arg.name == "cprefix") {
+ /* this will already be checked during semantic analysis */
+ if (arg.argument is LiteralExpression) {
+ var lit = ((LiteralExpression) arg.argument).literal;
+ if (lit is StringLiteral) {
+ lower_case_cprefix = ((StringLiteral) lit).eval ();
+ }
+ }
} else if (arg.name == "cheader_filename") {
/* this will already be checked during semantic analysis */
if (arg.argument is LiteralExpression) {