Skip to content
This repository was archived by the owner on Dec 4, 2023. It is now read-only.

Commit 4e880b1

Browse files
committed
add support for NewInstance()
1 parent 99f9ad3 commit 4e880b1

4 files changed

Lines changed: 24 additions & 8 deletions

File tree

ext/v8/maybe.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,16 @@ namespace rr {
6666
// the underlying value.
6767
VALUE object;
6868
};
69+
70+
template <class T, class V>
71+
class MaybeLocal : public Maybe {
72+
public:
73+
MaybeLocal(v8::Isolate* isolate, v8::MaybeLocal<V> maybe) {
74+
if (!maybe.IsEmpty()) {
75+
just(T(isolate, maybe.ToLocalChecked()));
76+
}
77+
}
78+
};
6979
}
7080

7181
#endif /* RR_MAYBE_H */

ext/v8/object-template.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
#define RR_OBJECT_TEMPLATE_H
44

55
namespace rr {
6-
class ObjectTemplate : Ref<v8::Template> {
6+
class ObjectTemplate : Ref<v8::ObjectTemplate> {
77
public:
8+
ObjectTemplate(VALUE self) : Ref<v8::ObjectTemplate>(self) {}
89
ObjectTemplate(v8::Isolate* isolate, v8::Handle<v8::ObjectTemplate> tmpl) :
9-
Ref<v8::Template>(isolate, tmpl) {}
10+
Ref<v8::ObjectTemplate>(isolate, tmpl) {}
1011
inline static void Init() {
1112
ClassBuilder("ObjectTemplate", Template::Class).
1213
defineSingletonMethod("New", &New).
14+
defineMethod("NewInstance", &NewInstance).
1315
store(&Class);
1416
}
1517

@@ -21,9 +23,15 @@ namespace rr {
2123
return ObjectTemplate(isolate, v8::ObjectTemplate::New(isolate));
2224
}
2325

24-
static VALUE NewInstance(VALUE self , VALUE context) {
25-
26+
static VALUE NewInstance(VALUE self , VALUE r_context) {
27+
ObjectTemplate t(self);
28+
Context context(r_context);
29+
Isolate isolate(context.getIsolate());
30+
Locker lock(isolate);
31+
v8::MaybeLocal<v8::Object> object(t->NewInstance());
32+
return Object::Maybe(isolate, ObjectTemplate(self)->NewInstance(context));
2633
}
34+
2735
};
2836
}
2937

ext/v8/object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace rr {
5656

5757
inline Object(VALUE value) : Ref<v8::Object>(value) {}
5858
inline Object(v8::Isolate* isolate, v8::Handle<v8::Object> object) : Ref<v8::Object>(isolate, object) {}
59+
typedef MaybeLocal<Object, v8::Object> Maybe;
5960

6061
virtual operator VALUE();
6162

spec/c/object_template_spec.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
let(:template) { V8::C::ObjectTemplate::New(@isolate) }
66

77
it "can be used to create object instances" do
8-
expect(template.NewInstance(@ctx)).to be
9-
end
10-
it "can be used to create a new object" do
11-
8+
expect(template.NewInstance(@ctx).FromJust()).to be_instance_of V8::C::Object
129
end
1310
end

0 commit comments

Comments
 (0)