Skip to content

Commit d312d5d

Browse files
bnoordhuisrkd77
authored andcommitted
Add JS_SetImmutableArrayBuffer (#1350)
Fixes: #1347
1 parent 02c874b commit d312d5d

3 files changed

Lines changed: 69 additions & 0 deletions

File tree

api-test.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,53 @@ static void slice_string_tocstring(void)
858858
JS_FreeRuntime(rt);
859859
}
860860

861+
static void immutable_array_buffer(void)
862+
{
863+
JSValue obj, ret;
864+
bool immutable;
865+
char buf[96];
866+
int i, v;
867+
868+
JSRuntime *rt = JS_NewRuntime();
869+
JSContext *ctx = JS_NewContext(rt);
870+
for (i = 0; i < 2; i++) {
871+
obj = JS_NewObject(ctx);
872+
immutable = (i == 0);
873+
assert(-1 == JS_IsImmutableArrayBuffer(JS_NULL));
874+
assert(-1 == JS_IsImmutableArrayBuffer(JS_UNDEFINED));
875+
assert(-1 == JS_IsImmutableArrayBuffer(obj));
876+
assert(-1 == JS_SetImmutableArrayBuffer(JS_NULL, immutable));
877+
assert(-1 == JS_SetImmutableArrayBuffer(JS_UNDEFINED, immutable));
878+
assert(-1 == JS_SetImmutableArrayBuffer(obj, immutable));
879+
JS_FreeValue(ctx, obj);
880+
}
881+
obj = eval(ctx, "globalThis.ab = new ArrayBuffer(1)");
882+
assert(!JS_IsException(obj));
883+
assert(JS_IsArrayBuffer(obj));
884+
assert(!JS_IsImmutableArrayBuffer(obj));
885+
for (i = 1; i <= 3; i++) {
886+
immutable = (i == 2);
887+
if (i > 1)
888+
JS_SetImmutableArrayBuffer(obj, immutable);
889+
assert(immutable == JS_IsImmutableArrayBuffer(obj));
890+
snprintf(buf, sizeof(buf),
891+
"var ta = new Uint8Array(ab); ta[0] = %d; ta[0]", i);
892+
ret = eval(ctx, buf);
893+
assert(!JS_IsException(ret));
894+
assert(JS_IsNumber(ret));
895+
assert(0 == JS_ToInt32(ctx, &v, ret));
896+
JS_FreeValue(ctx, ret);
897+
if (immutable) {
898+
assert(v != i);
899+
} else {
900+
assert(v == i);
901+
}
902+
}
903+
JS_FreeValue(ctx, obj);
904+
JS_FreeContext(ctx);
905+
JS_FreeRuntime(rt);
906+
}
907+
861908
int main(void)
862909
{
863910
cfunctions();
@@ -875,5 +922,6 @@ int main(void)
875922
new_errors();
876923
global_object_prototype();
877924
slice_string_tocstring();
925+
immutable_array_buffer();
878926
return 0;
879927
}

quickjs.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55763,6 +55763,23 @@ void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj)
5576355763
}
5576455764
}
5576555765

55766+
int JS_IsImmutableArrayBuffer(JSValueConst obj)
55767+
{
55768+
JSArrayBuffer *abuf = JS_GetOpaque(obj, JS_CLASS_ARRAY_BUFFER);
55769+
if (!abuf)
55770+
return -1;
55771+
return abuf->immutable;
55772+
}
55773+
55774+
int JS_SetImmutableArrayBuffer(JSValueConst obj, bool immutable)
55775+
{
55776+
JSArrayBuffer *abuf = JS_GetOpaque(obj, JS_CLASS_ARRAY_BUFFER);
55777+
if (!abuf)
55778+
return -1;
55779+
abuf->immutable = immutable;
55780+
return 0;
55781+
}
55782+
5576655783
/* get an ArrayBuffer or SharedArrayBuffer */
5576755784
static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValueConst obj)
5576855785
{

quickjs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,6 +1061,10 @@ JS_EXTERN JSValue JS_NewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size
10611061
JS_EXTERN void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj);
10621062
JS_EXTERN uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValueConst obj);
10631063
JS_EXTERN bool JS_IsArrayBuffer(JSValueConst obj);
1064+
// returns true or false if obj is an ArrayBuffer, -1 otherwise
1065+
JS_EXTERN int JS_IsImmutableArrayBuffer(JSValueConst obj);
1066+
// returns 0 if obj is an ArrayBuffer, -1 otherwise
1067+
JS_EXTERN int JS_SetImmutableArrayBuffer(JSValueConst obj, bool immutable);
10641068
JS_EXTERN uint8_t *JS_GetUint8Array(JSContext *ctx, size_t *psize, JSValueConst obj);
10651069

10661070
typedef enum JSTypedArrayEnum {

0 commit comments

Comments
 (0)