小编zne*_*eak的帖子

我可以将现有方法绑定到LLVM函数*并从JIT编译的代码中使用它吗?

我正在使用LLVM C++ API.我想JIT编译代码并运行它.

但是,我需要从所述JIT编译的代码中调用C++方法.通常,LLVM将方法调用视为函数调用,并将对象指针作为第一个参数传递,因此调用不应该是一个问题.真正的问题是将该功能转换为LLVM.

据我所知,可以使用外部链接功能,并通过其名称获取它.问题是,因为它是一个C++方法,它的名字会被破坏,所以我不认为这样做是个好主意.

使FunctionType对象很容易.但是从那里,我如何通知LLVM我的方法并Function为它获取一个对象?

c++ jit llvm

19
推荐指数
3
解决办法
5851
查看次数

如何在动态对象上动态调用方法?

当我想在C#中的任何对象上动态调用静态定义的(在"编译时确定"意义上的"静态",而不是"类级别成员"意义上的)方法时,我可以使用反射来获取该方法的句柄并调用它:

typeof(Foo).GetMethod("Bar").Invoke(foo, new object[] { /* params */ });
Run Code Online (Sandbox Code Playgroud)

但是,通过继承DynamicObject响应(未定义的)实例方法调用而使对象变为TryInvokeMember动态,并且由于显而易见的原因,类不响应的动态方法不会通过反射公开.这意味着我无法获得应该响应的方法的方法句柄TryInvokeMember.

具有讽刺意味的是,在我看来,您无法dynamic像在非dynamic对象上调用已定义的方法那样轻松地动态调用对象上的动态方法.

我考虑过TryInvokeMember直接调用,但第一个参数必须是InvokeMemberBinder一个抽象类的实例.我觉得如果我必须实现一个类来调用动态对象的动态方法,我一定是做错了.

如何dynamic通过名称调用对象上的方法,知道目标类没有实现它并且应该响应使用它TryInvokeMember

.net c# dynamic-language-runtime

18
推荐指数
2
解决办法
5409
查看次数

我可以告诉.NET GC单独保留一些线程吗?

我正在研究将相对较小的服务从C++重写为C#的可能性.该服务有两个主要功能:

  1. 偶尔执行HTTP请求.它们涉及几个高级任务,如JSON编码/解码,base64编码/解码和HTTP请求本身,对于这些任务,C++并不令人敬畏;
  2. 执行许多具有硬截止期限的实时,与音频相关的任务,C#并不令人敬畏.

实时任务由一个单独的库处理,该库执行自己的线程,并且根本不与服务的其余部分进行交互.服务的其余部分每5分钟左右从HTTP请求中获取一些数据.

问题是,由于实时部分有很长的期限,我无法真正容忍库的线程上的GC暂停.在我自己的代码方面,GC应该有足够的时间在Web请求之间运行,但我不能容忍它在我尝试将数据提供给库时启动.

发现我可以创建一个垃圾收集器不会开始使用的关键部分GC.TryStartNoGCRegion(),这解决了一半的问题.

但是,我仍然不知道是否有办法告诉.NET GC单独留下不运行托管代码的特定线程.那可能吗?

.net c# multithreading garbage-collection

16
推荐指数
1
解决办法
842
查看次数

System.Int32包含...另一个System.Int32

我用反射检查内容,System.Int32发现它包含另一个System.Int32.

System.Int32 m_value;
Run Code Online (Sandbox Code Playgroud)

我不明白这是怎么回事.

int实际上是你所拥有的"后退整数":如果你int打算并使用反射来改变其m_value字段的值,你可以有效地改变整数的值:

object testInt = 4;
Console.WriteLine(testInt); // yields 4

typeof(System.Int32)
    .GetField("m_value", BindingFlags.NonPublic | BindingFlags.Instance)
    .SetValue(testInt, 5);
Console.WriteLine(testInt); // yields 5
Run Code Online (Sandbox Code Playgroud)

这个奇点背后必须有一个理性的解释.值类型如何包含自身?CLR用它来制作它有什么神奇之处?

clr primitive-types

14
推荐指数
1
解决办法
518
查看次数

是否可以仅使用GPU加厚二次贝塞尔曲线?

我在OpenGL程序中绘制了许多二次Bézier曲线.现在,曲线是一个像素的薄和软件生成的,因为我处于一个相当早的阶段,它足以看到什么有效.

很简单,给定3个控制点(P 0P 2),我在软件中用t从0到1(步长为1/8)来评估下面的等式,并用GL_LINE_STRIP它们将它们链接在一起:

B(t)=(1- t)2 P 0 + 2(1- t)t P 1 + t 2 P 2

B显然,在哪里产生二维向量.

这种方法"足够好",因为即使是我最大的曲线,也不需要超过8步才能看起来弯曲.不过,一条像素细的曲线很难看.

我想编写一个GLSL着色器,它接受控制点和一个统一thickness变量,以使曲线更粗.起初我想过只制作一个像素着色器,它只会thickness / 2在曲线的距离内着色像素,但这样做需要求解三次多项式,并且在着色器内选择三个解决方案看起来不是最好的想法.

然后我试着查看其他人是否已经这样做了.我偶然发现了微软研究院的Loop和Blinn的一份白皮书,其中的人们展示了一种简单的方法来填充曲线下的区域.虽然它在这种程度上运作良好,但我很难适应两条连线曲线之间的绘制.

使用几何着色器查找与单条曲线匹配的边界曲线相当容易.片段着色器会出现问题,应该填满整个事物.他们的方法使用插值纹理坐标来确定片段是否落在曲线之上或之下; 但我想办法用两条曲线来做这件事(我对着色器而言并不是数学专家,所以事实上我并没有弄清楚如何做到这一点当然并不意味着它是不可能的).

我的下一个想法是将填充的曲线分成三角形,并仅在外部部分使用Bézier片段着色器.但是为此我需要将内部曲线和外部曲线分开到可变点,这意味着我必须再次解决方程式,这不是一个真正的选择.

是否有可行的算法用于使用着色器描边二次Bézier曲线?

bezier glsl

14
推荐指数
1
解决办法
5486
查看次数

如何用无限循环构建函数的后支配树?

我的一个项目是反编译器,它将本机代码转换为LLVM IR,简化它并输出伪C.程序过程的一个重要阶段是与模式无关的控制流结构,它在程序中查找区域并将其转换为结构化控制流语句(即不是结果).

我不得不推出自己的代码来寻找区域,因为LLVM的区域并不完全符合论文的预期.但是,找到区域需要你有一个后支配树,并且事实证明LLVM的后支配树构建算法不能为没有结束块的函数创建一个,就像用无限循环"结束"的函数一样.

这似乎是因为树构建算法需要一个起点.通常,起点是函数的返回块,因为它后控制每隔一个块; 但是没有任何函数可以旋转到无限循环中,因为它们没有任何returnunreachable终结符.(此时,值得注意的是LLVM的区域代码也依赖于后支配树,对于无法构建的函数也没用.)

在我看来,即使这个算法失败,函数不返回的事实并不意味着你不能为它做一个后支配树.1实际上,如果无限循环具有单个后沿(这是我可以确保的),那么具有该后沿的节点必然会支配图中的每个其他节点,因此应该可以发布帖子 - 主动树.

如果我能找到那个节点,我可以将它提供给LLVM的后dom基础设施,并从中获得一个合理的后支配树.不幸的是,我不是很富有想象力,而且我能想到的唯一直截了当的方法就是确定那个关键节点是"它是支配所有东西的那个",这当然不会帮助我引导后支配树.

寻找后缘并不是特别困难.正如Doug Currie所说,你可以用一个简单的DFS来实现,事实上,我的项目的另一部分就是这样做的.但是,在具有无限循环和嵌套终止循环的函数的情况下,我不知道如何在没有支配信息的情况下从外后边缘告诉内后边缘.(如果它可以提供帮助,在此过程的这个阶段,每个循环都保证有一个入口节点和最多一个出口节点.)

那么如何构建一个没有任何返回基本块的函数的后支配树?

我的编译器和图论背景完全是自学成才.这可能不准确.

compiler-construction algorithm graph llvm decompiler

14
推荐指数
1
解决办法
1326
查看次数

如何通过反射获取委托类型的返回类型?

我正在为个人项目进行反思繁重的工作,我需要通过其Type对象访问委托的返回类型.这是一个小元,所以这是一个例子.

Type type = typeof(Func<Foo, Bar, Baz>);
// ????
// Use reflection to come to the following expected result
Type result = typeof(Baz);
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我将不会有任何类型的实例进入Delegate.

c# reflection

13
推荐指数
1
解决办法
3095
查看次数

如何将数组从C#传递给Javascript函数?

我使用WPF中的WebBrowser对象,我在浏览器中加载的页面中调用了一些Javascript代码,如下所示:

myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, bar.ToArray<string>()});
Run Code Online (Sandbox Code Playgroud)

现在,js函数应该迭代第二个参数(一个字符串数组)的元素并相应地做东西.唯一的问题是该参数似乎不会作为js数组传递.

例如,

alert(typeof theArray);
Run Code Online (Sandbox Code Playgroud)

提醒"未知".

从CSharp调用js函数时,将数组作为参数传递的正确方法是什么?

javascript c# webbrowser-control

12
推荐指数
2
解决办法
9909
查看次数

如何让Mac OS在特定地址范围内分配内存?

我正在为Mac OS X编写一个Mac OS 9"兼容层",因为我最近对这种怀旧感到震惊,并且因为所有当前的解决方案都要求你在虚拟机中运行Classic,它不支持所有应该运行的东西我想用.

为了实现这一目标,我实现了一个PEF可执行加载器,一个可以桥接到本机代码的PowerPC解释器,以及一些Mac OS 9库.整个事情都有点工作:解释器中有一些错误,但这是预期的,我正在努力.

到目前为止,我最大的问题是PowerPC程序是32位,所以指针需要是32位.为了满足这个约束,目前我只为i386编译.但是,当我试图围绕该核心进行构建时,它变得越来越受限制(例如,您不能将ARC与32位Cocoa应用程序一起使用).更不用说让PowerPC代码访问主机进程可以访问的所有东西并不是超级安全的.

我设计了"平台",最终切换到64位:解释器需要一个基地址,所有PowerPC指针都被该基地址偏移.(出于性能和设计原因,有一个将PowerPC地址转换为本地地址的地图是不可能的.)

由于64位地址空间有足够的空间容纳四十亿个独立的32位地址空间,这听起来像是一个很好的方式.

但我仍然有一个问题:我需要确保我能够在该地址范围内分配内存,因为PPC解释器不可能访问它之外的任何内容.

我现在正在考虑两种解决方案:

  • 了解我是否可以要求Mac OS在特定地址范围内分配内容.我知道我可以使用mmap,但mmap会要求页面倍数的分配,这对我来说似乎非常浪费,因为我需要为每个分配一个完整的页面,无论它多么小(尽管考虑到经典 - 这实际上可以是好的)与现代计算机相比,Mac的内存非常少;
  • 使用mmap保留一个完整的0x100000000个字节PROT_NONE,然后mprotect在需要的页面在需要时实际分配内存,并把他们带回PROT_NONE时,他们没有什么用处了.它在纸面上看起来不错,但这意味着我必须实施malloc替代品.

所以我该怎么做?是否有内置机制让我尝试malloc在特定地址范围内分配内存?否则,是否有一个良好的,可读的,开源的实现,malloc我可以自己?

macos memory-management retro-computing

12
推荐指数
1
解决办法
1087
查看次数

我可以在C++函数getline中使用2个或更多分隔符吗?

我想知道如何在getline功能中使用2个或更多分隔符,这是我的问题:

该程序读取一个文本文件......每一行都是如下:

   New Your, Paris, 100
   CityA, CityB, 200
Run Code Online (Sandbox Code Playgroud)

我正在使用getline(文件,行),但我得到整条线,当我想要获得CityA,然后是CityB,然后是数字; 如果我使用','分隔符,我不知道下一行是什么时候,所以我试图找出一些解决方案..

虽然,我怎么能用逗号和\n作为分隔符?顺便说一句,我正在操纵字符串类型,而不是char,所以strtok是不可能的:/

一些划痕:

string line;
ifstream file("text.txt");
if(file.is_open())
   while(!file.eof()){
     getline(file, line);
        // here I need to get each string before comma and \n
   }
Run Code Online (Sandbox Code Playgroud)

c++ getline delimiter

12
推荐指数
2
解决办法
2万
查看次数