package com.hurlant.eval.gen { import com.hurlant.eval.Util; import com.hurlant.eval.abc.ABCConstantPool; import com.hurlant.eval.abc.ABCFile; import com.hurlant.eval.ast.*; public class ABCEmitter { public var file:ABCFile, constants:ABCConstantPool; /*private*/ var scripts = []; function ABCEmitter() { file = new ABCFile; constants = new ABCConstantPool; file.addConstants(constants); // XXX why are we adding junk in the constant pool for no good reason? //Object_name = nameFromIdent("Object"); //Array_name = nameFromIdent("Array"); //RegExp_name = nameFromIdent("RegExp"); } public function newScript(): Script { var s = new Script(this); scripts.push(s); return s; } public function finalize() { function f(s) { s.finalize() } Util.forEach(f, scripts); return file; } public var Object_name; public var Array_name; public var RegExp_name; public var meta_construct_name; public function namespace( ns:IAstNamespace ) { if (ns is IntrinsicNamespace) { return constants.namespace(AVM2Assembler.CONSTANT_Namespace, constants.stringUtf8("intrinsic")); // FIXME } else if (ns is OperatorNamespace) { throw ("Unimplemented namespace OperatorNamespace"); } else if (ns is PrivateNamespace) { var pn:PrivateNamespace = ns as PrivateNamespace; return constants.namespace(AVM2Assembler.CONSTANT_PrivateNamespace, constants.stringUtf8(pn.name)); } else if (ns is ProtectedNamespace) { var pn2:ProtectedNamespace = ns as ProtectedNamespace; return constants.namespace(AVM2Assembler.CONSTANT_ProtectedNamespace, constants.stringUtf8(pn2.name)); } else if (ns is PublicNamespace) { var pn3:PublicNamespace = ns as PublicNamespace; return constants.namespace(AVM2Assembler.CONSTANT_Namespace, constants.stringUtf8(pn3.name)); } else if (ns is InternalNamespace) { var pn4:InternalNamespace = ns as InternalNamespace; return constants.namespace(AVM2Assembler.CONSTANT_PackageInternalNS, constants.stringUtf8(pn4.name)); } else if (ns is UserNamespace) { var un:UserNamespace = ns as UserNamespace; /// return constants.namespace(CONSTANT_ExplicitNamespace, constants.stringUtf8(pn.name)); return constants.namespace(AVM2Assembler.CONSTANT_Namespace, constants.stringUtf8(un.name)); } else if (ns is AnonymousNamespace) { var an:AnonymousNamespace = ns as AnonymousNamespace; /// return constants.namespace(CONSTANT_PackageInternalNS, constants.stringUtf8(an.name)); return constants.namespace(AVM2Assembler.CONSTANT_Namespace, constants.stringUtf8(an.name)); } else if (ns is ImportNamespace) { throw ("Unimplemented namespace ImportNamespace"); } else { throw ("Unimplemented namespace " + ns); } } function flattenNamespaceSet(nss /*:[[NAMESPACE]]*/) { var new_nss = []; for( var i = 0; i