public Class object_class;
public Class type_class;
public Class value_class;
+ public Class string_class;
public Class array_class;
public Class delegate_class;
public Class error_class;
object_class = (Class) dova_ns.scope.lookup ("Object");
type_class = (Class) dova_ns.scope.lookup ("Type");
value_class = (Class) dova_ns.scope.lookup ("Value");
+ string_class = (Class) root_symbol.scope.lookup ("string");
array_class = (Class) dova_ns.scope.lookup ("Array");
delegate_class = (Class) dova_ns.scope.lookup ("Delegate");
error_class = (Class) dova_ns.scope.lookup ("Error");
}
public override void visit_string_literal (StringLiteral expr) {
- var ccall = new CCodeFunctionCall (new CCodeIdentifier ("string_create_from_cstring"));
// FIXME handle escaped characters in scanner/parser and escape them here again for C
- ccall.add_argument (new CCodeConstant (expr.value));
+ var cliteral = new CCodeConstant ("\"\\0\" " + expr.value);
- expr.ccodenode = ccall;
+ var cbinary = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, cliteral, new CCodeConstant ("1"));
+ expr.ccodenode = new CCodeCastExpression (cbinary, "string_t");
}
public override void visit_null_literal (NullLiteral expr) {
if (cl.base_class == null) {
decl_space.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (cl.get_cname ()), new CCodeVariableDeclarator (cl.get_cname ())));
+ } else if (cl == string_type.data_type) {
+ generate_class_declaration (cl.base_class, decl_space);
+ decl_space.add_type_declaration (new CCodeTypeDefinition ("const uint8_t *", new CCodeVariableDeclarator (cl.get_cname ())));
} else {
// typedef to base class instead of dummy struct to avoid warnings/casts
generate_class_declaration (cl.base_class, decl_space);
}
type_init_fun.block = new CCodeBlock ();
- if (base_class == null || cl == object_class || cl == value_class) {
+ if (base_class == null || cl == object_class || cl == value_class || cl == string_class) {
var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
sizeof_call.add_argument (new CCodeIdentifier ("void *"));
value_to_any_fun.add_parameter (new CCodeFormalParameter ("value_index", "int32_t"));
value_to_any_fun.block = new CCodeBlock ();
var val = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("value"), new CCodeIdentifier ("value_index"));
- var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_ref".printf (cl.get_lower_case_cname ())));
+ string to_any_fun = "%s_ref".printf (cl.get_lower_case_cname ());
+ if (cl == string_class) {
+ to_any_fun = "string_to_any";
+ }
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier (to_any_fun));
ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, val));
value_to_any_fun.block.add_statement (new CCodeReturnStatement (ccall));
source_type_member_definition.append (value_to_any_fun);
value_from_any_fun.add_parameter (new CCodeFormalParameter ("value", cl.get_cname () + "**"));
value_from_any_fun.add_parameter (new CCodeFormalParameter ("value_index", "int32_t"));
value_from_any_fun.block = new CCodeBlock ();
- ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_ref".printf (cl.get_lower_case_cname ())));
+ string from_any_fun = "%s_ref".printf (cl.get_lower_case_cname ());
+ if (cl == string_class) {
+ from_any_fun = "string_from_any";
+ }
+ ccall = new CCodeFunctionCall (new CCodeIdentifier (from_any_fun));
ccall.add_argument (new CCodeIdentifier ("any_"));
value_from_any_fun.block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, val), ccall)));
value_from_any_fun.block.add_statement (new CCodeReturnStatement (ccall));
&& right.value_type.compatible (analyzer.string_type)) {
// string comparison
if (analyzer.context.profile == Profile.DOVA) {
- var equals_call = new MethodCall (new MemberAccess (left, "equals", source_reference), source_reference);
+ var string_ma = new MemberAccess.simple ("string", source_reference);
+ string_ma.qualified = true;
+ var equals_call = new MethodCall (new MemberAccess (string_ma, "equals", source_reference), source_reference);
+ equals_call.add_argument (left);
equals_call.add_argument (right);
if (operator == BinaryOperator.EQUALITY) {
parent_node.replace_expression (this, equals_call);