diff options
Diffstat (limited to 'Godeps/_workspace/src/github.com/obscuren/otto/clone.go')
-rw-r--r-- | Godeps/_workspace/src/github.com/obscuren/otto/clone.go | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Godeps/_workspace/src/github.com/obscuren/otto/clone.go b/Godeps/_workspace/src/github.com/obscuren/otto/clone.go new file mode 100644 index 000000000..fbdde81c2 --- /dev/null +++ b/Godeps/_workspace/src/github.com/obscuren/otto/clone.go @@ -0,0 +1,144 @@ +package otto + +import ( + "fmt" +) + +type _clone struct { + runtime *_runtime + stash struct { + object map[*_object]*_object + objectEnvironment map[*_objectEnvironment]*_objectEnvironment + declarativeEnvironment map[*_declarativeEnvironment]*_declarativeEnvironment + } +} + +func (runtime *_runtime) clone() *_runtime { + + self := &_runtime{} + clone := &_clone{ + runtime: self, + } + clone.stash.object = make(map[*_object]*_object) + clone.stash.objectEnvironment = make(map[*_objectEnvironment]*_objectEnvironment) + clone.stash.declarativeEnvironment = make(map[*_declarativeEnvironment]*_declarativeEnvironment) + + globalObject := clone.object(runtime.GlobalObject) + self.GlobalEnvironment = self.newObjectEnvironment(globalObject, nil) + self.GlobalObject = globalObject + self.Global = _global{ + clone.object(runtime.Global.Object), + clone.object(runtime.Global.Function), + clone.object(runtime.Global.Array), + clone.object(runtime.Global.String), + clone.object(runtime.Global.Boolean), + clone.object(runtime.Global.Number), + clone.object(runtime.Global.Math), + clone.object(runtime.Global.Date), + clone.object(runtime.Global.RegExp), + clone.object(runtime.Global.Error), + clone.object(runtime.Global.EvalError), + clone.object(runtime.Global.TypeError), + clone.object(runtime.Global.RangeError), + clone.object(runtime.Global.ReferenceError), + clone.object(runtime.Global.SyntaxError), + clone.object(runtime.Global.URIError), + clone.object(runtime.Global.JSON), + + clone.object(runtime.Global.ObjectPrototype), + clone.object(runtime.Global.FunctionPrototype), + clone.object(runtime.Global.ArrayPrototype), + clone.object(runtime.Global.StringPrototype), + clone.object(runtime.Global.BooleanPrototype), + clone.object(runtime.Global.NumberPrototype), + clone.object(runtime.Global.DatePrototype), + clone.object(runtime.Global.RegExpPrototype), + clone.object(runtime.Global.ErrorPrototype), + clone.object(runtime.Global.EvalErrorPrototype), + clone.object(runtime.Global.TypeErrorPrototype), + clone.object(runtime.Global.RangeErrorPrototype), + clone.object(runtime.Global.ReferenceErrorPrototype), + clone.object(runtime.Global.SyntaxErrorPrototype), + clone.object(runtime.Global.URIErrorPrototype), + } + + self.EnterGlobalExecutionContext() + + self.eval = self.GlobalObject.property["eval"].value.(Value).value.(*_object) + self.GlobalObject.prototype = self.Global.ObjectPrototype + + return self +} +func (clone *_clone) object(self0 *_object) *_object { + if self1, exists := clone.stash.object[self0]; exists { + return self1 + } + self1 := &_object{} + clone.stash.object[self0] = self1 + return self0.objectClass.clone(self0, self1, clone) +} + +func (clone *_clone) declarativeEnvironment(self0 *_declarativeEnvironment) (*_declarativeEnvironment, bool) { + if self1, exists := clone.stash.declarativeEnvironment[self0]; exists { + return self1, true + } + self1 := &_declarativeEnvironment{} + clone.stash.declarativeEnvironment[self0] = self1 + return self1, false +} + +func (clone *_clone) objectEnvironment(self0 *_objectEnvironment) (*_objectEnvironment, bool) { + if self1, exists := clone.stash.objectEnvironment[self0]; exists { + return self1, true + } + self1 := &_objectEnvironment{} + clone.stash.objectEnvironment[self0] = self1 + return self1, false +} + +func (clone *_clone) value(self0 Value) Value { + self1 := self0 + switch value := self0.value.(type) { + case *_object: + self1.value = clone.object(value) + } + return self1 +} + +func (clone *_clone) valueArray(self0 []Value) []Value { + self1 := make([]Value, len(self0)) + for index, value := range self0 { + self1[index] = clone.value(value) + } + return self1 +} + +func (clone *_clone) environment(self0 _environment) _environment { + if self0 == nil { + return nil + } + return self0.clone(clone) +} + +func (clone *_clone) property(self0 _property) _property { + self1 := self0 + if value, valid := self0.value.(Value); valid { + self1.value = clone.value(value) + } else { + panic(fmt.Errorf("self0.value.(Value) != true")) + } + return self1 +} + +func (clone *_clone) declarativeProperty(self0 _declarativeProperty) _declarativeProperty { + self1 := self0 + self1.value = clone.value(self0.value) + return self1 +} + +func (clone *_clone) callFunction(self0 _callFunction) _callFunction { + if self0 == nil { + return nil + } + return self0.clone(clone) +} |