From 1dd2a44a6f08d18a5dd41d91787a751446361c9e Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 4 May 2016 16:54:51 +1000 Subject: [PATCH] initial commit --- .gitignore | 9 ++ .travis.yml | 5 + CODE_OF_CONDUCT.md | 49 +++++++ Gemfile | 4 + LICENSE.txt | 21 +++ README.md | 41 ++++++ Rakefile | 15 +++ bin/console | 14 ++ bin/setup | 8 ++ ext/mini_racer_extension/extconf.rb | 41 ++++++ .../mini_racer_extension.cc | 127 ++++++++++++++++++ lib/mini_racer.rb | 6 + lib/mini_racer/version.rb | 3 + mini_racer.gemspec | 33 +++++ test/mini_racer_test.rb | 36 +++++ test/test_helper.rb | 4 + 16 files changed, 416 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 Gemfile create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 Rakefile create mode 100755 bin/console create mode 100755 bin/setup create mode 100644 ext/mini_racer_extension/extconf.rb create mode 100644 ext/mini_racer_extension/mini_racer_extension.cc create mode 100644 lib/mini_racer.rb create mode 100644 lib/mini_racer/version.rb create mode 100644 mini_racer.gemspec create mode 100644 test/mini_racer_test.rb create mode 100644 test/test_helper.rb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0cb6eeb --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..e6ecc2b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +sudo: false +language: ruby +rvm: + - 2.3.1 +before_install: gem install bundler -v 1.12.0 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..bf04809 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,49 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting a project maintainer at sam.saffron@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. Maintainers are +obligated to maintain confidentiality with regard to the reporter of an +incident. + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[http://contributor-covenant.org/version/1/3/0/][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/3/0/ \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..1c5a48e --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in mini_racer.gemspec +gemspec diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..109b204 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 TODO: Write your name + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..17eea20 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# MiniRacer + +Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/mini_racer`. To experiment with that code, run `bin/console` for an interactive prompt. + +TODO: Delete this and the text above, and describe your gem + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'mini_racer' +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install mini_racer + +## Usage + +TODO: Write usage instructions here + +## Development + +After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/mini_racer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + + +## License + +The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). + diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..c7f6661 --- /dev/null +++ b/Rakefile @@ -0,0 +1,15 @@ +require "bundler/gem_tasks" +require "rake/testtask" +require "rake/extensiontask" + +Rake::TestTask.new(:test) do |t| + t.libs << "test" + t.libs << "lib" + t.test_files = FileList['test/**/*_test.rb'] +end + +task :default => :test + +gem = Gem::Specification.load( File.dirname(__FILE__) + '/mini_racer.gemspec' ) +Rake::ExtensionTask.new( 'mini_racer_extension', gem ) + diff --git a/bin/console b/bin/console new file mode 100755 index 0000000..64f2503 --- /dev/null +++ b/bin/console @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby + +require "bundler/setup" +require "mini_racer" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +# (If you use this, don't forget to add pry to your Gemfile!) +# require "pry" +# Pry.start + +require "irb" +IRB.start diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000..dce67d8 --- /dev/null +++ b/bin/setup @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install + +# Do any other automated setup that you need to do here diff --git a/ext/mini_racer_extension/extconf.rb b/ext/mini_racer_extension/extconf.rb new file mode 100644 index 0000000..be1fe19 --- /dev/null +++ b/ext/mini_racer_extension/extconf.rb @@ -0,0 +1,41 @@ +require 'mkmf' + +have_library('pthread') +have_library('objc') if RUBY_PLATFORM =~ /darwin/ +$CPPFLAGS += " -Wall" unless $CPPFLAGS.split.include? "-Wall" +$CPPFLAGS += " -g" unless $CPPFLAGS.split.include? "-g" +$CPPFLAGS += " -rdynamic" unless $CPPFLAGS.split.include? "-rdynamic" +$CPPFLAGS += " -fPIC" unless $CPPFLAGS.split.include? "-rdynamic" or RUBY_PLATFORM =~ /darwin/ +$CPPFLAGS += " -std=c++0x" +$CPPFLAGS += " -fpermissive" + +CONFIG['LDSHARED'] = '$(CXX) -shared' unless RUBY_PLATFORM =~ /darwin/ +if CONFIG['warnflags'] + CONFIG['warnflags'].gsub!('-Wdeclaration-after-statement', '') + CONFIG['warnflags'].gsub!('-Wimplicit-function-declaration', '') +end +if enable_config('debug') + $CFLAGS += " -O0 -ggdb3" +end + +LIBV8_COMPATIBILITY = '~> 5.0.71.35.0' + +begin + require 'rubygems' + gem 'libv8', LIBV8_COMPATIBILITY +rescue Gem::LoadError + warn "Warning! Unable to load libv8 #{LIBV8_COMPATIBILITY}." +rescue LoadError + warn "Warning! Could not load rubygems. Please make sure you have libv8 #{LIBV8_COMPATIBILITY} installed." +ensure + require 'libv8' +end + +Libv8.configure_makefile + +# Temp Hack +find_header('v8.h', '/home/sam/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/libv8-5.0.71.35.0/vendor/v8/include') + +find_header('libplatform/libplatform.h', '/home/sam/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/libv8-5.0.71.35.0/vendor/v8/include') + +create_makefile 'mini_racer_extension' diff --git a/ext/mini_racer_extension/mini_racer_extension.cc b/ext/mini_racer_extension/mini_racer_extension.cc new file mode 100644 index 0000000..233faff --- /dev/null +++ b/ext/mini_racer_extension/mini_racer_extension.cc @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include + +using namespace v8; + +class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { + public: + virtual void* Allocate(size_t length) { + void* data = AllocateUninitialized(length); + return data == NULL ? data : memset(data, 0, length); + } + virtual void* AllocateUninitialized(size_t length) { return malloc(length); } + virtual void Free(void* data, size_t) { free(data); } +}; + + +Platform* current_platform = NULL; +ArrayBufferAllocator* allocator = NULL; +Isolate* isolate = NULL; + +static void init_v8() { + if (current_platform == NULL) { + V8::InitializeICU(); + current_platform = platform::CreateDefaultPlatform(); + V8::InitializePlatform(current_platform); + V8::Initialize(); + allocator = new ArrayBufferAllocator(); + + Isolate::CreateParams create_params; + create_params.array_buffer_allocator = allocator; + isolate = Isolate::New(create_params); + + } +} + + +void shutdown_v8() { + +} + +static VALUE rb_context_eval(VALUE self, VALUE str) { + init_v8(); + + Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + Persistent* persistent_context; + + Data_Get_Struct(self, Persistent, persistent_context); + Local context = Local::New(isolate, *persistent_context); + + Context::Scope context_scope(context); + + Local eval = String::NewFromUtf8(isolate, RSTRING_PTR(str), + NewStringType::kNormal, (int)RSTRING_LEN(str)).ToLocalChecked(); + + Local