[vala] dova: Support string literals without allocation
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] dova: Support string literals without allocation
- Date: Sat, 7 Aug 2010 09:04:23 +0000 (UTC)
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]