home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
-
- #ifndef jsopcode_h___
- #define jsopcode_h___
- /*
- * JS bytecode definitions.
- */
- #include <stddef.h>
- #include "jsprvtd.h"
- #include "jspubtd.h"
-
- PR_BEGIN_EXTERN_C
-
- /*
- * JS operation bytecodes.
- */
- typedef enum JSOp {
- #define OPDEF(op,val,name,token,length,nuses,ndefs,prec,format) \
- op = val,
- #include "jsopcode.def"
- #undef OPDEF
- JSOP_LIMIT
- } JSOp;
-
- /*
- * JS bytecode formats.
- */
- #define JOF_BYTE 0 /* single bytecode, no immediates */
- #define JOF_JUMP 1 /* signed 16-bit jump offset immediate */
- #define JOF_CONST 2 /* unsigned 16-bit constant pool index */
- #define JOF_UINT16 3 /* unsigned 16-bit immediate operand */
- #define JOF_TABLESWITCH 4 /* table switch */
- #define JOF_LOOKUPSWITCH 5 /* lookup switch */
- #define JOF_QARG 6 /* quickened get/set function argument ops */
- #define JOF_QVAR 7 /* quickened get/set local variable ops */
- #define JOF_TYPEMASK 0x000f /* mask for above immediate types */
- #define JOF_NAME 0x0010 /* name operation */
- #define JOF_PROP 0x0020 /* obj.prop operation */
- #define JOF_ELEM 0x0030 /* obj[index] operation */
- #define JOF_MODEMASK 0x0030 /* mask for above addressing modes */
- #define JOF_SET 0x0040 /* set (i.e., assignment) operation */
- #define JOF_DEL 0x0080 /* delete operation */
- #define JOF_DEC 0x0100 /* decrement (--, not ++) opcode */
- #define JOF_INC 0x0200 /* increment (++, not --) opcode */
- #define JOF_INCDEC 0x0300 /* increment or decrement opcode */
- #define JOF_POST 0x0400 /* postorder increment or decrement */
- #define JOF_IMPORT 0x0800 /* import property op */
-
- /*
- * Immediate operand getters, setters, and bounds.
- */
- #define JUMP_OFFSET_HI(off) ((jsbytecode)((off) >> 8))
- #define JUMP_OFFSET_LO(off) ((jsbytecode)(off))
- #define GET_JUMP_OFFSET(pc) ((int16)(((pc)[1] << 8) | (pc)[2]))
- #define SET_JUMP_OFFSET(pc,off) ((pc)[1] = JUMP_OFFSET_HI(off), \
- (pc)[2] = JUMP_OFFSET_LO(off))
- #define JUMP_OFFSET_MIN ((int16)0x8000)
- #define JUMP_OFFSET_MAX ((int16)0x7fff)
-
- #define ATOM_INDEX_HI(index) ((jsbytecode)((index) >> 8))
- #define ATOM_INDEX_LO(index) ((jsbytecode)(index))
- #define GET_ATOM_INDEX(pc) (((pc)[1] << 8) | (pc)[2])
- #define SET_ATOM_INDEX(pc,ndx) ((pc)[1] = ATOM_INDEX_HI(ndx), \
- (pc)[2] = ATOM_INDEX_LO(ndx))
- #define GET_ATOM(cx,script,pc) js_GetAtom((cx), &(script)->atomMap, \
- GET_ATOM_INDEX(pc))
- #define ATOM_INDEX_LIMIT_LOG2 16
- #define ATOM_INDEX_LIMIT ((uint32)1 << ATOM_INDEX_LIMIT_LOG2)
-
- #define ARGC_HI(argc) ((jsbytecode)((argc) >> 8))
- #define ARGC_LO(argc) ((jsbytecode)(argc))
- #define GET_ARGC(pc) (((pc)[1] << 8) | (pc)[2])
- #define ARGC_LIMIT ((uint32)1 << 16)
-
- /* Synonyms for quick JOF_QARG and JOF_QVAR bytecodes. */
- #define GET_ARGNO(pc) GET_ARGC(pc)
- #define SET_ARGNO(pc,argno) SET_JUMP_OFFSET(pc,argno)
- #define GET_VARNO(pc) GET_ARGC(pc)
- #define SET_VARNO(pc,varno) SET_JUMP_OFFSET(pc,varno)
-
- struct JSCodeSpec {
- const char *name; /* JS bytecode name */
- const char *token; /* JS source literal or null */
- int8 length; /* length including opcode byte */
- int8 nuses; /* arity, -1 if variadic */
- int8 ndefs; /* number of stack results */
- uint8 prec; /* operator precedence */
- uint32 format; /* immediate operand format */
- };
-
- extern char js_new_str[];
- extern char js_delete_str[];
- extern char js_typeof_str[];
- extern char js_void_str[];
- extern char js_null_str[];
- extern char js_this_str[];
- extern char js_false_str[];
- extern char js_true_str[];
- extern JSCodeSpec js_CodeSpec[];
- extern uintN js_NumCodeSpecs;
- extern jschar js_EscapeMap[];
-
- /*
- * Return a GC'ed string containing the chars in str, with any non-printing
- * chars or quotes (' or " as specified by the quote argument) escaped.
- */
- extern JSString *
- js_EscapeString(JSContext *cx, JSString *str, jschar quote);
-
- /*
- * JSPrinter operations, for printf style message formatting. The return
- * value from js_GetPrinterOutput() is the printer's cumulative output, in
- * a GC'ed string.
- */
- extern JSPrinter *
- js_NewPrinter(JSContext *cx, const char *name, uintN indent);
-
- extern void
- js_DestroyPrinter(JSPrinter *jp);
-
- extern JSString *
- js_GetPrinterOutput(JSPrinter *jp);
-
- extern int
- js_printf(JSPrinter *jp, char *format, ...);
-
- extern JSBool
- js_puts(JSPrinter *jp, char *s);
-
- #ifdef DEBUG
- /*
- * Disassemblers, for debugging only.
- */
- #include <stdio.h>
-
- extern void
- js_Disassemble(JSContext *cx, JSScript *script, JSBool lines, FILE *fp);
-
- extern uintN
- js_Disassemble1(JSContext *cx, JSScript *script, jsbytecode *pc, uintN loc,
- JSBool lines, FILE *fp);
- #endif /* DEBUG */
-
- /*
- * Decompilers, for script, function, and expression pretty-printing.
- */
- extern JSBool
- js_DecompileCode(JSPrinter *jp, JSScript *script, jsbytecode *pc, uintN len);
-
- extern JSBool
- js_DecompileScript(JSPrinter *jp, JSScript *script);
-
- extern JSBool
- js_DecompileFunction(JSPrinter *jp, JSFunction *fun, JSBool newlines);
-
- /*
- * Find the source expression that resulted in v, and return a new string
- * containing it. Fall back on v's string conversion if cx lacks sufficient
- * information to tell what source resulted in v.
- */
- extern JSString *
- js_ValueToSource(JSContext *cx, jsval v);
-
- PR_END_EXTERN_C
-
- #endif /* jsopcode_h___ */
-