]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
dova: Support string literals without allocation
authorJürg Billeter <j@bitron.ch>
Sat, 7 Aug 2010 08:47:29 +0000 (10:47 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 7 Aug 2010 08:47:29 +0000 (10:47 +0200)
codegen/valadovabasemodule.vala
codegen/valadovaobjectmodule.vala
vala/valabinaryexpression.vala
vala/valaobjecttype.vala
vala/valastringliteral.vala

index 14d0ee18d93e4fa6bc8eb799c09acffc5893f5a8..79a8198e8c68cab48e64bb4666e9265e18becd36 100644 (file)
@@ -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) {
index 6e277b85409f60e13cb56ad8e995b48511253bbc..175a176ff80a63342491dd39aad47e4128597ebc 100644 (file)
@@ -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));
index 81bc2ce7154b97d7c2216d695d20ec3091e6e926..f2652f956cb92191efb952fb2af536bff2e703d0 100644 (file)
@@ -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);
index 53ecb61d838de1296d49745c9d5738b0717ed9cd..fecf1aa38bdc5f0a01bf3d7c2cb6d8b1c98d8d19 100644 (file)
@@ -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));
        }
 
index 94c4d99fb2a773846b2dafe69f050d56b964ba04..318c2189e60a785089fa608c620ef2e0666326e0 100644 (file)
@@ -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;
        }