00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _ABC_H
00021 #define _ABC_H
00022
00023 #include "compat.h"
00024 #include <llvm/Module.h>
00025 #include <llvm/ExecutionEngine/ExecutionEngine.h>
00026 #include <llvm/Support/IRBuilder.h>
00027 #include <llvm/PassManagers.h>
00028 #include <llvm/LLVMContext.h>
00029 #include "parsing/tags.h"
00030 #include "frame.h"
00031 #include "logger.h"
00032 #include <vector>
00033 #include <deque>
00034 #include <map>
00035 #include <set>
00036 #include "swf.h"
00037
00038 namespace lightspark
00039 {
00040
00041 class s24
00042 {
00043 friend std::istream& operator>>(std::istream& in, s24& v);
00044 private:
00045 int32_t val;
00046 public:
00047 operator int32_t(){return val;}
00048 };
00049
00050 class s32
00051 {
00052 friend std::istream& operator>>(std::istream& in, s32& v);
00053 private:
00054 int32_t val;
00055 public:
00056 operator int32_t(){return val;}
00057 };
00058
00059 class u32
00060 {
00061 friend std::istream& operator>>(std::istream& in, u32& v);
00062 private:
00063 uint32_t val;
00064 public:
00065 operator uint32_t() const{return val;}
00066 };
00067
00068 class u30
00069 {
00070 friend std::istream& operator>>(std::istream& in, u30& v);
00071 private:
00072 uint32_t val;
00073 public:
00074 u30():val(0){}
00075 u30(int v):val(v){}
00076 operator uint32_t() const{return val;}
00077 };
00078
00079 class u16
00080 {
00081 friend std::istream& operator>>(std::istream& in, u16& v);
00082 private:
00083 uint32_t val;
00084 public:
00085 operator uint32_t() const{return val;}
00086 };
00087
00088 class u8
00089 {
00090 friend std::istream& operator>>(std::istream& in, u8& v);
00091 private:
00092 uint32_t val;
00093 public:
00094 operator uint32_t() const{return val;}
00095 };
00096
00097 class d64
00098 {
00099 friend std::istream& operator>>(std::istream& in, d64& v);
00100 private:
00101 double val;
00102 public:
00103 operator double(){return val;}
00104 };
00105
00106 class string_info
00107 {
00108 friend std::istream& operator>>(std::istream& in, string_info& v);
00109 private:
00110 u30 size;
00111 tiny_string val;
00112 public:
00113 operator const tiny_string&() const{return val;}
00114 };
00115
00116 struct namespace_info
00117 {
00118 u8 kind;
00119 u30 name;
00120 };
00121
00122 struct ns_set_info
00123 {
00124 u30 count;
00125 std::vector<u30> ns;
00126 };
00127
00128 struct multiname_info
00129 {
00130 u8 kind;
00131 u30 name;
00132 u30 ns;
00133 u30 ns_set;
00134 u30 type_definition;
00135 std::vector<u30> param_types;
00136 multiname* cached;
00137 multiname_info():cached(NULL){}
00138 ~multiname_info(){delete cached;}
00139 };
00140
00141 struct cpool_info
00142 {
00143 u30 int_count;
00144 std::vector<s32> integer;
00145 u30 uint_count;
00146 std::vector<u32> uinteger;
00147 u30 double_count;
00148 std::vector<d64> doubles;
00149 u30 string_count;
00150 std::vector<string_info> strings;
00151 u30 namespace_count;
00152 std::vector<namespace_info> namespaces;
00153 u30 ns_set_count;
00154 std::vector<ns_set_info> ns_sets;
00155 u30 multiname_count;
00156 std::vector<multiname_info> multinames;
00157 };
00158
00159 struct option_detail
00160 {
00161 u30 val;
00162 u8 kind;
00163 };
00164
00165 struct method_body_info;
00166 class method_info;
00167 class ABCContext;
00168 class ABCVm;
00169
00170 struct call_context
00171 {
00172 #include "packed_begin.h"
00173 struct
00174 {
00175 ASObject** locals;
00176 ASObject** stack;
00177 uint32_t stack_index;
00178 } PACKED;
00179 #include "packed_end.h"
00180 ABCContext* context;
00181 int locals_size;
00182 std::vector<ASObject*> scope_stack;
00183 int initialScopeStack;
00184 void runtime_stack_push(ASObject* s);
00185 ASObject* runtime_stack_pop();
00186 ASObject* runtime_stack_peek();
00187 call_context(method_info* th, int l, ASObject* const* args, const unsigned int numArgs);
00188 ~call_context();
00189 };
00190
00191 struct block_info
00192 {
00193 llvm::BasicBlock* BB;
00194 std::vector<STACK_TYPE> locals;
00195 std::vector<STACK_TYPE> locals_start;
00196 std::vector<llvm::Value*> locals_start_obj;
00197 std::vector<bool> locals_reset;
00198 std::vector<bool> locals_used;
00199 std::set<block_info*> preds;
00200 std::set<block_info*> seqs;
00201 std::map<int,STACK_TYPE> push_types;
00202
00203
00204 block_info():BB(NULL){abort();}
00205 block_info(const method_info* mi, const char* blockName);
00206 STACK_TYPE checkProactiveCasting(int local_ip,STACK_TYPE type);
00207 };
00208
00209 typedef std::pair<llvm::Value*, STACK_TYPE> stack_entry;
00210 inline stack_entry make_stack_entry(llvm::Value* v, STACK_TYPE t)
00211 {
00212 return std::make_pair(v, t);
00213 }
00214
00215 class method_info
00216 {
00217 friend std::istream& operator>>(std::istream& in, method_info& v);
00218 friend struct block_info;
00219 private:
00220 enum { NEED_ARGUMENTS=1,NEED_REST=4, HAS_OPTIONAL=8};
00221 u30 param_count;
00222 u30 return_type;
00223 std::vector<u30> param_type;
00224 std::vector<option_detail> options;
00225 u30 name;
00226 u8 flags;
00227
00228 std::vector<u30> param_names;
00229
00230
00231 stack_entry static_stack_peek(llvm::IRBuilder<>& builder, std::vector<stack_entry>& static_stack,
00232 llvm::Value* dynamic_stack, llvm::Value* dynamic_stack_index);
00233 stack_entry static_stack_pop(llvm::IRBuilder<>& builder, std::vector<stack_entry>& static_stack,
00234 llvm::Value* dynamic_stack, llvm::Value* dynamic_stack_index);
00235 void static_stack_push(std::vector<stack_entry>& static_stack, const stack_entry& e);
00236
00237 void abstract_value(llvm::ExecutionEngine* ex, llvm::IRBuilder<>& builder, stack_entry& e);
00238
00239
00240 llvm::Value* llvm_stack_pop(llvm::IRBuilder<>& builder,llvm::Value* dynamic_stack,llvm::Value* dynamic_stack_index);
00241 llvm::Value* llvm_stack_peek(llvm::IRBuilder<>& builder,llvm::Value* dynamic_stack,llvm::Value* dynamic_stack_index);
00242 void llvm_stack_push(llvm::ExecutionEngine* ex, llvm::IRBuilder<>& builder, llvm::Value* val,
00243 llvm::Value* dynamic_stack,llvm::Value* dynamic_stack_index);
00244
00245
00246 void syncStacks(llvm::ExecutionEngine* ex, llvm::IRBuilder<>& builder, std::vector<stack_entry>& static_stack,
00247 llvm::Value* dynamic_stack, llvm::Value* dynamic_stack_index);
00248 void syncLocals(llvm::ExecutionEngine* ex, llvm::IRBuilder<>& builder,
00249 const std::vector<stack_entry>& static_locals,llvm::Value* locals,
00250 const std::vector<STACK_TYPE>& expected,const block_info& dest_block);
00251 typedef std::vector<std::pair<int, STACK_TYPE> > static_stack_types_vector;
00252
00253 void consumeStackForRTMultiname(static_stack_types_vector& stack, int multinameIndex) const;
00254
00255
00256 void addBlock(std::map<unsigned int,block_info>& blocks, unsigned int ip, const char* blockName);
00257 std::pair<unsigned int, STACK_TYPE> popTypeFromStack(static_stack_types_vector& stack, unsigned int localIp) const;
00258 llvm::FunctionType* synt_method_prototype(llvm::ExecutionEngine* ex);
00259 llvm::Function* llvmf;
00260
00261
00262 void doAnalysis(std::map<unsigned int,block_info>& blocks, llvm::IRBuilder<>& Builder);
00263
00264 public:
00265 u30 option_count;
00266 SyntheticFunction::synt_function f;
00267 ABCContext* context;
00268 method_body_info* body;
00269 SyntheticFunction::synt_function synt_method();
00270 bool needsArgs() { return (flags & NEED_ARGUMENTS) != 0;}
00271 bool needsRest() { return (flags & NEED_REST) != 0;}
00272 bool hasOptional() { return (flags & HAS_OPTIONAL) != 0;}
00273 ASObject* getOptional(unsigned int i);
00274 int numArgs() { return param_count; }
00275 method_info():option_count(0),f(NULL),context(NULL),body(NULL)
00276 {
00277 }
00278 };
00279
00280 struct item_info
00281 {
00282 u30 key;
00283 u30 value;
00284 };
00285
00286 struct metadata_info
00287 {
00288 u30 name;
00289 u30 item_count;
00290 std::vector<item_info> items;
00291 };
00292
00293 struct traits_info
00294 {
00295 enum { Slot=0,Method=1,Getter=2,Setter=3,Class=4,Function=5,Const=6};
00296 enum { Final=0x10, Override=0x20, Metadata=0x40};
00297 u30 name;
00298 u8 kind;
00299
00300 u30 slot_id;
00301 u30 type_name;
00302 u30 vindex;
00303 u8 vkind;
00304 u30 classi;
00305 u30 function;
00306 u30 disp_id;
00307 u30 method;
00308
00309 u30 metadata_count;
00310 std::vector<u30> metadata;
00311 };
00312
00313 struct instance_info
00314 {
00315 enum { ClassSealed=0x01,ClassFinal=0x02,ClassInterface=0x04,ClassProtectedNs=0x08};
00316 u30 name;
00317 u30 supername;
00318 u8 flags;
00319 u30 protectedNs;
00320 u30 interface_count;
00321 std::vector<u30> interfaces;
00322 u30 init;
00323 u30 trait_count;
00324 std::vector<traits_info> traits;
00325 };
00326
00327 struct class_info
00328 {
00329 u30 cinit;
00330 u30 trait_count;
00331 std::vector<traits_info> traits;
00332 };
00333
00334 struct script_info
00335 {
00336 u30 init;
00337 u30 trait_count;
00338 std::vector<traits_info> traits;
00339 };
00340
00341 class exception_info
00342 {
00343 friend std::istream& operator>>(std::istream& in, exception_info& v);
00344 private:
00345 u30 from;
00346 u30 to;
00347 u30 target;
00348 u30 exc_type;
00349 u30 var_name;
00350 };
00351
00352 struct method_body_info
00353 {
00354 u30 method;
00355 u30 max_stack;
00356 u30 local_count;
00357 u30 init_scope_depth;
00358 u30 max_scope_depth;
00359 u30 code_length;
00360
00361 std::string code;
00362 u30 exception_count;
00363 std::vector<exception_info> exceptions;
00364 u30 trait_count;
00365 std::vector<traits_info> traits;
00366 };
00367
00368 struct opcode_handler
00369 {
00370 const char* name;
00371 void* addr;
00372 };
00373
00374 enum ARGS_TYPE { ARGS_OBJ_OBJ=0, ARGS_OBJ_INT, ARGS_OBJ, ARGS_INT, ARGS_OBJ_OBJ_INT, ARGS_NUMBER, ARGS_OBJ_NUMBER,
00375 ARGS_BOOL, ARGS_INT_OBJ, ARGS_NONE, ARGS_NUMBER_OBJ, ARGS_INT_INT, ARGS_CONTEXT, ARGS_CONTEXT_INT, ARGS_CONTEXT_INT_INT};
00376
00377 struct typed_opcode_handler
00378 {
00379 const char* name;
00380 void* addr;
00381 ARGS_TYPE type;
00382 };
00383
00384 class ABCContext
00385 {
00386 friend class ABCVm;
00387 friend class method_info;
00388 private:
00389 method_info* get_method(unsigned int m);
00390 const tiny_string& getString(unsigned int s) const;
00391
00392 static multiname* s_getMultiname(call_context*, ASObject*, int m);
00393 static multiname* s_getMultiname_i(call_context*, uintptr_t i , int m);
00394 static multiname* s_getMultiname_d(call_context*, number_t i , int m);
00395 int getMultinameRTData(int n) const;
00396 ASObject* getConstant(int kind, int index);
00397 public:
00398 u16 minor;
00399 u16 major;
00400 cpool_info constant_pool;
00401 u30 method_count;
00402 std::vector<method_info> methods;
00403 u30 metadata_count;
00404 std::vector<metadata_info> metadata;
00405 u30 class_count;
00406 std::vector<instance_info> instances;
00407 std::vector<class_info> classes;
00408 u30 script_count;
00409 std::vector<script_info> scripts;
00410 u30 method_body_count;
00411 std::vector<method_body_info> method_body;
00412 void buildTrait(ASObject* obj, const traits_info* t, IFunction* deferred_initialization=NULL);
00413 void linkTrait(Class_base* obj, const traits_info* t);
00414 void getOptionalConstant(const option_detail& opt);
00415 multiname* getMultiname(unsigned int m, call_context* th);
00416 void buildInstanceTraits(ASObject* obj, int class_index);
00417 ABCContext(std::istream& in) DLL_PUBLIC;
00418 void exec();
00419 };
00420
00421 struct thisAndLevel
00422 {
00423 ASObject* cur_this;
00424 int cur_level;
00425 thisAndLevel(ASObject* t,int l):cur_this(t),cur_level(l){}
00426 };
00427
00428 class ABCVm
00429 {
00430 friend class ABCContext;
00431 friend class method_info;
00432 private:
00433 SystemState* m_sys;
00434 pthread_t t;
00435 bool terminated;
00436
00437 llvm::Module* module;
00438
00439 void registerClasses();
00440
00441 void registerFunctions();
00442
00443 static bool hasNext2(call_context* th, int n, int m);
00444 static void callPropVoid(call_context* th, int n, int m);
00445 static void callSuperVoid(call_context* th, int n, int m);
00446 static void callSuper(call_context* th, int n, int m);
00447 static void callProperty(call_context* th, int n, int m);
00448 static void constructProp(call_context* th, int n, int m);
00449 static void setLocal(int n);
00450 static void setLocal_int(int n,int v);
00451 static void setLocal_obj(int n,ASObject* v);
00452 static void getLocal(ASObject* o, int n);
00453 static void getLocal_short(int n);
00454 static void getLocal_int(int n, int v);
00455 static void newObject(call_context* th, int n);
00456 static void getDescendants(call_context* th, int n);
00457 static ASObject* newCatch(call_context* th, int n);
00458 static void jump(int offset);
00459 static bool ifEq(ASObject*, ASObject*);
00460 static bool ifStrictEq(ASObject*, ASObject*);
00461 static bool ifNE(ASObject*, ASObject*);
00462 static bool ifNE_oi(ASObject*, intptr_t);
00463 static bool ifLT(ASObject*, ASObject*);
00464 static bool ifGT(ASObject*, ASObject*);
00465 static bool ifLE(ASObject*, ASObject*);
00466 static bool ifLT_oi(ASObject*, intptr_t);
00467 static bool ifLT_io(intptr_t, ASObject*);
00468 static bool ifNLT(ASObject*, ASObject*);
00469 static bool ifNGT(ASObject*, ASObject*);
00470 static bool ifNGE(ASObject*, ASObject*);
00471 static bool ifGE(ASObject*, ASObject*);
00472 static bool ifNLE(ASObject*, ASObject*);
00473 static bool ifStrictNE(ASObject*, ASObject*);
00474 static bool ifFalse(ASObject*);
00475 static bool ifTrue(ASObject*);
00476 static ASObject* getSlot(ASObject* th, int n);
00477 static void setSlot(ASObject*, ASObject*, int n);
00478 static void kill(int n);
00479 static ASObject* pushString(call_context* th, int n);
00480 static void getLex(call_context* th, int n);
00481 static ASObject* getScopeObject(call_context* th, int n);
00482 static void deleteProperty(call_context* th, int n);
00483 static void initProperty(call_context* th, int n);
00484 static void newClass(call_context* th, int n);
00485 static void newArray(call_context* th, int n);
00486 static ASObject* findPropStrict(call_context* th, int n);
00487 static ASObject* findProperty(call_context* th, int n);
00488 static intptr_t pushByte(intptr_t n);
00489 static intptr_t pushShort(intptr_t n);
00490 static void pushInt(call_context* th, int n);
00491 static void pushUInt(call_context* th, int n);
00492 static void pushDouble(call_context* th, int n);
00493 static void incLocal_i(call_context* th, int n);
00494 static void coerce(call_context* th, int n);
00495 static ASObject* getProperty(ASObject* obj, multiname* name);
00496 static intptr_t getProperty_i(ASObject* obj, multiname* name);
00497 static void setProperty(ASObject* value,ASObject* obj, multiname* name);
00498 static void setProperty_i(intptr_t value,ASObject* obj, multiname* name);
00499 static void call(call_context* th, int n);
00500 static void constructSuper(call_context* th, int n);
00501 static void construct(call_context* th, int n);
00502 static void constructGenericType(call_context* th, int n);
00503 static ASObject* newFunction(call_context* th, int n);
00504 static void setSuper(call_context* th, int n);
00505 static void getSuper(call_context* th, int n);
00506 static void pushScope(call_context* obj);
00507 static void pushWith(call_context* th);
00508 static ASObject* pushNull();
00509 static ASObject* pushUndefined();
00510 static ASObject* pushNaN();
00511 static bool pushFalse();
00512 static bool pushTrue();
00513 static void dup();
00514 static bool in(ASObject*,ASObject*);
00515 static bool _not(ASObject*);
00516 static bool equals(ASObject*,ASObject*);
00517 static number_t negate(ASObject*);
00518 static void pop();
00519 static ASObject* typeOf(ASObject*);
00520 static void _throw(call_context* th);
00521 static ASObject* asTypelate(ASObject* type, ASObject* obj);
00522 static bool isTypelate(ASObject* type, ASObject* obj);
00523 static bool isType(ASObject* obj, multiname* name);
00524 static void swap();
00525 static ASObject* add(ASObject*,ASObject*);
00526 static ASObject* add_oi(ASObject*,intptr_t);
00527 static ASObject* add_od(ASObject*,number_t);
00528 static uintptr_t bitAnd(ASObject*,ASObject*);
00529 static uintptr_t bitNot(ASObject*);
00530 static uintptr_t bitAnd_oi(ASObject* val1, intptr_t val2);
00531 static uintptr_t bitOr(ASObject*,ASObject*);
00532 static uintptr_t bitOr_oi(ASObject*,uintptr_t);
00533 static uintptr_t bitXor(ASObject*,ASObject*);
00534 static uintptr_t rShift(ASObject*,ASObject*);
00535 static uintptr_t urShift(ASObject*,ASObject*);
00536 static uintptr_t urShift_io(uintptr_t,ASObject*);
00537 static uintptr_t lShift(ASObject*,ASObject*);
00538 static uintptr_t lShift_io(uintptr_t,ASObject*);
00539 static number_t multiply(ASObject*,ASObject*);
00540 static number_t multiply_oi(ASObject*, intptr_t);
00541 static number_t divide(ASObject*,ASObject*);
00542 static intptr_t modulo(ASObject*,ASObject*);
00543 static number_t subtract(ASObject*,ASObject*);
00544 static number_t subtract_oi(ASObject*, intptr_t);
00545 static number_t subtract_io(intptr_t, ASObject*);
00546 static number_t subtract_do(number_t, ASObject*);
00547 static void popScope(call_context* th);
00548 static ASObject* newActivation(call_context* th, method_info*);
00549 static ASObject* coerce_s(ASObject*);
00550 static ASObject* checkfilter(ASObject*);
00551 static void coerce_a();
00552 static void label();
00553 static void lookupswitch();
00554 static intptr_t convert_i(ASObject*);
00555 static uintptr_t convert_u(ASObject*);
00556 static number_t convert_d(ASObject*);
00557 static bool convert_b(ASObject*);
00558 static bool greaterThan(ASObject*,ASObject*);
00559 static bool greaterEquals(ASObject*,ASObject*);
00560 static bool lessEquals(ASObject*,ASObject*);
00561 static bool lessThan(ASObject*,ASObject*);
00562 static ASObject* nextName(ASObject* index, ASObject* obj);
00563 static ASObject* nextValue(ASObject* index, ASObject* obj);
00564 static uintptr_t increment_i(ASObject*);
00565 static uintptr_t increment(ASObject*);
00566 static uintptr_t decrement(ASObject*);
00567 static uintptr_t decrement_i(ASObject*);
00568 static ASObject* getGlobalScope(call_context* th);
00569 static bool strictEquals(ASObject*,ASObject*);
00570
00571 static void not_impl(int p);
00572
00573
00574 static void method_reset(method_info* th);
00575 static void newClassRecursiveLink(Class_base* target, Class_base* c);
00576
00577
00578 void register_table(const llvm::Type* ret_type,typed_opcode_handler* table, int table_len);
00579 static opcode_handler opcode_table_args_pointer_2int[];
00580 static opcode_handler opcode_table_args_pointer_number_int[];
00581 static opcode_handler opcode_table_args3_pointers[];
00582 static typed_opcode_handler opcode_table_uintptr_t[];
00583 static typed_opcode_handler opcode_table_number_t[];
00584 static typed_opcode_handler opcode_table_void[];
00585 static typed_opcode_handler opcode_table_voidptr[];
00586 static typed_opcode_handler opcode_table_bool_t[];
00587
00588
00589 sem_t event_queue_mutex;
00590 sem_t sem_event_count;
00591
00592
00593 bool shuttingdown;
00594 std::deque<std::pair<EventDispatcher*,Event*> > events_queue;
00595 void handleEvent(std::pair<EventDispatcher*,Event*> e);
00596
00597 void buildClassAndInjectBase(const std::string& n, ASObject*, ASObject* const* a, const unsigned int argslen, bool isRoot);
00598
00599
00600
00601 std::vector<thisAndLevel> method_this_stack;
00602
00603 public:
00604 GlobalObject* Global;
00605 Manager* int_manager;
00606 Manager* number_manager;
00607 llvm::ExecutionEngine* ex;
00608 llvm::FunctionPassManager* FPM;
00609 llvm::LLVMContext llvm_context;
00610 ABCVm(SystemState* s) DLL_PUBLIC;
00616 ~ABCVm();
00617 static void Run(ABCVm* th);
00618 static ASObject* executeFunction(SyntheticFunction* function, call_context* context);
00619 bool addEvent(EventDispatcher*,Event*) DLL_PUBLIC;
00620 int getEventQueueSize();
00621 void shutdown();
00622 void wait();
00623
00624 void pushObjAndLevel(ASObject* o, int l);
00625 thisAndLevel popObjAndLevel();
00626 thisAndLevel getCurObjAndLevel()
00627 {
00628 return method_this_stack.back();
00629 }
00630
00631 static bool strictEqualImpl(ASObject*, ASObject*);
00632
00633 };
00634
00635 class DoABCTag: public ControlTag
00636 {
00637 private:
00638 UI32 Flags;
00639 STRING Name;
00640 ABCContext* context;
00641 pthread_t thread;
00642 public:
00643 DoABCTag(RECORDHEADER h, std::istream& in);
00644 ~DoABCTag();
00645 void execute(RootMovieClip* root);
00646 };
00647
00648 class SymbolClassTag: public ControlTag
00649 {
00650 private:
00651 UI16 NumSymbols;
00652 std::vector<UI16> Tags;
00653 std::vector<STRING> Names;
00654 public:
00655 SymbolClassTag(RECORDHEADER h, std::istream& in);
00656 void execute(RootMovieClip* root);
00657 };
00658
00659 ASObject* undefinedFunction(ASObject* obj,ASObject* const* args, const unsigned int argslen);
00660
00661 inline GlobalObject* getGlobal()
00662 {
00663 return sys->currentVm->Global;
00664 }
00665
00666 inline ABCVm* getVm()
00667 {
00668 return sys->currentVm;
00669 }
00670
00671 std::istream& operator>>(std::istream& in, u8& v);
00672 std::istream& operator>>(std::istream& in, u16& v);
00673 std::istream& operator>>(std::istream& in, u30& v);
00674 std::istream& operator>>(std::istream& in, u32& v);
00675 std::istream& operator>>(std::istream& in, s32& v);
00676 std::istream& operator>>(std::istream& in, d64& v);
00677 std::istream& operator>>(std::istream& in, string_info& v);
00678 std::istream& operator>>(std::istream& in, namespace_info& v);
00679 std::istream& operator>>(std::istream& in, ns_set_info& v);
00680 std::istream& operator>>(std::istream& in, multiname_info& v);
00681 std::istream& operator>>(std::istream& in, cpool_info& v);
00682 std::istream& operator>>(std::istream& in, method_info& v);
00683 std::istream& operator>>(std::istream& in, method_body_info& v);
00684 std::istream& operator>>(std::istream& in, instance_info& v);
00685 std::istream& operator>>(std::istream& in, traits_info& v);
00686 std::istream& operator>>(std::istream& in, script_info& v);
00687 std::istream& operator>>(std::istream& in, metadata_info& v);
00688 std::istream& operator>>(std::istream& in, class_info& v);
00689
00690 };
00691
00692 #endif