Optimize opaque refs detection.

This commit is contained in:
Julien Fontanet 2015-12-16 14:15:37 +01:00
parent b45a169a2f
commit 716d7bfcf6

View File

@ -140,11 +140,16 @@ const {
create: createObject, create: createObject,
defineProperties, defineProperties,
defineProperty, defineProperty,
freeze: freezeObject freeze: freezeObject,
prototype: { toString }
} = Object } = Object
const noop = () => {} const noop = () => {}
const isString = (tag =>
value => toString.call(value) === tag
)(toString.call(''))
// ------------------------------------------------------------------- // -------------------------------------------------------------------
let getNotConnectedPromise = function () { let getNotConnectedPromise = function () {
@ -160,7 +165,8 @@ let getNotConnectedPromise = function () {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
const OPAQUE_REF_RE = /^OpaqueRef:/ const OPAQUE_REF_PREFIX = /^OpaqueRef:/
const isOpaqueRef = value => isString(value) && startsWith(value, OPAQUE_REF_PREFIX)
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -473,7 +479,7 @@ export class Xapi extends EventEmitter {
// Minor memory optimization, use the same empty array for // Minor memory optimization, use the same empty array for
// everyone. // everyone.
object[key] = EMPTY_ARRAY object[key] = EMPTY_ARRAY
} else if (OPAQUE_REF_RE.test(value)) { } else if (isOpaqueRef(value)) {
// This is an array of refs. // This is an array of refs.
defineProperty(object, '$' + key, { defineProperty(object, '$' + key, {
get: () => freezeObject(map(value, (ref) => objectsByRefs[ref])) get: () => freezeObject(map(value, (ref) => objectsByRefs[ref]))
@ -485,7 +491,7 @@ export class Xapi extends EventEmitter {
forEach(value, resolveObject) forEach(value, resolveObject)
freezeObject(value) freezeObject(value)
} else if (OPAQUE_REF_RE.test(value)) { } else if (isOpaqueRef(value)) {
defineProperty(object, '$' + key, { defineProperty(object, '$' + key, {
get: () => objectsByRefs[value] get: () => objectsByRefs[value]
}) })