therubyracer-freebsd 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +13 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/.yardopts +1 -0
- data/Changelog.md +231 -0
- data/Gemfile +3 -0
- data/README.md +167 -0
- data/Rakefile +26 -0
- data/bin/therubyracer +11 -0
- data/ext/v8/extconf.rb +26 -0
- data/ext/v8/rr.cpp +189 -0
- data/ext/v8/rr.h +41 -0
- data/ext/v8/v8.cpp +48 -0
- data/ext/v8/v8_array.cpp +48 -0
- data/ext/v8/v8_array.h +8 -0
- data/ext/v8/v8_callbacks.cpp +81 -0
- data/ext/v8/v8_callbacks.h +8 -0
- data/ext/v8/v8_context.cpp +92 -0
- data/ext/v8/v8_context.h +6 -0
- data/ext/v8/v8_date.cpp +40 -0
- data/ext/v8/v8_date.h +6 -0
- data/ext/v8/v8_debug.cpp +17 -0
- data/ext/v8/v8_debug.h +6 -0
- data/ext/v8/v8_exception.cpp +133 -0
- data/ext/v8/v8_exception.h +11 -0
- data/ext/v8/v8_external.cpp +70 -0
- data/ext/v8/v8_external.h +8 -0
- data/ext/v8/v8_function.cpp +69 -0
- data/ext/v8/v8_function.h +11 -0
- data/ext/v8/v8_handle.cpp +186 -0
- data/ext/v8/v8_handle.h +48 -0
- data/ext/v8/v8_locker.cpp +139 -0
- data/ext/v8/v8_locker.h +6 -0
- data/ext/v8/v8_message.cpp +67 -0
- data/ext/v8/v8_message.h +10 -0
- data/ext/v8/v8_object.cpp +122 -0
- data/ext/v8/v8_object.h +10 -0
- data/ext/v8/v8_script.cpp +36 -0
- data/ext/v8/v8_script.h +8 -0
- data/ext/v8/v8_string.cpp +52 -0
- data/ext/v8/v8_string.h +9 -0
- data/ext/v8/v8_template.cpp +344 -0
- data/ext/v8/v8_template.h +8 -0
- data/ext/v8/v8_try_catch.cpp +70 -0
- data/ext/v8/v8_try_catch.h +5 -0
- data/ext/v8/v8_v8.cpp +34 -0
- data/ext/v8/v8_v8.h +6 -0
- data/ext/v8/v8_value.cpp +175 -0
- data/ext/v8/v8_value.h +10 -0
- data/ext/v8/v8_weakref.cpp +61 -0
- data/ext/v8/v8_weakref.h +29 -0
- data/lib/v8.rb +23 -0
- data/lib/v8/access.rb +92 -0
- data/lib/v8/array.rb +17 -0
- data/lib/v8/c/locker.rb +18 -0
- data/lib/v8/cli.rb +133 -0
- data/lib/v8/context.rb +111 -0
- data/lib/v8/error.rb +130 -0
- data/lib/v8/function.rb +44 -0
- data/lib/v8/object.rb +69 -0
- data/lib/v8/portal.rb +86 -0
- data/lib/v8/portal/caller.rb +37 -0
- data/lib/v8/portal/constructor.rb +98 -0
- data/lib/v8/portal/function.rb +63 -0
- data/lib/v8/portal/interceptors.rb +152 -0
- data/lib/v8/portal/proxies.rb +151 -0
- data/lib/v8/portal/templates.rb +73 -0
- data/lib/v8/stack.rb +66 -0
- data/lib/v8/tap.rb +9 -0
- data/lib/v8/version.rb +3 -0
- data/spec/ext/array_spec.rb +15 -0
- data/spec/ext/cxt_spec.rb +57 -0
- data/spec/ext/ext_spec_helper.rb +27 -0
- data/spec/ext/func_spec.rb +64 -0
- data/spec/ext/object_spec.rb +10 -0
- data/spec/ext/string_spec.rb +11 -0
- data/spec/ext/try_catch_spec.rb +60 -0
- data/spec/redjs_spec.rb +9 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/v8/error_spec.rb +131 -0
- data/spec/v8/portal/proxies_spec.rb +106 -0
- data/specmem/handle_memspec.rb +41 -0
- data/specmem/object_memspec.rb +14 -0
- data/specmem/proxies_memspec.rb +49 -0
- data/specmem/spec_helper.rb +24 -0
- data/specthread/spec_helper.rb +2 -0
- data/specthread/threading_spec.rb +13 -0
- data/thefrontside.png +0 -0
- data/therubyracer.gemspec +27 -0
- metadata +183 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
#include "v8_try_catch.h"
|
3
|
+
#include "v8_message.h"
|
4
|
+
|
5
|
+
using namespace v8;
|
6
|
+
|
7
|
+
namespace {
|
8
|
+
VALUE TryCatchClass;
|
9
|
+
|
10
|
+
TryCatch *unwrap(VALUE self) {
|
11
|
+
TryCatch *tc = 0;
|
12
|
+
Data_Get_Struct(self, class TryCatch, tc);
|
13
|
+
if (RTEST(rb_iv_get(self, "dead"))) {
|
14
|
+
rb_raise(rb_eScriptError, "out of scope access of %s", RSTRING_PTR(rb_inspect(self)));
|
15
|
+
return false;
|
16
|
+
} else {
|
17
|
+
return tc;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
VALUE Try(int argc, VALUE *argv, VALUE self) {
|
22
|
+
if (rb_block_given_p()) {
|
23
|
+
HandleScope scope;
|
24
|
+
TryCatch tc;
|
25
|
+
VALUE try_catch = Data_Wrap_Struct(TryCatchClass, 0, 0, &tc);
|
26
|
+
rb_iv_set(try_catch, "dead", Qfalse);
|
27
|
+
VALUE result = rb_yield(try_catch);
|
28
|
+
rb_iv_set(try_catch, "dead", Qtrue);
|
29
|
+
tc.Reset();
|
30
|
+
return result;
|
31
|
+
} else {
|
32
|
+
return Qnil;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
VALUE HasCaught(VALUE self) {
|
37
|
+
TryCatch *tc = unwrap(self);
|
38
|
+
return tc ? rr_v82rb(tc->HasCaught()) : Qnil;
|
39
|
+
}
|
40
|
+
|
41
|
+
VALUE _Exception(VALUE self) {
|
42
|
+
TryCatch *tc = unwrap(self);
|
43
|
+
return tc ? rr_v82rb(tc->Exception()) : Qnil;
|
44
|
+
}
|
45
|
+
|
46
|
+
VALUE _StackTrace(VALUE self) {
|
47
|
+
TryCatch *tc = unwrap(self);
|
48
|
+
return tc ? rr_v82rb(tc->StackTrace()) : Qnil;
|
49
|
+
}
|
50
|
+
|
51
|
+
VALUE _Message(VALUE self) {
|
52
|
+
TryCatch *tc = unwrap(self);
|
53
|
+
return tc ? rr_v82rb(tc->Message()) : Qnil;
|
54
|
+
}
|
55
|
+
|
56
|
+
VALUE CanContinue(VALUE self) {
|
57
|
+
TryCatch *tc = unwrap(self);
|
58
|
+
return tc ? rr_v82rb(tc->CanContinue()) : Qnil;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
void rr_init_v8_try_catch() {
|
63
|
+
TryCatchClass = rr_define_class("TryCatch");
|
64
|
+
rr_define_singleton_method(TryCatchClass, "try", Try, -1);
|
65
|
+
rr_define_method(TryCatchClass, "HasCaught", HasCaught, 0);
|
66
|
+
rr_define_method(TryCatchClass, "Exception", _Exception, 0);
|
67
|
+
rr_define_method(TryCatchClass, "StackTrace", _StackTrace, 0);
|
68
|
+
rr_define_method(TryCatchClass, "Message", _Message, 0);
|
69
|
+
rr_define_method(TryCatchClass, "CanContinue", CanContinue, 0);
|
70
|
+
}
|
data/ext/v8/v8_v8.cpp
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
#include "rr.h"
|
3
|
+
|
4
|
+
using namespace v8;
|
5
|
+
|
6
|
+
namespace {
|
7
|
+
|
8
|
+
VALUE IsDead(VALUE self) {
|
9
|
+
return rr_v82rb(V8::IsDead());
|
10
|
+
}
|
11
|
+
|
12
|
+
VALUE AdjustAmountOfExternalAllocatedMemory(VALUE self, VALUE bytes) {
|
13
|
+
V8::AdjustAmountOfExternalAllocatedMemory(NUM2INT(bytes));
|
14
|
+
return Qnil;
|
15
|
+
}
|
16
|
+
|
17
|
+
VALUE IdleNotification(VALUE self) {
|
18
|
+
return rr_v82rb(V8::IdleNotification());
|
19
|
+
}
|
20
|
+
|
21
|
+
VALUE SetFlagsFromString(VALUE self, VALUE string) {
|
22
|
+
V8::SetFlagsFromString(RSTRING_PTR(string), (int)RSTRING_LEN(string));
|
23
|
+
return Qnil;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
void rr_init_v8_v8() {
|
29
|
+
VALUE V8Module = rr_define_module("V8");
|
30
|
+
rr_define_singleton_method(V8Module, "IsDead", IsDead, 0);
|
31
|
+
rr_define_singleton_method(V8Module, "AdjustAmountOfExternalAllocatedMemory", AdjustAmountOfExternalAllocatedMemory, 1);
|
32
|
+
rr_define_singleton_method(V8Module, "IdleNotification", IdleNotification, 0);
|
33
|
+
rr_define_singleton_method(V8Module, "SetFlagsFromString", SetFlagsFromString, 1);
|
34
|
+
}
|
data/ext/v8/v8_v8.h
ADDED
data/ext/v8/v8_value.cpp
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
#include "v8_handle.h"
|
2
|
+
#include "v8_value.h"
|
3
|
+
|
4
|
+
using namespace v8;
|
5
|
+
namespace {
|
6
|
+
|
7
|
+
VALUE ValueClass;
|
8
|
+
|
9
|
+
Persistent<Value>& unwrap(VALUE value) {
|
10
|
+
return rr_v8_handle<Value>(value);
|
11
|
+
}
|
12
|
+
VALUE IsEmpty(VALUE value) {
|
13
|
+
return value == rr_v8_value_empty() ? Qtrue : Qfalse;
|
14
|
+
}
|
15
|
+
VALUE IsUndefined(VALUE self) {
|
16
|
+
HandleScope scope;
|
17
|
+
return rr_v82rb(unwrap(self)->IsUndefined());
|
18
|
+
}
|
19
|
+
VALUE IsNull(VALUE self) {
|
20
|
+
HandleScope scope;
|
21
|
+
return rr_v82rb(unwrap(self)->IsNull());
|
22
|
+
}
|
23
|
+
VALUE IsTrue(VALUE self) {
|
24
|
+
HandleScope scope;
|
25
|
+
return rr_v82rb(unwrap(self)->IsTrue());
|
26
|
+
}
|
27
|
+
VALUE IsFalse(VALUE self) {
|
28
|
+
HandleScope scope;
|
29
|
+
return rr_v82rb(unwrap(self)->IsFalse());
|
30
|
+
}
|
31
|
+
VALUE IsString(VALUE self) {
|
32
|
+
HandleScope scope;
|
33
|
+
return rr_v82rb(unwrap(self)->IsString());
|
34
|
+
}
|
35
|
+
VALUE IsFunction(VALUE self) {
|
36
|
+
HandleScope scope;
|
37
|
+
return rr_v82rb(unwrap(self)->IsFunction());
|
38
|
+
}
|
39
|
+
VALUE IsArray(VALUE self) {
|
40
|
+
HandleScope scope;
|
41
|
+
return rr_v82rb(unwrap(self)->IsArray());
|
42
|
+
}
|
43
|
+
VALUE IsObject(VALUE self) {
|
44
|
+
HandleScope scope;
|
45
|
+
return rr_v82rb(unwrap(self)->IsObject());
|
46
|
+
}
|
47
|
+
VALUE IsBoolean(VALUE self) {
|
48
|
+
HandleScope scope;
|
49
|
+
return rr_v82rb(unwrap(self)->IsBoolean());
|
50
|
+
}
|
51
|
+
VALUE IsNumber(VALUE self) {
|
52
|
+
HandleScope scope;
|
53
|
+
return rr_v82rb(unwrap(self)->IsNumber());
|
54
|
+
}
|
55
|
+
VALUE IsExternal(VALUE self) {
|
56
|
+
HandleScope scope;
|
57
|
+
return rr_v82rb(unwrap(self)->IsExternal());
|
58
|
+
}
|
59
|
+
VALUE IsInt32(VALUE self) {
|
60
|
+
HandleScope scope;
|
61
|
+
return rr_v82rb(unwrap(self)->IsInt32());
|
62
|
+
}
|
63
|
+
VALUE IsUint32(VALUE self) {
|
64
|
+
HandleScope scope;
|
65
|
+
return rr_v82rb(unwrap(self)->IsUint32());
|
66
|
+
}
|
67
|
+
VALUE IsDate(VALUE self) {
|
68
|
+
HandleScope scope;
|
69
|
+
return rr_v82rb(unwrap(self)->IsDate());
|
70
|
+
}
|
71
|
+
|
72
|
+
VALUE ToBoolean(VALUE self) {
|
73
|
+
HandleScope scope;
|
74
|
+
return rr_v82rb(unwrap(self)->ToBoolean());
|
75
|
+
}
|
76
|
+
VALUE ToNumber(VALUE self) {
|
77
|
+
HandleScope scope;
|
78
|
+
return rr_v82rb(unwrap(self)->ToNumber());
|
79
|
+
}
|
80
|
+
VALUE ToString(VALUE self) {
|
81
|
+
HandleScope scope;
|
82
|
+
return rr_v82rb(unwrap(self)->ToString());
|
83
|
+
}
|
84
|
+
VALUE ToDetailString(VALUE self) {
|
85
|
+
HandleScope scope;
|
86
|
+
return rr_v82rb(unwrap(self)->ToDetailString());
|
87
|
+
}
|
88
|
+
VALUE ToObject(VALUE self) {
|
89
|
+
HandleScope scope;
|
90
|
+
return rr_v82rb(unwrap(self)->ToObject());
|
91
|
+
}
|
92
|
+
VALUE ToInteger(VALUE self) {
|
93
|
+
HandleScope scope;
|
94
|
+
return rr_v82rb(unwrap(self)->ToInteger());
|
95
|
+
}
|
96
|
+
VALUE ToUint32(VALUE self) {
|
97
|
+
HandleScope scope;
|
98
|
+
return rr_v82rb(unwrap(self)->ToUint32());
|
99
|
+
}
|
100
|
+
VALUE ToInt32(VALUE self) {
|
101
|
+
HandleScope scope;
|
102
|
+
return rr_v82rb(unwrap(self)->ToInt32());
|
103
|
+
}
|
104
|
+
VALUE ToArrayIndex(VALUE self) {
|
105
|
+
HandleScope scope;
|
106
|
+
return rr_v82rb(unwrap(self)->ToArrayIndex());
|
107
|
+
}
|
108
|
+
|
109
|
+
VALUE Equals(VALUE self, VALUE that) {
|
110
|
+
HandleScope scope;
|
111
|
+
return rr_v82rb(unwrap(self)->Equals(unwrap(that)));
|
112
|
+
}
|
113
|
+
VALUE StrictEquals(VALUE self, VALUE that) {
|
114
|
+
HandleScope scope;
|
115
|
+
return rr_v82rb(unwrap(self)->StrictEquals(unwrap(that)));
|
116
|
+
}
|
117
|
+
|
118
|
+
VALUE BooleanValue(VALUE self) {
|
119
|
+
HandleScope scope;
|
120
|
+
return rr_v82rb(unwrap(self)->BooleanValue());
|
121
|
+
}
|
122
|
+
|
123
|
+
VALUE NumberValue(VALUE self) {
|
124
|
+
HandleScope scope;
|
125
|
+
return rr_v82rb(unwrap(self)->NumberValue());
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
VALUE rr_v8_value_class() {
|
130
|
+
return ValueClass;
|
131
|
+
}
|
132
|
+
|
133
|
+
VALUE rr_v8_value_empty() {
|
134
|
+
return rr_const_get("Empty");
|
135
|
+
}
|
136
|
+
|
137
|
+
void rr_init_value() {
|
138
|
+
ValueClass = rr_define_class("Value", rr_v8_handle_class());
|
139
|
+
rr_define_const("Empty", rr_v8_handle_new(ValueClass, Handle<Value>()));
|
140
|
+
|
141
|
+
rr_define_method(ValueClass, "IsEmpty", IsEmpty, 0);
|
142
|
+
rr_define_method(ValueClass, "IsUndefined", IsUndefined, 0);
|
143
|
+
rr_define_method(ValueClass, "IsNull", IsNull, 0);
|
144
|
+
rr_define_method(ValueClass, "IsTrue", IsTrue, 0);
|
145
|
+
rr_define_method(ValueClass, "IsFalse", IsFalse, 0);
|
146
|
+
rr_define_method(ValueClass, "IsString", IsString, 0);
|
147
|
+
rr_define_method(ValueClass, "IsFunction", IsFunction, 0);
|
148
|
+
rr_define_method(ValueClass, "IsArray", IsArray, 0);
|
149
|
+
rr_define_method(ValueClass, "IsObject", IsObject, 0);
|
150
|
+
rr_define_method(ValueClass, "IsBoolean", IsBoolean, 0);
|
151
|
+
rr_define_method(ValueClass, "IsNumber", IsNumber, 0);
|
152
|
+
rr_define_method(ValueClass, "IsExternal", IsExternal, 0);
|
153
|
+
rr_define_method(ValueClass, "IsInt32", IsInt32, 0);
|
154
|
+
rr_define_method(ValueClass, "IsUint32", IsUint32, 0);
|
155
|
+
rr_define_method(ValueClass, "IsDate", IsDate, 0);
|
156
|
+
|
157
|
+
rr_define_method(ValueClass, "ToBoolean", ToBoolean, 0);
|
158
|
+
rr_define_method(ValueClass, "ToNumber", ToNumber, 0);
|
159
|
+
rr_define_method(ValueClass, "ToString", ToString, 0);
|
160
|
+
rr_define_method(ValueClass, "ToDetailString", ToDetailString, 0);
|
161
|
+
rr_define_method(ValueClass, "ToObject", ToObject, 0);
|
162
|
+
rr_define_method(ValueClass, "ToInteger", ToInteger, 0);
|
163
|
+
rr_define_method(ValueClass, "ToUint32", ToUint32, 0);
|
164
|
+
rr_define_method(ValueClass, "ToArrayIndex", ToArrayIndex, 0);
|
165
|
+
|
166
|
+
rr_define_method(ValueClass, "Equals", Equals, 1);
|
167
|
+
rr_define_method(ValueClass, "StrictEquals", StrictEquals, 1);
|
168
|
+
|
169
|
+
rr_define_method(ValueClass, "BooleanValue", BooleanValue, 0);
|
170
|
+
rr_define_method(ValueClass, "NumberValue", NumberValue, 0);
|
171
|
+
}
|
172
|
+
|
173
|
+
VALUE rr_wrap_v8_value(Handle<Value>& value) {
|
174
|
+
return rr_v8_handle_new(ValueClass, value);
|
175
|
+
}
|
data/ext/v8/v8_value.h
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#include "v8.h"
|
2
|
+
#include "v8_weakref.h"
|
3
|
+
|
4
|
+
using namespace v8;
|
5
|
+
|
6
|
+
v8_weakref::v8_weakref(VALUE object) {
|
7
|
+
this->v8_active = true;
|
8
|
+
this->rb_active = true;
|
9
|
+
this->external = Persistent<External>::New(External::New((void *)this));
|
10
|
+
this->external.MakeWeak(this, v8_weakref_dispose);
|
11
|
+
this->set(object);
|
12
|
+
}
|
13
|
+
|
14
|
+
void v8_weakref::set(VALUE value) {
|
15
|
+
this->object_id = rb_obj_id(value);
|
16
|
+
this->rb_active = true;
|
17
|
+
VALUE data = Data_Wrap_Struct(rb_cObject, 0, 0, this);
|
18
|
+
rr_define_finalizer(value,(void*)v8_weakref_finalize, data);
|
19
|
+
}
|
20
|
+
|
21
|
+
VALUE v8_weakref::get() {
|
22
|
+
if (this->object_id) {
|
23
|
+
return rb_rescue((VALUE (*)(...))v8_weakref_id2ref, this->object_id, (VALUE (*)(...))v8_weakref_nil, Qnil);
|
24
|
+
} else {
|
25
|
+
return Qnil;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
VALUE v8_weakref_finalize(VALUE object_id, VALUE data) {
|
30
|
+
v8_weakref* weakref = 0;
|
31
|
+
Data_Get_Struct(data, struct v8_weakref, weakref);
|
32
|
+
weakref->object_id = Qnil;
|
33
|
+
weakref->rb_active = false;
|
34
|
+
if (!weakref->v8_active) {
|
35
|
+
delete weakref;
|
36
|
+
}
|
37
|
+
return Qnil;
|
38
|
+
}
|
39
|
+
|
40
|
+
void v8_weakref_dispose(Persistent<Value> value, void* data) {
|
41
|
+
value.Dispose();
|
42
|
+
value.Clear();
|
43
|
+
v8_weakref* weakref = (v8_weakref*)data;
|
44
|
+
weakref->v8_active = false;
|
45
|
+
if (!weakref->rb_active) {
|
46
|
+
delete weakref;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
VALUE v8_weakref_nil(VALUE nil, VALUE exception) {
|
51
|
+
return nil;
|
52
|
+
}
|
53
|
+
|
54
|
+
VALUE v8_weakref_objectspace() {
|
55
|
+
return rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
|
56
|
+
}
|
57
|
+
|
58
|
+
VALUE v8_weakref_id2ref(VALUE id) {
|
59
|
+
return rb_funcall(v8_weakref_objectspace(), rb_intern("_id2ref"), 1, id);
|
60
|
+
}
|
61
|
+
|
data/ext/v8/v8_weakref.h
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#ifndef _RR_V8_WEAKREF_
|
2
|
+
#define _RR_V8_WEAKREF_
|
3
|
+
|
4
|
+
#include <v8.h>
|
5
|
+
#include "ruby.h"
|
6
|
+
#include "rr.h"
|
7
|
+
|
8
|
+
struct v8_weakref {
|
9
|
+
v8_weakref(VALUE object);
|
10
|
+
VALUE get();
|
11
|
+
void set(VALUE object);
|
12
|
+
void retain();
|
13
|
+
void release();
|
14
|
+
|
15
|
+
VALUE object_id;
|
16
|
+
bool v8_active;
|
17
|
+
bool rb_active;
|
18
|
+
v8::Persistent<v8::External> external;
|
19
|
+
};
|
20
|
+
|
21
|
+
void v8_weakref_dispose(v8::Persistent<v8::Value> value, void* weakref);
|
22
|
+
VALUE v8_weakref_finalize(VALUE self, VALUE object_id);
|
23
|
+
VALUE v8_weakref_objectspace();
|
24
|
+
VALUE v8_weakref_nil(VALUE nil, VALUE exception);
|
25
|
+
VALUE v8_weakref_id2ref(VALUE id);
|
26
|
+
|
27
|
+
// extern "C" VALUE rb_proc_new(VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE);
|
28
|
+
|
29
|
+
#endif
|
data/lib/v8.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
module V8
|
5
|
+
require 'v8/version'
|
6
|
+
require 'v8/v8' #native glue
|
7
|
+
require 'v8/c/locker'
|
8
|
+
require 'v8/portal'
|
9
|
+
require 'v8/portal/caller'
|
10
|
+
require 'v8/portal/proxies'
|
11
|
+
require 'v8/portal/templates'
|
12
|
+
require 'v8/portal/function'
|
13
|
+
require 'v8/portal/constructor'
|
14
|
+
require 'v8/portal/interceptors'
|
15
|
+
require 'v8/context'
|
16
|
+
require 'v8/object'
|
17
|
+
require 'v8/array'
|
18
|
+
require 'v8/function'
|
19
|
+
require 'v8/tap'
|
20
|
+
require 'v8/access'
|
21
|
+
require 'v8/error'
|
22
|
+
require 'v8/stack'
|
23
|
+
end
|
data/lib/v8/access.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'set'
|
2
|
+
module V8
|
3
|
+
class Access
|
4
|
+
def get(obj, name, &dontintercept)
|
5
|
+
methods = accessible_methods(obj)
|
6
|
+
if methods.include?(name)
|
7
|
+
method = obj.method(name)
|
8
|
+
method.arity == 0 ? method.call : method.unbind
|
9
|
+
elsif obj.respond_to?(:[]) && !special?(name)
|
10
|
+
obj.send(:[], name, &dontintercept)
|
11
|
+
else
|
12
|
+
yield
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def iget(obj, index, &dontintercept)
|
17
|
+
if obj.respond_to?(:[])
|
18
|
+
obj.send(:[], index, &dontintercept)
|
19
|
+
else
|
20
|
+
yield
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def set(obj, name, value, &dontintercept)
|
25
|
+
setter = name + "="
|
26
|
+
methods = accessible_methods(obj, true)
|
27
|
+
if methods.include?(setter)
|
28
|
+
obj.send(setter, value)
|
29
|
+
elsif obj.respond_to?(:[]=) && !special?(name)
|
30
|
+
obj.send(:[]=, name, value, &dontintercept)
|
31
|
+
else
|
32
|
+
yield
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def iset(obj, index, value, &dontintercept)
|
37
|
+
if obj.respond_to?(:[]=)
|
38
|
+
obj.send(:[]=, index, value, &dontintercept)
|
39
|
+
else
|
40
|
+
yield
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def query(obj, name, attributes)
|
45
|
+
if obj.respond_to?(name)
|
46
|
+
attributes.dont_delete
|
47
|
+
unless obj.respond_to?(name + "=")
|
48
|
+
attributes.read_only
|
49
|
+
end
|
50
|
+
else
|
51
|
+
yield
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def iquery(obj, index, attributes)
|
56
|
+
if obj.respond_to?(:[])
|
57
|
+
attributes.dont_delete
|
58
|
+
unless obj.respond_to?(:[]=)
|
59
|
+
attributes.read_only
|
60
|
+
end
|
61
|
+
else
|
62
|
+
yield
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def names(obj)
|
67
|
+
accessible_methods(obj)
|
68
|
+
end
|
69
|
+
|
70
|
+
def indices(obj)
|
71
|
+
obj.respond_to?(:length) ? (0..obj.length).to_a : yield
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def accessible_methods(obj, special_methods = false)
|
77
|
+
obj.public_methods(false).map {|m| m.to_s}.to_set.tap do |methods|
|
78
|
+
ancestors = obj.class.ancestors.dup
|
79
|
+
while ancestor = ancestors.shift
|
80
|
+
break if ancestor == ::Object
|
81
|
+
methods.merge(ancestor.public_instance_methods(false).map {|m| m.to_s})
|
82
|
+
end
|
83
|
+
methods.reject!(&special?) unless special_methods
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def special?(name = nil)
|
88
|
+
@special ||= lambda {|m| m == "[]" || m == "[]=" || m =~ /=$/}
|
89
|
+
name.nil? ? @special : @special[name]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|