good morning!!!!

Skip to content
Snippets Groups Projects
Commit 563c035e authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Refactored some of the functions

parent de1dfae7
Branches
Tags
No related merge requests found
...@@ -7,6 +7,9 @@ import ( ...@@ -7,6 +7,9 @@ import (
"github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/otto" "github.com/obscuren/otto"
"io/ioutil"
"os"
"path/filepath"
) )
type JSRE struct { type JSRE struct {
...@@ -53,6 +56,22 @@ func (self *JSRE) Run(code string) (otto.Value, error) { ...@@ -53,6 +56,22 @@ func (self *JSRE) Run(code string) (otto.Value, error) {
return self.vm.Run(code) return self.vm.Run(code)
} }
func (self *JSRE) Require(file string) error {
if len(filepath.Ext(file)) == 0 {
file += ".js"
}
fh, err := os.Open(file)
if err != nil {
return err
}
content, _ := ioutil.ReadAll(fh)
self.Run("exports = {};(function() {" + string(content) + "})();")
return nil
}
func (self *JSRE) Stop() { func (self *JSRE) Stop() {
// Kill the main loop // Kill the main loop
self.quitChan <- true self.quitChan <- true
...@@ -82,7 +101,10 @@ out: ...@@ -82,7 +101,10 @@ out:
cb.Call(cb, val) cb.Call(cb, val)
} }
} else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok { } else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok {
fmt.Println(storageObject) for _, cb := range self.objectCb[ethutil.Hex(storageObject.Address)+ethutil.Hex(storageObject.StateAddress)] {
val, _ := self.vm.ToValue(ethpub.NewPStorageState(storageObject))
cb.Call(cb, val)
}
} }
} }
} }
...@@ -91,18 +113,45 @@ out: ...@@ -91,18 +113,45 @@ out:
func (self *JSRE) initStdFuncs() { func (self *JSRE) initStdFuncs() {
t, _ := self.vm.Get("eth") t, _ := self.vm.Get("eth")
eth := t.Object() eth := t.Object()
eth.Set("watch", func(call otto.FunctionCall) otto.Value { eth.Set("watch", self.watch)
eth.Set("addPeer", self.addPeer)
self.Set("require", self.require)
}
/*
* The following methods are natively implemented javascript functions
*/
// eth.watch
func (self JSRE) watch(call otto.FunctionCall) otto.Value {
addr, _ := call.Argument(0).ToString() addr, _ := call.Argument(0).ToString()
cb := call.Argument(1) var storageAddr string
var cb otto.Value
var storageCallback bool
if len(call.ArgumentList) > 2 {
storageCallback = true
storageAddr, _ = call.Argument(1).ToString()
cb = call.Argument(2)
} else {
cb = call.Argument(1)
}
if storageCallback {
self.objectCb[addr+storageAddr] = append(self.objectCb[addr+storageAddr], cb)
event := "storage:" + string(ethutil.FromHex(addr)) + ":" + string(ethutil.FromHex(storageAddr))
self.ethereum.Reactor().Subscribe(event, self.changeChan)
} else {
self.objectCb[addr] = append(self.objectCb[addr], cb) self.objectCb[addr] = append(self.objectCb[addr], cb)
event := "object:" + string(ethutil.FromHex(addr)) event := "object:" + string(ethutil.FromHex(addr))
self.ethereum.Reactor().Subscribe(event, self.changeChan) self.ethereum.Reactor().Subscribe(event, self.changeChan)
}
return otto.UndefinedValue() return otto.UndefinedValue()
}) }
eth.Set("addPeer", func(call otto.FunctionCall) otto.Value {
func (self *JSRE) addPeer(call otto.FunctionCall) otto.Value {
host, err := call.Argument(0).ToString() host, err := call.Argument(0).ToString()
if err != nil { if err != nil {
return otto.FalseValue() return otto.FalseValue()
...@@ -110,5 +159,19 @@ func (self *JSRE) initStdFuncs() { ...@@ -110,5 +159,19 @@ func (self *JSRE) initStdFuncs() {
self.ethereum.ConnectToPeer(host) self.ethereum.ConnectToPeer(host)
return otto.TrueValue() return otto.TrueValue()
}) }
func (self *JSRE) require(call otto.FunctionCall) otto.Value {
file, err := call.Argument(0).ToString()
if err != nil {
return otto.UndefinedValue()
}
if err := self.Require(file); err != nil {
fmt.Println("err:", err)
return otto.UndefinedValue()
}
t, _ := self.vm.Get("exports")
return t
} }
...@@ -8,7 +8,6 @@ package main ...@@ -8,7 +8,6 @@ package main
import "C" import "C"
import ( import (
"github.com/obscuren/otto"
"strings" "strings"
"unsafe" "unsafe"
) )
...@@ -87,7 +86,10 @@ L: ...@@ -87,7 +86,10 @@ L:
} }
} }
func (self *JSRepl) PrintValue(value otto.Value) { func (self *JSRepl) PrintValue(v interface{}) {
method, _ := self.re.vm.Get("prettyPrint") method, _ := self.re.vm.Get("prettyPrint")
method.Call(method, value) v, err := self.re.vm.ToValue(v)
if err == nil {
method.Call(method, v)
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment