Compare commits

...

5 Commits

Author SHA1 Message Date
Pavel Shevaev ce24672649 For now using Val.New(..) instead of Val.NewNoReset() since the latter introduces some ownership related bug
Publish PHP Package / docker (push) Successful in 8s Details
2025-01-04 12:48:52 +03:00
Pavel Shevaev 66e9451e4a Migrating to more robust bhl_custom_rw semantics. Struct methods can affect the caller now, same applies to bhl_blob now
Publish PHP Package / docker (push) Successful in 6s Details
2024-12-28 15:20:09 +03:00
Pavel Shevaev 5144fe0e9a Обновить README.md 2024-12-18 18:36:26 +03:00
Pavel Shevaev b8aaaeb141 Обновить CHANGELOG.md 2024-12-18 18:34:50 +03:00
Pavel Shevaev b96b3996ba A bit minimizing codegen output for types setup
Publish PHP Package / docker (push) Successful in 6s Details
2024-12-17 22:27:09 +03:00
5 changed files with 60 additions and 37 deletions

View File

@ -1,3 +1,9 @@
## v17.1.0
- Splitting one huge codegenerated file into multiple ones
## v16.0.0
- Migrating to IList from ValList for []any bindings since it is more generic
## v15.5.2
- Proper retain for any Val in args
- A bit optimizing setters/getters codegen

View File

@ -38,12 +38,12 @@ Usage example:
$meta = \bhl_bind\prepare_meta($meta);
file_put_contents('autobind.cs',
\bhl_bind\codegen(null, $meta,
$output = \bhl_bind\codegen(null, $meta,
[
'imports' => ['UnityEngine'],
'register_class' => 'BHL_AutoBindings',
]
)
);
);
foreach($output as $name => $text)
file_put_contents($name, $text);

View File

@ -22,6 +22,7 @@ function supported_tokens()
'bhl_ref_arg',
'bhl_bin_op',
'bhl_blob',
'bhl_refc',
];
}
@ -282,7 +283,7 @@ function add_twig_support(\Twig\Environment $twig)
$twig->addFunction(new \Twig\TwigFunction('has_token',
function($o, $token)
{
return $o->hasToken($token);
return method_exists($o, 'hasToken') && $o->hasToken($token);
}
));
$twig->addFunction(new \Twig\TwigFunction('token',

View File

@ -14,13 +14,27 @@
#if !BHL_FRONT
static bhl.Coroutine {{local_fn_name}}(VM.Frame frm, ValStack stack, FuncArgsInfo args_info, ref BHS status) {
{{ _self.read_args2natives(o, '__', this_type) }}
{{ _self.read_args2natives(o, '__') }}
{%- if this_type and not has_token(o, 'bhl_static') ~%}
var dv_self = stack.Pop();
{%if has_token(this_type, 'bhl_blob')%}ref{%endif%} var {{ _self.val2native(this_type, 'dv_self', '__self', true, has_token(this_type, 'bhl_blob')) }};
{%- endif ~%}
{%~ if o.returntype %}
var return_val =
{%- endif ~%}
{{this_prefix}}{{ _self.call_native_prefix_func(o, '__') }}
{%- if this_type and not has_token(o, 'bhl_static') ~%}
{%if has_token(this_type, 'bhl_custom_rw')%}
dv_self.Encode(__self);
{%- endif ~%}
dv_self.Release();
{%- endif ~%}
{# pass back and release ref args #}
{%- for arg in o.args -%}
{%- if has_token(arg, 'bhl_ref_arg') ~%}
@ -320,7 +334,6 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{%- if this_type ~%}
{{this_type|native_type}} {{prefix}}self = default;
{%- endif -%}
{%- for v in vars -%}
{%- if has_token(v, 'bhl_ref_arg') -%}
bhl.Val {{prefix}}{{v.name}} = default;
@ -350,6 +363,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{%- set default_counter = default_counter + 1 -%}
if(!args_info.IsDefaultArgUsed({{o.args|length - count_required_args(o) - default_counter}}))
{%- endif ~%}
{
{%- if has_token(arg, 'bhl_ref_arg') ~%}
var dv = stack.Pop();
@ -363,6 +377,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
dv.Release();
{%- endif ~%}
}
{#-default arg value-#}
{%- if has_token(arg, 'default') ~%}
else
@ -440,7 +455,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{%- endfor -%}
{%- endmacro -%}
{%- macro val2native(type, value, native, is_arg = false) -%}
{%- macro val2native(type, value, native, is_arg = false, is_ref = false) -%}
{# any special case #}
{%- if type == 'any' -%}
{{native}} = {{value}};
@ -492,8 +507,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
for(int i=0;i<_src_arr_count;++i)
{
var _arr_item = _src_arr_type.ArrGetAt({{value}}, i);
{#TODO: get rid of replace hack below#}
{{('var ' ~ _self.val2native(type.value, '_arr_item', 'tmp'))|replace({'tmp = tmp' : '', 'var var' : 'var'})}};
var {{_self.val2native(type.value, '_arr_item', 'tmp')}};
if(i < _dst_before_count)
{{native}}[i] = tmp;
else
@ -532,9 +546,9 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{{native}} = ({{type|native_class_name}})((int){{value}}._num)
{%- else -%}
{%- if has_token(type, 'bhl_custom_rw') -%}
var tmp = new {{type|native_class_name}}(); {{value}}.Decode(ref tmp); {{native}} = tmp
{{native}} = {{value}}.Decode(new {{type|native_class_name}}())
{%- elseif has_token(type, 'bhl_blob') -%}
{{native}} = {{value}}.GetBlob<{{type|native_class_name}}>()
{{native}} = {%if is_ref%}ref{%endif%} {{value}}.GetBlob<{{type|native_class_name}}>()
{%- else -%}
{{native}} = ({{type|native_class_name}}){{value}}._obj
{%- endif -%}
@ -551,7 +565,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{%- else -%}
{%- if type is instanceof('\\mtgMetaFunc') -%}
{{value}}.SetObj({{native}}, Types.Any)
{{value}}.SetObj({{native}}, Types.Any/*TODO: use real type?*/)
{%- endif -%}
{%- if type is instanceof('\\mtgArrType') -%}
@ -593,8 +607,10 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{{value}}.Encode({{native}})
{%- elseif has_token(type, 'bhl_blob') -%}
{{value}}.SetBlob({{native}}, Types_{{type.name|norm_name}}.Value)
{%- else -%}
{%- elseif has_token(type, 'bhl_refc') -%}
{{value}}.SetObj({{native}}, Types_{{type.name|norm_name}}.Value)
{%- else -%}
{{value}}.SetObjNoRefc({{native}}, Types_{{type.name|norm_name}}.Value)
{%- endif -%}
{%- endif -%}
{%- endif -%}
@ -616,8 +632,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
"{{o.name}}",
(v) => {
#if !BHL_FRONT
{#TODO: get rid of replace hack below#}
{{('var ' ~ _self.val2native(token(o, 'bhl_native_arr_proxy'), 'v', 'tmp'))|replace({'tmp = tmp' : '', 'var var' : 'var'})}};
var {{_self.val2native(token(o, 'bhl_native_arr_proxy'), 'v', 'tmp')}};
return tmp;
#else
return null;
@ -686,8 +701,10 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
v.Encode(o);
{% elseif has_token(o, 'bhl_blob') %}
v.SetBlob(ref o, type);
{% else %}
{% elseif has_token(o, 'bhl_refc') %}
v.SetObj(o, type);
{% else %}
v.SetObjNoRefc(o, type);
{% endif %}
#endif
}
@ -718,9 +735,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
, native_type: typeof({{o|native_class_name}})
{% if has_token(o, 'bhl_custom_rw') %}
, native_object_getter: (v) => {
var tmp = new {{o|native_class_name}}();
v.Decode(ref tmp);
return tmp;
return v.Decode(new {{o|native_class_name}}());
}
{% elseif has_token(o, 'bhl_blob') %}
, native_object_getter: (v) => {
@ -767,8 +782,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
static void get_{{o.name|norm_name}}_{{f.name}}(VM.Frame frm, Val ctx, ref Val v, FieldSymbol fld) {
#if !BHL_FRONT
{%~ if has_token(o, 'bhl_custom_rw') ~%}
{{class}} f = new {{class}}();
ctx.Decode(ref f);
{{class}} f = ctx.Decode(new {{class}}());
{%- elseif has_token(o, 'bhl_blob') ~%}
ref var f = ref ctx.GetBlob<{{class}}>();
{%- else ~%}
@ -793,8 +807,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
static void set_{{o.name|norm_name}}_{{f.name}}(VM.Frame frm, ref Val ctx, Val v, FieldSymbol fld) {
#if !BHL_FRONT
{%~ if has_token(o, 'bhl_custom_rw') ~%}
{{class}} f = new {{class}}();
ctx.Decode(ref f);
{{class}} f = ctx.Decode(new {{class}}());
{%- elseif has_token(o, 'bhl_blob') ~%}
ref var f = ref ctx.GetBlob<{{class}}>();
{%- else ~%}
@ -802,7 +815,7 @@ Script_{{o.name|norm_name}}.Method_{{m.name}}.ReturnValue(frm, stack
{%- endif ~%}
{% if token(f, 'bhl_set') == 2 %}
{{_self.val2native(f.type, 'v', 'var nv')}};
var {{_self.val2native(f.type, 'v', 'nv')}};
Script_{{o.name|norm_name}}.Set_{{f.name}}(ref f, nv);
{% else %}
{%- if has_token(f, 'bhl_native_prefix') -%}
@ -956,18 +969,7 @@ public partial class Script_{{u.object.name}} {
//assign global static types
{%- for u in units -%}
{%- if u.object is instanceof('\\mtgMetaStruct') or u.object is instanceof('\\mtgMetaInterface') ~%}
{
var tmp = types.T("{{u.object.name}}").Get();
if(tmp == null)
throw new System.Exception("Type '{{u.object.name}}' not resolved");
{%- if u.object is instanceof('\\mtgMetaStruct') ~%}
(tmp as ClassSymbolNative)?.Setup();
{%- endif ~%}
{%- if u.object is instanceof('\\mtgMetaInterface') ~%}
(tmp as InterfaceSymbolNative)?.Setup();
{%- endif ~%}
Types_{{u.object.name|norm_name}}.Value = tmp;
}
Types_{{u.object.name|norm_name}}.Value = SetupType(types, "{{u.object.name}}");
{%- endif -%}
{%- endfor -%}

View File

@ -45,6 +45,20 @@ public static void RegisterBegin(Types types)
{%~ endfor -%}
}
static IType SetupType(Types types, string name)
{
var tmp = types.T(name).Get();
if(tmp == null)
throw new System.Exception("Type '" + name + "' not resolved");
if(tmp is ClassSymbolNative csn)
csn.Setup();
else if(tmp is InterfaceSymbolNative isn)
isn.Setup();
return tmp;
}
public static void RegisterEnd(Types types)
{
{{ macro.setup_global_types(meta.units) }}