From: Jürg Billeter Date: Sat, 7 Aug 2010 08:47:29 +0000 (+0200) Subject: dova: Support string literals without allocation X-Git-Tag: 0.9.5~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4a42b47451402ef6972715d5ae19607fd0f44eb;p=thirdparty%2Fvala.git dova: Support string literals without allocation --- diff --git a/codegen/valadovabasemodule.vala b/codegen/valadovabasemodule.vala index 14d0ee18d..79a8198e8 100644 --- a/codegen/valadovabasemodule.vala +++ b/codegen/valadovabasemodule.vala @@ -154,6 +154,7 @@ internal class Vala.DovaBaseModule : CCodeModule { 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; @@ -232,6 +233,7 @@ internal class Vala.DovaBaseModule : CCodeModule { 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"); @@ -1532,11 +1534,11 @@ internal class Vala.DovaBaseModule : CCodeModule { } 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) { diff --git a/codegen/valadovaobjectmodule.vala b/codegen/valadovaobjectmodule.vala index 6e277b854..175a176ff 100644 --- a/codegen/valadovaobjectmodule.vala +++ b/codegen/valadovaobjectmodule.vala @@ -32,6 +32,9 @@ internal class Vala.DovaObjectModule : DovaArrayModule { 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); @@ -594,7 +597,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule { } 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 *")); @@ -690,7 +693,11 @@ internal class Vala.DovaObjectModule : DovaArrayModule { 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); @@ -709,7 +716,11 @@ internal class Vala.DovaObjectModule : DovaArrayModule { 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)); diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala index 81bc2ce71..f2652f956 100644 --- a/vala/valabinaryexpression.vala +++ b/vala/valabinaryexpression.vala @@ -414,7 +414,10 @@ public class Vala.BinaryExpression : Expression { && 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); diff --git a/vala/valaobjecttype.vala b/vala/valaobjecttype.vala index 53ecb61d8..fecf1aa38 100644 --- a/vala/valaobjecttype.vala +++ b/vala/valaobjecttype.vala @@ -52,6 +52,12 @@ public class Vala.ObjectType : ReferenceType { } public override string? get_cname () { + if (CodeContext.get ().profile == Profile.DOVA) { + if (type_symbol.get_full_name () == "string") { + return "string_t"; + } + } + return "%s*".printf (type_symbol.get_cname (!value_owned)); } diff --git a/vala/valastringliteral.vala b/vala/valastringliteral.vala index 94c4d99fb..318c2189e 100644 --- a/vala/valastringliteral.vala +++ b/vala/valastringliteral.vala @@ -85,9 +85,6 @@ public class Vala.StringLiteral : Literal { checked = true; value_type = analyzer.string_type.copy (); - if (analyzer.context.profile == Profile.DOVA) { - value_type.value_owned = true; - } return !error; }