smalloc: export constants from C++
PR-URL: https://github.com/iojs/io.js/pull/920 Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com> Reviewed-By: Trevor Norris <trev.norris@gmail.com>
This commit is contained in:
parent
0697f8b44d
commit
8f5f12bb48
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
const smalloc = process.binding('smalloc');
|
const smalloc = process.binding('smalloc');
|
||||||
const kMaxLength = smalloc.kMaxLength;
|
const kMaxLength = smalloc.kMaxLength;
|
||||||
|
const kMinType = smalloc.kMinType;
|
||||||
|
const kMaxType = smalloc.kMaxType;
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
|
|
||||||
exports.alloc = alloc;
|
exports.alloc = alloc;
|
||||||
@ -15,24 +17,8 @@ Object.defineProperty(exports, 'kMaxLength', {
|
|||||||
enumerable: true, value: kMaxLength, writable: false
|
enumerable: true, value: kMaxLength, writable: false
|
||||||
});
|
});
|
||||||
|
|
||||||
// enumerated values for different external array types
|
|
||||||
var Types = {};
|
|
||||||
|
|
||||||
// Must match enum v8::ExternalArrayType.
|
|
||||||
Object.defineProperties(Types, {
|
|
||||||
'Int8': { enumerable: true, value: 1, writable: false },
|
|
||||||
'Uint8': { enumerable: true, value: 2, writable: false },
|
|
||||||
'Int16': { enumerable: true, value: 3, writable: false },
|
|
||||||
'Uint16': { enumerable: true, value: 4, writable: false },
|
|
||||||
'Int32': { enumerable: true, value: 5, writable: false },
|
|
||||||
'Uint32': { enumerable: true, value: 6, writable: false },
|
|
||||||
'Float': { enumerable: true, value: 7, writable: false },
|
|
||||||
'Double': { enumerable: true, value: 8, writable: false },
|
|
||||||
'Uint8Clamped': { enumerable: true, value: 9, writable: false }
|
|
||||||
});
|
|
||||||
|
|
||||||
Object.defineProperty(exports, 'Types', {
|
Object.defineProperty(exports, 'Types', {
|
||||||
enumerable: true, value: Types, writable: false
|
enumerable: true, value: Object.freeze(smalloc.types), writable: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -59,8 +45,7 @@ function alloc(n, obj, type) {
|
|||||||
if (smalloc.hasExternalData(obj))
|
if (smalloc.hasExternalData(obj))
|
||||||
throw new TypeError('object already has external array data');
|
throw new TypeError('object already has external array data');
|
||||||
|
|
||||||
// 1 == v8::kExternalUint8Array, 9 == v8::kExternalUint8ClampedArray
|
if (type < kMinType || type > kMaxType)
|
||||||
if (type < 1 || type > 9)
|
|
||||||
throw new TypeError('unknown external array type: ' + type);
|
throw new TypeError('unknown external array type: ' + type);
|
||||||
if (n > kMaxLength)
|
if (n > kMaxLength)
|
||||||
throw new RangeError('Attempt to allocate array larger than maximum ' +
|
throw new RangeError('Attempt to allocate array larger than maximum ' +
|
||||||
|
@ -10,6 +10,20 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define ALLOC_ID (0xA10C)
|
#define ALLOC_ID (0xA10C)
|
||||||
|
#define EXTERNAL_ARRAY_TYPES(V) \
|
||||||
|
V(Int8, kExternalInt8Array) \
|
||||||
|
V(Uint8, kExternalUint8Array) \
|
||||||
|
V(Int16, kExternalInt16Array) \
|
||||||
|
V(Uint16, kExternalUint16Array) \
|
||||||
|
V(Int32, kExternalInt32Array) \
|
||||||
|
V(Uint32, kExternalUint32Array) \
|
||||||
|
V(Float, kExternalFloat32Array) \
|
||||||
|
V(Double, kExternalFloat64Array) \
|
||||||
|
V(Uint8Clamped, kExternalUint8ClampedArray)
|
||||||
|
|
||||||
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
namespace smalloc {
|
namespace smalloc {
|
||||||
@ -559,6 +573,7 @@ void Initialize(Handle<Object> exports,
|
|||||||
Handle<Value> unused,
|
Handle<Value> unused,
|
||||||
Handle<Context> context) {
|
Handle<Context> context) {
|
||||||
Environment* env = Environment::GetCurrent(context);
|
Environment* env = Environment::GetCurrent(context);
|
||||||
|
Isolate* isolate = env->isolate();
|
||||||
|
|
||||||
env->SetMethod(exports, "copyOnto", CopyOnto);
|
env->SetMethod(exports, "copyOnto", CopyOnto);
|
||||||
env->SetMethod(exports, "sliceOnto", SliceOnto);
|
env->SetMethod(exports, "sliceOnto", SliceOnto);
|
||||||
@ -573,6 +588,25 @@ void Initialize(Handle<Object> exports,
|
|||||||
exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxLength"),
|
exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxLength"),
|
||||||
Uint32::NewFromUnsigned(env->isolate(), kMaxLength));
|
Uint32::NewFromUnsigned(env->isolate(), kMaxLength));
|
||||||
|
|
||||||
|
Local<Object> types = Object::New(isolate);
|
||||||
|
|
||||||
|
uint32_t kMinType = ~0;
|
||||||
|
uint32_t kMaxType = 0;
|
||||||
|
#define V(name, value) \
|
||||||
|
types->Set(FIXED_ONE_BYTE_STRING(env->isolate(), #name), \
|
||||||
|
Uint32::NewFromUnsigned(env->isolate(), v8::value)); \
|
||||||
|
kMinType = MIN(kMinType, v8::value); \
|
||||||
|
kMaxType = MAX(kMinType, v8::value);
|
||||||
|
|
||||||
|
EXTERNAL_ARRAY_TYPES(V)
|
||||||
|
#undef V
|
||||||
|
|
||||||
|
exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "types"), types);
|
||||||
|
exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kMinType"),
|
||||||
|
Uint32::NewFromUnsigned(env->isolate(), kMinType));
|
||||||
|
exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxType"),
|
||||||
|
Uint32::NewFromUnsigned(env->isolate(), kMaxType));
|
||||||
|
|
||||||
HeapProfiler* heap_profiler = env->isolate()->GetHeapProfiler();
|
HeapProfiler* heap_profiler = env->isolate()->GetHeapProfiler();
|
||||||
heap_profiler->SetWrapperClassInfoProvider(ALLOC_ID, WrapperInfo);
|
heap_profiler->SetWrapperClassInfoProvider(ALLOC_ID, WrapperInfo);
|
||||||
}
|
}
|
||||||
|
@ -309,3 +309,23 @@ assert.throws(function() {
|
|||||||
assert.throws(function() {
|
assert.throws(function() {
|
||||||
smalloc.dispose({});
|
smalloc.dispose({});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Types should be immutable
|
||||||
|
assert.deepStrictEqual(Object.getOwnPropertyDescriptor(smalloc, 'Types'), {
|
||||||
|
value: smalloc.Types,
|
||||||
|
writable: false,
|
||||||
|
enumerable: true,
|
||||||
|
configurable: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var types = Object.keys(smalloc.Types);
|
||||||
|
var Types = smalloc.Types;
|
||||||
|
|
||||||
|
for (var i = 0; i < types.length; i++)
|
||||||
|
assert.deepStrictEqual(Object.getOwnPropertyDescriptor(Types, types[i]), {
|
||||||
|
value: Types[types[i]],
|
||||||
|
writable: false,
|
||||||
|
enumerable: true,
|
||||||
|
configurable: false
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user