diff options
Diffstat (limited to 'src/pkg/syscall/mksyscall_windows.pl')
-rwxr-xr-x | src/pkg/syscall/mksyscall_windows.pl | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/pkg/syscall/mksyscall_windows.pl b/src/pkg/syscall/mksyscall_windows.pl index 1fb51125b..0e015cb70 100755 --- a/src/pkg/syscall/mksyscall_windows.pl +++ b/src/pkg/syscall/mksyscall_windows.pl @@ -118,7 +118,8 @@ while(<>) { } # Decide which version of api is used: ascii or unicode. - my $strconvfunc = $sysname !~ /W$/ ? "StringBytePtr" : "StringToUTF16Ptr"; + my $strconvfunc = $sysname !~ /W$/ ? "BytePtrFromString" : "UTF16PtrFromString"; + my $strconvtype = $sysname !~ /W$/ ? "*byte" : "*uint16"; # Winapi proc address variable. $vars .= "\t$sysvarname = $modvname.NewProc(\"$sysname\")\n"; @@ -133,6 +134,16 @@ while(<>) { } $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + # Prepare arguments to Syscall. my @args = (); my $n = 0; @@ -141,8 +152,18 @@ while(<>) { my ($name, $type) = parseparam($p); if($type =~ /^\*/) { push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; } elsif($type eq "string") { - push @args, "uintptr(unsafe.Pointer($strconvfunc($name)))"; + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; } elsif($type =~ /^\[\](.*)/) { # Convert slice into pointer, length. # Have to be careful not to take address of &a[0] if len == 0: @@ -245,7 +266,7 @@ while(<>) { $failexpr = "!$name"; } elsif($name eq "err") { $ret[$i] = "r1"; - $failexpr = "int(r1) $failcond"; + $failexpr = "r1 $failcond"; } else { $failexpr = "$name $failcond"; } |