Skip to content

Commit 7d692ce

Browse files
committed
[GR-24666] Implementation of v8::Object::SetIntegrityLevel() and v8::V8::FromJustIsNothing().
PullRequest: js/1570
2 parents f6dbedf + 2a63af9 commit 7d692ce

File tree

9 files changed

+85
-4
lines changed

9 files changed

+85
-4
lines changed

graal-nodejs/deps/v8/src/graal/graal_isolate.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ GraalIsolate::GraalIsolate(JavaVM* jvm, JNIEnv* env, v8::Isolate::CreateParams c
649649
ACCESS_METHOD(GraalAccessMethod::object_creation_context, "objectCreationContext", "(Ljava/lang/Object;)Ljava/lang/Object;")
650650
ACCESS_METHOD(GraalAccessMethod::object_define_property, "objectDefineProperty", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;ZZZZZZ)Z")
651651
ACCESS_METHOD(GraalAccessMethod::object_preview_entries, "objectPreviewEntries", "(Ljava/lang/Object;)Ljava/lang/Object;")
652+
ACCESS_METHOD(GraalAccessMethod::object_set_integrity_level, "objectSetIntegrityLevel", "(Ljava/lang/Object;Z)V")
652653
ACCESS_METHOD(GraalAccessMethod::array_new, "arrayNew", "(Ljava/lang/Object;I)Ljava/lang/Object;")
653654
ACCESS_METHOD(GraalAccessMethod::array_length, "arrayLength", "(Ljava/lang/Object;)J")
654655
ACCESS_METHOD(GraalAccessMethod::array_buffer_new, "arrayBufferNew", "(Ljava/lang/Object;I)Ljava/lang/Object;")

graal-nodejs/deps/v8/src/graal/graal_isolate.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ enum GraalAccessMethod {
149149
object_creation_context,
150150
object_define_property,
151151
object_preview_entries,
152+
object_set_integrity_level,
152153
array_new,
153154
array_length,
154155
array_buffer_new,

graal-nodejs/deps/v8/src/graal/graal_object.cc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,4 +353,11 @@ v8::MaybeLocal<v8::Array> GraalObject::PreviewEntries(bool* is_key_value) {
353353
v8::Local<v8::Array> v8_entries = reinterpret_cast<v8::Array*> (graal_entries);
354354
return v8_entries;
355355
}
356-
}
356+
}
357+
358+
v8::Maybe<bool> GraalObject::SetIntegrityLevel(v8::Local<v8::Context> context, v8::IntegrityLevel level) {
359+
GraalIsolate* graal_isolate = Isolate();
360+
jboolean freeze = (level == v8::IntegrityLevel::kFrozen);
361+
JNI_CALL_VOID(graal_isolate, GraalAccessMethod::object_set_integrity_level, GetJavaObject(), freeze);
362+
return graal_isolate->GetJNIEnv()->ExceptionCheck() ? v8::Nothing<bool>() : v8::Just<bool>(true);
363+
}

graal-nodejs/deps/v8/src/graal/graal_object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class GraalObject : public GraalValue {
8787
v8::MaybeLocal<v8::Value> GetOwnPropertyDescriptor(v8::Local<v8::Context> context, v8::Local<v8::Name> key);
8888
v8::Maybe<bool> DefineProperty(v8::Local<v8::Context> context, v8::Local<v8::Name> key, v8::PropertyDescriptor& descriptor);
8989
v8::MaybeLocal<v8::Array> PreviewEntries(bool* is_key_value);
90+
v8::Maybe<bool> SetIntegrityLevel(v8::Local<v8::Context> context, v8::IntegrityLevel level);
9091
protected:
9192
GraalHandleContent* CopyImpl(jobject java_object_copy) override;
9293
private:

graal-nodejs/deps/v8/src/graal/v8.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ namespace v8 {
10351035
}
10361036

10371037
void V8::FromJustIsNothing() {
1038-
TRACE
1038+
reinterpret_cast<GraalIsolate*> (GraalIsolate::GetCurrent())->ReportAPIFailure("v8::FromJust", "Maybe value is Nothing.");
10391039
}
10401040

10411041
const char* V8::GetVersion() {
@@ -2254,8 +2254,7 @@ namespace v8 {
22542254
}
22552255

22562256
Maybe<bool> Object::SetIntegrityLevel(Local<Context> context, IntegrityLevel level) {
2257-
TRACE
2258-
return Nothing<bool>();
2257+
return reinterpret_cast<GraalObject*> (this)->SetIntegrityLevel(context, level);
22592258
}
22602259

22612260
ScriptOrigin Message::GetScriptOrigin() const {

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/GraalJSAccess.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,12 @@ private Object objectCreationContextFromConstructor(DynamicObject object) {
11441144
throw new IllegalArgumentException("Cannot get creation context for this object");
11451145
}
11461146

1147+
public void objectSetIntegrityLevel(Object object, boolean freeze) {
1148+
if (JSObject.isJSObject(object)) {
1149+
JSObject.setIntegrityLevel((DynamicObject) object, freeze, true);
1150+
}
1151+
}
1152+
11471153
public Object arrayNew(Object context, int length) {
11481154
return JSArray.createConstantEmptyArray(((JSRealm) context).getContext(), length);
11491155
}

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/svmnodejs.jniconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@
156156
{ "name": "objectSetAccessor" },
157157
{ "name": "objectSetAlignedPointerInInternalField" },
158158
{ "name": "objectSetIndex" },
159+
{ "name": "objectSetIntegrityLevel" },
159160
{ "name": "objectSetPrivate" },
160161
{ "name": "objectSetPrototype" },
161162
{ "name": "objectSlowGetAlignedPointerFromInternalField" },

graal-nodejs/test/graal/unit/object.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,17 @@ EXPORT_TO_JS(GetRealNamedPropertyAttributes) {
241241
args.GetReturnValue().Set(result);
242242
}
243243

244+
EXPORT_TO_JS(SetIntegrityLevel) {
245+
Local<Context> context = args.GetIsolate()->GetCurrentContext();
246+
Local<Object> obj = args[0].As<Object>();
247+
bool freeze = args[1].As<Boolean>()->Value();
248+
249+
IntegrityLevel level = freeze ? IntegrityLevel::kFrozen : IntegrityLevel::kSealed;
250+
Maybe<bool> result = obj->SetIntegrityLevel(context, level);
251+
252+
if (result.IsJust()) {
253+
args.GetReturnValue().Set(result.FromJust());
254+
}
255+
}
256+
244257
#undef SUITE

graal-nodejs/test/graal/unit/object.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,4 +455,56 @@ describe('Object', function () {
455455
assert.strictEqual(module.Object_GetRealNamedPropertyAttributes(o, "accessor"), 6 /* DontEnum | DontDelete */);
456456
});
457457
});
458+
describe('SetIntegrityLevel', function () {
459+
it('should freeze the object', function () {
460+
var o = {
461+
bar: 42
462+
};
463+
assert.strictEqual(module.Object_SetIntegrityLevel(o, true), true);
464+
assert.throws(function () {
465+
"use strict";
466+
o.bar = 211;
467+
}, TypeError);
468+
assert.throws(function () {
469+
"use strict";
470+
o.foo = 42;
471+
}, TypeError);
472+
});
473+
it('should seal the object', function () {
474+
var o = {
475+
bar: 42
476+
};
477+
assert.strictEqual(module.Object_SetIntegrityLevel(o, false), true);
478+
o.bar = 211; // value of an existing property can be modified
479+
assert.strictEqual(o.bar, 211);
480+
assert.throws(function () {
481+
"use strict";
482+
o.foo = 42;
483+
}, TypeError);
484+
});
485+
var proxy = new Proxy({}, {
486+
preventExtensions: function () {
487+
return false;
488+
}
489+
});
490+
it('should throw for a Proxy refusing to prevent extensions (freeze)', function () {
491+
assert.throws(function () {
492+
module.Object_SetIntegrityLevel(proxy, true);
493+
}, TypeError);
494+
});
495+
it('should throw for a Proxy refusing to prevent extensions (seal)', function () {
496+
assert.throws(function () {
497+
module.Object_SetIntegrityLevel(proxy, false);
498+
}, TypeError);
499+
});
500+
if (typeof java === 'object') {
501+
var point = new java.awt.Point();
502+
it('should not crash for foreign objects (freeze)', function () {
503+
assert.strictEqual(module.Object_SetIntegrityLevel(point, true), true);
504+
});
505+
it('should not crash for foreign objects (seal)', function () {
506+
assert.strictEqual(module.Object_SetIntegrityLevel(point, false), true);
507+
});
508+
}
509+
});
458510
});

0 commit comments

Comments
 (0)