小编Cur*_*mes的帖子

使用Cro :: WebSocket :: Client添加授权或标头?

我正在使用HTTP路由非常成功地使用Cro HTTP身份验证/授权/会话.

然后我添加了一个创建web-socket使用的路由,Cro::HTTP::Router::WebSocket我可以连接到它,Cro::WebSocket::Client一切正常.

现在我想控制对websocket的访问,所以我添加了一个Cro::HTTP::Auth参数.效果很好.现在客户端获得了401 Unauthorized预期的结果.

下一步,我该如何开门?

有了Cro::HTTP::Client,我可以传入Authorization标题,甚至传递auth选项.我该怎么做Cro::WebSocket::Client

我对WebSocket很新,所以我甚至不知道这是否是这样做的正确方法,但似乎该Cro::WebSocket::Client connect方法应该采用一个headers命名选项来获取传递的额外标题.

perl6 websocket cro

11
推荐指数
1
解决办法
200
查看次数

从迭代器制作序列

我正在尝试创建一个迭代器,然后从中构建一个序列,但它不会按我认为应该的方式运行.这是怎么回事?

这是我的基础课:

class Foo {
    has $.x = 0;
    has $.max = 3;

    method val() {
        (++$!x > $!max) ?? () !! ($!x, "string $!x")
    }
}

my $foo = Foo.new;
say $foo.val.perl for ^4;

# (1, "string 1")
# (2, "string 2")
# (3, "string 3")
# ()
Run Code Online (Sandbox Code Playgroud)

它只是迭代到max,然后return(),按照我认为的方式工作.

然后我从中构建一个迭代器,只需一个pull-one()方法.

class Foo-Iterator does Iterator {
    has Foo $.foo;

    method pull-one() {
        $!foo.val || IterationEnd
    }
}

my $iter = Foo-Iterator.new(foo => Foo.new);
$iter.pull-one.perl.say for ^4;

# (1, …
Run Code Online (Sandbox Code Playgroud)

perl6

10
推荐指数
1
解决办法
119
查看次数

Rakudo记忆/垃圾收集技术

我理解这个问题涉及到特定于实现的域,但在这一点上,Rakudo/MoarVM的具体答案对我也有帮助.

我正在研究一些NativeCall模块,并想知道如何调试内存泄漏.一些内存在C库中处理,我在那里有一个很好的处理.我知道域名是我的责任,MoarVM在那里没有什么可以做的.我可以在MoarVM域中做什么?检查悬空物体,循环参考物等的最佳方法是什么?

在一系列操作结束时是否有一种方法,我认为我的所有Perl对象都超出范围说"运行垃圾收集并告诉我任何事情"?

我可以运行一些Rakudo/NQP/MoarVM特定代码来帮助我吗?这不是为了在生产中发布,只是为了在我开发时进行测试/诊断.

MoarVM中的垃圾收集提供了一个诱人的概述,但没有足够的信息让我对它做任何事情.

garbage-collection perl6 nativecall

9
推荐指数
1
解决办法
203
查看次数

在Perl 6 NativeCall CStruct中声明一个数组

有没有办法在CStruct中声明一个对象数组?

struct my_struct {
    int foo;
    int bar;
    char somestring[80];
};

class My::Struct is repr('CStruct') {
    has int32 $.foo;
    has int32 $.bar;
    ???
}
Run Code Online (Sandbox Code Playgroud)

A CArray[uint8]将是一个char *指针,实际上并不在结构中保留空间.

而不是My::Struct.new,我可能自己做内存(而不是My::Struct.new(),我使用一个buf8.allocate(xxx)并保持句柄,所以GC不收割它,nativecast它到My :: Struct),然后我必须使用指针数学来找到里面的字符串结构等,但似乎应该有一个更简单的方法.

即使它没有完全实现,一个简单的方法说"在这里放80个字节,这里是指针",这将是非常好的.

arrays struct perl6 nativecall

7
推荐指数
1
解决办法
148
查看次数

角色访问是否包含角色属性?

我有一个类可以扮演另一个角色.该类中的方法可以访问顶级角色中的属性:

role A {
    has $.x
}

role B does A {
}

class C does B {
    method this() { say $!x }
}

C.new(:x(1)).this;
Run Code Online (Sandbox Code Playgroud)

这工作正常,并说我认为应该如此.

但我有很多类都做角色B,我想分享方法this(),所以我把它移到角色B:

role A {
    has $.x
}

role B does A {
    method this() { $!x }
}

class C does B {}

C.new(:x(1)).this;
Run Code Online (Sandbox Code Playgroud)

那甚至都不会编译:SORRY Attribute $!x not declared in role B.

角色是否可以在其包含的角色中看不到属性?

perl6

7
推荐指数
1
解决办法
113
查看次数

如何通过Nativecall回调传递Perl 6对象?

我正在使用NativeCall接口.

该库将多次调用我的回调函数.

这很好.我可以使用正确的签名声明我的回调,将其作为&callback传入,并且库调用sub就好了.

它还能够将有效负载void*指针设置为我想要的任何东西,并且它将包含在我的回调函数调用中.

我可以隐藏一个Perl Str,例如,在有效载荷中成功往返吗?

sub set_userdata(Pointer) returns int32 is native { ... }

sub set_callback(&callback(Pointer $userdata --> int32)) returns int32 is native { ... }

sub callback(Pointer $userdata) returns int32 {
    my Str $mystring = ???
    ...
}

my Str $my-userdata-string;

set_userdata(???);
set_callback(&callback);
Run Code Online (Sandbox Code Playgroud)

看起来它可能适用于一些绑定,"是rw",nativecast()和/或.deref.

perl6 nativecall

6
推荐指数
1
解决办法
213
查看次数

将结构数组传递给 Perl 6 NativeCall 函数

我正在尝试使用 NativeCall 与一些 C 函数进行交互。

我有一个简单的 C 结构体和一个需要它们的数组的函数。

struct foo {
    int x;
    char *s;
};

struct foo foo_array[3];

foo_array[0].x = 12;
foo_array[0].s = "foo";
foo_array[1].x = 27;
foo_array[1].s = "bar";
foo_array[2].x = -1;

void somefunc(foo_array);
Run Code Online (Sandbox Code Playgroud)

我尝试了很多方法,但似乎无法完全正确。

class foo is repr('CStruct') {
    has int32 $.x;
    has Str $.s
};

sub somefunc(CArray[foo]) is native { * }

my @foo-array := CArray[foo].new;

@foo-array[0] = ???
@foo-array[1] = ???
@foo-array[2] = ???

somefunc(@foo-array);
Run Code Online (Sandbox Code Playgroud)

如何正确创建 foo 类的对象并设置它们的值,以及如何制作适合传递的数组?

nativecall raku

6
推荐指数
1
解决办法
371
查看次数

用Buf测试模块'isa-ok'

使用Perl6 Test模块通过以下命令测试对象的类型Buf

use Test;
isa-ok Buf.new, Buf;
isa-ok Buf.new, Blob;
isa-ok Buf.new, 'Buf';
isa-ok Buf.new, 'Blob';
ok Buf.new ~~ Buf;
ok Buf.new ~~ Blob;
does-ok Buf.new, Buf;
does-ok Buf.new, Blob;
Run Code Online (Sandbox Code Playgroud)

这是输出:

not ok 1 - The object is-a 'Buf'
# Failed test 'The object is-a 'Buf''
# at buftest line 3
# Actual type: Buf
not ok 2 - The object is-a 'Blob'
# Failed test 'The object is-a 'Blob''
# at buftest line 5
# Actual …
Run Code Online (Sandbox Code Playgroud)

testing perl6

6
推荐指数
1
解决办法
55
查看次数

Nativecall Buf生命周期和垃圾收集器

Buf想传递给C库中有一个内存块,但是该库将在单个调用的生命周期之外使用内存。

我知道这是有问题的,因为垃圾收集器可以移动内存。

为了传递a StrNativecall文档 说:“如果C函数要求字符串的生存期超过函数调用的长度,则必须对参数进行手动编码并以CArray [uint8]的形式传递”,并举例说明:

my $array = CArray[uint8].new($string.encode.list);
Run Code Online (Sandbox Code Playgroud)

我的问题是:我是否必须为同一件事做同样的事情Buf?万一它被GC移动了?还是GC会离开我的Buf位置?对于短字符串,这没什么大不了的,但是对于大内存缓冲区,这可能是昂贵的操作。(例如,请参见Archive :: Libarchive,可以将其Buf与tar文件一起传递。该代码有问题吗?

multi method open(Buf $data!) {
    my $res = archive_read_open_memory $!archive, $data, $data.bytes; 
    ...
Run Code Online (Sandbox Code Playgroud)

是否有(可能有呢?应该有?)某种traitBuf,它告诉GC不能移动它?我知道如果我向中添加更多数据可能会很麻烦Buf,但我保证不会这样做。对于一个Blob不变的东西呢?

perl6

6
推荐指数
1
解决办法
110
查看次数

在Perl 6 NativeCall中将指针传递给指针

我正在尝试使用NativeCall与某些C函数进行交互.

对于一种情况,我需要传入由函数更新的指针,因此它需要指向指针的指针'void**'.

我试过这样的:

class Foo
{
    has Pointer $.first;
    has Pointer $.last;

    sub somefunc(Pointer is rw, Pointer is rw, Str) is native { * }

    method myfunc(Str $arg) {
        somefunc($!first, $!last, $arg);
    }
}
Run Code Online (Sandbox Code Playgroud)

它不起作用.指针不会被函数更新.

由于C数组基本上是指向指针的指针,我可以这样伪造它:

class Foo
{
    has Pointer $.first;
    has Pointer $.last;

    sub somefunc(CArray[Pointer], CArray[Pointer], Str) is native { * }

    method myfunc(Str $arg) {
        my $first = CArray[Pointer].new($!first);
        my $last = CArray[Pointer].new($!last);
        somefunc($first, $last, $arg);
        $!first = $first[0];
        $!last = $last[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好.看起来像"是rw"应该强制指针指针,它应该以第一种方式工作.

我究竟做错了什么?

perl6 nativecall

5
推荐指数
1
解决办法
300
查看次数

为Perl 6 NativeCall结构添加用户模式类型

Perl 6 文档列出了一堆类型.其中一些(例如Str)具有更复杂的盒子/拆箱行为.

是否可以定义我自己的类型,为box/unboxing指定我自己的例程?对于一个特定的项目,我有一堆我正在重用的类型,并且基本上一遍又一遍地剪切/粘贴我的访问器功能.

例如,C Struct使用a time_t,我插入访问器方法来往/来自a DateTime.另一个例子是以逗号分隔的列表,我想进入/离开Array并自动处理split/ join.

有一个更好的方法吗?

编辑:添加示例:

constant time_t = uint64;
constant FooType_t = uint16;

enum FooType <A B C>;

class Foo is repr('CStruct') is rw
{
    has uint32    $.id;
    has Str       $.name;
    has FooType_t $.type;
    has time_t    $.time;

    method name(Str $n?) {
        $!name := $n with $n;
        $!name;
    }

    method type(FooType $t?) {
        $!type = $t with $t;
        FooType($!type);
    }

    method time(DateTime $d?) { …
Run Code Online (Sandbox Code Playgroud)

boxing perl6 nativecall

5
推荐指数
1
解决办法
209
查看次数

将函数指针放入 Perl6 NativeCall CStruct

试图与一个 C 库接口,该库采用一个带有一堆指向它在不同点调用的函数的指针的结构。

像这样:

struct callbacks {
    int (*foo)(int);
    int (*bar)(int);
}

int set_callbacks(callbacks *cbs);
Run Code Online (Sandbox Code Playgroud)

我可以进行回调:

sub foo-callback(int32 --> int32) {...}
sub bar-callback(int32 --> int32) {...}
Run Code Online (Sandbox Code Playgroud)

如果这样做会很酷:

class Callbacks is repr<CStruct>
{
    has &.foo (int32 --> int32);
    has &.bar (int32 --> int32);
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。我正在尝试做一些事情:

class Callbacks is repr<CStruct>
{
    has Pointer $.foo;
    has Pointer $.bar;
}
Run Code Online (Sandbox Code Playgroud)

并将它们设置为nativecast(Pointer, &foo-callback)或一些,但我似乎无法强迫它们在那里。

除了编写一个小 C 函数来获取所有 Perl 6 函数指针并将它们插入 C 中的结构之外,还有什么方法可以做到这一点?

nativecall raku

4
推荐指数
1
解决办法
169
查看次数

标签 统计

perl6 ×10

nativecall ×7

raku ×2

arrays ×1

boxing ×1

cro ×1

garbage-collection ×1

struct ×1

testing ×1

websocket ×1