我想将 V8 嵌入到我正在处理的项目中。这个项目根本不使用网络——事实上它出于安全原因避免了网络(我不想打开一个我没有准备好的跨站点脚本潘多拉魔盒)。无论如何,我只想要 javascript。
据我了解,V8 只是一个简单的 javascript 编译器和 VM,这很好——但它需要使用各种第 3 方库进行编译才能适应添加的功能。我想网络就是其中之一。为了能够构建使用 V8 的应用程序,您必须链接到 Winsock。
我希望能够从引擎中剥离这些额外的库,并从头开始将绑定(bind)添加到我自己的内部代码中(除了字符串和类似的东西),但我找不到指南或一些文档可以帮助我做到这一点。作为我应该了解的 JavaScript 引擎,V8 添加了哪些功能?我该如何删除它?
编辑:我还注意到包含了 URI,这对我正在做的事情并不是特别有用。 URI 函数未被优化,因为可执行文件中嵌入了各种标准库,我也想删除它们(连同任何其他 XML/Http 相关的 javascript 函数)。
最佳答案
网络。目前V8的debugger agent需要联网,没有它也可以使用engine,但是需要修改源码。
src/platform/socket.h
将您的操作系统(如 V8_OS_WIN)的 NativeHandle typedef 替换为:
typedef int NativeHandle;
将 kInvalidNativeHandle 常量值替换为 -1。
删除操作系统包含文件。
src/platform/socket.cc
用 stub 替换所有 Socket 类方法的主体,例如:
bool Socket::Bind(int port) {
assert(!"Socket usage.");
return true;
}
bool Socket::Listen(int backlog) {
assert(!"Socket usage.");
return true;
}
...
从此文件中删除其他特定于操作系统的函数等。
这应该会删除所有 V8 网络依赖项。
XML/HTTP 函数。。 V8 不包括那些。它们通常由嵌入器实现。
URI 函数 我不建议删除这些函数以及任何其他 JavaScript 内置函数。这可能会损坏引擎。而且它们无论如何都可以安全使用。
重症监护病房。您可以使用构建选项 i18nsupport=off 构建不带 ICU 库的 V8。
在这种情况下,您需要初始化内置 ICU:
v8::V8::InitializeICU();
希望这对您有所帮助。我自己在非常受限的环境中使用 V8,没有网络/文件系统等。如果我忘记了其他依赖项或者您有任何问题,请告诉我。
关于javascript - 在没有网络的情况下编译 V8 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165593/
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.