Mercurial > projects > dmdscript-tango
view dmdscript_tango/protoerror.d @ 3:8363a4bf6a8f
rename package: dmdscript to dmdscript_tango
author | saaadel |
---|---|
date | Sun, 24 Jan 2010 18:33:05 +0200 |
parents | 55c2951c07be |
children |
line wrap: on
line source
/* Digital Mars DMDScript source code. * Copyright (c) 2000-2002 by Chromium Communications * D version Copyright (c) 2004-2006 by Digital Mars * All Rights Reserved * written by Walter Bright * www.digitalmars.com * Use at your own risk. There is no warranty, express or implied. * License for redistribution is by the GNU General Public License in gpl.txt. * * A binary, non-exclusive license for commercial use can be * purchased from www.digitalmars.com/dscript/buy.html. * * DMDScript is implemented in the D Programming Language, * www.digitalmars.com/d/ * * For a C++ implementation of DMDScript, including COM support, * see www.digitalmars.com/dscript/cppscript.html. */ module dmdscript_tango.protoerror; import dmdscript_tango.script; import dmdscript_tango.dobject; import dmdscript_tango.value; import dmdscript_tango.threadcontext; import dmdscript_tango.text; import dmdscript_tango.dfunction; import dmdscript_tango.property; int foo; // cause this module to be linked in /* ===================== D0_constructor ==================== */ class D0_constructor : Dfunction { d_string text_d1; Dobject function(d_string) newD0; this(ThreadContext *tc, d_string text_d1, Dobject function(d_string) newD0) { super(1, tc.Dfunction_prototype); this.text_d1 = text_d1; this.newD0 = newD0; } void *Construct(CallContext *cc, Value *ret, Value[] arglist) { // ECMA 15.11.7.2 Value* m; Dobject o; tchar[] s; m = (arglist.length) ? &arglist[0] : &vundefined; // ECMA doesn't say what we do if m is undefined if (m.isUndefined()) s = text_d1; else s = m.toString(); o = (*newD0)(s); ret.putVobject(o); return null; } void *Call(CallContext *cc, Dobject othis, Value* ret, Value[] arglist) { // ECMA v3 15.11.7.1 return Construct(cc, ret, arglist); } } template proto(alias TEXT_D1) { /* ===================== D0_prototype ==================== */ class D0_prototype : D0 { this(ThreadContext *tc) { super(tc.Derror_prototype); tchar[] s; Put(TEXT_constructor, tc.ctorTable[TEXT_D1], DontEnum); Put(TEXT_name, TEXT_D1, 0); s = TEXT_D1 ~ ".prototype.message"; Put(TEXT_message, s, 0); Put(TEXT_description, s, 0); Put(TEXT_number, cast(d_number)0, 0); } } /* ===================== D0 ==================== */ class D0 : Dobject { ErrInfo errinfo; this(Dobject prototype) { super(prototype); classname = TEXT_Error; } this(tchar[] m) { this(D0.getPrototype()); Put(TEXT_message, m, 0); Put(TEXT_description, m, 0); Put(TEXT_number, cast(d_number)0, 0); errinfo.message = m; } this(ErrInfo *perrinfo) { this(perrinfo.message); errinfo = *perrinfo; Put(TEXT_number, cast(d_number)perrinfo.code, 0); } void getErrInfo(ErrInfo *perrinfo, int linnum) { if (linnum && errinfo.linnum == 0) errinfo.linnum = linnum; if (perrinfo) *perrinfo = errinfo; //writefln("getErrInfo(linnum = %d), errinfo.linnum = %d", linnum, errinfo.linnum); } static Dfunction getConstructor() { ThreadContext *tc = ThreadContext.getThreadContext(); assert(tc); return tc.ctorTable[TEXT_D1]; } static Dobject getPrototype() { ThreadContext *tc = ThreadContext.getThreadContext(); assert(tc); return tc.protoTable[TEXT_D1]; } static Dobject newD0(d_string s) { return new D0(s); } static void init(ThreadContext *tc) { Dfunction constructor = new D0_constructor(tc, TEXT_D1, &newD0); tc.ctorTable[TEXT_D1] = constructor; Dobject prototype = new D0_prototype(tc); tc.protoTable[TEXT_D1] = prototype; constructor.Put(TEXT_prototype, prototype, DontEnum | DontDelete | ReadOnly); } } } alias proto!(TEXT_SyntaxError) syntaxerror; alias proto!(TEXT_EvalError) evalerror; alias proto!(TEXT_ReferenceError) referenceerror; alias proto!(TEXT_RangeError) rangeerror; alias proto!(TEXT_TypeError) typeerror; alias proto!(TEXT_URIError) urierror; /********************************** * Register initializer for each class. */ static this() { ThreadContext.initTable ~= &syntaxerror.D0.init; ThreadContext.initTable ~= &evalerror.D0.init; ThreadContext.initTable ~= &referenceerror.D0.init; ThreadContext.initTable ~= &rangeerror.D0.init; ThreadContext.initTable ~= &typeerror.D0.init; ThreadContext.initTable ~= &urierror.D0.init; }