var binding = process.binding('evals');
-binding.NodeScript._setCloneMethod(function(source, target) {
- Object.getOwnPropertyNames(source).forEach(function(key) {
- try {
- var desc = Object.getOwnPropertyDescriptor(source, key);
- if (desc.value === source) desc.value = target;
-
- Object.defineProperty(target, key, desc);
- } catch (e) {
- // Catch sealed properties errors
- }
- });
-});
-
exports.Script = binding.NodeScript;
exports.createScript = function(code, ctx, name) {
return new exports.Script(code, ctx, name);
using v8::String;
using v8::Exception;
using v8::Local;
-using v8::Null;
using v8::Array;
using v8::Persistent;
using v8::Integer;
-using v8::Function;
using v8::FunctionTemplate;
static Handle<Value> CompileRunInThisContext(const Arguments& args);
static Handle<Value> CompileRunInNewContext(const Arguments& args);
- static Handle<Value> SetCloneMethod(const Arguments& args);
-
Persistent<Script> script_;
};
-Persistent<Function> cloneObjectMethod;
-
-void CloneObject(Handle<Object> recv,
- Handle<Value> source, Handle<Value> target) {
- HandleScope scope;
-
- Handle<Value> args[] = {source, target};
- cloneObjectMethod->Call(recv, 2, args);
-}
-
-
void WrappedContext::Initialize(Handle<Object> target) {
HandleScope scope;
"runInNewContext",
WrappedScript::RunInNewContext);
- NODE_SET_PROTOTYPE_METHOD(constructor_template,
- "_setCloneMethod",
- WrappedScript::SetCloneMethod);
-
NODE_SET_METHOD(constructor_template,
"createContext",
WrappedScript::CreateContext);
"runInNewContext",
WrappedScript::CompileRunInNewContext);
- NODE_SET_METHOD(constructor_template,
- "_setCloneMethod",
- WrappedScript::SetCloneMethod);
-
target->Set(String::NewSymbol("NodeScript"),
constructor_template->GetFunction());
}
if (args.Length() > 0) {
Local<Object> sandbox = args[0]->ToObject();
+ Local<Array> keys = sandbox->GetPropertyNames();
- CloneObject(args.This(), sandbox, context);
+ for (uint32_t i = 0; i < keys->Length(); i++) {
+ Handle<String> key = keys->Get(Integer::New(i))->ToString();
+ Handle<Value> value = sandbox->Get(key);
+ if(value == sandbox) { value = context; }
+ context->Set(key, value);
+ }
}
WrappedScript::EvalMachine<compileCode, newContext, returnResult>(args);
}
-Handle<Value> WrappedScript::SetCloneMethod(const Arguments& args) {
- HandleScope scope;
-
- Local<Function> cloneObjectMethod_ = Local<Function>::Cast(args[0]);
- cloneObjectMethod = Persistent<Function>::New(cloneObjectMethod_);
-
- return scope.Close(Null());
-}
-
template <WrappedScript::EvalInputFlags input_flag,
WrappedScript::EvalContextFlags context_flag,
// Copy everything from the passed in sandbox (either the persistent
// context for runInContext(), or the sandbox arg to runInNewContext()).
- CloneObject(args.This(), sandbox, context->Global()->GetPrototype());
+ keys = sandbox->GetPropertyNames();
+
+ for (i = 0; i < keys->Length(); i++) {
+ Handle<String> key = keys->Get(Integer::New(i))->ToString();
+ Handle<Value> value = sandbox->Get(key);
+ if (value == sandbox) { value = context->Global(); }
+ context->Global()->Set(key, value);
+ }
}
// Catch errors
if (context_flag == userContext || context_flag == newContext) {
// success! copy changes back onto the sandbox object.
- CloneObject(args.This(), context->Global()->GetPrototype(), sandbox);
+ keys = context->Global()->GetPropertyNames();
+ for (i = 0; i < keys->Length(); i++) {
+ Handle<String> key = keys->Get(Integer::New(i))->ToString();
+ Handle<Value> value = context->Global()->Get(key);
+ if (value == context->Global()) { value = sandbox; }
+ sandbox->Set(key, value);
+ }
}
if (context_flag == newContext) {