Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 523608 | Differences between
and this patch

Collapse All | Expand All

(-)file_not_specified_in_diff (-22 / +277 lines)
Line  Link Here
--
1
girepository/gicallableinfo.c                                                       |   26 +++
girepository/gicallableinfo.c                                                       |   26 +++
2
girepository/gicallableinfo.h                                                       |    2 
1
girepository/gicallableinfo.h                                                       |    2 
3
girepository/girepository.symbols                                                   |    1 
2
girepository/girepository.symbols                                                   |    1 
4
girepository/girnode.c                                                              |    3 
3
girepository/girnode.c                                                              |    3 
5
girepository/girnode.h                                                              |    3 
4
girepository/girnode.h                                                              |    3 
6
girepository/girparser.c                                                            |   74 +++++++++-
5
girepository/girparser.c                                                            |   74 +++++++++-
7
girepository/gitypelib-internal.h                                                   |    5 
6
girepository/gitypelib-internal.h                                                   |    5 
8
tests/repository/gitypelibtest.c                                                    |   29 +++
7
tests/repository/gitypelibtest.c                                                    |   29 +++
9
tests/scanner/Regress-1.0-C-expected/Regress.TestObj.instance_method_full.page      |   38 +++++
8
tests/scanner/Regress-1.0-C-expected/Regress.TestObj.instance_method_full.page      |   38 +++++
10
tests/scanner/Regress-1.0-Gjs-expected/Regress.TestObj.instance_method_full.page    |   26 +++
9
tests/scanner/Regress-1.0-Gjs-expected/Regress.TestObj.instance_method_full.page    |   26 +++
11
tests/scanner/Regress-1.0-Python-expected/Regress.TestObj.instance_method_full.page |   37 +++++
10
tests/scanner/Regress-1.0-Python-expected/Regress.TestObj.instance_method_full.page |   37 +++++
12
tests/scanner/Regress-1.0-expected.gir                                              |   11 +
11
tests/scanner/Regress-1.0-expected.gir                                              |   11 +
13
tests/scanner/Regress-1.0-sections-expected.txt                                     |    1 
12
tests/scanner/Regress-1.0-sections-expected.txt                                     |    1 
14
tests/scanner/regress.c                                                             |   11 +
13
tests/scanner/regress.c                                                             |   11 +
15
tests/scanner/regress.h                                                             |    1 
14
tests/scanner/regress.h                                                             |    1 
16
15 files changed, 262 insertions(+), 6 deletions(-)
15
15 files changed, 262 insertions(+), 6 deletions(-)
17
-- a/girepository/gicallableinfo.c
16
++ b/girepository/gicallableinfo.c
Lines 276-281 g_callable_info_get_caller_owns (GICalla Link Here
276
}
276
}
277
277
278
/**
278
/**
279
 * g_callable_info_get_instance_ownership_transfer:
280
 * @info: a #GICallableInfo
281
 *
282
 * Obtains the ownership transfer for the instance argument.
283
 * #GITransfer contains a list of possible transfer values.
284
 *
285
 * Returns: the transfer
286
 */
287
GITransfer
288
g_callable_info_get_instance_ownership_transfer (GICallableInfo *info)
289
{
290
  GIRealInfo *rinfo = (GIRealInfo*) info;
291
  SignatureBlob *blob;
292
293
  g_return_val_if_fail (info != NULL, -1);
294
  g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), -1);
295
296
  blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)];
297
298
  if (blob->instance_transfer_ownership)
299
    return GI_TRANSFER_EVERYTHING;
300
  else
301
    return GI_TRANSFER_NOTHING;
302
}
303
304
/**
279
 * g_callable_info_get_n_args:
305
 * g_callable_info_get_n_args:
280
 * @info: a #GICallableInfo
306
 * @info: a #GICallableInfo
281
 *
307
 *
282
-- a/girepository/gicallableinfo.h
308
++ b/girepository/gicallableinfo.h
Lines 73-78 gboolean g_callable_info_i Link Here
73
                                                        gboolean          is_method,
73
                                                        gboolean          is_method,
74
                                                        gboolean          throws,
74
                                                        gboolean          throws,
75
                                                        GError          **error);
75
                                                        GError          **error);
76
GITransfer             g_callable_info_get_instance_ownership_transfer (GICallableInfo *info);
77
76
G_END_DECLS
78
G_END_DECLS
77
79
78
80
79
-- a/girepository/girepository.symbols
81
++ b/girepository/girepository.symbols
Lines 26-31 g_info_new Link Here
26
g_callable_info_can_throw_gerror
26
g_callable_info_can_throw_gerror
27
g_callable_info_get_arg
27
g_callable_info_get_arg
28
g_callable_info_get_caller_owns
28
g_callable_info_get_caller_owns
29
g_callable_info_get_instance_ownership_transfer
29
g_callable_info_get_n_args
30
g_callable_info_get_n_args
30
g_callable_info_get_return_attribute
31
g_callable_info_get_return_attribute
31
g_callable_info_get_return_type
32
g_callable_info_get_return_type
32
-- a/girepository/girnode.c
33
++ b/girepository/girnode.c
Lines 1664-1669 _g_ir_node_build_typelib (GIrNode Link Here
1664
	blob2->caller_owns_return_value = function->result->transfer;
1664
	blob2->caller_owns_return_value = function->result->transfer;
1665
	blob2->caller_owns_return_container = function->result->shallow_transfer;
1665
	blob2->caller_owns_return_container = function->result->shallow_transfer;
1666
	blob2->skip_return = function->result->skip;
1666
	blob2->skip_return = function->result->skip;
1667
        blob2->instance_transfer_ownership = function->instance_transfer_full;
1667
	blob2->reserved = 0;
1668
	blob2->reserved = 0;
1668
	blob2->n_arguments = n;
1669
	blob2->n_arguments = n;
1669
1670
Lines 1762-1767 _g_ir_node_build_typelib (GIrNode Link Here
1762
	blob2->may_return_null = signal->result->allow_none;
1763
	blob2->may_return_null = signal->result->allow_none;
1763
	blob2->caller_owns_return_value = signal->result->transfer;
1764
	blob2->caller_owns_return_value = signal->result->transfer;
1764
	blob2->caller_owns_return_container = signal->result->shallow_transfer;
1765
	blob2->caller_owns_return_container = signal->result->shallow_transfer;
1766
        blob2->instance_transfer_ownership = signal->instance_transfer_full;
1765
	blob2->reserved = 0;
1767
	blob2->reserved = 0;
1766
	blob2->n_arguments = n;
1768
	blob2->n_arguments = n;
1767
1769
Lines 1820-1825 _g_ir_node_build_typelib (GIrNode Link Here
1820
	blob2->may_return_null = vfunc->result->allow_none;
1822
	blob2->may_return_null = vfunc->result->allow_none;
1821
	blob2->caller_owns_return_value = vfunc->result->transfer;
1823
	blob2->caller_owns_return_value = vfunc->result->transfer;
1822
	blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1824
	blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1825
        blob2->instance_transfer_ownership = vfunc->instance_transfer_full;
1823
	blob2->reserved = 0;
1826
	blob2->reserved = 0;
1824
	blob2->n_arguments = n;
1827
	blob2->n_arguments = n;
1825
1828
1826
-- a/girepository/girnode.h
1829
++ b/girepository/girnode.h
Lines 100-105 struct _GIrNodeFunction Link Here
100
  gboolean is_constructor;
100
  gboolean is_constructor;
101
  gboolean wraps_vfunc;
101
  gboolean wraps_vfunc;
102
  gboolean throws;
102
  gboolean throws;
103
  gboolean instance_transfer_full;
103
104
104
  gchar *symbol;
105
  gchar *symbol;
105
106
Lines 188-193 struct _GIrNodeSignal Link Here
188
  gboolean detailed;
189
  gboolean detailed;
189
  gboolean action;
190
  gboolean action;
190
  gboolean no_hooks;
191
  gboolean no_hooks;
192
  gboolean instance_transfer_full;
191
193
192
  gboolean has_class_closure;
194
  gboolean has_class_closure;
193
  gboolean true_stops_emit;
195
  gboolean true_stops_emit;
Lines 208-213 struct _GIrNodeVFunc Link Here
208
  gboolean must_not_be_implemented;
210
  gboolean must_not_be_implemented;
209
  gboolean is_class_closure;
211
  gboolean is_class_closure;
210
  gboolean throws;
212
  gboolean throws;
213
  gboolean instance_transfer_full;
211
214
212
  char *invoker;
215
  char *invoker;
213
216
214
-- a/girepository/girparser.c
217
++ b/girepository/girparser.c
Lines 1047-1052 parse_param_transfer (GIrNodeParam *para Link Here
1047
}
1047
}
1048
1048
1049
static gboolean
1049
static gboolean
1050
start_instance_parameter (GMarkupParseContext *context,
1051
                          const gchar         *element_name,
1052
                          const gchar        **attribute_names,
1053
                          const gchar        **attribute_values,
1054
                          ParseContext        *ctx,
1055
                          GError             **error)
1056
{
1057
  const gchar *transfer;
1058
  gboolean transfer_full;
1059
1060
  if (!(strcmp (element_name, "instance-parameter") == 0 &&
1061
	ctx->state == STATE_FUNCTION_PARAMETERS))
1062
    return FALSE;
1063
1064
  transfer = find_attribute ("transfer-ownership", attribute_names, attribute_values);
1065
1066
  state_switch (ctx, STATE_PASSTHROUGH);
1067
1068
  if (strcmp (transfer, "full") == 0)
1069
    transfer_full = TRUE;
1070
  else if (strcmp (transfer, "none") == 0)
1071
    transfer_full = FALSE;
1072
  else
1073
    {
1074
      g_set_error (error, G_MARKUP_ERROR,
1075
		   G_MARKUP_ERROR_INVALID_CONTENT,
1076
		   "invalid value for 'transfer-ownership' for instance parameter: %s", transfer);
1077
      return FALSE;
1078
    }
1079
1080
  switch (CURRENT_NODE (ctx)->type)
1081
    {
1082
    case G_IR_NODE_FUNCTION:
1083
    case G_IR_NODE_CALLBACK:
1084
      {
1085
	GIrNodeFunction *func;
1086
1087
	func = (GIrNodeFunction *)CURRENT_NODE (ctx);
1088
        func->instance_transfer_full = transfer_full;
1089
      }
1090
      break;
1091
    case G_IR_NODE_SIGNAL:
1092
      {
1093
	GIrNodeSignal *signal;
1094
1095
	signal = (GIrNodeSignal *)CURRENT_NODE (ctx);
1096
        signal->instance_transfer_full = transfer_full;
1097
      }
1098
      break;
1099
    case G_IR_NODE_VFUNC:
1100
      {
1101
	GIrNodeVFunc *vfunc;
1102
1103
	vfunc = (GIrNodeVFunc *)CURRENT_NODE (ctx);
1104
        vfunc->instance_transfer_full = transfer_full;
1105
      }
1106
      break;
1107
    default:
1108
      g_assert_not_reached ();
1109
    }
1110
1111
  return TRUE;
1112
}
1113
1114
static gboolean
1050
start_parameter (GMarkupParseContext *context,
1115
start_parameter (GMarkupParseContext *context,
1051
		 const gchar         *element_name,
1116
		 const gchar         *element_name,
1052
		 const gchar        **attribute_names,
1117
		 const gchar        **attribute_names,
Lines 2833-2843 start_element_handler (GMarkupParseConte Link Here
2833
				 attribute_names, attribute_values,
2898
				 attribute_names, attribute_values,
2834
				 ctx, error))
2899
				 ctx, error))
2835
	goto out;
2900
	goto out;
2836
      else if (strcmp (element_name, "instance-parameter") == 0)
2901
      else if (start_instance_parameter (context, element_name,
2837
        {
2902
				attribute_names, attribute_values,
2838
          state_switch (ctx, STATE_PASSTHROUGH);
2903
				ctx, error))
2839
          goto out;
2904
	goto out;
2840
        }
2841
      else if (strcmp (element_name, "c:include") == 0)
2905
      else if (strcmp (element_name, "c:include") == 0)
2842
	{
2906
	{
2843
	  state_switch (ctx, STATE_C_INCLUDE);
2907
	  state_switch (ctx, STATE_C_INCLUDE);
2844
-- a/girepository/gitypelib-internal.h
2908
++ b/girepository/gitypelib-internal.h
Lines 465-470 typedef struct { Link Here
465
 *   freeing the container, but not its contents.
465
 *   freeing the container, but not its contents.
466
 * @skip_return: Indicates that the return value is only useful in C and should
466
 * @skip_return: Indicates that the return value is only useful in C and should
467
 *   be skipped.
467
 *   be skipped.
468
 * @instance_transfer_ownership: When calling, the function assumes ownership of
469
 *   the instance parameter.
468
 * @reserved: Reserved for future use.
470
 * @reserved: Reserved for future use.
469
 * @n_arguments: The number of arguments that this function expects, also the
471
 * @n_arguments: The number of arguments that this function expects, also the
470
 *   length of the array of ArgBlobs.
472
 *   length of the array of ArgBlobs.
Lines 479-485 typedef struct { Link Here
479
  guint16        caller_owns_return_value     : 1;
481
  guint16        caller_owns_return_value     : 1;
480
  guint16        caller_owns_return_container : 1;
482
  guint16        caller_owns_return_container : 1;
481
  guint16        skip_return                  : 1;
483
  guint16        skip_return                  : 1;
482
  guint16        reserved                     :12;
484
  guint16        instance_transfer_ownership  : 1;
485
  guint16        reserved                     :11;
483
486
484
  guint16        n_arguments;
487
  guint16        n_arguments;
485
488
486
-- a/tests/repository/gitypelibtest.c
489
++ b/tests/repository/gitypelibtest.c
Lines 276-281 test_signal_array_len (GIRepository * re Link Here
276
  g_base_info_unref (testobj_info);
276
  g_base_info_unref (testobj_info);
277
}
277
}
278
278
279
static void
280
test_instance_transfer_ownership (GIRepository * repo)
281
{
282
  GIObjectInfo *testobj_info;
283
  GIFunctionInfo *func_info;
284
  GITransfer transfer;
285
286
  g_assert (g_irepository_require (repo, "Regress", NULL, 0, NULL));
287
  testobj_info = g_irepository_find_by_name (repo, "Regress", "TestObj");
288
  g_assert (testobj_info != NULL);
289
290
  func_info = g_object_info_find_method (testobj_info, "instance_method");
291
  g_assert (func_info != NULL);
292
  transfer = g_callable_info_get_instance_ownership_transfer ((GICallableInfo*) func_info);
293
  g_assert_cmpint (GI_TRANSFER_NOTHING, ==, transfer);
294
295
  g_base_info_unref (func_info);
296
297
  func_info = g_object_info_find_method (testobj_info, "instance_method_full");
298
  g_assert (func_info != NULL);
299
  transfer = g_callable_info_get_instance_ownership_transfer ((GICallableInfo*) func_info);
300
  g_assert_cmpint (GI_TRANSFER_EVERYTHING, ==, transfer);
301
302
  g_base_info_unref (func_info);
303
304
  g_base_info_unref (testobj_info);
305
}
306
279
int
307
int
280
main (int argc, char **argv)
308
main (int argc, char **argv)
281
{
309
{
Lines 292-297 main (int argc, char **argv) Link Here
292
  test_hash_with_cairo_typelib (repo);
320
  test_hash_with_cairo_typelib (repo);
293
  test_char_types (repo);
321
  test_char_types (repo);
294
  test_signal_array_len (repo);
322
  test_signal_array_len (repo);
323
  test_instance_transfer_ownership (repo);
295
324
296
  exit (0);
325
  exit (0);
297
}
326
}
298
-- /dev/null
327
++ b/tests/scanner/Regress-1.0-C-expected/Regress.TestObj.instance_method_full.page
Line 0 Link Here
0
-- /dev/null
1
<?xml version="1.0"?>
2
<page id="Regress.TestObj.instance_method_full"
3
      type="topic"
4
      style="method"
5
      xmlns="http://projectmallard.org/1.0/"
6
      xmlns:api="http://projectmallard.org/experimental/api/"
7
      xmlns:ui="http://projectmallard.org/1.0/ui/">
8
  <info>
9
    <link xref="Regress.TestObj" group="method" type="guide"/>
10
    <api:function>
11
      <api:returns>
12
        <api:type>void</api:type>
13
      </api:returns>
14
      <api:name>regress_test_obj_instance_method_full</api:name>
15
      <api:arg>
16
        <api:type>RegressTestObj*</api:type>
17
        <api:name>obj</api:name>
18
      </api:arg>
19
    </api:function>
20
  </info>
21
  <title>regress_test_obj_instance_method_full</title>
22
  <synopsis><code mime="text/x-csrc">
23
void regress_test_obj_instance_method_full (RegressTestObj* obj);
24
  </code></synopsis>
25
26
27
<terms>
28
<item>
29
<title><code>obj</code></title>
30
31
</item>
32
<item>
33
<title><code>Returns</code></title>
34
35
</item>
36
</terms>
37
38
</page>
39
++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestObj.instance_method_full.page
Line 0 Link Here
0
-- /dev/null
1
<?xml version="1.0"?>
2
<page id="Regress.TestObj.instance_method_full"
3
      type="topic"
4
      style="method"
5
      xmlns="http://projectmallard.org/1.0/"
6
      xmlns:api="http://projectmallard.org/experimental/api/"
7
      xmlns:ui="http://projectmallard.org/1.0/ui/">
8
  <info>
9
    <link xref="Regress.TestObj" group="method" type="guide"/>
10
    <api:function>
11
      <api:returns>
12
        <api:type>void</api:type>
13
      </api:returns>
14
      <api:name>regress_test_obj_instance_method_full</api:name>
15
    </api:function>
16
  </info>
17
  <title>Regress.TestObj.prototype.instance_method_full</title>
18
  <synopsis><code mime="text/x-gjs">
19
function instance_method_full(): void {
20
    // Gjs wrapper for regress_test_obj_instance_method_full()
21
}
22
  </code></synopsis>
23
24
25
26
</page>
27
++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestObj.instance_method_full.page
Line 0 Link Here
0
-- a/tests/scanner/Regress-1.0-expected.gir
1
<?xml version="1.0"?>
2
<page id="Regress.TestObj.instance_method_full"
3
      type="topic"
4
      style="method"
5
      xmlns="http://projectmallard.org/1.0/"
6
      xmlns:api="http://projectmallard.org/experimental/api/"
7
      xmlns:ui="http://projectmallard.org/1.0/ui/">
8
  <info>
9
    <link xref="Regress.TestObj" group="method" type="guide"/>
10
    <api:function>
11
      <api:returns>
12
        <api:type>none</api:type>
13
      </api:returns>
14
      <api:name>regress_test_obj_instance_method_full</api:name>
15
      <api:arg>
16
        <api:type>Regress.TestObj</api:type>
17
        <api:name>self</api:name>
18
      </api:arg>
19
    </api:function>
20
  </info>
21
  <title>Regress.TestObj.instance_method_full</title>
22
  <synopsis><code mime="text/x-python">
23
@accepts(Regress.TestObj)
24
@returns(none)
25
def instance_method_full(self):
26
    # Python wrapper for regress_test_obj_instance_method_full()
27
  </code></synopsis>
28
29
30
<terms>
31
<item>
32
<title><code>self</code></title>
33
34
</item>
35
</terms>
36
37
</page>
38
++ b/tests/scanner/Regress-1.0-expected.gir
Lines 3047-3052 case.</doc> Link Here
3047
          </parameter>
3047
          </parameter>
3048
        </parameters>
3048
        </parameters>
3049
      </method>
3049
      </method>
3050
      <method name="instance_method_full"
3051
              c:identifier="regress_test_obj_instance_method_full">
3052
        <return-value transfer-ownership="none">
3053
          <type name="none" c:type="void"/>
3054
        </return-value>
3055
        <parameters>
3056
          <instance-parameter name="obj" transfer-ownership="full">
3057
            <type name="TestObj" c:type="RegressTestObj*"/>
3058
          </instance-parameter>
3059
        </parameters>
3060
      </method>
3050
      <method name="set_bare" c:identifier="regress_test_obj_set_bare">
3061
      <method name="set_bare" c:identifier="regress_test_obj_set_bare">
3051
        <return-value transfer-ownership="none">
3062
        <return-value transfer-ownership="none">
3052
          <type name="none" c:type="void"/>
3063
          <type name="none" c:type="void"/>
3053
-- a/tests/scanner/Regress-1.0-sections-expected.txt
3064
++ b/tests/scanner/Regress-1.0-sections-expected.txt
Lines 334-339 regress_test_obj_emit_sig_with_uint64 Link Here
334
regress_forced_method
334
regress_forced_method
335
regress_test_obj_instance_method
335
regress_test_obj_instance_method
336
regress_test_obj_instance_method_callback
336
regress_test_obj_instance_method_callback
337
regress_test_obj_instance_method_full
337
regress_test_obj_set_bare
338
regress_test_obj_set_bare
338
regress_test_obj_skip_inout_param
339
regress_test_obj_skip_inout_param
339
regress_test_obj_skip_out_param
340
regress_test_obj_skip_out_param
340
-- a/tests/scanner/regress.c
341
++ b/tests/scanner/regress.c
Lines 2679-2684 regress_test_obj_instance_method (Regres Link Here
2679
    return -1;
2679
    return -1;
2680
}
2680
}
2681
2681
2682
/**
2683
 * regress_test_obj_instance_method_full:
2684
 * @obj: (transfer full):
2685
 *
2686
 */
2687
void
2688
regress_test_obj_instance_method_full (RegressTestObj *obj)
2689
{
2690
  g_object_unref (obj);
2691
}
2692
2682
double
2693
double
2683
regress_test_obj_static_method (int x)
2694
regress_test_obj_static_method (int x)
2684
{
2695
{
2685
-- a/tests/scanner/regress.h
2696
++ b/tests/scanner/regress.h
Lines 527-532 void regress_test_obj_emit_sig_wit Link Here
527
void       regress_test_obj_emit_sig_with_int64 (RegressTestObj *obj);
527
void       regress_test_obj_emit_sig_with_int64 (RegressTestObj *obj);
528
void       regress_test_obj_emit_sig_with_uint64 (RegressTestObj *obj);
528
void       regress_test_obj_emit_sig_with_uint64 (RegressTestObj *obj);
529
int        regress_test_obj_instance_method (RegressTestObj *obj);
529
int        regress_test_obj_instance_method (RegressTestObj *obj);
530
void       regress_test_obj_instance_method_full (RegressTestObj *obj);
530
double     regress_test_obj_static_method (int x);
531
double     regress_test_obj_static_method (int x);
531
void       regress_forced_method (RegressTestObj *obj);
532
void       regress_forced_method (RegressTestObj *obj);
532
533

Return to bug 523608