[vala] dova: Support string literals without allocation



commit f4a42b47451402ef6972715d5ae19607fd0f44eb
Author: Jürg Billeter <j bitron ch>
Date:   Sat Aug 7 10:47:29 2010 +0200

    dova: Support string literals without allocation

 codegen/valadovabasemodule.vala   |    8 +++++---
 codegen/valadovaobjectmodule.vala |   17 ++++++++++++++---
 vala/valabinaryexpression.vala    |    5 ++++-
 vala/valaobjecttype.vala          |    6 ++++++
 vala/valastringliteral.vala       |    3 ---
 5 files changed, 29 insertions(+), 10 deletions(-)
---
diff --git a/codegen/valadovabasemodule.vala b/codegen/valadovabasemodule.vala
index 14d0ee1..79a8198 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 6e277b8..175a176 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 81bc2ce..f2652f9 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 53ecb61..fecf1aa 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 94c4d99..318c218 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;
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]