From 716d7bfcf622bd7e73f411155092bf50a67f2736 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 16 Dec 2015 14:15:37 +0100 Subject: [PATCH] Optimize opaque refs detection. --- packages/xen-api/src/index.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/xen-api/src/index.js b/packages/xen-api/src/index.js index 5519df6d5..18e4592a1 100644 --- a/packages/xen-api/src/index.js +++ b/packages/xen-api/src/index.js @@ -140,11 +140,16 @@ const { create: createObject, defineProperties, defineProperty, - freeze: freezeObject + freeze: freezeObject, + prototype: { toString } } = Object const noop = () => {} +const isString = (tag => + value => toString.call(value) === tag +)(toString.call('')) + // ------------------------------------------------------------------- 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 // everyone. object[key] = EMPTY_ARRAY - } else if (OPAQUE_REF_RE.test(value)) { + } else if (isOpaqueRef(value)) { // This is an array of refs. defineProperty(object, '$' + key, { get: () => freezeObject(map(value, (ref) => objectsByRefs[ref])) @@ -485,7 +491,7 @@ export class Xapi extends EventEmitter { forEach(value, resolveObject) freezeObject(value) - } else if (OPAQUE_REF_RE.test(value)) { + } else if (isOpaqueRef(value)) { defineProperty(object, '$' + key, { get: () => objectsByRefs[value] })