Skip to content

Commit 1bd1d26

Browse files
authored
Put atomics behind a feature flag (AssemblyScript#470)
1 parent 2f1a6c4 commit 1bd1d26

File tree

6 files changed

+173
-154
lines changed

6 files changed

+173
-154
lines changed

cli/asc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
" mutable-global Enables mutable global imports and exports",
164164
" bulk-memory Enables bulk memory operations",
165165
" simd Enables SIMD types and operations.",
166+
" threads Enables threading and atomic operations.",
166167
""
167168
],
168169
"type": "s"

src/builtins.ts

Lines changed: 115 additions & 102 deletions
Large diffs are not rendered by default.

src/compiler.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ export const enum Feature {
237237
/** Bulk memory operations. */
238238
BULK_MEMORY = 1 << 2, // see: https://github.com/WebAssembly/bulk-memory-operations
239239
/** SIMD types and operations. */
240-
SIMD = 1 << 3 // see: https://github.com/WebAssembly/simd
240+
SIMD = 1 << 3, // see: https://github.com/WebAssembly/simd
241+
/** Threading and atomic operations. */
242+
THREADS = 1 << 4 // see: https://github.com/WebAssembly/threads
241243
}
242244

243245
/** Indicates the desired kind of a conversion. */

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ export const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;
132132
export const FEATURE_BULK_MEMORY = Feature.BULK_MEMORY;
133133
/** SIMD types and operations. */
134134
export const FEATURE_SIMD = Feature.SIMD;
135+
/** Threading and atomic operations. */
136+
export const FEATURE_THREADS = Feature.THREADS;
135137

136138
/** Enables a specific feature. */
137139
export function enableFeature(options: Options, feature: Feature): void {

std/assembly/builtins.ts

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
@builtin export declare function call_indirect<T>(target: void, ...args: void[]): T;
4444
@builtin export declare function instantiate<T>(...args: void[]): T;
4545

46-
export namespace Atomic {
46+
export namespace atomic {
4747
@builtin export declare function load<T>(offset: usize, constantOffset?: usize): T;
4848
@builtin export declare function store<T>(offset: usize, value: void, constantOffset?: usize): void;
4949
@builtin export declare function add<T>(ptr: usize, value: T, constantOffset?: usize): T;
@@ -88,7 +88,7 @@ export namespace i32 {
8888
@builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;
8989
@builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;
9090

91-
namespace atomic {
91+
export namespace atomic {
9292
@builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;
9393
@builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;
9494
@builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;
@@ -100,33 +100,33 @@ export namespace i32 {
100100
@builtin export declare function wait(ptr: usize, expected:i32, timeout:i64): i32;
101101
@builtin export declare function notify(ptr: usize, count:u32): u32;
102102

103-
namespace rmw8_u {
104-
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32
105-
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32
106-
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32
107-
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32
108-
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32
109-
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32
103+
export namespace rmw8_u {
104+
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;
105+
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;
106+
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;
107+
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;
108+
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;
109+
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;
110110
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;
111111
}
112112

113-
namespace rmw16_u {
114-
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32
115-
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32
116-
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32
117-
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32
118-
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32
119-
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32
113+
export namespace rmw16_u {
114+
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;
115+
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;
116+
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;
117+
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;
118+
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;
119+
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;
120120
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;
121121
}
122122

123-
namespace rmw {
124-
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32
125-
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32
126-
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32
127-
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32
128-
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32
129-
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32
123+
export namespace rmw {
124+
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;
125+
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;
126+
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;
127+
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;
128+
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;
129+
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;
130130
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;
131131
}
132132
}
@@ -166,43 +166,43 @@ export namespace i64 {
166166
@builtin export declare function wait(ptr: usize, expected:i64, timeout:i64): i32;
167167
@builtin export declare function notify(ptr: usize, count:u32): u32;
168168

169-
namespace rmw8_u {
170-
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
171-
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
172-
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
173-
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
174-
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
175-
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
169+
export namespace rmw8_u {
170+
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;
171+
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;
172+
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;
173+
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;
174+
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;
175+
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;
176176
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
177177
}
178178

179-
namespace rmw16_u {
180-
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
181-
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
182-
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
183-
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
184-
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
185-
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
179+
export namespace rmw16_u {
180+
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;
181+
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;
182+
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;
183+
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;
184+
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;
185+
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;
186186
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
187187
}
188188

189-
namespace rmw32_u {
190-
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
191-
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
192-
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
193-
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
194-
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
195-
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
189+
export namespace rmw32_u {
190+
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;
191+
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;
192+
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;
193+
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;
194+
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;
195+
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;
196196
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
197197
}
198198

199-
namespace rmw {
200-
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
201-
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
202-
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
203-
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
204-
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
205-
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
199+
export namespace rmw {
200+
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;
201+
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;
202+
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;
203+
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;
204+
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;
205+
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;
206206
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
207207
}
208208
}

std/portable/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ globalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;
1212
globalScope.ASC_FEATURE_SIGN_EXTENSION = false;
1313
globalScope.ASC_FEATURE_BULK_MEMORY = false;
1414
globalScope.ASC_FEATURE_SIMD = false;
15+
globalScope.ASC_FEATURE_THREADS = false;
1516

1617
var F64 = new Float64Array(1);
1718
var U64 = new Uint32Array(F64.buffer);

0 commit comments

Comments
 (0)