summaryrefslogtreecommitdiff
path: root/scripting/engine_v8.h
blob: 61b026b47193721db6eda0d979fa35bd952d6c48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma once

#include "engine.h"
#include <v8.h>

using namespace v8;

namespace mongo {

    class V8ScriptEngine;
    
    class V8Scope : public Scope {
    public:
        
        V8Scope( V8ScriptEngine * engine );
        ~V8Scope();
        
        virtual void reset(){}
        virtual void init( BSONObj * data ){ assert(0); }

        virtual void localConnect( const char * dbName ){ assert(0); }
        virtual void externalSetup(){ assert(0); };
        
        virtual double getNumber( const char *field );
        virtual string getString( const char *field );
        virtual bool getBoolean( const char *field );
        virtual BSONObj getObject( const char *field ){ assert( false ); return BSONObj(); }
        
        virtual int type( const char *field ){ assert( false ); return 0; }

        virtual void setNumber( const char *field , double val );
        virtual void setString( const char *field , const char * val );
        virtual void setBoolean( const char *field , bool val );
        virtual void setElement( const char *field , const BSONElement& e ){ assert( 0 );} 
        virtual void setObject( const char *field , const BSONObj& obj , bool readOnly){ assert(0); }
        virtual void setThis( const BSONObj * obj ){ assert(0); }
        
        virtual ScriptingFunction _createFunction( const char * code ){ assert( false ); return 0; }
        virtual int invoke( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 , bool ignoreReturn = false ){ assert(0); return 0;}
        virtual bool exec( const string& code , const string& name , bool printResult , bool reportError , bool assertOnError, int timeoutMs ){ assert(0); return 0; }
        virtual string getError(){ assert( false ); return ""; }
        
        virtual void injectNative( const char *field, NativeFunction func ){
            Handle< FunctionTemplate > f( v8::FunctionTemplate::New( nativeCallback ) );
            f->Set( v8::String::New( "_native_function" ), External::New( (void*)func ) );
            _global->Set( v8::String::New( field ), f->GetFunction() );
        }

        void gc(){ assert(0); }

    private:

        static Handle< Value > nativeCallback( const Arguments &args );

        HandleScope _handleScope;
        Handle<Context> _context;
        Context::Scope _scope;
        Handle<v8::Object> _global;
    };
    
    class V8ScriptEngine : public ScriptEngine {
    public:
        V8ScriptEngine();
        virtual ~V8ScriptEngine();
        
        virtual Scope * createScope(){ return new V8Scope( this ); }
        
        virtual void runTest(){}

        bool utf8Ok() const { return true; }

    private:
        HandleScope _handleScope;
        Handle<ObjectTemplate> _globalTemplate;

        friend class V8Scope;
    };
    
    
    extern ScriptEngine * globalScriptEngine;
}