forked from mirrors/gecko-dev
		
	MozReview-Commit-ID: Iw4ke16CTKg --HG-- extra : rebase_source : b2c6f5b0dec1849e1bd814ecdcde78b376ffb8ca
		
			
				
	
	
		
			114 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* -*-  Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
 | 
						|
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#include "PerfMeasurement.h"
 | 
						|
#include "jsperf.h"
 | 
						|
#include "mozilla/ModuleUtils.h"
 | 
						|
#include "nsMemory.h"
 | 
						|
#include "mozilla/Preferences.h"
 | 
						|
#include "mozJSComponentLoader.h"
 | 
						|
#include "nsZipArchive.h"
 | 
						|
#include "xpc_make_class.h"
 | 
						|
 | 
						|
#define JSPERF_CONTRACTID \
 | 
						|
  "@mozilla.org/jsperf;1"
 | 
						|
 | 
						|
#define JSPERF_CID            \
 | 
						|
{ 0x421c38e6, 0xaee0, 0x4509, \
 | 
						|
  { 0xa0, 0x25, 0x13, 0x0f, 0x43, 0x78, 0x03, 0x5a } }
 | 
						|
 | 
						|
namespace mozilla {
 | 
						|
namespace jsperf {
 | 
						|
 | 
						|
NS_GENERIC_FACTORY_CONSTRUCTOR(Module)
 | 
						|
 | 
						|
NS_IMPL_ISUPPORTS(Module, nsIXPCScriptable)
 | 
						|
 | 
						|
Module::Module() = default;
 | 
						|
 | 
						|
Module::~Module() = default;
 | 
						|
 | 
						|
#define XPC_MAP_CLASSNAME Module
 | 
						|
#define XPC_MAP_QUOTED_CLASSNAME "Module"
 | 
						|
#define XPC_MAP_FLAGS XPC_SCRIPTABLE_WANT_CALL
 | 
						|
#include "xpc_map_end.h"
 | 
						|
 | 
						|
static bool
 | 
						|
SealObjectAndPrototype(JSContext* cx, JS::Handle<JSObject *> parent, const char* name)
 | 
						|
{
 | 
						|
  JS::Rooted<JS::Value> prop(cx);
 | 
						|
  if (!JS_GetProperty(cx, parent, name, &prop))
 | 
						|
    return false;
 | 
						|
 | 
						|
  if (prop.isUndefined()) {
 | 
						|
    // Pretend we sealed the object.
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  JS::Rooted<JSObject*> obj(cx, prop.toObjectOrNull());
 | 
						|
  if (!JS_GetProperty(cx, obj, "prototype", &prop))
 | 
						|
    return false;
 | 
						|
 | 
						|
  JS::Rooted<JSObject*> prototype(cx, prop.toObjectOrNull());
 | 
						|
  return JS_FreezeObject(cx, obj) && JS_FreezeObject(cx, prototype);
 | 
						|
}
 | 
						|
 | 
						|
static bool
 | 
						|
InitAndSealPerfMeasurementClass(JSContext* cx, JS::Handle<JSObject*> global)
 | 
						|
{
 | 
						|
  // Init the PerfMeasurement class
 | 
						|
  if (!JS::RegisterPerfMeasurement(cx, global))
 | 
						|
    return false;
 | 
						|
 | 
						|
  // Seal up Object, Function, and Array and their prototypes.  (This single
 | 
						|
  // object instance is shared amongst everyone who imports the jsperf module.)
 | 
						|
  if (!SealObjectAndPrototype(cx, global, "Object") ||
 | 
						|
      !SealObjectAndPrototype(cx, global, "Function") ||
 | 
						|
      !SealObjectAndPrototype(cx, global, "Array"))
 | 
						|
    return false;
 | 
						|
 | 
						|
  // Finally, seal the global object, for good measure. (But not recursively;
 | 
						|
  // this breaks things.)
 | 
						|
  return JS_FreezeObject(cx, global);
 | 
						|
}
 | 
						|
 | 
						|
NS_IMETHODIMP
 | 
						|
Module::Call(nsIXPConnectWrappedNative* wrapper,
 | 
						|
             JSContext* cx,
 | 
						|
             JSObject* obj,
 | 
						|
             const JS::CallArgs& args,
 | 
						|
             bool* _retval)
 | 
						|
{
 | 
						|
 | 
						|
  mozJSComponentLoader* loader = mozJSComponentLoader::Get();
 | 
						|
  JS::Rooted<JSObject*> targetObj(cx);
 | 
						|
  loader->FindTargetObject(cx, &targetObj);
 | 
						|
 | 
						|
  *_retval = InitAndSealPerfMeasurementClass(cx, targetObj);
 | 
						|
  return NS_OK;
 | 
						|
}
 | 
						|
 | 
						|
} // namespace jsperf
 | 
						|
} // namespace mozilla
 | 
						|
 | 
						|
NS_DEFINE_NAMED_CID(JSPERF_CID);
 | 
						|
 | 
						|
static const mozilla::Module::CIDEntry kPerfCIDs[] = {
 | 
						|
  { &kJSPERF_CID, false, nullptr, mozilla::jsperf::ModuleConstructor },
 | 
						|
  { nullptr }
 | 
						|
};
 | 
						|
 | 
						|
static const mozilla::Module::ContractIDEntry kPerfContracts[] = {
 | 
						|
  { JSPERF_CONTRACTID, &kJSPERF_CID },
 | 
						|
  { nullptr }
 | 
						|
};
 | 
						|
 | 
						|
static const mozilla::Module kPerfModule = {
 | 
						|
  mozilla::Module::kVersion,
 | 
						|
  kPerfCIDs,
 | 
						|
  kPerfContracts
 | 
						|
};
 | 
						|
 | 
						|
NSMODULE_DEFN(jsperf) = &kPerfModule;
 |