Esempio n. 1
0
        public virtual string Eval(string expression, out NSJSException exception)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }
            if (string.IsNullOrEmpty(expression))
            {
                throw new ArgumentException("expression");
            }
            NSJSException exception_info = null;
            string        result         = null;

            this.Executing(() =>
            {
                byte[] ch     = NSJSString.GetUTF8StringBuffer(expression);
                fixed(byte *s = ch)
                {
                    sbyte *p       = nsjs_virtualmachine_eval(this.Handle, s, ref *this.exception);
                    exception_info = NSJSException.From(this, this.exception);
                    result         = p != null ? new string(p) : null;
                    NSJSMemoryManagement.Free(p);
                    return(result);
                }
            });
            exception = exception_info;
            return(result);
        }
Esempio n. 2
0
        public virtual string Run(string source, string alias, out NSJSException exception)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            NSJSException exception_info = null;
            string        result         = null;

            try
            {
                lock (this)
                {
                    RunContext context = new RunContext();
                    if (this.runings.TryGetValue(source, out context))
                    {
                        result         = context.result;
                        exception_info = context.exception;
                        return(result);
                    }
                }
                result = this.Executing((() =>
                {
                    byte[] alias_buffer = null;
                    if (alias != null)
                    {
                        alias_buffer = NSJSString.GetUTF8StringBuffer(alias);
                    }
                    byte[] source_buffer = NSJSString.GetUTF8StringBuffer(source);
                    fixed(byte *pstr_source = source_buffer)
                    {
                        fixed(byte *pstr_alias = alias_buffer)
                        {
                            sbyte *pstr_result = nsjs_virtualmachine_run(this.Handle,
                                                                         pstr_source, pstr_alias, ref *this.exception);
                            string result_str = pstr_result != null ? new string(pstr_result) : null;
                            NSJSMemoryManagement.Free(pstr_result);
                            exception_info = NSJSException.From(this, this.exception);
                            return(result_str);
                        }
                    }
                }));
                lock (this)
                {
                    RunContext context = new RunContext()
                    {
                        exception = exception_info,
                        result    = result,
                        alias     = alias,
                        source    = source
                    };
                    this.runings.Add(source, context);
                }
                return(result);
            }
            finally
            {
                exception = exception_info;
            }
        }
Esempio n. 3
0
 internal static NSJSException From(NSJSVirtualMachine machine, NSJSStructural.NSJSExceptionInfo *exception)
 {
     if (exception == null || machine == null)
     {
         return(null);
     }
     if (!exception->NowIsWrong)
     {
         return(null);
     }
     exception->NowIsWrong = false;
     return(new NSJSException(machine, exception));
 }
Esempio n. 4
0
        private NSJSException(NSJSVirtualMachine machine, NSJSStructural.NSJSExceptionInfo *exception)
        {
            if (exception == null)
            {
                throw new ArgumentNullException("exception");
            }
            this.VirtualMachine    = machine ?? throw new ArgumentNullException("machine");
            this.EndColumn         = exception->EndColumn;
            this.EndPosition       = exception->EndPosition;
            this.ErrorLevel        = exception->ErrorLevel;
            this.exception_message = new string((sbyte *)exception->ExceptionMessage);
            NSJSMemoryManagement.Free(exception->ExceptionMessage);
            this.IsSharedCrossOrigin  = exception->IsSharedCrossOrigin;
            this.LineNumber           = exception->LineNumber;
            this.ResourceColumnOffset = exception->ResourceColumnOffset;
            this.ResourceLineOffset   = exception->ResourceLineOffset;
            this.ResourceName         = new string((sbyte *)exception->ResourceName);
            NSJSMemoryManagement.Free(exception->ResourceName);
            this.ScriptId           = exception->ScriptId;
            this.ScriptResourceName = new string((sbyte *)exception->ScriptResourceName);
            NSJSMemoryManagement.Free(exception->ScriptResourceName);
            this.SourceLine = new string((sbyte *)exception->SourceLine);
            NSJSMemoryManagement.Free(exception->SourceLine);
            this.SourceMapUrl = new string((sbyte *)exception->SourceMapUrl);
            NSJSMemoryManagement.Free(exception->SourceMapUrl);
            this.StartColumn   = exception->StartColumn;
            this.StartPosition = exception->StartPosition;
            string s = new string((sbyte *)exception->StackTrace);

            if (s != null)
            {
                int index = s.IndexOf('\n');
                if (index > -1)
                {
                    s = s.Substring(index + 1);
                }
                s = s.Replace("\n", "\r\n");
            }
            this.JavaScriptStackTrace = s;
            NSJSMemoryManagement.Free(exception->StackTrace);
            // memeset
            exception->Reset();
        }
Esempio n. 5
0
 public NSJSVirtualMachine(NSJSConsoleHandler handler)
 {
     if (handler == null)
     {
         throw new ArgumentNullException("handler");
     }
     this.AutomaticallyPrintException = true;
     this.IntegerBoolean = false;
     this.Handle         = nsjs_virtualmachine_new();
     if (this.Handle == NULL)
     {
         throw new InvalidOperationException("this");
     }
     machines.TryAdd(this.Handle, this);
     this.ConsoleHandler = handler;
     this.cookie         = GCHandle.Alloc(this);
     this.exception      = NSJSStructural.NSJSExceptionInfo.New();
     this.stacktrace     = NSJSStructural.NSJSStackTrace.New();
 }
Esempio n. 6
0
        public virtual string Call(string name, IEnumerable <NSJSValue> args, out NSJSException exception)
        {
            NSJSException exception_info = null;
            string        result         = null;

            this.InternalCall(name, args, (List <IntPtr> argc) =>
            {
                fixed(byte *key = NSJSString.GetUTF8StringBuffer(name))
                {
                    fixed(IntPtr * argv = argc.ToArray())
                    {
                        sbyte *chunk   = nsjs_virtualmachine_call(this.Handle, key, argc.Count, argv, ref *this.exception);
                        exception_info = NSJSException.From(this, this.exception);
                        result         = chunk != null ? new string(chunk) : null;
                        NSJSMemoryManagement.Free(chunk);
                        return(result);
                    }
                }
            });
            exception = exception_info;
            return(result);
        }
Esempio n. 7
0
        public virtual NSJSValue Callvir(string name, IEnumerable <NSJSValue> args, out NSJSException exception)
        {
            NSJSException exception_info = null;
            NSJSValue     result         = this.InternalCall(name, args, (List <IntPtr> argc) =>
            {
                fixed(byte *key = NSJSString.GetUTF8StringBuffer(name))
                {
                    fixed(IntPtr * argv = argc.ToArray())
                    {
                        IntPtr handle  = nsjs_virtualmachine_callvir(this.Handle, key, argc.Count, argv, ref *this.exception);
                        exception_info = NSJSException.From(this, this.exception);
                        if (handle == NULL)
                        {
                            return(null);
                        }
                        return(NSJSValueBuilder.From(handle, this));
                    }
                }
            });

            exception = exception_info;
            return(result);
        }
Esempio n. 8
0
        public virtual string Call(string name, IEnumerable <string> args, out NSJSException exception)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name.Length <= 0)
            {
                throw new ArgumentException("name");
            }
            NSJSException exception_info = null;
            string        result         = null;

            this.Executing <string>(() =>
            {
                IList <GCHandle?> cookies = new List <GCHandle?>(256);
                IList <IntPtr> arguments  = new List <IntPtr>(256);
                cookies.Add(GCHandle.Alloc(NSJSString.GetUTF8StringBuffer(name), GCHandleType.Pinned));
                int argc = 0;
                if (args != null)
                {
                    foreach (string s in args)
                    {
                        byte[] ch = null;
                        if (s != null)
                        {
                            ch = NSJSString.GetUTF8StringBuffer(s);
                        }
                        if (s == null || ch.Length <= 0)
                        {
                            cookies.Add(null);
                            arguments.Add(NULL);
                        }
                        else
                        {
                            GCHandle cookie = GCHandle.Alloc(ch, GCHandleType.Pinned);
                            cookies.Add(cookie);
                            arguments.Add(cookie.AddrOfPinnedObject());
                        }
                        argc++;
                    }
                }
                void **argv = null;
                if (argc > 0)
                {
                    void **ppv = stackalloc void *[argc];
                    for (int i = 0; i < argc; i++)
                    {
                        ppv[i] = arguments[i].ToPointer();
                    }
                    argv = ppv;
                }
                IntPtr chunk   = nsjs_virtualmachine_call2(this.Handle, cookies[0].Value.AddrOfPinnedObject().ToPointer(), argc, argv, ref *this.exception);
                exception_info = NSJSException.From(this, this.exception);
                result         = chunk != NULL ? new string((sbyte *)chunk.ToPointer()) : null;
                foreach (GCHandle?cookie in cookies)
                {
                    if (cookie == null)
                    {
                        continue;
                    }
                    cookie.Value.Free();
                }
                return(result);
            });
            exception = exception_info;
            return(result);
        }