Browse Source

Fix QuickJS primitive type marshaling to take target sizes into account.

pull/1865/head
Joao Matos 11 months ago
parent
commit
642379a544
  1. 52
      src/Generator/Generators/QuickJS/QuickJSMarshal.cs
  2. 2
      src/Generator/Generators/QuickJS/QuickJSSources.cs
  3. 15
      src/Generator/Generators/QuickJS/QuickJSTypeCheckGen.cs

52
src/Generator/Generators/QuickJS/QuickJSMarshal.cs

@ -1,6 +1,7 @@
using System; using System;
using CppSharp.AST; using CppSharp.AST;
using CppSharp.AST.Extensions; using CppSharp.AST.Extensions;
using CppSharp.Extensions;
using CppSharp.Generators.C; using CppSharp.Generators.C;
using CppSharp.Generators.CLI; using CppSharp.Generators.CLI;
using CppSharp.Types; using CppSharp.Types;
@ -132,6 +133,9 @@ namespace CppSharp.Generators.Cpp
var retName = Generator.GeneratedIdentifier(Context.ReturnVarName); var retName = Generator.GeneratedIdentifier(Context.ReturnVarName);
Context.Before.Write($"JSValue {retName} = "); Context.Before.Write($"JSValue {retName} = ");
(uint width, uint _alignment) =
primitive.GetInfo(Context.Context.TargetInfo, out bool _signed);
switch (primitive) switch (primitive)
{ {
case PrimitiveType.Void: case PrimitiveType.Void:
@ -150,14 +154,23 @@ namespace CppSharp.Generators.Cpp
case PrimitiveType.UChar: case PrimitiveType.UChar:
case PrimitiveType.Short: case PrimitiveType.Short:
case PrimitiveType.UShort: case PrimitiveType.UShort:
Context.Before.WriteLine($"JS_NewInt32(ctx, {Context.ArgName});");
break;
case PrimitiveType.Int: case PrimitiveType.Int:
case PrimitiveType.Long: case PrimitiveType.Long:
Context.Before.WriteLine($"JS_NewInt32(ctx, {Context.ArgName});"); if (width == 64)
Context.Before.WriteLine($"JS_NewBigInt64(ctx, {Context.ArgName});");
else
Context.Before.WriteLine($"JS_NewInt32(ctx, {Context.ArgName});");
break; break;
case PrimitiveType.UInt: case PrimitiveType.UInt:
case PrimitiveType.ULong: case PrimitiveType.ULong:
Context.Before.WriteLine($"JS_NewUint32(ctx, {Context.ArgName});"); if (width == 64)
Context.Before.WriteLine($"JS_NewBigUint64(ctx, {Context.ArgName});");
else
Context.Before.WriteLine($"JS_NewUint32(ctx, {Context.ArgName});");
break; break;
case PrimitiveType.LongLong: case PrimitiveType.LongLong:
@ -486,6 +499,9 @@ namespace CppSharp.Generators.Cpp
var argName = Context.Parameter.Name; var argName = Context.Parameter.Name;
Context.Before.WriteLine($"{type} {argName};"); Context.Before.WriteLine($"{type} {argName};");
(uint width, uint _alignment) =
primitive.GetInfo(Context.Context.TargetInfo, out bool _signed);
switch (primitive) switch (primitive)
{ {
case PrimitiveType.Void: case PrimitiveType.Void:
@ -519,31 +535,43 @@ namespace CppSharp.Generators.Cpp
case PrimitiveType.Int: case PrimitiveType.Int:
case PrimitiveType.Long: case PrimitiveType.Long:
Context.Before.WriteLine($"if (JS_ToInt32(ctx, &{argName}, argv[{Context.ParameterIndex}]))"); if (width == 64)
Context.Before.WriteLineIndent("return JS_EXCEPTION;"); {
Context.Before.WriteLine($"if (JS_ToBigInt64(ctx, (int64_t*)&{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLineIndent("return JS_EXCEPTION;");
}
else
{
Context.Before.WriteLine($"if (JS_ToInt32(ctx, &{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLineIndent("return JS_EXCEPTION;");
}
Context.Return.Write($"{argName}"); Context.Return.Write($"{argName}");
return true; return true;
case PrimitiveType.UInt: case PrimitiveType.UInt:
case PrimitiveType.ULong: case PrimitiveType.ULong:
Context.Before.WriteLine($"if (JS_ToUint32(ctx, &{argName}, argv[{Context.ParameterIndex}]))"); if (width == 64)
Context.Before.WriteLineIndent("return JS_EXCEPTION;"); {
Context.Before.WriteLine($"if (JS_ToBigInt64(ctx, (int64_t*)&{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLineIndent("return JS_EXCEPTION;");
}
else
{
Context.Before.WriteLine($"if (JS_ToUint32(ctx, &{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLineIndent("return JS_EXCEPTION;");
}
Context.Return.Write($"{argName}"); Context.Return.Write($"{argName}");
return true; return true;
case PrimitiveType.LongLong: case PrimitiveType.LongLong:
Context.Before.WriteLine($"int64_t _{argName};"); Context.Before.WriteLine($"if (JS_ToBigInt64(ctx, (int64_t*)&_{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLine($"if (JS_ToInt64Ext(ctx, &_{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLineIndent("return JS_EXCEPTION;"); Context.Before.WriteLineIndent("return JS_EXCEPTION;");
Context.Before.WriteLine($"{argName} = ({type})_{argName};");
Context.Return.Write($"{argName}"); Context.Return.Write($"{argName}");
return true; return true;
case PrimitiveType.ULongLong: case PrimitiveType.ULongLong:
Context.Before.WriteLine($"int64_t _{argName};"); Context.Before.WriteLine($"if (JS_ToBigUInt64(ctx, (int64_t*)&{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLine($"if (JS_ToInt64Ext(ctx, &_{argName}, argv[{Context.ParameterIndex}]))");
Context.Before.WriteLineIndent("return JS_EXCEPTION;"); Context.Before.WriteLineIndent("return JS_EXCEPTION;");
Context.Before.WriteLine($"{argName} = ({type})_{argName};");
Context.Return.Write($"{argName}"); Context.Return.Write($"{argName}");
return true; return true;

2
src/Generator/Generators/QuickJS/QuickJSSources.cs

@ -912,7 +912,7 @@ namespace CppSharp.Generators.Cpp
public override string GenerateTypeCheckForParameter(int paramIndex, Type type) public override string GenerateTypeCheckForParameter(int paramIndex, Type type)
{ {
var typeChecker = new QuickJSTypeCheckGen(paramIndex); var typeChecker = new QuickJSTypeCheckGen(Context, paramIndex);
type.Visit(typeChecker); type.Visit(typeChecker);
var condition = typeChecker.Generate(); var condition = typeChecker.Generate();

15
src/Generator/Generators/QuickJS/QuickJSTypeCheckGen.cs

@ -11,7 +11,7 @@ namespace CppSharp.Generators.Cpp
public override string FileExtension { get; } public override string FileExtension { get; }
public QuickJSTypeCheckGen(int parameterIndex) : base(null) public QuickJSTypeCheckGen(BindingContext context, int parameterIndex) : base(context)
{ {
ParameterIndex = parameterIndex; ParameterIndex = parameterIndex;
} }
@ -23,7 +23,8 @@ namespace CppSharp.Generators.Cpp
public override bool VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals) public override bool VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals)
{ {
// TODO: Use TargetInfo to check the actual width of types for the target. (uint width, uint _alignment) =
primitive.GetInfo(Context.TargetInfo, out bool _signed);
var condition = string.Empty; var condition = string.Empty;
var arg = $"argv[{ParameterIndex}]"; var arg = $"argv[{ParameterIndex}]";
@ -50,11 +51,17 @@ namespace CppSharp.Generators.Cpp
break; break;
case PrimitiveType.Int: case PrimitiveType.Int:
case PrimitiveType.Long: case PrimitiveType.Long:
condition = $"JS_IsInt32({arg})"; if (width == 64)
condition = $"JS_IsBigInt(ctx, {arg})";
else
condition = $"JS_IsInt32({arg})";
break; break;
case PrimitiveType.ULong: case PrimitiveType.ULong:
case PrimitiveType.UInt: case PrimitiveType.UInt:
condition = $"JS_IsUInt32({arg})"; if (width == 64)
condition = $"JS_IsBigInt(ctx, {arg})";
else
condition = $"JS_IsUInt32({arg})";
break; break;
case PrimitiveType.LongLong: case PrimitiveType.LongLong:
case PrimitiveType.ULongLong: case PrimitiveType.ULongLong:

Loading…
Cancel
Save